diff options
author | Jonathan Kew <jfkthame@googlemail.com> | 2007-11-21 12:29:46 +0000 |
---|---|---|
committer | Jonathan Kew <jfkthame@googlemail.com> | 2007-11-21 12:29:46 +0000 |
commit | 952d69f85d43b087ce9fa79d3fc6f1c076000bc7 (patch) | |
tree | dd6937a6486e80e1638618308481075efab000ae /Build/source/libs/icu-xetex/common | |
parent | 888236cb9df7b7d7b5a3e2d784037a9a59511c53 (diff) |
updated icu-xetex library for XeTeX 0.997
git-svn-id: svn://tug.org/texlive/trunk@5536 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/icu-xetex/common')
171 files changed, 22024 insertions, 15701 deletions
diff --git a/Build/source/libs/icu-xetex/common/.cvsignore b/Build/source/libs/icu-xetex/common/.cvsignore index fd975286a94..97c71fca869 100644 --- a/Build/source/libs/icu-xetex/common/.cvsignore +++ b/Build/source/libs/icu-xetex/common/.cvsignore @@ -3,6 +3,7 @@ libicu*.* Debug Release Makefile +svchook.mk icucfg.h *.ao *.o diff --git a/Build/source/libs/icu-xetex/common/Makefile.in b/Build/source/libs/icu-xetex/common/Makefile.in index 2499d3ff5c4..666373cf160 100644 --- a/Build/source/libs/icu-xetex/common/Makefile.in +++ b/Build/source/libs/icu-xetex/common/Makefile.in @@ -1,6 +1,6 @@ #****************************************************************************** # -# Copyright (C) 1999-2005, International Business Machines +# Copyright (C) 1999-2006, International Business Machines # Corporation and others. All Rights Reserved. # #****************************************************************************** @@ -19,8 +19,12 @@ include $(top_builddir)/icudefs.mk ## Build directory information subdir = common +# for service hook +LOCALSVC_CPP=localsvc.cpp +SVC_HOOK_INC=$(top_builddir)/common/svchook.mk + ## Extra files to remove for 'make clean' -CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) $(SVC_HOOK_INC) ## Target information @@ -32,7 +36,7 @@ endif ifneq ($(ENABLE_SHARED),) SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) -ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) +ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) $(SHARED_OBJECT) ifeq ($(ENABLE_SO_VERSION_DATA),1) SO_VERSION_DATA = common.res @@ -51,39 +55,47 @@ DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) -LDFLAGS += $(LDFLAGSICUUC) -CPPFLAGS += -I. -I$(srcdir) -I$(top_srcdir)/i18n $(LIBCPPFLAGS) +ifneq ($(top_builddir),$(top_srcdir)) +CPPFLAGS += -I$(top_builddir)/common +endif +CPPFLAGS += -I$(srcdir) -I$(top_srcdir)/i18n $(LIBCPPFLAGS) DEFS += -DU_COMMON_IMPLEMENTATION +LDFLAGS += $(LDFLAGSICUUC) # $(LIBICUDT) is either stub data or the real DLL common data. LIBS = $(LIBICUDT) $(DEFAULT_LIBS) -OBJECTS = putil.o utypes.o uobject.o cmemory.o umutex.o ucln_cmn.o uinit.o \ -udata.o ucmndata.o udatamem.o udataswp.o umapfile.o ucol_swp.o \ -uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \ -ucat.o locmap.o uloc.o locid.o \ -uhash.o uhash_us.o \ -ucnv.o ucnv_set.o ucnv_bld.o ucnv_cb.o ucnv_cnv.o ucnv_err.o ucnv_ext.o ucnv_io.o ucnvlat1.o \ +OBJECTS = putil.o umath.o utypes.o uinvchar.o umutex.o ucln_cmn.o uinit.o uobject.o cmemory.o \ +udata.o ucmndata.o udatamem.o umapfile.o udataswp.o ucol_swp.o utrace.o \ +uhash.o uhash_us.o uenum.o ustrenum.o uvector.o ustack.o uvectr32.o \ +ucnv.o ucnv_bld.o ucnv_cnv.o ucnv_io.o ucnv_cb.o ucnv_err.o ucnvlat1.o \ ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o ucnvscsu.o ucnvbocu.o \ -ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o \ -unistr.o unistr_case.o unistr_cnv.o unistr_props.o \ -utf_impl.o ustring.o ustr_cnv.o ustrcase.o ucasemap.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o uinvchar.o utext.o \ +ucnv_ext.o ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o ucnv_set.o \ +uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o \ +ucat.o locmap.o uloc.o locid.o locutil.o \ +ustr_cnv.o unistr_cnv.o unistr.o unistr_case.o unistr_props.o \ +utf_impl.o ustring.o ustrcase.o ucasemap.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o utext.o \ normlzr.o unorm.o unormcmp.o unorm_it.o chariter.o schriter.o uchriter.o uiter.o \ -uchar.o uprops.o ucase.o propname.o ubidi_props.o ubidi.o ubidiwrt.o ubidiln.o ushape.o unames.o \ -uscript.o usc_impl.o uvector.o ustack.o uvectr32.o ucmp8.o \ -uarrsort.o utrie.o uset.o uset_props.o uniset.o uniset_props.o ruleiter.o caniter.o unifilt.o unifunct.o usetiter.o \ -brkiter.o brkdict.o ubrk.o dbbi.o dbbi_tbl.o \ +uchar.o uprops.o ucase.o propname.o ubidi_props.o ubidi.o ubidiwrt.o ubidiln.o ushape.o \ +uscript.o usc_impl.o unames.o \ +utrie.o uset_props.o uniset_props.o uset.o uniset.o usetiter.o ruleiter.o caniter.o unifilt.o unifunct.o \ +uarrsort.o brkiter.o ubrk.o brkeng.o dictbe.o triedict.o \ rbbi.o rbbidata.o rbbinode.o rbbirb.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o \ -serv.o servnotf.o servls.o servlk.o servlkf.o servrbf.o servslkf.o locutil.o \ -uenum.o ustrenum.o uidna.o usprep.o punycode.o \ -cwchar.o util.o parsepos.o utrace.o locbased.o +serv.o servnotf.o servls.o servlk.o servlkf.o servrbf.o servslkf.o \ +uidna.o usprep.o punycode.o \ +util.o util_props.o parsepos.o locbased.o cwchar.o wintz.o + +## Header files to install +HEADERS = $(srcdir)/unicode/*.h unicode/*.h STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) DEPS = $(OBJECTS:.o=.d) -## Header files to install -HEADERS = unicode/*.h $(srcdir)/unicode/*.h +-include Makefile.local + +-include $(SVC_HOOK_INC) + ## List of phony targets .PHONY : all all-local install install-local clean clean-local \ @@ -101,8 +113,6 @@ distclean : distclean-local dist: dist-local check: all check-local --include Makefile.local - all-local: $(ALL_TARGETS) unicode/platform.h install-local: install-headers install-library @@ -131,6 +141,14 @@ ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) endif endif +$(SVC_HOOK_INC): + @echo generating $@ + @-test -f $(top_srcdir)/common/$(LOCALSVC_CPP) && ( echo "have $(LOCALSVC_CPP) - U_LOCAL_SERVICE_HOOK=1" ; \ + echo 'CPPFLAGS +=-DU_LOCAL_SERVICE_HOOK=1' > $@ ; \ + echo 'OBJECTS += $(LOCALSVC_CPP:%.cpp=%.o)' >> $@ \ + ) ; true + @echo "# Autogenerated by Makefile" >> $@ + install-headers: $(MKINSTALLDIRS) $(DESTDIR)$(includedir)/unicode @for file in $(HEADERS); do \ @@ -145,11 +163,11 @@ clean-local: $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA) distclean-local: clean-local - $(RMV) Makefile icucfg.h unicode/platform.h + $(RMV) Makefile icucfg.h unicode/platform.h $(SVC_HOOK_INC) check-local: -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(SVC_HOOK_INC) cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status @@ -163,14 +181,13 @@ $(TARGET): $(TARGET)($(STATIC_OBJECTS)) endif ifneq ($(ENABLE_SHARED),) -$(FINAL_SO_TARGET): $(OBJECTS) $(SO_VERSION_DATA) +$(SHARED_OBJECT): $(OBJECTS) $(SO_VERSION_DATA) $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS) ifeq ($(OS390BATCH),1) -$(BATCH_TARGET): $(OBJECTS) +$(BATCH_TARGET):$(OBJECTS) $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(BATCH_LIBS) endif # OS390BATCH - endif # ENABLE_SHARED ifeq (,$(MAKECMDGOALS)) diff --git a/Build/source/libs/icu-xetex/common/brkdict.cpp b/Build/source/libs/icu-xetex/common/brkdict.cpp deleted file mode 100644 index 68875b97708..00000000000 --- a/Build/source/libs/icu-xetex/common/brkdict.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2004 IBM and others. All rights reserved. -********************************************************************** -* Date Name Description -* 12/1/99 rtg Ported from Java -* 01/13/2000 helena Added UErrorCode to ctors. -********************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_BREAK_ITERATION - -#include "unicode/ures.h" -#include "brkdict.h" -#include "cmemory.h" - -U_NAMESPACE_BEGIN - -//================================================================================= -// deserialization -//================================================================================= - -BreakDictionary::BreakDictionary(const char* /*dictionaryFilename*/, UErrorCode& status) - : columnMap(NULL), - table(NULL), - rowIndex(NULL), - rowIndexFlags(NULL), - rowIndexFlagsIndex(NULL), - rowIndexShifts(NULL) -{ - if (U_FAILURE(status)) return; - - UResourceBundle *th_dict = ures_open(NULL, "th", &status); - th_dict = ures_getByKey(th_dict, "BreakDictionaryData", th_dict, &status); - if (U_FAILURE(status)) return; - - int32_t len; - const uint8_t * data = ures_getBinary(th_dict, &len, &status); - ures_close(th_dict); - if (U_FAILURE(status)) return; - - readDictionaryFile(data); -} - -BreakDictionary::~BreakDictionary() -{ - ucmp8_close(columnMap); - uprv_free(table); - uprv_free(rowIndex); - uprv_free(rowIndexFlags); - uprv_free(rowIndexFlagsIndex); - uprv_free(rowIndexShifts); -} - -// macros to support readDictionaryFile. The data files originated from a Java -// program, and Java always writes data out in big-endian format. These macros will -// byte-swap the data for appropriate use on Windows. - -#if U_IS_BIG_ENDIAN -#define SWAP32(x) -#define SWAP16(x) -#else -#define SWAP32(x) x = (uint32_t)((x >> 24 & 0xff) | (x >> 8 & 0xff00) | (x << 8 & 0xff0000) | (x << 24 & 0xff000000)) -#define SWAP16(x) x = (uint16_t)((x << 8 & 0xff00) | (x >> 8 & 0xff)) -#endif - -#define DICTIONARY_READ(source, destAddr, len) \ - uprv_memcpy(destAddr, source, len);\ - source+=(len) - - -void -BreakDictionary::readDictionaryFile(const uint8_t * in) -{ - int32_t l; - int32_t version; - - int i; - - // read in the version number (right now we just ignore it) - DICTIONARY_READ(in, &version, 4); - - // read in the column map (this is serialized in its internal form: - // an index array followed by a data array) - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - uint16_t* temp = (uint16_t*) uprv_malloc(sizeof(uint16_t)*l); - DICTIONARY_READ(in, temp, l * sizeof (int16_t) ); - for (i = 0; i < l; i++) { - SWAP16(temp[i]); - } - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - int8_t* temp2 = (int8_t*) uprv_malloc(sizeof(int8_t)*l); - DICTIONARY_READ(in, temp2, l); - columnMap = ucmp8_openAdopt(temp, temp2, l); - - // read in numCols and numColGroups - DICTIONARY_READ(in, &numCols, 4); - SWAP32(numCols); - DICTIONARY_READ(in, &numColGroups, 4); - SWAP32(numColGroups); - - // read in the row-number index - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - rowIndex = (int16_t *)uprv_malloc(l*2); - DICTIONARY_READ(in, rowIndex, l * sizeof (int16_t) ); - for (i = 0; i < l; i++) { - SWAP16(rowIndex[i]); - } - - // load in the populated-cells bitmap: index first, then bitmap list - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - rowIndexFlagsIndex = (int16_t *)uprv_malloc(l*2); - DICTIONARY_READ(in, rowIndexFlagsIndex, l * sizeof(int16_t) ); - for (i = 0; i < l; i++) { - SWAP16(rowIndexFlagsIndex[i]); - } - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - rowIndexFlags = (int32_t *)uprv_malloc(l*4); - DICTIONARY_READ(in, rowIndexFlags, l * sizeof(int32_t)); - for (i = 0; i < l; i++) { - SWAP32(rowIndexFlags[i]); - } - - // load in the row-shift index - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - rowIndexShifts = (int8_t *)uprv_malloc(l); - DICTIONARY_READ(in, rowIndexShifts, l); - - // finally, load in the actual state table - DICTIONARY_READ(in, &l, 4); - SWAP32(l); - table = (int16_t *)uprv_malloc(l*2); - DICTIONARY_READ(in, table, l * sizeof(int16_t) ); - for (i = 0; i < l; i++) { - SWAP16(table[i]); - } - - // the reverse column map occurs next in the file. In the C/C++ code, for the - // time being, we're not going to worry about that. -} - -//================================================================================= -// access to the words -//================================================================================= - -/** - * Uses the column map to map the character to a column number, then - * passes the row and column number to the other version of at() - * @param row The current state - * @param ch The character whose column we're interested in - * @return The new state to transition to - */ -int16_t -BreakDictionary::at(int32_t row, UChar ch) const -{ - int16_t col = ucmp8_get(columnMap, ch); - return at(row, (int32_t)col); -} - -/** - * Returns the value in the cell with the specified (logical) row and - * column numbers. In DictionaryBasedBreakIterator, the row number is - * a state number, the column number is an input, and the return value - * is the row number of the new state to transition to. (0 is the - * "error" state, and -1 is the "end of word" state in a dictionary) - * @param row The row number of the current state - * @param col The column number of the input character (0 means "not a - * dictionary character") - * @return The row number of the new state to transition to - */ -int16_t -BreakDictionary::at(int32_t row, int32_t col) const -{ - if (cellIsPopulated(row, col)) { - // we map from logical to physical row number by looking up the - // mapping in rowIndex; we map from logical column number to - // physical column number by looking up a shift value for this - // logical row and offsetting the logical column number by - // the shift amount. Then we can use internalAt() to actually - // get the value out of the table. - return internalAt(rowIndex[row], col + rowIndexShifts[row]); - } - else { - return 0; - } -} - -//================================================================================= -// implementation -//================================================================================= -/** - * Given (logical) row and column numbers, returns true if the - * cell in that position is populated - */ -UBool -BreakDictionary::cellIsPopulated(int32_t row, int32_t col) const -{ - // look up the entry in the bitmap index for the specified row. - // If it's a negative number, it's the column number of the only - // populated cell in the row - if (rowIndexFlagsIndex[row] < 0) { - return col == -rowIndexFlagsIndex[row]; - } - - // if it's a positive number, it's the offset of an entry in the bitmap - // list. If the table is more than 32 columns wide, the bitmap is stored - // successive entries in the bitmap list, so we have to divide the column - // number by 32 and offset the number we got out of the index by the result. - // Once we have the appropriate piece of the bitmap, test the appropriate - // bit and return the result. - else { - int32_t flags = rowIndexFlags[rowIndexFlagsIndex[row] + (col >> 5)]; - return (flags & (1 << (col & 0x1f))) != 0; - } -} - -/** - * Implementation of at() when we know the specified cell is populated. - * @param row The PHYSICAL row number of the cell - * @param col The PHYSICAL column number of the cell - * @return The value stored in the cell - */ -int16_t -BreakDictionary::internalAt(int32_t row, int32_t col) const -{ - // the table is a one-dimensional array, so this just does the math necessary - // to treat it as a two-dimensional array (we don't just use a two-dimensional - // array because two-dimensional arrays are inefficient in Java) - return table[row * numCols + col]; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/Build/source/libs/icu-xetex/common/brkdict.h b/Build/source/libs/icu-xetex/common/brkdict.h deleted file mode 100644 index 87a6fd74d7b..00000000000 --- a/Build/source/libs/icu-xetex/common/brkdict.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2004 IBM and others. All rights reserved. -********************************************************************** -* Date Name Description -* 12/1/99 rtg Ported from Java -* 01/13/2000 helena Added UErrorCode to ctors. -********************************************************************** -*/ - -#ifndef BRKDICT_H -#define BRKDICT_H - -#include "unicode/utypes.h" -#include "unicode/uobject.h" -#include "ucmp8.h" - -U_NAMESPACE_BEGIN - -/** - * This is the class that represents the list of known words used by - * DictionaryBasedBreakIterator. The conceptual data structure used - * here is a trie: there is a node hanging off the root node for every - * letter that can start a word. Each of these nodes has a node hanging - * off of it for every letter that can be the second letter of a word - * if this node is the first letter, and so on. The trie is represented - * as a two-dimensional array that can be treated as a table of state - * transitions. Indexes are used to compress this array, taking - * advantage of the fact that this array will always be very sparse. - */ -class BreakDictionary : public UMemory { - //================================================================================= - // data members - //================================================================================= -private: - - /** - * Maps from characters to column numbers. The main use of this is to - * avoid making room in the array for empty columns. - */ - CompactByteArray* columnMap; - - /** - * The number of actual columns in the table - */ - int32_t numCols; - - /** - * Columns are organized into groups of 32. This says how many - * column groups. (We could calculate this, but we store the - * value to avoid having to repeatedly calculate it.) - */ - int32_t numColGroups; - - /** - * The actual compressed state table. Each conceptual row represents - * a state, and the cells in it contain the row numbers of the states - * to transition to for each possible letter. 0 is used to indicate - * an illegal combination of letters (i.e., the error state). The - * table is compressed by eliminating all the unpopulated (i.e., zero) - * cells. Multiple conceptual rows can then be doubled up in a single - * physical row by sliding them up and possibly shifting them to one - * side or the other so the populated cells don't collide. Indexes - * are used to identify unpopulated cells and to locate populated cells. - */ - int16_t* table; - - /** - * This index maps logical row numbers to physical row numbers - */ - int16_t* rowIndex; - - /** - * A bitmap is used to tell which cells in the comceptual table are - * populated. This array contains all the unique bit combinations - * in that bitmap. If the table is more than 32 columns wide, - * successive entries in this array are used for a single row. - */ - int32_t* rowIndexFlags; - - /** - * This index maps from a logical row number into the bitmap table above. - * (This keeps us from storing duplicate bitmap combinations.) Since there - * are a lot of rows with only one populated cell, instead of wasting space - * in the bitmap table, we just store a negative number in this index for - * rows with one populated cell. The absolute value of that number is - * the column number of the populated cell. - */ - int16_t* rowIndexFlagsIndex; - - /** - * For each logical row, this index contains a constant that is added to - * the logical column number to get the physical column number - */ - int8_t* rowIndexShifts; - - //================================================================================= - // deserialization - //================================================================================= - -public: - /** - * Constructor. Creates the BreakDictionary by using readDictionaryFile() to - * load the dictionary tables from the disk. - * @param dictionaryFilename The name of the dictionary file - * @param status for errors if it occurs - */ - BreakDictionary(const char* dictionaryFilename, UErrorCode& status); - - /** - * Destructor. - */ - ~BreakDictionary(); - - /** - * Reads the dictionary file on the disk and constructs the appropriate in-memory - * representation. - * @param in The given memory stream - */ - void readDictionaryFile(const uint8_t * in); - - //================================================================================= - // access to the words - //================================================================================= - - /** - * Uses the column map to map the character to a column number, then - * passes the row and column number to the other version of at() - * @param row The current state - * @param ch The character whose column we're interested in - * @return The new state to transition to - */ - int16_t at(int32_t row, UChar ch) const; - - /** - * Returns the value in the cell with the specified (logical) row and - * column numbers. In DictionaryBasedBreakIterator, the row number is - * a state number, the column number is an input, and the return value - * is the row number of the new state to transition to. (0 is the - * "error" state, and -1 is the "end of word" state in a dictionary) - * @param row The row number of the current state - * @param col The column number of the input character (0 means "not a - * dictionary character") - * @return The row number of the new state to transition to - */ - int16_t at(int32_t row, int32_t col) const; - -private: - /** - * Given (logical) row and column numbers, returns true if the - * cell in that position is populated - * @param row The LOGICAL row number of the cell - * @param col The PHYSICAL row number of the cell - * @return true if the cell in that position is populated - */ - UBool cellIsPopulated(int32_t row, int32_t col) const; - - /** - * Implementation of at() when we know the specified cell is populated. - * @param row The PHYSICAL row number of the cell - * @param col The PHYSICAL column number of the cell - * @return The value stored in the cell - */ - int16_t internalAt(int32_t row, int32_t col) const; - - // the following methods are never meant to be called and so are not defined - // (if you don't declare them, you get default implementations) - BreakDictionary(const BreakDictionary& that); - BreakDictionary& operator=(const BreakDictionary& that); -}; - -U_NAMESPACE_END - -#endif diff --git a/Build/source/libs/icu-xetex/common/brkeng.cpp b/Build/source/libs/icu-xetex/common/brkeng.cpp new file mode 100644 index 00000000000..577a401ce5b --- /dev/null +++ b/Build/source/libs/icu-xetex/common/brkeng.cpp @@ -0,0 +1,230 @@ +/** + ******************************************************************************* + * Copyright (C) 2006, International Business Machines Corporation and others. * + * All Rights Reserved. * + ******************************************************************************* + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "brkeng.h" +#include "dictbe.h" +#include "triedict.h" +#include "unicode/uchar.h" +#include "unicode/uniset.h" +#include "unicode/chariter.h" +#include "unicode/ures.h" +#include "unicode/udata.h" +#include "unicode/putil.h" +#include "unicode/ustring.h" +#include "uvector.h" +#include "mutex.h" +#include "uresimp.h" +#include "ubrkimpl.h" + +U_NAMESPACE_BEGIN + +/* + ****************************************************************** + */ + +LanguageBreakEngine::LanguageBreakEngine() { +} + +LanguageBreakEngine::~LanguageBreakEngine() { +} + +/* + ****************************************************************** + */ + +LanguageBreakFactory::LanguageBreakFactory() { +} + +LanguageBreakFactory::~LanguageBreakFactory() { +} + +/* + ****************************************************************** + */ + +UnhandledEngine::UnhandledEngine(UErrorCode &/*status*/) { + for (int32_t i = 0; i < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0])); ++i) { + fHandled[i] = 0; + } +} + +UnhandledEngine::~UnhandledEngine() { + for (int32_t i = 0; i < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0])); ++i) { + if (fHandled[i] != 0) { + delete fHandled[i]; + } + } +} + +UBool +UnhandledEngine::handles(UChar32 c, int32_t breakType) const { + return (breakType >= 0 && breakType < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0])) + && fHandled[breakType] != 0 && fHandled[breakType]->contains(c)); +} + +int32_t +UnhandledEngine::findBreaks( UText *text, + int32_t startPos, + int32_t endPos, + UBool reverse, + int32_t breakType, + UStack &/*foundBreaks*/ ) const { + if (breakType >= 0 && breakType < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0]))) { + UChar32 c = utext_current32(text); + if (reverse) { + while((int32_t)utext_getNativeIndex(text) > startPos && fHandled[breakType]->contains(c)) { + c = utext_previous32(text); + } + } + else { + while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) { + utext_next32(text); // TODO: recast loop to work with post-increment operations. + c = utext_current32(text); + } + } + } + return 0; +} + +void +UnhandledEngine::handleCharacter(UChar32 c, int32_t breakType) { + if (breakType >= 0 && breakType < (int32_t)(sizeof(fHandled)/sizeof(fHandled[0]))) { + if (fHandled[breakType] == 0) { + fHandled[breakType] = new UnicodeSet(); + if (fHandled[breakType] == 0) { + return; + } + } + if (!fHandled[breakType]->contains(c)) { + UErrorCode status = U_ZERO_ERROR; + // Apply the entire script of the character. + int32_t script = u_getIntPropertyValue(c, UCHAR_SCRIPT); + fHandled[breakType]->applyIntPropertyValue(UCHAR_SCRIPT, script, status); + } + } +} + +/* + ****************************************************************** + */ + +ICULanguageBreakFactory::ICULanguageBreakFactory(UErrorCode &/*status*/) { + fEngines = 0; +} + +ICULanguageBreakFactory::~ICULanguageBreakFactory() { + if (fEngines != 0) { + delete fEngines; + } +} + +U_NAMESPACE_END +U_CDECL_BEGIN +static void U_CALLCONV _deleteEngine(void *obj) { + delete (const LanguageBreakEngine *) obj; +} +U_CDECL_END +U_NAMESPACE_BEGIN + +const LanguageBreakEngine * +ICULanguageBreakFactory::getEngineFor(UChar32 c, int32_t breakType) { + UBool needsInit; + UErrorCode status = U_ZERO_ERROR; + umtx_lock(NULL); + needsInit = (UBool)(fEngines == NULL); + umtx_unlock(NULL); + + if (needsInit) { + UStack *engines = new UStack(_deleteEngine, NULL, status); + if (U_SUCCESS(status) && engines == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + // TODO: add locale parameter, check "dictionaries" in locale + // TODO: generalize once we can figure out how to parameterize engines + // instead of having different subclasses. Right now it needs to check + // for the key of each particular subclass. + + // Open root from brkitr tree. + char dictnbuff[256]; + char ext[4]={'\0'}; + + UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status); + b = ures_getByKeyWithFallback(b, "dictionaries", b, &status); + b = ures_getByKeyWithFallback(b, "Thai", b, &status); + int32_t dictnlength = 0; + const UChar *dictfname = ures_getString(b, &dictnlength, &status); + if (U_SUCCESS(status) && (size_t)dictnlength >= sizeof(dictnbuff)) { + dictnlength = 0; + status = U_BUFFER_OVERFLOW_ERROR; + } + if (U_SUCCESS(status) && dictfname) { + UChar* extStart=u_strchr(dictfname, 0x002e); + int len = 0; + if(extStart!=NULL){ + len = extStart-dictfname; + u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff + u_UCharsToChars(dictfname, dictnbuff, len); + } + dictnbuff[len]=0; // nul terminate + } + ures_close(b); + UDataMemory *file = udata_open(U_ICUDATA_BRKITR, ext, dictnbuff, &status); + if (U_SUCCESS(status)) { + const CompactTrieDictionary *dict = new CompactTrieDictionary( + file, status); + if (U_SUCCESS(status) && dict == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(status)) { + delete dict; + dict = NULL; + } + const ThaiBreakEngine *thai = new ThaiBreakEngine(dict, status); + if (thai == NULL) { + delete dict; + if (U_SUCCESS(status)) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } + if (U_SUCCESS(status)) { + engines->push((void *)thai, status); + } + else { + delete thai; + } + } + umtx_lock(NULL); + if (fEngines == NULL) { + fEngines = engines; + engines = NULL; + } + umtx_unlock(NULL); + delete engines; + } + + if (fEngines == NULL) { + return NULL; + } + int32_t i = fEngines->size(); + const LanguageBreakEngine *lbe = NULL; + while (--i >= 0) { + lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i)); + if (lbe != NULL && lbe->handles(c, breakType)) { + break; + } + lbe = NULL; + } + return lbe; +} + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/Build/source/libs/icu-xetex/common/brkeng.h b/Build/source/libs/icu-xetex/common/brkeng.h new file mode 100644 index 00000000000..afc70dc3eae --- /dev/null +++ b/Build/source/libs/icu-xetex/common/brkeng.h @@ -0,0 +1,265 @@ +/** + ******************************************************************************* + * Copyright (C) 2006, International Business Machines Corporation and others. * + * All Rights Reserved. * + ******************************************************************************* + */ + +#ifndef BRKENG_H +#define BRKENG_H + +#include "unicode/utypes.h" +#include "unicode/uobject.h" +#include "unicode/utext.h" + +U_NAMESPACE_BEGIN + +class UnicodeSet; +class UStack; + +/******************************************************************* + * LanguageBreakEngine + */ + +/** + * <p>LanguageBreakEngines implement language-specific knowledge for + * finding text boundaries within a run of characters belonging to a + * specific set. The boundaries will be of a specific kind, e.g. word, + * line, etc.</p> + * + * <p>LanguageBreakEngines should normally be implemented so as to + * be shared between threads without locking.</p> + */ +class LanguageBreakEngine : public UMemory { + public: + + /** + * <p>Default constructor.</p> + * + */ + LanguageBreakEngine(); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~LanguageBreakEngine(); + + /** + * <p>Indicate whether this engine handles a particular character for + * a particular kind of break.</p> + * + * @param c A character which begins a run that the engine might handle + * @param breakType The type of text break which the caller wants to determine + * @return TRUE if this engine handles the particular character and break + * type. + */ + virtual UBool handles(UChar32 c, int32_t breakType) const = 0; + + /** + * <p>Find any breaks within a run in the supplied text.</p> + * + * @param text A UText representing the text. The + * iterator is left at the end of the run of characters which the engine + * is capable of handling. + * @param startPos The start of the run within the supplied text. + * @param endPos The end of the run within the supplied text. + * @param reverse Whether the caller is looking for breaks in a reverse + * direction. + * @param breakType The type of break desired, or -1. + * @param foundBreaks An allocated C array of the breaks found, if any + * @return The number of breaks found. + */ + virtual int32_t findBreaks( UText *text, + int32_t startPos, + int32_t endPos, + UBool reverse, + int32_t breakType, + UStack &foundBreaks ) const = 0; + +}; + +/******************************************************************* + * LanguageBreakFactory + */ + +/** + * <p>LanguageBreakFactorys find and return a LanguageBreakEngine + * that can determine breaks for characters in a specific set, if + * such an object can be found.</p> + * + * <p>If a LanguageBreakFactory is to be shared between threads, + * appropriate synchronization must be used; there is none internal + * to the factory.</p> + * + * <p>A LanguageBreakEngine returned by a LanguageBreakFactory can + * normally be shared between threads without synchronization, unless + * the specific subclass of LanguageBreakFactory indicates otherwise.</p> + * + * <p>A LanguageBreakFactory is responsible for deleting any LanguageBreakEngine + * it returns when it itself is deleted, unless the specific subclass of + * LanguageBreakFactory indicates otherwise. Naturally, the factory should + * not be deleted until the LanguageBreakEngines it has returned are no + * longer needed.</p> + */ +class LanguageBreakFactory : public UMemory { + public: + + /** + * <p>Default constructor.</p> + * + */ + LanguageBreakFactory(); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~LanguageBreakFactory(); + + /** + * <p>Find and return a LanguageBreakEngine that can find the desired + * kind of break for the set of characters to which the supplied + * character belongs. It is up to the set of available engines to + * determine what the sets of characters are.</p> + * + * @param c A character that begins a run for which a LanguageBreakEngine is + * sought. + * @param breakType The kind of text break for which a LanguageBreakEngine is + * sought. + * @return A LanguageBreakEngine with the desired characteristics, or 0. + */ + virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType) = 0; + +}; + +/******************************************************************* + * UnhandledEngine + */ + +/** + * <p>UnhandledEngine is a special subclass of LanguageBreakEngine that + * handles characters that no other LanguageBreakEngine is available to + * handle. It is told the character and the type of break; at its + * discretion it may handle more than the specified character (e.g., + * the entire script to which that character belongs.</p> + * + * <p>UnhandledEngines may not be shared between threads without + * external synchronization.</p> + */ + +class UnhandledEngine : public LanguageBreakEngine { + private: + + /** + * The sets of characters handled, for each break type + * @internal + */ + + UnicodeSet *fHandled[4]; + + public: + + /** + * <p>Default constructor.</p> + * + */ + UnhandledEngine(UErrorCode &status); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~UnhandledEngine(); + + /** + * <p>Indicate whether this engine handles a particular character for + * a particular kind of break.</p> + * + * @param c A character which begins a run that the engine might handle + * @param breakType The type of text break which the caller wants to determine + * @return TRUE if this engine handles the particular character and break + * type. + */ + virtual UBool handles(UChar32 c, int32_t breakType) const; + + /** + * <p>Find any breaks within a run in the supplied text.</p> + * + * @param text A UText representing the text (TODO: UText). The + * iterator is left at the end of the run of characters which the engine + * is capable of handling. + * @param startPos The start of the run within the supplied text. + * @param endPos The end of the run within the supplied text. + * @param reverse Whether the caller is looking for breaks in a reverse + * direction. + * @param breakType The type of break desired, or -1. + * @param foundBreaks An allocated C array of the breaks found, if any + * @return The number of breaks found. + */ + virtual int32_t findBreaks( UText *text, + int32_t startPos, + int32_t endPos, + UBool reverse, + int32_t breakType, + UStack &foundBreaks ) const; + + /** + * <p>Tell the engine to handle a particular character and break type.</p> + * + * @param c A character which the engine should handle + * @param breakType The type of text break for which the engine should handle c + */ + virtual void handleCharacter(UChar32 c, int32_t breakType); + +}; + +/******************************************************************* + * ICULanguageBreakFactory + */ + +/** + * <p>ICULanguageBreakFactory is the default LanguageBreakFactory for + * ICU. It creates dictionary-based LanguageBreakEngines from dictionary + * data in the ICU data file.</p> + */ +class ICULanguageBreakFactory : public LanguageBreakFactory { + private: + + /** + * The stack of break engines created by this factory + * @internal + */ + + UStack *fEngines; + + public: + + /** + * <p>Standard constructor.</p> + * + */ + ICULanguageBreakFactory(UErrorCode &status); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~ICULanguageBreakFactory(); + + /** + * <p>Find and return a LanguageBreakEngine that can find the desired + * kind of break for the set of characters to which the supplied + * character belongs. It is up to the set of available engines to + * determine what the sets of characters are.</p> + * + * @param c A character that begins a run for which a LanguageBreakEngine is + * sought. + * @param breakType The kind of text break for which a LanguageBreakEngine is + * sought. + * @return A LanguageBreakEngine with the desired characteristics, or 0. + */ + virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType); + +}; + +U_NAMESPACE_END + + /* BRKENG_H */ +#endif diff --git a/Build/source/libs/icu-xetex/common/brkiter.cpp b/Build/source/libs/icu-xetex/common/brkiter.cpp index e8b10f78d27..256095bfed6 100644 --- a/Build/source/libs/icu-xetex/common/brkiter.cpp +++ b/Build/source/libs/icu-xetex/common/brkiter.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2005, International Business Machines Corporation and * +* Copyright (C) 1997-2006, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * @@ -22,16 +22,19 @@ #if !UCONFIG_NO_BREAK_ITERATION -#include "unicode/dbbi.h" +#include "unicode/rbbi.h" #include "unicode/brkiter.h" #include "unicode/udata.h" #include "unicode/ures.h" +#include "unicode/ustring.h" #include "ucln_cmn.h" #include "cstring.h" #include "mutex.h" #include "servloc.h" #include "locbased.h" #include "uresimp.h" +#include "uassert.h" +#include "ubrkimpl.h" // ***************************************************************************** // class BreakIterator @@ -45,15 +48,18 @@ U_NAMESPACE_BEGIN // ------------------------------------- BreakIterator* -BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UErrorCode &status) +BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode &status) { char fnbuff[256]; + char ext[4]={'\0'}; char actualLocale[ULOC_FULLNAME_CAPACITY]; int32_t size; const UChar* brkfname = NULL; - UResourceBundle brkRulesStack, brkNameStack; - UResourceBundle *brkRules = &brkRulesStack, *brkName = &brkNameStack; - BreakIterator *result = NULL; + UResourceBundle brkRulesStack; + UResourceBundle brkNameStack; + UResourceBundle *brkRules = &brkRulesStack; + UResourceBundle *brkName = &brkNameStack; + RuleBasedBreakIterator *result = NULL; if (U_FAILURE(status)) return NULL; @@ -62,7 +68,13 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UE ures_initStackObject(brkName); // Get the locale - UResourceBundle *b = ures_open(NULL, loc.getName(), &status); + UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, loc.getName(), &status); + /* this is a hack for now. Should be fixed when the data is fetched from + brk_index.txt */ + if(status==U_USING_DEFAULT_WARNING){ + status=U_ZERO_ERROR; + ures_openFillIn(b, U_ICUDATA_BRKITR, "", &status); + } // Get the "boundaries" array. if (U_SUCCESS(status)) { @@ -71,57 +83,48 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UBool dict, UE brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status); // Get the actual string brkfname = ures_getString(brkName, &size, &status); + U_ASSERT((size_t)size<sizeof(fnbuff)); + if ((size_t)size>=sizeof(fnbuff)) { + size=0; + if (U_SUCCESS(status)) { + status = U_BUFFER_OVERFLOW_ERROR; + } + } // Use the string if we found it if (U_SUCCESS(status) && brkfname) { uprv_strncpy(actualLocale, ures_getLocale(brkName, &status), sizeof(actualLocale)/sizeof(actualLocale[0])); - u_UCharsToChars(brkfname, fnbuff, size+1); + + UChar* extStart=u_strchr(brkfname, 0x002e); + int len = 0; + if(extStart!=NULL){ + len = extStart-brkfname; + u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff + u_UCharsToChars(brkfname, fnbuff, len); + } + fnbuff[len]=0; // nul terminate } } ures_close(brkRules); ures_close(brkName); - UDataMemory* file = udata_open(NULL, "brk", fnbuff, &status); + UDataMemory* file = udata_open(U_ICUDATA_BRKITR, ext, fnbuff, &status); if (U_FAILURE(status)) { ures_close(b); return NULL; } - // We found the break rules; now see if a dictionary is needed - if (dict) - { - UErrorCode localStatus = U_ZERO_ERROR; - brkName = &brkNameStack; - ures_initStackObject(brkName); - brkName = ures_getByKeyWithFallback(b, "BreakDictionaryData", brkName, &localStatus); -#if 0 - if (U_SUCCESS(localStatus)) { - brkfname = ures_getString(&brkname, &size, &localStatus); - } -#endif - if (U_SUCCESS(localStatus)) { -#if 0 - u_UCharsToChars(brkfname, fnbuff, size); - fnbuff[size] = '\0'; -#endif - result = new DictionaryBasedBreakIterator(file, "thaidict.brk", status); - } - ures_close(brkName); - } - - // If there is still no result but we haven't had an error, no dictionary, - // so make a non-dictionary break iterator - if (U_SUCCESS(status) && result == NULL) { - result = new RuleBasedBreakIterator(file, status); - } + // Create a RuleBasedBreakIterator + result = new RuleBasedBreakIterator(file, status); - // If there is a result, set the valid locale and actual locale + // If there is a result, set the valid locale and actual locale, and the kind if (U_SUCCESS(status) && result != NULL) { U_LOCALE_BASED(locBased, *result); locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), actualLocale); + result->setBreakType(kind); } ures_close(b); @@ -361,7 +364,7 @@ BreakIterator::getAvailableLocales(void) // ------------------------------------- BreakIterator* -BreakIterator::createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status) +BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& status) { if (U_FAILURE(status)) { return NULL; @@ -408,19 +411,19 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) BreakIterator *result = NULL; switch (kind) { case UBRK_CHARACTER: - result = BreakIterator::buildInstance(loc, "grapheme", FALSE, status); + result = BreakIterator::buildInstance(loc, "grapheme", kind, status); break; case UBRK_WORD: - result = BreakIterator::buildInstance(loc, "word", TRUE, status); + result = BreakIterator::buildInstance(loc, "word", kind, status); break; case UBRK_LINE: - result = BreakIterator::buildInstance(loc, "line", TRUE, status); + result = BreakIterator::buildInstance(loc, "line", kind, status); break; case UBRK_SENTENCE: - result = BreakIterator::buildInstance(loc, "sentence", FALSE, status); + result = BreakIterator::buildInstance(loc, "sentence", kind, status); break; case UBRK_TITLE: - result = BreakIterator::buildInstance(loc, "title", FALSE, status); + result = BreakIterator::buildInstance(loc, "title", kind, status); break; default: status = U_ILLEGAL_ARGUMENT_ERROR; diff --git a/Build/source/libs/icu-xetex/common/caniter.cpp b/Build/source/libs/icu-xetex/common/caniter.cpp index 731e24398da..04d48ba8fce 100644 --- a/Build/source/libs/icu-xetex/common/caniter.cpp +++ b/Build/source/libs/icu-xetex/common/caniter.cpp @@ -1,6 +1,6 @@ /* ***************************************************************************** - * Copyright (C) 1996-2004, International Business Machines Corporation and * + * Copyright (C) 1996-2006, International Business Machines Corporation and * * others. All Rights Reserved. * ***************************************************************************** */ @@ -51,29 +51,7 @@ Results for: {LATIN CAPITAL LETTER A WITH RING ABOVE}{LATIN SMALL LETTER D}{COMB *@author M. Davis *@draft */ -#if 0 -static UBool PROGRESS = FALSE; -#include <stdio.h> -#include "unicode/translit.h" - -UErrorCode status = U_ZERO_ERROR; - -// Just for testing - remove, not thread safe. -static const char* UToS(const UnicodeString &source) { - static char buffer[256]; - buffer[source.extract(0, source.length(), buffer)] = 0; - return buffer; -} - -static const UnicodeString &Tr(const UnicodeString &source) { - static Transliterator *NAME = Transliterator::createInstance("name", UTRANS_FORWARD, status); - static UnicodeString result; - result = source; - NAME->transliterate(result); - return result; -} -#endif // public U_NAMESPACE_BEGIN @@ -111,14 +89,16 @@ void CanonicalIterator::cleanPieces() { } uprv_free(pieces); pieces = NULL; - if(pieces_lengths != NULL) { - uprv_free(pieces_lengths); - } + pieces_length = 0; + } + if(pieces_lengths != NULL) { + uprv_free(pieces_lengths); pieces_lengths = NULL; - if(current != NULL) { - uprv_free(current); - } + } + if(current != NULL) { + uprv_free(current); current = NULL; + current_length = 0; } } @@ -269,20 +249,7 @@ CleanPartialInitialization: if (list != NULL) { delete[] list; } - if (pieces != NULL) { - uprv_free(pieces); - } - pieces = NULL; - pieces_length = 0; - if(pieces_lengths != NULL) { - uprv_free(pieces_lengths); - } - pieces_lengths = NULL; - if(current != NULL) { - uprv_free(current); - } - current = NULL; - current_length = 0; + cleanPieces(); } /** @@ -293,7 +260,7 @@ CleanPartialInitialization: */ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) { if(U_FAILURE(status)) { - return; + return; } //if (PROGRESS) printf("Permute: %s\n", UToS(Tr(source))); int32_t i = 0; @@ -302,27 +269,23 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros // if zero or one character, just return a set with it // we check for length < 2 to keep from counting code points all the time if (source.length() <= 2 && source.countChar32() <= 1) { - UnicodeString *toPut = new UnicodeString(source); - /* test for NULL */ - if (toPut == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - result->put(source, toPut, status); - return; + UnicodeString *toPut = new UnicodeString(source); + /* test for NULL */ + if (toPut == 0) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + result->put(source, toPut, status); + return; } // otherwise iterate through the string, and recursively permute all the other characters UChar32 cp; - Hashtable *subpermute = new Hashtable(status); - /* test for NULL */ - if (subpermute == 0) { - status = U_MEMORY_ALLOCATION_ERROR; + Hashtable subpermute(status); + if(U_FAILURE(status)) { return; } - if (U_SUCCESS(status)) { - subpermute->setValueDeleter(uhash_deleteUnicodeString); - } + subpermute.setValueDeleter(uhash_deleteUnicodeString); for (i = 0; i < source.length(); i += UTF16_CHAR_LENGTH(cp)) { cp = source.char32At(i); @@ -338,37 +301,34 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros continue; } - subpermute->removeAll(); + subpermute.removeAll(); // see what the permutations of the characters before and after this one are //Hashtable *subpermute = permute(source.substring(0,i) + source.substring(i + UTF16.getCharCount(cp))); - permute(subPermuteString.replace(i, UTF16_CHAR_LENGTH(cp), NULL, 0), skipZeros, subpermute, status); + permute(subPermuteString.replace(i, UTF16_CHAR_LENGTH(cp), NULL, 0), skipZeros, &subpermute, status); /* Test for buffer overflows */ if(U_FAILURE(status)) { - delete subpermute; return; } // The upper replace is destructive. The question is do we have to make a copy, or we don't care about the contents // of source at this point. // prefix this character to all of them - ne = subpermute->nextElement(el); + ne = subpermute.nextElement(el); while (ne != NULL) { - UnicodeString *permRes = (UnicodeString *)(ne->value.pointer); - UnicodeString *chStr = new UnicodeString(cp); - //test for NULL - if (chStr == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - delete subpermute; - return; - } + UnicodeString *permRes = (UnicodeString *)(ne->value.pointer); + UnicodeString *chStr = new UnicodeString(cp); + //test for NULL + if (chStr == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } chStr->append(*permRes); //*((UnicodeString *)(ne->value.pointer)); //if (PROGRESS) printf(" Piece: %s\n", UToS(*chStr)); result->put(*chStr, chStr, status); - ne = subpermute->nextElement(el); + ne = subpermute.nextElement(el); } } - delete subpermute; //return result; } @@ -378,21 +338,17 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status) { Hashtable result(status); Hashtable permutations(status); + Hashtable basic(status); if (U_FAILURE(status)) { return 0; } result.setValueDeleter(uhash_deleteUnicodeString); permutations.setValueDeleter(uhash_deleteUnicodeString); + basic.setValueDeleter(uhash_deleteUnicodeString); UChar USeg[256]; int32_t segLen = segment.extract(USeg, 256, status); - Hashtable *basic = getEquivalents2(USeg, segLen, status); - //Hashtable *basic = getEquivalents2(segment, segLen, status); - if (basic == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - delete basic; - return 0; - } + getEquivalents2(&basic, USeg, segLen, status); // now get all the permutations // add only the ones that are canonically equivalent @@ -401,7 +357,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i const UHashElement *ne = NULL; int32_t el = -1; //Iterator it = basic.iterator(); - ne = basic->nextElement(el); + ne = basic.nextElement(el); //while (it.hasNext()) while (ne != NULL) { //String item = (String) it.next(); @@ -432,12 +388,11 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i ne2 = permutations.nextElement(el2); } - ne = basic->nextElement(el); + ne = basic.nextElement(el); } /* Test for buffer overflows */ if(U_FAILURE(status)) { - delete basic; return 0; } // convert into a String[] to clean up storage @@ -446,50 +401,39 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i int32_t resultCount; if((resultCount = result.count())) { finalResult = new UnicodeString[resultCount]; - } else { - status = U_ILLEGAL_ARGUMENT_ERROR; - } - /* test for NULL */ - if (finalResult == 0) { - if(U_SUCCESS(status)) { + if (finalResult == 0) { status = U_MEMORY_ALLOCATION_ERROR; + return NULL; } - delete basic; - return 0; + } + else { + status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; } //result.toArray(finalResult); result_len = 0; el = -1; ne = result.nextElement(el); while(ne != NULL) { - UnicodeString finResult = *((UnicodeString *)(ne->value.pointer)); - finalResult[result_len++] = finResult; + finalResult[result_len++] = *((UnicodeString *)(ne->value.pointer)); ne = result.nextElement(el); } - delete basic; return finalResult; } -Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segLen, UErrorCode &status) { -//Hashtable *CanonicalIterator::getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status) { +Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status) { - Hashtable *result = new Hashtable(status); - /* test for NULL */ - if (result == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - if (U_SUCCESS(status)) { - result->setValueDeleter(uhash_deleteUnicodeString); + if (U_FAILURE(status)) { + return NULL; } //if (PROGRESS) printf("Adding: %s\n", UToS(Tr(segment))); UnicodeString toPut(segment, segLen); - result->put(toPut, new UnicodeString(toPut), status); + fillinResult->put(toPut, new UnicodeString(toPut), status); USerializedSet starts; @@ -500,48 +444,45 @@ Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segL // see if any character is at the start of some decomposition UTF_GET_CHAR(segment, 0, i, segLen, cp); if (!unorm_getCanonStartSet(cp, &starts)) { - continue; + continue; } // if so, see which decompositions match for(j = 0, cp = end+1; cp <= end || uset_getSerializedRange(&starts, j++, &cp, &end); ++cp) { - //Hashtable *remainder = extract(cp, segment, segLen, i, status); - Hashtable *remainder = extract(cp, segment, segLen, i, status); - if (remainder == NULL) continue; + Hashtable remainder(status); + remainder.setValueDeleter(uhash_deleteUnicodeString); + if (extract(&remainder, cp, segment, segLen, i, status) == NULL) { + continue; + } // there were some matches, so add all the possibilities to the set. UnicodeString prefix(segment, i); prefix += cp; - const UHashElement *ne = NULL; int32_t el = -1; - ne = remainder->nextElement(el); + const UHashElement *ne = remainder.nextElement(el); while (ne != NULL) { UnicodeString item = *((UnicodeString *)(ne->value.pointer)); UnicodeString *toAdd = new UnicodeString(prefix); /* test for NULL */ if (toAdd == 0) { status = U_MEMORY_ALLOCATION_ERROR; - delete result; - delete remainder; - return 0; + return NULL; } *toAdd += item; - result->put(*toAdd, toAdd, status); + fillinResult->put(*toAdd, toAdd, status); //if (PROGRESS) printf("Adding: %s\n", UToS(Tr(*toAdd))); - ne = remainder->nextElement(el); + ne = remainder.nextElement(el); } - - delete remainder; } } /* Test for buffer overflows */ if(U_FAILURE(status)) { - return 0; + return NULL; } - return result; + return fillinResult; } /** @@ -549,11 +490,15 @@ Hashtable *CanonicalIterator::getEquivalents2(const UChar *segment, int32_t segL * (with canonical rearrangment!) * If so, take the remainder, and return the equivalents */ -Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) { +Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) { //Hashtable *CanonicalIterator::extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) { //if (PROGRESS) printf(" extract: %s, ", UToS(Tr(UnicodeString(comp)))); //if (PROGRESS) printf("%s, %i\n", UToS(Tr(segment)), segmentPos); + if (U_FAILURE(status)) { + return NULL; + } + const int32_t bufSize = 256; int32_t bufLen = 0; UChar temp[bufSize]; @@ -588,7 +533,7 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_ i = segmentPos; while(i < segLen) { - UTF_NEXT_CHAR(segment, i, segLen, cp); + UTF_NEXT_CHAR(segment, i, segLen, cp); if (cp == decompCp) { // if equal, eat another cp from decomp @@ -635,20 +580,14 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_ */ } } - if (!ok) return NULL; // we failed, characters left over + if (!ok) + return NULL; // we failed, characters left over //if (PROGRESS) printf("Matches\n"); if (bufLen == 0) { - Hashtable *result = new Hashtable(status); - /* test for NULL */ - if (result == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return 0; - } - result->setValueDeleter(uhash_deleteUnicodeString); - result->put(UnicodeString(), new UnicodeString(), status); - return result; // succeed, but no remainder + fillinResult->put(UnicodeString(), new UnicodeString(), status); + return fillinResult; // succeed, but no remainder } // brute force approach @@ -658,16 +597,13 @@ Hashtable *CanonicalIterator::extract(UChar32 comp, const UChar *segment, int32_ UChar trial[bufSize]; unorm_decompose(trial, bufSize, temp, tempLen, FALSE, 0, &status); - /* Test for buffer overflows */ - if(U_FAILURE(status)) { - return 0; - } - - if(uprv_memcmp(segment+segmentPos, trial, (segLen - segmentPos)*sizeof(UChar)) != 0) { - return NULL; + if(U_FAILURE(status) + || uprv_memcmp(segment+segmentPos, trial, (segLen - segmentPos)*sizeof(UChar)) != 0) + { + return NULL; } - return getEquivalents2(buff, bufLen, status); + return getEquivalents2(fillinResult, buff, bufLen, status); } U_NAMESPACE_END diff --git a/Build/source/libs/icu-xetex/common/common.vcproj b/Build/source/libs/icu-xetex/common/common.vcproj index 66159fdefef..a30a33c7fbc 100644 --- a/Build/source/libs/icu-xetex/common/common.vcproj +++ b/Build/source/libs/icu-xetex/common/common.vcproj @@ -27,6 +27,7 @@ RuntimeLibrary="2" EnableFunctionLevelLinking="TRUE" DisableLanguageExtensions="TRUE" + TreatWChar_tAsBuiltInType="TRUE" PrecompiledHeaderFile=".\Release/common.pch" AssemblerListingLocation=".\Release/" ObjectFile=".\Release/" @@ -38,10 +39,10 @@ Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - OutputFile="..\..\bin\icuuc34.dll" + OutputFile="..\..\bin\icuuc36.dll" LinkIncremental="1" SuppressStartupBanner="TRUE" - ProgramDatabaseFile=".\..\..\lib\icuuc34.pdb" + ProgramDatabaseFile=".\..\..\lib\icuuc36.pdb" EnableCOMDATFolding="2" BaseAddress="0x4a800000" ImportLibrary="..\..\lib\icuuc.lib"/> @@ -90,6 +91,7 @@ RuntimeLibrary="3" BufferSecurityCheck="TRUE" DisableLanguageExtensions="TRUE" + TreatWChar_tAsBuiltInType="TRUE" PrecompiledHeaderFile=".\Debug/common.pch" AssemblerListingLocation=".\Debug/" ObjectFile=".\Debug/" @@ -102,11 +104,11 @@ Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - OutputFile="..\..\bin\icuuc34d.dll" + OutputFile="..\..\bin\icuuc36d.dll" LinkIncremental="2" SuppressStartupBanner="TRUE" GenerateDebugInformation="TRUE" - ProgramDatabaseFile=".\..\..\lib\icuuc34d.pdb" + ProgramDatabaseFile=".\..\..\lib\icuuc36d.pdb" BaseAddress="0x4a800000" ImportLibrary="..\..\lib\icuucd.lib"/> <Tool @@ -208,10 +210,10 @@ Name="break iteration" Filter=""> <File - RelativePath=".\brkdict.cpp"> + RelativePath=".\brkeng.cpp"> </File> <File - RelativePath=".\brkdict.h"> + RelativePath=".\brkeng.h"> </File> <File RelativePath=".\brkiter.cpp"> @@ -236,9 +238,6 @@ </FileConfiguration> </File> <File - RelativePath=".\dbbi.cpp"> - </File> - <File RelativePath=".\unicode\dbbi.h"> <FileConfiguration Name="Release|Win32"> @@ -258,10 +257,10 @@ </FileConfiguration> </File> <File - RelativePath=".\dbbi_tbl.cpp"> + RelativePath=".\dictbe.cpp"> </File> <File - RelativePath=".\dbbi_tbl.h"> + RelativePath=".\dictbe.h"> </File> <File RelativePath=".\rbbi.cpp"> @@ -328,6 +327,12 @@ RelativePath=".\rbbitblb.h"> </File> <File + RelativePath=".\triedict.cpp"> + </File> + <File + RelativePath=".\triedict.h"> + </File> + <File RelativePath=".\ubrk.cpp"> </File> <File @@ -349,6 +354,9 @@ Outputs="..\..\include\unicode\$(InputFileName)"/> </FileConfiguration> </File> + <File + RelativePath=".\ubrkimpl.h"> + </File> </Filter> <Filter Name="collation" @@ -404,12 +412,6 @@ RelativePath=".\uarrsort.h"> </File> <File - RelativePath=".\ucmp8.c"> - </File> - <File - RelativePath=".\ucmp8.h"> - </File> - <File RelativePath=".\uenum.c"> </File> <File @@ -625,6 +627,25 @@ </FileConfiguration> </File> <File + RelativePath=".\unicode\uintrnal.h"> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCustomBuildTool" + CommandLine="copy "$(InputPath)" ..\..\include\unicode +" + Outputs="..\..\include\unicode\$(InputFileName)"/> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCustomBuildTool" + CommandLine="copy "$(InputPath)" ..\..\include\unicode +" + Outputs="..\..\include\unicode\$(InputFileName)"/> + </FileConfiguration> + </File> + <File RelativePath=".\unicode\umachine.h"> <FileConfiguration Name="Release|Win32"> @@ -644,6 +665,9 @@ </FileConfiguration> </File> <File + RelativePath=".\umath.c"> + </File> + <File RelativePath=".\umutex.c"> <FileConfiguration Name="Release|Win32"> @@ -700,6 +724,25 @@ </FileConfiguration> </File> <File + RelativePath=".\unicode\usystem.h"> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCustomBuildTool" + CommandLine="copy "$(InputPath)" ..\..\include\unicode +" + Outputs="..\..\include\unicode\$(InputFileName)"/> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCustomBuildTool" + CommandLine="copy "$(InputPath)" ..\..\include\unicode +" + Outputs="..\..\include\unicode\$(InputFileName)"/> + </FileConfiguration> + </File> + <File RelativePath=".\utrace.c"> </File> <File @@ -765,6 +808,24 @@ Outputs="..\..\include\unicode\$(InputFileName)"/> </FileConfiguration> </File> + <File + RelativePath=".\wintz.c"> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + DisableLanguageExtensions="FALSE"/> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + DisableLanguageExtensions="FALSE"/> + </FileConfiguration> + </File> + <File + RelativePath=".\wintz.h"> + </File> </Filter> <Filter Name="conversion" @@ -1104,6 +1165,9 @@ <File RelativePath=".\util.h"> </File> + <File + RelativePath=".\util_props.cpp"> + </File> </Filter> <Filter Name="idna" @@ -2031,4 +2095,4 @@ </Files> <Globals> </Globals> -</VisualStudioProject> +</VisualStudioProject>
\ No newline at end of file diff --git a/Build/source/libs/icu-xetex/common/cpputils.h b/Build/source/libs/icu-xetex/common/cpputils.h index de09aea1427..c1b439c7ff8 100644 --- a/Build/source/libs/icu-xetex/common/cpputils.h +++ b/Build/source/libs/icu-xetex/common/cpputils.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -15,6 +15,7 @@ #define CPPUTILS_H #include "unicode/utypes.h" +#include "unicode/unistr.h" #include "cmemory.h" /*==========================================================================*/ @@ -63,4 +64,21 @@ uprv_arrayCopy(const UChar *src, int32_t srcStart, UChar *dst, int32_t dstStart, int32_t count) { uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); } +/** + * Copy an array of UnicodeString OBJECTS (not pointers). + * @internal + */ +static inline void +uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t count) +{ while(count-- > 0) *dst++ = *src++; } + +/** + * Copy an array of UnicodeString OBJECTS (not pointers). + * @internal + */ +static inline void +uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, int32_t srcStart, + U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t dstStart, int32_t count) +{ uprv_arrayCopy(src+srcStart, dst+dstStart, count); } + #endif /* _CPPUTILS */ diff --git a/Build/source/libs/icu-xetex/common/dbbi.cpp b/Build/source/libs/icu-xetex/common/dbbi.cpp deleted file mode 100644 index 9f4928473f8..00000000000 --- a/Build/source/libs/icu-xetex/common/dbbi.cpp +++ /dev/null @@ -1,637 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2005 IBM Corp. All rights reserved. -********************************************************************** -* Date Name Description -* 12/1/99 rgillam Complete port from Java. -* 01/13/2000 helena Added UErrorCode to ctors. -********************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_BREAK_ITERATION - -#include "unicode/dbbi.h" -#include "unicode/schriter.h" -#include "dbbi_tbl.h" -#include "uvector.h" -#include "cmemory.h" -#include "uassert.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DictionaryBasedBreakIterator) - - -//------------------------------------------------------------------------------ -// -// constructors -// -//------------------------------------------------------------------------------ - -DictionaryBasedBreakIterator::DictionaryBasedBreakIterator() : -RuleBasedBreakIterator() { - init(); -} - - -DictionaryBasedBreakIterator::DictionaryBasedBreakIterator(UDataMemory* rbbiData, - const char* dictionaryFilename, - UErrorCode& status) -: RuleBasedBreakIterator(rbbiData, status) -{ - init(); - if (U_FAILURE(status)) {return;}; - fTables = new DictionaryBasedBreakIteratorTables(dictionaryFilename, status); - if (U_FAILURE(status)) { - if (fTables != NULL) { - fTables->removeReference(); - fTables = NULL; - } - return; - } - /* test for NULL */ - if(fTables == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } -} - - -DictionaryBasedBreakIterator::DictionaryBasedBreakIterator(const DictionaryBasedBreakIterator &other) : -RuleBasedBreakIterator(other) -{ - init(); - if (other.fTables != NULL) { - fTables = other.fTables; - fTables->addReference(); - } -} - - - - -//------------------------------------------------------------------------------ -// -// Destructor -// -//------------------------------------------------------------------------------ -DictionaryBasedBreakIterator::~DictionaryBasedBreakIterator() -{ - uprv_free(cachedBreakPositions); - cachedBreakPositions = NULL; - if (fTables != NULL) {fTables->removeReference();}; -} - -//------------------------------------------------------------------------------ -// -// Assignment operator. Sets this iterator to have the same behavior, -// and iterate over the same text, as the one passed in. -// -//------------------------------------------------------------------------------ -DictionaryBasedBreakIterator& -DictionaryBasedBreakIterator::operator=(const DictionaryBasedBreakIterator& that) { - if (this == &that) { - return *this; - } - reset(); // clears out cached break positions. - RuleBasedBreakIterator::operator=(that); - if (this->fTables != that.fTables) { - if (this->fTables != NULL) {this->fTables->removeReference();}; - this->fTables = that.fTables; - if (this->fTables != NULL) {this->fTables->addReference();}; - } - return *this; -} - -//------------------------------------------------------------------------------ -// -// Clone() Returns a newly-constructed RuleBasedBreakIterator with the same -// behavior, and iterating over the same text, as this one. -// -//------------------------------------------------------------------------------ -BreakIterator* -DictionaryBasedBreakIterator::clone() const { - return new DictionaryBasedBreakIterator(*this); -} - -//======================================================================= -// BreakIterator overrides -//======================================================================= - -/** - * Advances the iterator one step backwards. - * @return The position of the last boundary position before the - * current iteration position - */ -int32_t -DictionaryBasedBreakIterator::previous() -{ - // if we have cached break positions and we're still in the range - // covered by them, just move one step backward in the cache - if (cachedBreakPositions != NULL && positionInCache > 0) { - --positionInCache; - fText->setIndex(cachedBreakPositions[positionInCache]); - return cachedBreakPositions[positionInCache]; - } - - // otherwise, dump the cache and use the inherited previous() method to move - // backward. This may fill up the cache with new break positions, in which - // case we have to mark our position in the cache - else { - reset(); - int32_t result = RuleBasedBreakIterator::previous(); - if (cachedBreakPositions != NULL) { - for (positionInCache=0; - cachedBreakPositions[positionInCache] != result; - positionInCache++); - U_ASSERT(positionInCache < numCachedBreakPositions); - if (positionInCache >= numCachedBreakPositions) { - // Something has gone wrong. Dump the cache. - reset(); - } - } - return result; - } -} - -/** - * Sets the current iteration position to the last boundary position - * before the specified position. - * @param offset The position to begin searching from - * @return The position of the last boundary before "offset" - */ -int32_t -DictionaryBasedBreakIterator::preceding(int32_t offset) -{ - // if the offset passed in is already past the end of the text, - // just return DONE; if it's before the beginning, return the - // text's starting offset - if (fText == NULL || offset > fText->endIndex()) { - return BreakIterator::DONE; - } - else if (offset < fText->startIndex()) { - return fText->startIndex(); - } - - // if we have no cached break positions, or "offset" is outside the - // range covered by the cache, we can just call the inherited routine - // (which will eventually call other routines in this class that may - // refresh the cache) - if (cachedBreakPositions == NULL || offset <= cachedBreakPositions[0] || - offset > cachedBreakPositions[numCachedBreakPositions - 1]) { - reset(); - return RuleBasedBreakIterator::preceding(offset); - } - - // on the other hand, if "offset" is within the range covered by the cache, - // then all we have to do is search the cache for the last break position - // before "offset" - else { - positionInCache = 0; - while (positionInCache < numCachedBreakPositions - && offset > cachedBreakPositions[positionInCache]) - ++positionInCache; - --positionInCache; - fText->setIndex(cachedBreakPositions[positionInCache]); - return fText->getIndex(); - } -} - -/** - * Sets the current iteration position to the first boundary position after - * the specified position. - * @param offset The position to begin searching forward from - * @return The position of the first boundary after "offset" - */ -int32_t -DictionaryBasedBreakIterator::following(int32_t offset) -{ - // if the offset passed in is already past the end of the text, - // just return DONE; if it's before the beginning, return the - // text's starting offset - if (fText == NULL || offset > fText->endIndex()) { - return BreakIterator::DONE; - } - else if (offset < fText->startIndex()) { - return fText->startIndex(); - } - - // if we have no cached break positions, or if "offset" is outside the - // range covered by the cache, then dump the cache and call our - // inherited following() method. This will call other methods in this - // class that may refresh the cache. - if (cachedBreakPositions == NULL || offset < cachedBreakPositions[0] || - offset >= cachedBreakPositions[numCachedBreakPositions - 1]) { - reset(); - return RuleBasedBreakIterator::following(offset); - } - - // on the other hand, if "offset" is within the range covered by the - // cache, then just search the cache for the first break position - // after "offset" - else { - positionInCache = 0; - while (positionInCache < numCachedBreakPositions - && offset >= cachedBreakPositions[positionInCache]) - ++positionInCache; - fText->setIndex(cachedBreakPositions[positionInCache]); - return fText->getIndex(); - } -} - -/** - * This is the implementation function for next(). - */ -int32_t -DictionaryBasedBreakIterator::handleNext() -{ - UErrorCode status = U_ZERO_ERROR; - // if there are no cached break positions, or if we've just moved - // off the end of the range covered by the cache, we have to dump - // and possibly regenerate the cache - if (cachedBreakPositions == NULL || positionInCache == numCachedBreakPositions - 1) { - - // start by using the inherited handleNext() to find a tentative return - // value. dictionaryCharCount tells us how many dictionary characters - // we passed over on our way to the tentative return value - int32_t startPos = fText->getIndex(); - fDictionaryCharCount = 0; - int32_t result = RuleBasedBreakIterator::handleNext(); - - // if we passed over more than one dictionary character, then we use - // divideUpDictionaryRange() to regenerate the cached break positions - // for the new range - if (fDictionaryCharCount > 1 && result - startPos > 1) { - divideUpDictionaryRange(startPos, result, status); - U_ASSERT(U_SUCCESS(status)); - if (U_FAILURE(status)) { - // Something went badly wrong, an internal error. - // We have no way from here to report it to caller. - // Treat as if this is if the dictionary did not apply to range. - reset(); - return result; - } - } - - // otherwise, the value we got back from the inherited fuction - // is our return value, and we can dump the cache - else { - reset(); - return result; - } - } - - // if the cache of break positions has been regenerated (or existed all - // along), then just advance to the next break position in the cache - // and return it - if (cachedBreakPositions != NULL) { - ++positionInCache; - fText->setIndex(cachedBreakPositions[positionInCache]); - return cachedBreakPositions[positionInCache]; - } - return -9999; // SHOULD NEVER GET HERE! -} - -void -DictionaryBasedBreakIterator::reset() -{ - uprv_free(cachedBreakPositions); - cachedBreakPositions = NULL; - numCachedBreakPositions = 0; - fDictionaryCharCount = 0; - positionInCache = 0; -} - - - -//------------------------------------------------------------------------------ -// -// init() Common initialization routine, for use by constructors, etc. -// -//------------------------------------------------------------------------------ -void DictionaryBasedBreakIterator::init() { - cachedBreakPositions = NULL; - fTables = NULL; - numCachedBreakPositions = 0; - fDictionaryCharCount = 0; - positionInCache = 0; -} - - -//------------------------------------------------------------------------------ -// -// BufferClone -// -//------------------------------------------------------------------------------ -BreakIterator * DictionaryBasedBreakIterator::createBufferClone(void *stackBuffer, - int32_t &bufferSize, - UErrorCode &status) -{ - if (U_FAILURE(status)){ - return NULL; - } - - // - // If user buffer size is zero this is a preflight operation to - // obtain the needed buffer size, allowing for worst case misalignment. - // - if (bufferSize == 0) { - bufferSize = sizeof(DictionaryBasedBreakIterator) + U_ALIGNMENT_OFFSET_UP(0); - return NULL; - } - - // - // Check the alignment and size of the user supplied buffer. - // Allocate heap memory if the user supplied memory is insufficient. - // - char *buf = (char *)stackBuffer; - uint32_t s = bufferSize; - - if (stackBuffer == NULL) { - s = 0; // Ignore size, force allocation if user didn't give us a buffer. - } - if (U_ALIGNMENT_OFFSET(stackBuffer) != 0) { - int32_t offsetUp = (int32_t)U_ALIGNMENT_OFFSET_UP(buf); - s -= offsetUp; - buf += offsetUp; - } - if (s < sizeof(DictionaryBasedBreakIterator)) { - buf = (char *) new DictionaryBasedBreakIterator(); - if (buf == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - status = U_SAFECLONE_ALLOCATED_WARNING; - } - - // - // Initialize the clone object. - // TODO: using an overloaded C++ "operator new" to directly initialize the - // copy in the user's buffer would be better, but it doesn't seem - // to get along with namespaces. Investigate why. - // - // The memcpy is only safe with an empty (default constructed) - // break iterator. Use on others can screw up reference counts - // to data. memcpy-ing objects is not really a good idea... - // - DictionaryBasedBreakIterator localIter; // Empty break iterator, source for memcpy - DictionaryBasedBreakIterator *clone = (DictionaryBasedBreakIterator *)buf; - uprv_memcpy(clone, &localIter, sizeof(DictionaryBasedBreakIterator)); // clone = empty, but initialized, iterator. - *clone = *this; // clone = the real one we want. - if (status != U_SAFECLONE_ALLOCATED_WARNING) { - clone->fBufferClone = TRUE; - } - return clone; -} - - - - -/** - * This is the function that actually implements the dictionary-based - * algorithm. Given the endpoints of a range of text, it uses the - * dictionary to determine the positions of any boundaries in this - * range. It stores all the boundary positions it discovers in - * cachedBreakPositions so that we only have to do this work once - * for each time we enter the range. - */ -void -DictionaryBasedBreakIterator::divideUpDictionaryRange(int32_t startPos, int32_t endPos, UErrorCode &status) -{ - // the range we're dividing may begin or end with non-dictionary characters - // (i.e., for line breaking, we may have leading or trailing punctuation - // that needs to be kept with the word). Seek from the beginning of the - // range to the first dictionary character - fText->setIndex(startPos); - UChar32 c = fText->current32(); - while (isDictionaryChar(c) == FALSE) { - c = fText->next32(); - } - - if (U_FAILURE(status)) { - return; // UStack below overwrites the status error codes - } - - // initialize. We maintain two stacks: currentBreakPositions contains - // the list of break positions that will be returned if we successfully - // finish traversing the whole range now. possibleBreakPositions lists - // all other possible word ends we've passed along the way. (Whenever - // we reach an error [a sequence of characters that can't begin any word - // in the dictionary], we back up, possibly delete some breaks from - // currentBreakPositions, move a break from possibleBreakPositions - // to currentBreakPositions, and start over from there. This process - // continues in this way until we either successfully make it all the way - // across the range, or exhaust all of our combinations of break - // positions.) wrongBreakPositions is used to keep track of paths we've - // tried on previous iterations. As the iterator backs up further and - // further, this saves us from having to follow each possible path - // through the text all the way to the error (hopefully avoiding many - // future recursive calls as well). - // there can be only one kind of error in UStack and UVector, so we'll - // just let the error fall through - UStack currentBreakPositions(status); - UStack possibleBreakPositions(status); - UVector wrongBreakPositions(status); - - // the dictionary is implemented as a trie, which is treated as a state - // machine. -1 represents the end of a legal word. Every word in the - // dictionary is represented by a path from the root node to -1. A path - // that ends in state 0 is an illegal combination of characters. - int16_t state = 0; - - // these two variables are used for error handling. We keep track of the - // farthest we've gotten through the range being divided, and the combination - // of breaks that got us that far. If we use up all possible break - // combinations, the text contains an error or a word that's not in the - // dictionary. In this case, we "bless" the break positions that got us the - // farthest as real break positions, and then start over from scratch with - // the character where the error occurred. - int32_t farthestEndPoint = fText->getIndex(); - UStack bestBreakPositions(status); - UBool bestBreakPositionsInitialized = FALSE; - - if (U_FAILURE(status)) { - return; - } - // initialize (we always exit the loop with a break statement) - c = fText->current32(); - for (;;) { - // The dictionary implementation doesn't do supplementary chars. - // Put them through as an unpaired surrogate, which - // will end any dictionary match in progress. - // With any luck, this dictionary implementation will be retired soon. - if (c>0x10000) { - c = 0xd800; - } - - // if we can transition to state "-1" from our current state, we're - // on the last character of a legal word. Push that position onto - // the possible-break-positions stack - if (fTables->fDictionary->at(state, (int32_t)0) == -1) { - possibleBreakPositions.push(fText->getIndex(), status); - if (U_FAILURE(status)) { - return; - } - } - - // look up the new state to transition to in the dictionary - state = fTables->fDictionary->at(state, (UChar)c); - - // if the character we're sitting on causes us to transition to - // the "end of word" state, then it was a non-dictionary character - // and we've successfully traversed the whole range. Drop out - // of the loop. - if (state == -1) { - currentBreakPositions.push(fText->getIndex(), status); - if (U_FAILURE(status)) { - return; - } - break; - } - - // if the character we're sitting on causes us to transition to - // the error state, or if we've gone off the end of the range - // without transitioning to the "end of word" state, we've hit - // an error... - else if (state == 0 || fText->getIndex() >= endPos) { - - // if this is the farthest we've gotten, take note of it in - // case there's an error in the text - if (fText->getIndex() > farthestEndPoint) { - farthestEndPoint = fText->getIndex(); - bestBreakPositions.removeAllElements(); - bestBreakPositionsInitialized = TRUE; - for (int32_t i = 0; i < currentBreakPositions.size(); i++) { - bestBreakPositions.push(currentBreakPositions.elementAti(i), status); - } - } - - // wrongBreakPositions is a list of all break positions we've tried starting - // that didn't allow us to traverse all the way through the text. Every time - // we pop a break position off of currentBreakPositions, we put it into - // wrongBreakPositions to avoid trying it again later. If we make it to this - // spot, we're either going to back up to a break in possibleBreakPositions - // and try starting over from there, or we've exhausted all possible break - // positions and are going to do the fallback procedure. This loop prevents - // us from messing with anything in possibleBreakPositions that didn't work as - // a starting point the last time we tried it (this is to prevent a bunch of - // repetitive checks from slowing down some extreme cases) - while (!possibleBreakPositions.isEmpty() && wrongBreakPositions.contains( - possibleBreakPositions.peeki())) { - possibleBreakPositions.popi(); - } - - // if we've used up all possible break-position combinations, there's - // an error or an unknown word in the text. In this case, we start - // over, treating the farthest character we've reached as the beginning - // of the range, and "blessing" the break positions that got us that - // far as real break positions - if (possibleBreakPositions.isEmpty()) { - if (bestBreakPositionsInitialized) { - currentBreakPositions.removeAllElements(); - for (int32_t i = 0; i < bestBreakPositions.size(); i++) { - currentBreakPositions.push(bestBreakPositions.elementAti(i), status); - if (U_FAILURE(status)) { - return; - } - } - bestBreakPositions.removeAllElements(); - if (farthestEndPoint < endPos) { - fText->setIndex(farthestEndPoint); - fText->next32(); - } - else { - break; - } - } - else { - if ((currentBreakPositions.isEmpty() - || currentBreakPositions.peeki() != fText->getIndex()) - && fText->getIndex() != startPos) { - currentBreakPositions.push(fText->getIndex(), status); - if (U_FAILURE(status)) { - return; - } - } - fText->next32(); - currentBreakPositions.push(fText->getIndex(), status); - if (U_FAILURE(status)) { - return; - } - } - } - - // if we still have more break positions we can try, then promote the - // last break in possibleBreakPositions into currentBreakPositions, - // and get rid of all entries in currentBreakPositions that come after - // it. Then back up to that position and start over from there (i.e., - // treat that position as the beginning of a new word) - else { - int32_t temp = possibleBreakPositions.popi(); - int32_t temp2 = 0; - while (!currentBreakPositions.isEmpty() && temp < - currentBreakPositions.peeki()) { - temp2 = currentBreakPositions.popi(); - wrongBreakPositions.addElement(temp2, status); - } - currentBreakPositions.push(temp, status); - fText->setIndex(currentBreakPositions.peeki()); - } - - // re-sync "c" for the next go-round, and drop out of the loop if - // we've made it off the end of the range - c = fText->current32(); - if (fText->getIndex() >= endPos) { - break; - } - } - - // if we didn't hit any exceptional conditions on this last iteration, - // just advance to the next character and loop - else { - c = fText->next32(); - } - } - - // dump the last break position in the list, and replace it with the actual - // end of the range (which may be the same character, or may be further on - // because the range actually ended with non-dictionary characters we want to - // keep with the word) - if (!currentBreakPositions.isEmpty()) { - currentBreakPositions.popi(); - } - currentBreakPositions.push(endPos, status); - if (U_FAILURE(status)) { - return; - } - - // create a regular array to hold the break positions and copy - // the break positions from the stack to the array (in addition, - // our starting position goes into this array as a break position). - // This array becomes the cache of break positions used by next() - // and previous(), so this is where we actually refresh the cache. - if (cachedBreakPositions != NULL) { - uprv_free(cachedBreakPositions); - } - cachedBreakPositions = (int32_t *)uprv_malloc((currentBreakPositions.size() + 1) * sizeof(int32_t)); - /* Test for NULL */ - if(cachedBreakPositions == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - numCachedBreakPositions = currentBreakPositions.size() + 1; - cachedBreakPositions[0] = startPos; - - for (int32_t i = 0; i < currentBreakPositions.size(); i++) { - cachedBreakPositions[i + 1] = currentBreakPositions.elementAti(i); - } - positionInCache = 0; -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ - -/* eof */ diff --git a/Build/source/libs/icu-xetex/common/dbbi_tbl.cpp b/Build/source/libs/icu-xetex/common/dbbi_tbl.cpp deleted file mode 100644 index 29eb3eb8b38..00000000000 --- a/Build/source/libs/icu-xetex/common/dbbi_tbl.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2002 IBM Corp. All rights reserved. -********************************************************************** -* Date Name Description -* 12/1/99 rgillam Complete port from Java. -* 01/13/2000 helena Added UErrorCode to ctors. -* 06/14/2002 andy Gutted for new RBBI impl. -********************************************************************** -*/ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_BREAK_ITERATION - -#include "dbbi_tbl.h" -#include "unicode/dbbi.h" -#include "umutex.h" - -U_NAMESPACE_BEGIN - -//======================================================================= -// constructor -//======================================================================= - -DictionaryBasedBreakIteratorTables::DictionaryBasedBreakIteratorTables( - const char* dictionaryFilename, - UErrorCode &status) { - fDictionary = new BreakDictionary(dictionaryFilename, status); - fRefCount = 1; -} - - -void DictionaryBasedBreakIteratorTables::addReference() { - umtx_atomic_inc(&fRefCount); -} - - -void DictionaryBasedBreakIteratorTables::removeReference() { - if (umtx_atomic_dec(&fRefCount) == 0) { - delete this; - } -} - - -/** - * Destructor - */ -DictionaryBasedBreakIteratorTables::~DictionaryBasedBreakIteratorTables() { - delete fDictionary; - fDictionary = NULL; -} - - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ - -/* eof */ diff --git a/Build/source/libs/icu-xetex/common/dbbi_tbl.h b/Build/source/libs/icu-xetex/common/dbbi_tbl.h deleted file mode 100644 index 70728e3f894..00000000000 --- a/Build/source/libs/icu-xetex/common/dbbi_tbl.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 1999-2000 IBM Corp. All rights reserved. -********************************************************************** -* Date Name Description -* 12/1/99 rgillam Complete port from Java. -* 01/13/2000 helena Added UErrorCode to ctors. -********************************************************************** -*/ - -#ifndef DBBI_TBL_H -#define DBBI_TBL_H - -#include "unicode/utypes.h" -#include "unicode/uobject.h" -#include "unicode/udata.h" -#include "brkdict.h" - -U_NAMESPACE_BEGIN - -/* forward declaration */ -class DictionaryBasedBreakIterator; - -// -// DictionaryBasedBreakIteratorTables -// -// This class sits between instances of DictionaryBasedBreakIterator -// and the dictionary data itself, which is of type BreakDictionary. -// It provides reference counting, allowing multiple copies of a -// DictionaryBasedBreakIterator to share a single instance of -// BreakDictionary. -// -// TODO: it'd probably be cleaner to add the reference counting to -// BreakDictionary and get rid of this class, but doing it this way -// was a convenient transition from earlier code, and time is short... -// -class DictionaryBasedBreakIteratorTables : public UMemory { - -private: - int32_t fRefCount; - - -public: - //======================================================================= - // constructor - //======================================================================= - /* @param dictionaryFilename The name of the dictionary file - * @param status The error code - * @return the newly created DictionaryBasedBreakIteratorTables - **/ - DictionaryBasedBreakIteratorTables(const char* dictionaryFilename, - UErrorCode& status); - - BreakDictionary *fDictionary; - void addReference(); - void removeReference(); - /** - * Destructor. Should not be used directly. Use removeReference() istead. - * (Not private to avoid compiler warnings.) - */ - virtual ~DictionaryBasedBreakIteratorTables(); - -private: - /** - * The copy constructor is declared private and not implemented. - * THIS CLASS MAY NOT BE COPIED. - * @param that The DictionaryBasedBreakIteratorTables to be copied. - * @return the newly constructed DictionaryBasedBreakIteratorTables. - */ - DictionaryBasedBreakIteratorTables(const DictionaryBasedBreakIteratorTables& that); - - //======================================================================= - // boilerplate - //======================================================================= - - - /** - * The assignment operator is declared private and not implemented. - * THIS CLASS MAY NOT BE COPIED. - * Call addReference() and share an existing copy instead. - * @that The object to be copied - * @return the newly created DictionaryBasedBreakIteratorTables. - */ - DictionaryBasedBreakIteratorTables& operator=( - const DictionaryBasedBreakIteratorTables& that); -}; - -U_NAMESPACE_END - -#endif diff --git a/Build/source/libs/icu-xetex/common/dictbe.cpp b/Build/source/libs/icu-xetex/common/dictbe.cpp new file mode 100644 index 00000000000..ac774f7c765 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/dictbe.cpp @@ -0,0 +1,418 @@ +/** + ******************************************************************************* + * Copyright (C) 2006, International Business Machines Corporation and others. * + * All Rights Reserved. * + ******************************************************************************* + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "brkeng.h" +#include "dictbe.h" +#include "unicode/uniset.h" +#include "unicode/chariter.h" +#include "unicode/ubrk.h" +#include "uvector.h" +#include "triedict.h" + +U_NAMESPACE_BEGIN + +/* + ****************************************************************** + */ + +/*DictionaryBreakEngine::DictionaryBreakEngine() { + fTypes = 0; +}*/ + +DictionaryBreakEngine::DictionaryBreakEngine(uint32_t breakTypes) { + fTypes = breakTypes; +} + +DictionaryBreakEngine::~DictionaryBreakEngine() { +} + +UBool +DictionaryBreakEngine::handles(UChar32 c, int32_t breakType) const { + return (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes) + && fSet.contains(c)); +} + +int32_t +DictionaryBreakEngine::findBreaks( UText *text, + int32_t startPos, + int32_t endPos, + UBool reverse, + int32_t breakType, + UStack &foundBreaks ) const { + int32_t result = 0; + + // Find the span of characters included in the set. + int32_t start = (int32_t)utext_getNativeIndex(text); + int32_t current; + int32_t rangeStart; + int32_t rangeEnd; + UChar32 c = utext_current32(text); + if (reverse) { + UBool isDict = fSet.contains(c); + while((current = (int32_t)utext_getNativeIndex(text)) > startPos && isDict) { + c = utext_previous32(text); + isDict = fSet.contains(c); + } + rangeStart = (current < startPos) ? startPos : current+(isDict ? 0 : 1); + rangeEnd = start + 1; + } + else { + while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) { + utext_next32(text); // TODO: recast loop for postincrement + c = utext_current32(text); + } + rangeStart = start; + rangeEnd = current; + } + if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) { + result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks); + utext_setNativeIndex(text, current); + } + + return result; +} + +void +DictionaryBreakEngine::setCharacters( UnicodeSet &set ) { + fSet = set; +} + +/*void +DictionaryBreakEngine::setBreakTypes( uint32_t breakTypes ) { + fTypes = breakTypes; +}*/ + +/* + ****************************************************************** + */ + + +// Helper class for improving readability of the Thai word break +// algorithm. The implementation is completely inline. + +// List size, limited by the maximum number of words in the dictionary +// that form a nested sequence. +#define POSSIBLE_WORD_LIST_MAX 20 + +class PossibleWord { + private: + // list of word candidate lengths, in increasing length order + int32_t lengths[POSSIBLE_WORD_LIST_MAX]; + int count; // Count of candidates + int32_t prefix; // The longest match with a dictionary word + int32_t offset; // Offset in the text of these candidates + int mark; // The preferred candidate's offset + int current; // The candidate we're currently looking at + + public: + PossibleWord(); + ~PossibleWord(); + + // Fill the list of candidates if needed, select the longest, and return the number found + int candidates( UText *text, const TrieWordDictionary *dict, int32_t rangeEnd ); + + // Select the currently marked candidate, point after it in the text, and invalidate self + int32_t acceptMarked( UText *text ); + + // Back up from the current candidate to the next shorter one; return TRUE if that exists + // and point the text after it + UBool backUp( UText *text ); + + // Return the longest prefix this candidate location shares with a dictionary word + int32_t longestPrefix(); + + // Mark the current candidate as the one we like + void markCurrent(); +}; + +inline +PossibleWord::PossibleWord() { + offset = -1; +} + +inline +PossibleWord::~PossibleWord() { +} + +inline int +PossibleWord::candidates( UText *text, const TrieWordDictionary *dict, int32_t rangeEnd ) { + // TODO: If getIndex is too slow, use offset < 0 and add discardAll() + int32_t start = (int32_t)utext_getNativeIndex(text); + if (start != offset) { + offset = start; + prefix = dict->matches(text, rangeEnd-start, lengths, count, sizeof(lengths)/sizeof(lengths[0])); + // Dictionary leaves text after longest prefix, not longest word. Back up. + if (count <= 0) { + utext_setNativeIndex(text, start); + } + } + if (count > 0) { + utext_setNativeIndex(text, start+lengths[count-1]); + } + current = count-1; + mark = current; + return count; +} + +inline int32_t +PossibleWord::acceptMarked( UText *text ) { + utext_setNativeIndex(text, offset + lengths[mark]); + return lengths[mark]; +} + +inline UBool +PossibleWord::backUp( UText *text ) { + if (current > 0) { + utext_setNativeIndex(text, offset + lengths[--current]); + return TRUE; + } + return FALSE; +} + +inline int32_t +PossibleWord::longestPrefix() { + return prefix; +} + +inline void +PossibleWord::markCurrent() { + mark = current; +} + +// How many words in a row are "good enough"? +#define THAI_LOOKAHEAD 3 + +// Will not combine a non-word with a preceding dictionary word longer than this +#define THAI_ROOT_COMBINE_THRESHOLD 3 + +// Will not combine a non-word that shares at least this much prefix with a +// dictionary word, with a preceding word +#define THAI_PREFIX_COMBINE_THRESHOLD 3 + +// Ellision character +#define THAI_PAIYANNOI 0x0E2F + +// Repeat character +#define THAI_MAIYAMOK 0x0E46 + +// Minimum word size +#define THAI_MIN_WORD 2 + +// Minimum number of characters for two words +#define THAI_MIN_WORD_SPAN (THAI_MIN_WORD * 2) + +ThaiBreakEngine::ThaiBreakEngine(const TrieWordDictionary *adoptDictionary, UErrorCode &status) + : DictionaryBreakEngine((1<<UBRK_WORD) | (1<<UBRK_LINE)), + fDictionary(adoptDictionary) +{ + fThaiWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]]"), status); + if (U_SUCCESS(status)) { + setCharacters(fThaiWordSet); + } + fMarkSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]&[:M:]]"), status); + fEndWordSet = fThaiWordSet; + fEndWordSet.remove(0x0E31); // MAI HAN-AKAT + fEndWordSet.remove(0x0E40, 0x0E44); // SARA E through SARA AI MAIMALAI + fBeginWordSet.add(0x0E01, 0x0E2E); // KO KAI through HO NOKHUK + fBeginWordSet.add(0x0E40, 0x0E44); // SARA E through SARA AI MAIMALAI + fSuffixSet.add(THAI_PAIYANNOI); + fSuffixSet.add(THAI_MAIYAMOK); +} + +ThaiBreakEngine::~ThaiBreakEngine() { + delete fDictionary; +} + +int32_t +ThaiBreakEngine::divideUpDictionaryRange( UText *text, + int32_t rangeStart, + int32_t rangeEnd, + UStack &foundBreaks ) const { + if ((rangeEnd - rangeStart) < THAI_MIN_WORD_SPAN) { + return 0; // Not enough characters for two words + } + + uint32_t wordsFound = 0; + int32_t wordLength; + int32_t current; + UErrorCode status = U_ZERO_ERROR; + PossibleWord words[THAI_LOOKAHEAD]; + UChar32 uc; + + utext_setNativeIndex(text, rangeStart); + + while (U_SUCCESS(status) && (current = (int32_t)utext_getNativeIndex(text)) < rangeEnd) { + wordLength = 0; + + // Look for candidate words at the current position + int candidates = words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd); + + // If we found exactly one, use that + if (candidates == 1) { + wordLength = words[wordsFound%THAI_LOOKAHEAD].acceptMarked(text); + wordsFound += 1; + } + + // If there was more than one, see which one can take us forward the most words + else if (candidates > 1) { + // If we're already at the end of the range, we're done + if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + goto foundBest; + } + do { + int wordsMatched = 1; + if (words[(wordsFound+1)%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { + if (wordsMatched < 2) { + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%THAI_LOOKAHEAD].markCurrent(); + wordsMatched = 2; + } + + // If we're already at the end of the range, we're done + if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + goto foundBest; + } + + // See if any of the possible second words is followed by a third word + do { + // If we find a third word, stop right away + if (words[(wordsFound+2)%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd)) { + words[wordsFound%THAI_LOOKAHEAD].markCurrent(); + goto foundBest; + } + } + while (words[(wordsFound+1)%THAI_LOOKAHEAD].backUp(text)); + } + } + while (words[wordsFound%THAI_LOOKAHEAD].backUp(text)); +foundBest: + wordLength = words[wordsFound%THAI_LOOKAHEAD].acceptMarked(text); + wordsFound += 1; + } + + // We come here after having either found a word or not. We look ahead to the + // next word. If it's not a dictionary word, we will combine it withe the word we + // just found (if there is one), but only if the preceding word does not exceed + // the threshold. + // The text iterator should now be positioned at the end of the word we found. + if ((int32_t)utext_getNativeIndex(text) < rangeEnd && wordLength < THAI_ROOT_COMBINE_THRESHOLD) { + // if it is a dictionary word, do nothing. If it isn't, then if there is + // no preceding word, or the non-word shares less than the minimum threshold + // of characters with a dictionary word, then scan to resynchronize + if (words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0 + && (wordLength == 0 + || words[wordsFound%THAI_LOOKAHEAD].longestPrefix() < THAI_PREFIX_COMBINE_THRESHOLD)) { + // Look for a plausible word boundary + //TODO: This section will need a rework for UText. + int32_t remaining = rangeEnd - (current+wordLength); + UChar32 pc = utext_current32(text); + int32_t chars = 0; + while (TRUE) { + utext_next32(text); + uc = utext_current32(text); + // TODO: Here we're counting on the fact that the SA languages are all + // in the BMP. This should get fixed with the UText rework. + chars += 1; + if (--remaining <= 0) { + break; + } + if (fEndWordSet.contains(pc) && fBeginWordSet.contains(uc)) { + // Maybe. See if it's in the dictionary. + // NOTE: In the original Apple code, checked that the next + // two characters after uc were not 0x0E4C THANTHAKHAT before + // checking the dictionary. That is just a performance filter, + // but it's not clear it's faster than checking the trie. + int candidates = words[(wordsFound+1)%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd); + utext_setNativeIndex(text, current+wordLength+chars); + if (candidates > 0) { + break; + } + } + pc = uc; + } + + // Bump the word count if there wasn't already one + if (wordLength <= 0) { + wordsFound += 1; + } + + // Update the length with the passed-over characters + wordLength += chars; + } + else { + // Back up to where we were for next iteration + utext_setNativeIndex(text, current+wordLength); + } + } + + // Never stop before a combining mark. + int32_t currPos; + while ((currPos = (int32_t)utext_getNativeIndex(text)) < rangeEnd && fMarkSet.contains(utext_current32(text))) { + utext_next32(text); + wordLength += (int32_t)utext_getNativeIndex(text) - currPos; + } + + // Look ahead for possible suffixes if a dictionary word does not follow. + // We do this in code rather than using a rule so that the heuristic + // resynch continues to function. For example, one of the suffix characters + // could be a typo in the middle of a word. + if ((int32_t)utext_getNativeIndex(text) < rangeEnd && wordLength > 0) { + if (words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0 + && fSuffixSet.contains(uc = utext_current32(text))) { + if (uc == THAI_PAIYANNOI) { + if (!fSuffixSet.contains(utext_previous32(text))) { + // Skip over previous end and PAIYANNOI + utext_next32(text); + utext_next32(text); + wordLength += 1; // Add PAIYANNOI to word + uc = utext_current32(text); // Fetch next character + } + else { + // Restore prior position + utext_next32(text); + } + } + if (uc == THAI_MAIYAMOK) { + if (utext_previous32(text) != THAI_MAIYAMOK) { + // Skip over previous end and MAIYAMOK + utext_next32(text); + utext_next32(text); + wordLength += 1; // Add MAIYAMOK to word + } + else { + // Restore prior position + utext_next32(text); + } + } + } + else { + utext_setNativeIndex(text, current+wordLength); + } + } + + // Did we find a word on this iteration? If so, push it on the break stack + if (wordLength > 0) { + foundBreaks.push((current+wordLength), status); + } + } + + // Don't return a break for the end of the dictionary range if there is one there. + if (foundBreaks.peeki() >= rangeEnd) { + (void) foundBreaks.popi(); + wordsFound -= 1; + } + + return wordsFound; +} + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/Build/source/libs/icu-xetex/common/dictbe.h b/Build/source/libs/icu-xetex/common/dictbe.h new file mode 100644 index 00000000000..80a52f57e16 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/dictbe.h @@ -0,0 +1,193 @@ +/** + ******************************************************************************* + * Copyright (C) 2006, International Business Machines Corporation and others. * + * All Rights Reserved. * + ******************************************************************************* + */ + +#ifndef DICTBE_H +#define DICTBE_H + +#include "unicode/utypes.h" +#include "unicode/uniset.h" +#include "unicode/utext.h" + +#include "brkeng.h" + +U_NAMESPACE_BEGIN + +class TrieWordDictionary; + +/******************************************************************* + * DictionaryBreakEngine + */ + +/** + * <p>DictionaryBreakEngine is a kind of LanguageBreakEngine that uses a + * dictionary to determine language-specific breaks.</p> + * + * <p>After it is constructed a DictionaryBreakEngine may be shared between + * threads without synchronization.</p> + */ +class DictionaryBreakEngine : public LanguageBreakEngine { + private: + /** + * The set of characters handled by this engine + * @internal + */ + + UnicodeSet fSet; + + /** + * The set of break types handled by this engine + * @internal + */ + + uint32_t fTypes; + + /** + * <p>Default constructor.</p> + * + */ + DictionaryBreakEngine(); + + public: + + /** + * <p>Constructor setting the break types handled.</p> + * + * @param breakTypes A bitmap of types handled by the engine. + */ + DictionaryBreakEngine( uint32_t breakTypes ); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~DictionaryBreakEngine(); + + /** + * <p>Indicate whether this engine handles a particular character for + * a particular kind of break.</p> + * + * @param c A character which begins a run that the engine might handle + * @param breakType The type of text break which the caller wants to determine + * @return TRUE if this engine handles the particular character and break + * type. + */ + virtual UBool handles( UChar32 c, int32_t breakType ) const; + + /** + * <p>Find any breaks within a run in the supplied text.</p> + * + * @param text A UText representing the text. The + * iterator is left at the end of the run of characters which the engine + * is capable of handling. + * @param startPos The start of the run within the supplied text. + * @param endPos The end of the run within the supplied text. + * @param reverse Whether the caller is looking for breaks in a reverse + * direction. + * @param breakType The type of break desired, or -1. + * @param foundBreaks An allocated C array of the breaks found, if any + * @return The number of breaks found. + */ + virtual int32_t findBreaks( UText *text, + int32_t startPos, + int32_t endPos, + UBool reverse, + int32_t breakType, + UStack &foundBreaks ) const; + + protected: + + /** + * <p>Set the character set handled by this engine.</p> + * + * @param set A UnicodeSet of the set of characters handled by the engine + */ + virtual void setCharacters( UnicodeSet &set ); + + /** + * <p>Set the break types handled by this engine.</p> + * + * @param breakTypes A bitmap of types handled by the engine. + */ +// virtual void setBreakTypes( uint32_t breakTypes ); + + /** + * <p>Divide up a range of known dictionary characters.</p> + * + * @param text A UText representing the text + * @param rangeStart The start of the range of dictionary characters + * @param rangeEnd The end of the range of dictionary characters + * @param foundBreaks Output of C array of int32_t break positions, or 0 + * @return The number of breaks found + */ + virtual int32_t divideUpDictionaryRange( UText *text, + int32_t rangeStart, + int32_t rangeEnd, + UStack &foundBreaks ) const = 0; + +}; + +/******************************************************************* + * ThaiBreakEngine + */ + +/** + * <p>ThaiBreakEngine is a kind of DictionaryBreakEngine that uses a + * TrieWordDictionary and heuristics to determine Thai-specific breaks.</p> + * + * <p>After it is constructed a ThaiBreakEngine may be shared between + * threads without synchronization.</p> + */ +class ThaiBreakEngine : public DictionaryBreakEngine { + private: + /** + * The set of characters handled by this engine + * @internal + */ + + UnicodeSet fThaiWordSet; + UnicodeSet fEndWordSet; + UnicodeSet fBeginWordSet; + UnicodeSet fSuffixSet; + UnicodeSet fMarkSet; + const TrieWordDictionary *fDictionary; + + public: + + /** + * <p>Default constructor.</p> + * + * @param adoptDictionary A TrieWordDictionary to adopt. Deleted when the + * engine is deleted. + */ + ThaiBreakEngine(const TrieWordDictionary *adoptDictionary, UErrorCode &status); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~ThaiBreakEngine(); + + protected: + /** + * <p>Divide up a range of known dictionary characters.</p> + * + * @param text A UText representing the text + * @param rangeStart The start of the range of dictionary characters + * @param rangeEnd The end of the range of dictionary characters + * @param foundBreaks Output of C array of int32_t break positions, or 0 + * @return The number of breaks found + */ + virtual int32_t divideUpDictionaryRange( UText *text, + int32_t rangeStart, + int32_t rangeEnd, + UStack &foundBreaks ) const; + +}; + + +U_NAMESPACE_END + + /* DICTBE_H */ +#endif diff --git a/Build/source/libs/icu-xetex/common/hash.h b/Build/source/libs/icu-xetex/common/hash.h index f1ea543cb67..375499bf1b8 100644 --- a/Build/source/libs/icu-xetex/common/hash.h +++ b/Build/source/libs/icu-xetex/common/hash.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2004, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * Date Name Description @@ -26,8 +26,9 @@ U_NAMESPACE_BEGIN */ class U_COMMON_API Hashtable : public UMemory { UHashtable* hash; + UHashtable hashObj; - inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status); + inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); public: /** @@ -39,6 +40,14 @@ public: /** * Construct a hashtable + * @param keyComp Compartor for comparing the keys + * @param valueComp Compartor for comparing the values + * @param status Error code + */ + Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + + /** + * Construct a hashtable * @param status Error code */ Hashtable(UErrorCode& status); @@ -76,7 +85,12 @@ public: const UHashElement* find(const UnicodeString& key) const; const UHashElement* nextElement(int32_t& pos) const; + + UKeyComparator* setKeyCompartor(UKeyComparator*keyComp); + + UValueComparator* setValueCompartor(UValueComparator* valueComp); + UBool equals(const Hashtable& that) const; private: Hashtable(const Hashtable &other); // forbid copying of this class Hashtable &operator=(const Hashtable &other); // forbid copying of this class @@ -86,16 +100,22 @@ private: * Implementation ********************************************************************/ -inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, UErrorCode& status) { +inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, UErrorCode& status) { if (U_FAILURE(status)) { return; } - hash = uhash_open(keyHash, keyComp, &status); + uhash_init(&hashObj, keyHash, keyComp, valueComp, &status); if (U_SUCCESS(status)) { + hash = &hashObj; uhash_setKeyDeleter(hash, uhash_deleteUnicodeString); } } +inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, + UErrorCode& status) : hash(0) { + init( uhash_hashUnicodeString, keyComp, valueComp, status); +} inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) : hash(0) { @@ -103,26 +123,26 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) : uhash_hashUnicodeString, ignoreKeyCase ? uhash_compareCaselessUnicodeString : uhash_compareUnicodeString, + NULL, status); } inline Hashtable::Hashtable(UErrorCode& status) : hash(0) { - init(uhash_hashUnicodeString, uhash_compareUnicodeString, status); + init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status); } inline Hashtable::Hashtable() : hash(0) { UErrorCode status = U_ZERO_ERROR; - init(uhash_hashUnicodeString, uhash_compareUnicodeString, status); + init(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, status); } inline Hashtable::~Hashtable() { - if (hash != 0) { + if (hash != NULL) { uhash_close(hash); - hash = 0; } } @@ -167,9 +187,21 @@ inline const UHashElement* Hashtable::nextElement(int32_t& pos) const { } inline void Hashtable::removeAll(void) { - uhash_removeAll(hash); + uhash_removeAll(hash); } +inline UKeyComparator* Hashtable::setKeyCompartor(UKeyComparator*keyComp){ + return uhash_setKeyComparator(hash, keyComp); +} + +inline UValueComparator* Hashtable::setValueCompartor(UValueComparator* valueComp){ + return uhash_setValueComparator(hash, valueComp); +} + +inline UBool Hashtable::equals(const Hashtable& that)const{ + return uhash_equals(hash, that.hash); +} U_NAMESPACE_END #endif + diff --git a/Build/source/libs/icu-xetex/common/localsvc.h b/Build/source/libs/icu-xetex/common/localsvc.h new file mode 100644 index 00000000000..67e5a8455ae --- /dev/null +++ b/Build/source/libs/icu-xetex/common/localsvc.h @@ -0,0 +1,25 @@ +/* +*************************************************************************** +* Copyright (C) 2006 International Business Machines Corporation * +* and others. All rights reserved. * +*************************************************************************** +*/ + +#ifndef LOCALSVC_H +#define LOCALSVC_H + +#include "unicode/utypes.h" + +#if U_LOCAL_SERVICE_HOOK +/** + * Prototype for user-supplied service hook. This function is expected to return + * a type of factory object specific to the requested service. + * + * @param what service-specific string identifying the specific user hook + * @param status error status + * @return a service-specific hook, or NULL on failure. + */ +U_CAPI void* uprv_svc_hook(const char *what, UErrorCode *status); +#endif + +#endif diff --git a/Build/source/libs/icu-xetex/common/locid.cpp b/Build/source/libs/icu-xetex/common/locid.cpp index c2eb5192d1d..cb8d59eb4c1 100644 --- a/Build/source/libs/icu-xetex/common/locid.cpp +++ b/Build/source/libs/icu-xetex/common/locid.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** - * Copyright (C) 1997-2005, International Business Machines + * Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -160,7 +160,7 @@ void locale_set_default_internal(const char *id) umtx_unlock(NULL); if (hashTableNeedsInit) { status = U_ZERO_ERROR; - UHashtable *tHashTable = uhash_open(uhash_hashChars, uhash_compareChars, &status); + UHashtable *tHashTable = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status); if (U_FAILURE(status)) { return; } @@ -357,7 +357,7 @@ Locale::Locale( const char * newLanguage, /*if the whole string is longer than our internal limit, we need to go to the heap for temporary buffers*/ - if (size > ULOC_FULLNAME_CAPACITY) + if (size >= ULOC_FULLNAME_CAPACITY) { togo_heap = (char *)uprv_malloc(sizeof(char)*(size+1)); togo = togo_heap; @@ -604,7 +604,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) // successful end of init() return *this; - } while(0); + } while(0); /*loop doesn't iterate*/ // when an error occurs, then set this object to "bogus" (there is no UErrorCode here) setToBogus(); @@ -937,6 +937,7 @@ Locale::getAvailableLocales(int32_t& count) newLocaleList = new Locale[locCount]; } if (newLocaleList == NULL) { + count = 0; return NULL; } @@ -1107,13 +1108,13 @@ const Locale & Locale::getLocale(int locid) { Locale *localeCache = getLocaleCache(); - U_ASSERT(locid < eMAX_LOCALES); + U_ASSERT((locid < eMAX_LOCALES)&&(locid>=0)); if (localeCache == NULL) { // Failure allocating the locale cache. // The best we can do is return a NULL reference. locid = 0; } - return localeCache[locid]; + return localeCache[locid]; /*operating on NULL*/ } /* diff --git a/Build/source/libs/icu-xetex/common/locmap.c b/Build/source/libs/icu-xetex/common/locmap.c index c17f3cede7c..802c6c38c17 100644 --- a/Build/source/libs/icu-xetex/common/locmap.c +++ b/Build/source/libs/icu-xetex/common/locmap.c @@ -1,6 +1,6 @@ /* ********************************************************************** - * Copyright (C) 1996-2005, International Business Machines + * Copyright (C) 1996-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -121,14 +121,28 @@ static const ILcidPosixElement ar[] = { ILCID_POSIX_ELEMENT_ARRAY(0x044d, as, as_IN) ILCID_POSIX_ELEMENT_ARRAY(0x045e, am, am_ET) +ILCID_POSIX_ELEMENT_ARRAY(0x047a, arn,arn_CL) static const ILcidPosixElement az[] = { {0x2c, "az"}, - {0x082c, "az_AZ"}, /* Cyrillic based */ - {0x042c, "az_Latn_AZ"} /* Latin based */ + {0x082c, "az_Cyrl_AZ"}, /* Cyrillic based */ + {0x082c, "az_Cyrl"}, /* Cyrillic based */ + {0x042c, "az_Latn_AZ"}, /* Latin based */ + {0x042c, "az_Latn"}, /* Latin based */ + {0x042c, "az_AZ"} /* Latin based */ }; +ILCID_POSIX_ELEMENT_ARRAY(0x046d, ba, ba_RU) ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY) + +static const ILcidPosixElement ber[] = { + {0x5f, "ber"}, + {0x045f, "ber_Arab_DZ"}, + {0x045f, "ber_Arab"}, + {0x085f, "ber_Latn_DZ"}, + {0x085f, "ber_Latn"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG) static const ILcidPosixElement bn[] = { @@ -137,14 +151,15 @@ static const ILcidPosixElement bn[] = { {0x0445, "bn_IN"} }; - static const ILcidPosixElement bo[] = { {0x51, "bo"}, {0x0851, "bo_BT"}, {0x0451, "bo_CN"} }; +ILCID_POSIX_ELEMENT_ARRAY(0x047e, br, br_FR) ILCID_POSIX_ELEMENT_ARRAY(0x0403, ca, ca_ES) +ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR) ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) /* Declared as cs_CZ to get around compiler errors on z/OS, which defines cs as a function */ @@ -163,7 +178,8 @@ static const ILcidPosixElement de[] = { {0x0407, "de_DE"}, {0x1407, "de_LI"}, {0x1007, "de_LU"}, - {0x10407,"de__PHONEBOOK"} /*This is really de_DE_PHONEBOOK on Windows, maybe 10007*/ + {0x10407,"de_DE@collation=phonebook"}, /*This is really de_DE_PHONEBOOK on Windows*/ + {0x10407,"de@collation=phonebook"} /*This is really de_DE_PHONEBOOK on Windows*/ }; ILCID_POSIX_ELEMENT_ARRAY(0x0465, dv, dv_MV) @@ -176,9 +192,12 @@ static const ILcidPosixElement en[] = { {0x1009, "en_CA"}, {0x0809, "en_GB"}, {0x1809, "en_IE"}, + {0x4009, "en_IN"}, {0x2009, "en_JM"}, + {0x4409, "en_MY"}, {0x1409, "en_NZ"}, {0x3409, "en_PH"}, + {0x4809, "en_SG"}, {0x2C09, "en_TT"}, {0x0409, "en_US"}, {0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */ @@ -193,7 +212,7 @@ static const ILcidPosixElement en[] = { }; static const ILcidPosixElement en_US_POSIX[] = { - {0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */ + {0x007f, "en_US_POSIX"} /* duplicate for roundtripping */ }; static const ILcidPosixElement es[] = { @@ -215,15 +234,31 @@ static const ILcidPosixElement es[] = { {0x500a, "es_PR"}, {0x3c0a, "es_PY"}, {0x440a, "es_SV"}, + {0x540a, "es_US"}, {0x380a, "es_UY"}, {0x200a, "es_VE"}, - {0x040a, "es__TRADITIONAL"} /*This is really es_ES_TRADITIONAL on Windows */ + {0x040a, "es_ES@collation=traditional"}, + {0x040a, "es@collation=traditional"} }; ILCID_POSIX_ELEMENT_ARRAY(0x0425, et, et_EE) ILCID_POSIX_ELEMENT_ARRAY(0x042d, eu, eu_ES) -ILCID_POSIX_ELEMENT_ARRAY(0x0429, fa, fa_IR) + +/* ISO-639 doesn't distinguish between Persian and Dari.*/ +static const ILcidPosixElement fa[] = { + {0x29, "fa"}, + {0x0429, "fa_IR"}, /* Persian/Farsi (Iran) */ + {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ +}; + +/* duplicate for roundtripping */ +static const ILcidPosixElement fa_AF[] = { + {0x8c, "fa_AF"}, /* Persian/Dari (Afghanistan) */ + {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ +}; + ILCID_POSIX_ELEMENT_ARRAY(0x040b, fi, fi_FI) +ILCID_POSIX_ELEMENT_ARRAY(0x0464, fil,fil_PH) ILCID_POSIX_ELEMENT_ARRAY(0x0438, fo, fo_FO) static const ILcidPosixElement fr[] = { @@ -257,7 +292,8 @@ static const ILcidPosixElement ga[] = { ILCID_POSIX_ELEMENT_ARRAY(0x0456, gl, gl_ES) ILCID_POSIX_ELEMENT_ARRAY(0x0447, gu, gu_IN) ILCID_POSIX_ELEMENT_ARRAY(0x0474, gn, gn_PY) -ILCID_POSIX_ELEMENT_ARRAY(0x0468, ha, ha_NG) +ILCID_POSIX_ELEMENT_ARRAY(0x0484, gsw,gsw_FR) +ILCID_POSIX_ELEMENT_ARRAY(0x0468, ha, ha_NG) /* ha_Latn_NG? */ ILCID_POSIX_ELEMENT_ARRAY(0x0475, haw,haw_US) ILCID_POSIX_ELEMENT_ARRAY(0x040d, he, he_IL) ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN) @@ -265,20 +301,28 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0439, hi, hi_IN) /* This LCID is really four different locales.*/ static const ILcidPosixElement hr[] = { {0x1a, "hr"}, + {0x141a, "bs_Latn_BA"}, /* Bosnian, Bosnia and Herzegovina */ + {0x141a, "bs_Latn"}, /* Bosnian, Bosnia and Herzegovina */ {0x141a, "bs_BA"}, /* Bosnian, Bosnia and Herzegovina */ {0x141a, "bs"}, /* Bosnian */ + {0x201a, "bs_Cyrl_BA"}, /* Bosnian, Bosnia and Herzegovina */ + {0x201a, "bs_Cyrl"}, /* Bosnian, Bosnia and Herzegovina */ + {0x101a, "hr_BA"}, /* Croatian in Bosnia */ {0x041a, "hr_HR"}, /* Croatian*/ - {0x081a, "sr_Latn_YU"}, /* Serbo-Croatian*/ + {0x181a, "sr_Latn_BA"}, /* Serbo-Croatian in Bosnia */ + {0x081a, "sr_Latn_CS"}, /* Serbo-Croatian*/ {0x081a, "sr_Latn"}, /* It's 0x1a or 0x081a, pick one to make the test program happy. */ - {0x0c1a, "sr_Cyrl_YU"}, /* Serbian*/ + {0x1c1a, "sr_Cyrl_BA"}, /* Serbo-Croatian in Bosnia */ + {0x0c1a, "sr_Cyrl_CS"}, /* Serbian*/ {0x0c1a, "sr_Cyrl"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ - {0x0c1a, "sr"}, /* It's 0x1a or 0x0c1a, pick one to make the test program happy. */ + {0x0c1a, "sr"} /* In CLDR sr is sr_Cyrl. */ }; ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU) ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM) ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID) ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG) +ILCID_POSIX_ELEMENT_ARRAY(0x0478, ii, ii_CN) ILCID_POSIX_ELEMENT_ARRAY(0x040f, is, is_IS) static const ILcidPosixElement it[] = { @@ -287,11 +331,19 @@ static const ILcidPosixElement it[] = { {0x0410, "it_IT"} }; -ILCID_POSIX_ELEMENT_ARRAY(0x045d, iu, iu_CA) /* TODO: verify country */ +static const ILcidPosixElement iu[] = { + {0x5d, "iu"}, + {0x045d, "iu_Cans_CA"}, + {0x045d, "iu_Cans"}, + {0x085d, "iu_Latn_CA"}, + {0x085d, "iu_Latn"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x040d, iw, iw_IL) /*Left in for compatibility*/ ILCID_POSIX_ELEMENT_ARRAY(0x0411, ja, ja_JP) ILCID_POSIX_ELEMENT_ARRAY(0x0437, ka, ka_GE) ILCID_POSIX_ELEMENT_ARRAY(0x043f, kk, kk_KZ) +ILCID_POSIX_ELEMENT_ARRAY(0x046f, kl, kl_GL) ILCID_POSIX_ELEMENT_ARRAY(0x0453, km, km_KH) ILCID_POSIX_ELEMENT_ARRAY(0x044b, kn, kn_IN) @@ -312,14 +364,22 @@ static const ILcidPosixElement ks[] = { /* We could add PK and CN too */ ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */ ILCID_POSIX_ELEMENT_ARRAY(0x0476, la, la_IT) /* TODO: Verify the country */ +ILCID_POSIX_ELEMENT_ARRAY(0x046e, lb, lb_LU) ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA) ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) ILCID_POSIX_ELEMENT_ARRAY(0x0426, lv, lv_LV) ILCID_POSIX_ELEMENT_ARRAY(0x0481, mi, mi_NZ) ILCID_POSIX_ELEMENT_ARRAY(0x042f, mk, mk_MK) ILCID_POSIX_ELEMENT_ARRAY(0x044c, ml, ml_IN) -ILCID_POSIX_ELEMENT_ARRAY(0x0450, mn, mn_MN) + +static const ILcidPosixElement mn[] = { + {0x50, "mn"}, + {0x0850, "mn_CN"}, + {0x0450, "mn_MN"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0458, mni,mni_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x047c, moh,moh_CA) ILCID_POSIX_ELEMENT_ARRAY(0x044e, mr, mr_IN) static const ILcidPosixElement ms[] = { @@ -328,8 +388,8 @@ static const ILcidPosixElement ms[] = { {0x043e, "ms_MY"} /* Malaysia*/ }; -/* The MSJDK documentation says this is maltese, but it's not supported.*/ ILCID_POSIX_ELEMENT_ARRAY(0x043a, mt, mt_MT) +ILCID_POSIX_ELEMENT_ARRAY(0x0455, my, my_MM) static const ILcidPosixElement ne[] = { {0x61, "ne"}, @@ -354,7 +414,8 @@ static const ILcidPosixElement no[] = { {0x0814, "no_NO_NY"}/* really nn_NO */ }; -ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the country */ +ILCID_POSIX_ELEMENT_ARRAY(0x046c, nso,nso_ZA) /* TODO: Verify the ISO-639 code */ +ILCID_POSIX_ELEMENT_ARRAY(0x0482, oc, oc_FR) ILCID_POSIX_ELEMENT_ARRAY(0x0472, om, om_ET) /* TODO: Verify the country */ /* Declared as or_IN to get around compiler errors*/ @@ -379,12 +440,14 @@ static const ILcidPosixElement pt[] = { }; static const ILcidPosixElement qu[] = { - {0x6B, "qu"}, - {0x046B, "qu_BO"}, - {0x086B, "qu_EC"}, - {0x0C6B, "qu_PE"} + {0x6b, "qu"}, + {0x046b, "qu_BO"}, + {0x086b, "qu_EC"}, + {0x0C6b, "qu_PE"} }; +ILCID_POSIX_ELEMENT_ARRAY(0x0486, qut, qut_GT) /* qut is an ISO-639-3 code */ +ILCID_POSIX_ELEMENT_ARRAY(0x0417, rm, rm_CH) ILCID_POSIX_ELEMENT_ARRAY(0x0418, ro, ro_RO) static const ILcidPosixElement root[] = { @@ -392,7 +455,9 @@ static const ILcidPosixElement root[] = { }; ILCID_POSIX_ELEMENT_ARRAY(0x0419, ru, ru_RU) +ILCID_POSIX_ELEMENT_ARRAY(0x0487, rw, rw_RW) ILCID_POSIX_ELEMENT_ARRAY(0x044f, sa, sa_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0485, sah,sah_RU) static const ILcidPosixElement sd[] = { {0x59, "sd"}, @@ -400,6 +465,19 @@ static const ILcidPosixElement sd[] = { {0x0859, "sd_PK"} }; +static const ILcidPosixElement se[] = { + {0x3b, "se"}, + {0x0c3b, "se_FI"}, + {0x043b, "se_NO"}, + {0x083b, "se_SE"}, + {0x183b, "sma_NO"}, + {0x1c3b, "sma_SE"}, + {0x103b, "smj_NO"}, + {0x143b, "smj_SE"}, + {0x243b, "smn_FI"}, + {0x203b, "sms_FI"}, +}; + ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK) ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK) ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI) @@ -416,6 +494,7 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0441, sw, sw_KE) ILCID_POSIX_ELEMENT_ARRAY(0x045A, syr, syr_SY) ILCID_POSIX_ELEMENT_ARRAY(0x0449, ta, ta_IN) ILCID_POSIX_ELEMENT_ARRAY(0x044a, te, te_IN) +ILCID_POSIX_ELEMENT_ARRAY(0x0428, tg, tg_TJ) /* Cyrillic based by default */ ILCID_POSIX_ELEMENT_ARRAY(0x041e, th, th_TH) static const ILcidPosixElement ti[] = { @@ -425,7 +504,6 @@ static const ILcidPosixElement ti[] = { }; ILCID_POSIX_ELEMENT_ARRAY(0x0442, tk, tk_TM) -ILCID_POSIX_ELEMENT_ARRAY(0x0464, tl, tl_PH) ILCID_POSIX_ELEMENT_ARRAY(0x0432, tn, tn_BW) ILCID_POSIX_ELEMENT_ARRAY(0x041f, tr, tr_TR) ILCID_POSIX_ELEMENT_ARRAY(0x0444, tt, tt_RU) @@ -440,19 +518,31 @@ static const ILcidPosixElement ur[] = { static const ILcidPosixElement uz[] = { {0x43, "uz"}, + {0x0843, "uz_Cyrl_UZ"}, /* Cyrillic based */ + {0x0843, "uz_Cyrl"}, /* Cyrillic based */ {0x0843, "uz_UZ"}, /* Cyrillic based */ - {0x0443, "uz_Latn_UZ"} /* Latin based */ + {0x0443, "uz_Latn_UZ"}, /* Latin based */ + {0x0443, "uz_Latn"} /* Latin based */ }; ILCID_POSIX_ELEMENT_ARRAY(0x0433, ve, ve_ZA) /* TODO: Verify the country */ ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN) -ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) /* TODO: Verify the country */ -ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) /* TODO: Verify the country */ -/* TODO: Make the locales with the script the primary locale once the names are implemented in the resources. */ +static const ILcidPosixElement wen[] = { + {0x2E, "wen"}, + {0x042E, "wen_DE"}, + {0x042E, "hsb_DE"}, + {0x082E, "dsb_DE"} +}; + +ILCID_POSIX_ELEMENT_ARRAY(0x0488, wo, wo_SN) +ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) +ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) + static const ILcidPosixElement zh[] = { {0x04, "zh"}, {0x0804, "zh_Hans_CN"}, + {0x0804, "zh_Hans"}, {0x0804, "zh_CN"}, {0x0c04, "zh_Hant_HK"}, {0x0c04, "zh_HK"}, @@ -461,39 +551,44 @@ static const ILcidPosixElement zh[] = { {0x1004, "zh_Hans_SG"}, {0x1004, "zh_SG"}, {0x0404, "zh_Hant_TW"}, + {0x0404, "zh_Hant"}, {0x0404, "zh_TW"}, - {0x30404,"zh_Hant_TW"}, + {0x30404,"zh_Hant_TW"}, /* Bopomofo order */ {0x30404,"zh_TW"}, /* Bopomofo order */ - {0x20404,"zh_TW@collation=STROKE"} + {0x20404,"zh_Hant_TW@collation=stroke"}, + {0x20404,"zh_TW@collation=stroke"}, + {0x20804,"zh_Hans_CN@collation=stroke"}, + {0x20804,"zh_CN@collation=stroke"} }; -ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) /* TODO: Verify the country */ +ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) /* This must be static and grouped by LCID. */ -/* non-existent ISO-639 codes */ +/* non-existent ISO-639-2 codes */ /* 0x466 Edo 0x467 Fulfulde - Nigeria -0x43b Sami (Lappish) -0x42e Sorbian (iso639 = dsb, hsb, wen) +0x486 K'iche - Guatemala 0x430 Sutu -0x45f Tamazight (Arabic script) -0x85f Tamazight (Latin script) -0x478 Yi */ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */ ILCID_POSIX_MAP(am), /* am Amharic 0x5e */ ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */ + ILCID_POSIX_MAP(arn), /* arn Araucanian/Mapudungun 0x7a */ ILCID_POSIX_MAP(as), /* as Assamese 0x4d */ ILCID_POSIX_MAP(az), /* az Azerbaijani 0x2c */ + ILCID_POSIX_MAP(ba), /* ba Bashkir 0x6d */ ILCID_POSIX_MAP(be), /* be Belarusian 0x23 */ + ILCID_POSIX_MAP(ber), /* ber Berber/Tamazight 0x5f */ ILCID_POSIX_MAP(bg), /* bg Bulgarian 0x02 */ ILCID_POSIX_MAP(bn), /* bn Bengali; Bangla 0x45 */ ILCID_POSIX_MAP(bo), /* bo Tibetan 0x51 */ + ILCID_POSIX_MAP(br), /* br Breton 0x7e */ ILCID_POSIX_MAP(ca), /* ca Catalan 0x03 */ ILCID_POSIX_MAP(chr), /* chr Cherokee 0x5c */ + ILCID_POSIX_MAP(co), /* co Corsican 0x83 */ ILCID_POSIX_MAP(cs_CZ), /* cs Czech 0x05 */ ILCID_POSIX_MAP(cy), /* cy Welsh 0x52 */ ILCID_POSIX_MAP(da), /* da Danish 0x06 */ @@ -505,14 +600,17 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(es), /* es Spanish 0x0a */ ILCID_POSIX_MAP(et), /* et Estonian 0x25 */ ILCID_POSIX_MAP(eu), /* eu Basque 0x2d */ - ILCID_POSIX_MAP(fa), /* fa Farsi 0x29 */ + ILCID_POSIX_MAP(fa), /* fa Persian/Farsi 0x29 */ + ILCID_POSIX_MAP(fa_AF), /* fa Persian/Dari 0x8c */ ILCID_POSIX_MAP(fi), /* fi Finnish 0x0b */ + ILCID_POSIX_MAP(fil), /* fil Filipino 0x64 */ ILCID_POSIX_MAP(fo), /* fo Faroese 0x38 */ ILCID_POSIX_MAP(fr), /* fr French 0x0c */ ILCID_POSIX_MAP(fy), /* fy Frisian 0x62 */ ILCID_POSIX_MAP(ga), /* * Gaelic (Ireland,Scotland) 0x3c */ ILCID_POSIX_MAP(gl), /* gl Galician 0x56 */ ILCID_POSIX_MAP(gn), /* gn Guarani 0x74 */ + ILCID_POSIX_MAP(gsw), /* gsw Alemanic/Alsatian/Swiss German 0x84 */ ILCID_POSIX_MAP(gu), /* gu Gujarati 0x47 */ ILCID_POSIX_MAP(ha), /* ha Hausa 0x68 */ ILCID_POSIX_MAP(haw), /* haw Hawaiian 0x75 */ @@ -523,6 +621,7 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(hy), /* hy Armenian 0x2b */ ILCID_POSIX_MAP(id), /* id Indonesian (formerly in) 0x21 */ ILCID_POSIX_MAP(ig), /* ig Igbo 0x70 */ + ILCID_POSIX_MAP(ii), /* ii Sichuan Yi 0x78 */ ILCID_POSIX_MAP(is), /* is Icelandic 0x0f */ ILCID_POSIX_MAP(it), /* it Italian 0x10 */ ILCID_POSIX_MAP(iu), /* iu Inuktitut 0x5d */ @@ -530,6 +629,7 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(ja), /* ja Japanese 0x11 */ ILCID_POSIX_MAP(ka), /* ka Georgian 0x37 */ ILCID_POSIX_MAP(kk), /* kk Kazakh 0x3f */ + ILCID_POSIX_MAP(kl), /* kl Kalaallisut 0x6f */ ILCID_POSIX_MAP(km), /* km Khmer 0x53 */ ILCID_POSIX_MAP(kn), /* kn Kannada 0x4b */ ILCID_POSIX_MAP(ko), /* ko Korean 0x12 */ @@ -537,6 +637,7 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(kr), /* kr Kanuri 0x71 */ ILCID_POSIX_MAP(ks), /* ks Kashmiri 0x60 */ ILCID_POSIX_MAP(ky), /* ky Kyrgyz 0x40 */ + ILCID_POSIX_MAP(lb), /* lb Luxembourgish 0x6e */ ILCID_POSIX_MAP(la), /* la Latin 0x76 */ ILCID_POSIX_MAP(lo), /* lo Lao 0x54 */ ILCID_POSIX_MAP(lt), /* lt Lithuanian 0x27 */ @@ -546,27 +647,35 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(ml), /* ml Malayalam 0x4c */ ILCID_POSIX_MAP(mn), /* mn Mongolian 0x50 */ ILCID_POSIX_MAP(mni), /* mni Manipuri 0x58 */ + ILCID_POSIX_MAP(moh), /* moh Mohawk 0x7c */ ILCID_POSIX_MAP(mr), /* mr Marathi 0x4e */ ILCID_POSIX_MAP(ms), /* ms Malay 0x3e */ ILCID_POSIX_MAP(mt), /* mt Maltese 0x3a */ + ILCID_POSIX_MAP(my), /* my Burmese 0x55 */ /* ILCID_POSIX_MAP(nb), // no Norwegian 0x14 */ ILCID_POSIX_MAP(ne), /* ne Nepali 0x61 */ ILCID_POSIX_MAP(nl), /* nl Dutch 0x13 */ /* ILCID_POSIX_MAP(nn), // no Norwegian 0x14 */ ILCID_POSIX_MAP(no), /* * Norwegian 0x14 */ ILCID_POSIX_MAP(nso), /* nso Sotho, Northern (Sepedi dialect) 0x6c */ + ILCID_POSIX_MAP(oc), /* oc Occitan 0x82 */ ILCID_POSIX_MAP(om), /* om Oromo 0x72 */ ILCID_POSIX_MAP(or_IN), /* or Oriya 0x48 */ ILCID_POSIX_MAP(pa), /* pa Punjabi 0x46 */ ILCID_POSIX_MAP(pl), /* pl Polish 0x15 */ ILCID_POSIX_MAP(ps), /* ps Pashto 0x63 */ ILCID_POSIX_MAP(pt), /* pt Portuguese 0x16 */ - ILCID_POSIX_MAP(qu), /* qu Quechua (correct spelling)0x6B */ + ILCID_POSIX_MAP(qu), /* qu Quechua 0x6B */ + ILCID_POSIX_MAP(qut), /* qut K'iche 0x86 */ + ILCID_POSIX_MAP(rm), /* rm Raeto-Romance/Romansh 0x17 */ ILCID_POSIX_MAP(ro), /* ro Romanian 0x18 */ ILCID_POSIX_MAP(root), /* root 0x00 */ ILCID_POSIX_MAP(ru), /* ru Russian 0x19 */ + ILCID_POSIX_MAP(rw), /* rw Kinyarwanda 0x87 */ ILCID_POSIX_MAP(sa), /* sa Sanskrit 0x4f */ + ILCID_POSIX_MAP(sah), /* sah Yakut 0x85 */ ILCID_POSIX_MAP(sd), /* sd Sindhi 0x59 */ + ILCID_POSIX_MAP(se), /* se Sami 0x3b */ /* ILCID_POSIX_MAP(sh), // sh Serbo-Croatian 0x1a */ ILCID_POSIX_MAP(si), /* si Sinhalese 0x5b */ ILCID_POSIX_MAP(sk), /* sk Slovak 0x1b */ @@ -579,10 +688,10 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(syr), /* syr Syriac 0x5A */ ILCID_POSIX_MAP(ta), /* ta Tamil 0x49 */ ILCID_POSIX_MAP(te), /* te Telugu 0x4a */ + ILCID_POSIX_MAP(tg), /* tg Tajik 0x28 */ ILCID_POSIX_MAP(th), /* th Thai 0x1e */ ILCID_POSIX_MAP(ti), /* ti Tigrigna 0x73 */ ILCID_POSIX_MAP(tk), /* tk Turkmen 0x42 */ - ILCID_POSIX_MAP(tl), /* tl Tagalog (Filipino) 0x64 */ ILCID_POSIX_MAP(tn), /* tn Tswana 0x32 */ ILCID_POSIX_MAP(tr), /* tr Turkish 0x1f */ ILCID_POSIX_MAP(tt), /* tt Tatar 0x44 */ @@ -592,6 +701,8 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(uz), /* uz Uzbek 0x43 */ ILCID_POSIX_MAP(ve), /* ve Venda 0x33 */ ILCID_POSIX_MAP(vi), /* vi Vietnamese 0x2a */ + ILCID_POSIX_MAP(wen), /* wen Sorbian 0x2e */ + ILCID_POSIX_MAP(wo), /* wo Wolof 0x88 */ ILCID_POSIX_MAP(xh), /* xh Xhosa 0x34 */ ILCID_POSIX_MAP(yo), /* yo Yoruba 0x6a */ ILCID_POSIX_MAP(zh), /* zh Chinese 0x04 */ diff --git a/Build/source/libs/icu-xetex/common/locutil.cpp b/Build/source/libs/icu-xetex/common/locutil.cpp index 61b90892af4..777403d7980 100644 --- a/Build/source/libs/icu-xetex/common/locutil.cpp +++ b/Build/source/libs/icu-xetex/common/locutil.cpp @@ -211,7 +211,9 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) ucln_common_registerCleanup(UCLN_COMMON_SERVICE, service_cleanup); } umtx_unlock(NULL); - delete cache; + if(cache != NULL) { + delete cache; + } cache = h; } diff --git a/Build/source/libs/icu-xetex/common/putil.c b/Build/source/libs/icu-xetex/common/putil.c index b371284562e..e063a261241 100644 --- a/Build/source/libs/icu-xetex/common/putil.c +++ b/Build/source/libs/icu-xetex/common/putil.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -36,23 +36,21 @@ ****************************************************************************** */ -#ifndef PTX - /* Define _XOPEN_SOURCE for Solaris and friends. */ /* NetBSD needs it to be >= 4 */ #ifndef _XOPEN_SOURCE +#if __STDC_VERSION__ >= 199901L +/* It is invalid to compile an XPG3, XPG4, XPG4v2 or XPG5 application using c99 */ +#define _XOPEN_SOURCE 600 +#else #define _XOPEN_SOURCE 4 #endif - -/* Define __USE_POSIX and __USE_XOPEN for Linux and glibc. */ -#ifndef __USE_POSIX -#define __USE_POSIX -#endif -#ifndef __USE_XOPEN -#define __USE_XOPEN #endif -#endif /* PTX */ +/* Make sure things like readlink and such functions work. */ +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED 1 +#endif /* include ICU headers */ #include "unicode/utypes.h" @@ -84,6 +82,7 @@ # define NOIME # define NOMCX # include <windows.h> +# include "wintz.h" #elif defined(U_CYGWIN) && defined(__STRICT_ANSI__) /* tzset isn't defined in strict ANSI on Cygwin. */ # undef __STRICT_ANSI__ @@ -102,12 +101,9 @@ # define ICU_NO_USER_DATA_OVERRIDE 1 #elif defined(OS390) #include "unicode/ucnv.h" /* Needed for UCNV_SWAP_LFNL_OPTION_STRING */ -#elif defined(U_AIX) -#elif defined(U_SOLARIS) || defined(U_LINUX) -#elif defined(U_HPUX) -#elif defined(U_DARWIN) -#include <sys/file.h> -#include <sys/param.h> +#elif defined(U_DARWIN) || defined(U_LINUX) || defined(U_BSD) +#include <limits.h> +#include <unistd.h> #elif defined(U_QNX) #include <sys/neutrino.h> #endif @@ -136,41 +132,14 @@ static const char copyright[] = U_COPYRIGHT_STRING; /* We return QNAN rather than SNAN*/ #define SIGN 0x80000000U -#if defined(__GNUC__) || defined(_MSC_VER) -/* - This is an optimization for when u_topNBytesOfDouble - and u_bottomNBytesOfDouble can't be properly optimized by the compiler - or when faster infinity and NaN usage is helpful. -*/ -#define USE_64BIT_DOUBLE_OPTIMIZATION 1 -#else -#define USE_64BIT_DOUBLE_OPTIMIZATION 0 -#endif - -#if USE_64BIT_DOUBLE_OPTIMIZATION -/* gcc 3.2 has an optimization bug */ -static const int64_t gNan64 = INT64_C(0x7FF8000000000000); -static const int64_t gInf64 = INT64_C(0x7FF0000000000000); -static const double * const fgNan = (const double * const)(&gNan64); -static const double * const fgInf = (const double * const)(&gInf64); -#else - -#if IEEE_754 -#define NAN_TOP ((int16_t)0x7FF8) -#define INF_TOP ((int16_t)0x7FF0) -#elif defined(OS390) -#define NAN_TOP ((int16_t)0x7F08) -#define INF_TOP ((int16_t)0x3F00) -#endif -/* statics */ -static UBool fgNaNInitialized = FALSE; -static UBool fgInfInitialized = FALSE; -static double gNan; -static double gInf; -static double * fgNan = &gNan; -static double * fgInf = &gInf; -#endif +/* Make it easy to define certain types of constants */ +typedef union { + int64_t i64; /* This must be defined first in order to allow the initialization to work. This is a C89 feature. */ + double d64; +} BitPatternConversion; +static const BitPatternConversion gNan = { (int64_t) INT64_C(0x7FF8000000000000) }; +static const BitPatternConversion gInf = { (int64_t) INT64_C(0x7FF0000000000000) }; /*--------------------------------------------------------------------------- Platform utilities @@ -186,8 +155,11 @@ static double * fgInf = &gInf; # define U_POSIX_LOCALE 1 #endif -/* Utilities to get the bits from a double */ -#if !USE_64BIT_DOUBLE_OPTIMIZATION +/* + WARNING! u_topNBytesOfDouble and u_bottomNBytesOfDouble + can't be properly optimized by the gcc compiler sometimes (i.e. gcc 3.2). +*/ +#if !IEEE_754 static char* u_topNBytesOfDouble(double* d, int n) { @@ -277,35 +249,10 @@ U_CAPI UBool U_EXPORT2 uprv_isNaN(double number) { #if IEEE_754 -#if USE_64BIT_DOUBLE_OPTIMIZATION - /* gcc 3.2 has an optimization bug */ + BitPatternConversion convertedNumber; + convertedNumber.d64 = number; /* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */ - return (UBool)(((*((int64_t *)&number)) & U_INT64_MAX) > gInf64); - -#else - /* This should work in theory, but it doesn't, so we resort to the more*/ - /* complicated method below.*/ - /* return number != number;*/ - - /* You can't return number == getNaN() because, by definition, NaN != x for*/ - /* all x, including NaN (that is, NaN != NaN). So instead, we compare*/ - /* against the known bit pattern. We must be careful of endianism here.*/ - /* The pattern we are looking for id:*/ - - /* 7FFy yyyy yyyy yyyy (some y non-zero)*/ - - /* There are two different kinds of NaN, but we ignore the distinction*/ - /* here. Note that the y value must be non-zero; if it is zero, then we*/ - /* have infinity.*/ - - uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, - sizeof(uint32_t)); - uint32_t lowBits = *(uint32_t*)u_bottomNBytesOfDouble(&number, - sizeof(uint32_t)); - - return (UBool)(((highBits & 0x7FF00000L) == 0x7FF00000L) && - (((highBits & 0x000FFFFFL) != 0) || (lowBits != 0))); -#endif + return (UBool)((convertedNumber.i64 & U_INT64_MAX) > gInf.i64); #elif defined(OS390) uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, @@ -328,32 +275,10 @@ U_CAPI UBool U_EXPORT2 uprv_isInfinite(double number) { #if IEEE_754 -#if USE_64BIT_DOUBLE_OPTIMIZATION - /* gcc 3.2 has an optimization bug */ - return (UBool)(((*((int64_t *)&number)) & U_INT64_MAX) == gInf64); -#else - - /* We know the top bit is the sign bit, so we mask that off in a copy of */ - /* the number and compare against infinity. [LIU]*/ - /* The following approach doesn't work for some reason, so we go ahead and */ - /* scrutinize the pattern itself. */ - /* double a = number; */ - /* *(int8_t*)u_topNBytesOfDouble(&a, 1) &= 0x7F;*/ - /* return a == uprv_getInfinity();*/ - /* Instead, We want to see either:*/ - - /* 7FF0 0000 0000 0000*/ - /* FFF0 0000 0000 0000*/ - - uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, - sizeof(uint32_t)); - uint32_t lowBits = *(uint32_t*)u_bottomNBytesOfDouble(&number, - sizeof(uint32_t)); - - return (UBool)(((highBits & ~SIGN) == 0x7FF00000U) && - (lowBits == 0x00000000U)); -#endif - + BitPatternConversion convertedNumber; + convertedNumber.d64 = number; + /* Infinity is exactly 0x7FF0000000000000U. */ + return (UBool)((convertedNumber.i64 & U_INT64_MAX) == gInf.i64); #elif defined(OS390) uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, sizeof(uint32_t)); @@ -398,19 +323,7 @@ U_CAPI double U_EXPORT2 uprv_getNaN() { #if IEEE_754 || defined(OS390) -#if !USE_64BIT_DOUBLE_OPTIMIZATION - if (!fgNaNInitialized) { - /* This variable is always initialized with the same value, - so a mutex isn't needed. */ - int i; - int8_t* p = (int8_t*)fgNan; - for(i = 0; i < sizeof(double); ++i) - *p++ = 0; - *(int16_t*)u_topNBytesOfDouble(fgNan, sizeof(NAN_TOP)) = NAN_TOP; - fgNaNInitialized = TRUE; - } -#endif - return *fgNan; + return gNan.d64; #else /* If your platform doesn't support IEEE 754 but *does* have an NaN value,*/ /* you'll need to replace this default implementation with what's correct*/ @@ -423,20 +336,7 @@ U_CAPI double U_EXPORT2 uprv_getInfinity() { #if IEEE_754 || defined(OS390) -#if !USE_64BIT_DOUBLE_OPTIMIZATION - if (!fgInfInitialized) - { - /* This variable is always initialized with the same value, - so a mutex isn't needed. */ - int i; - int8_t* p = (int8_t*)fgInf; - for(i = 0; i < sizeof(double); ++i) - *p++ = 0; - *(int16_t*)u_topNBytesOfDouble(fgInf, sizeof(INF_TOP)) = INF_TOP; - fgInfInitialized = TRUE; - } -#endif - return *fgInf; + return gInf.d64; #else /* If your platform doesn't support IEEE 754 but *does* have an infinity*/ /* value, you'll need to replace this default implementation with what's*/ @@ -515,12 +415,6 @@ uprv_fmax(double x, double y) return (x > y ? x : y); } -U_CAPI int32_t U_EXPORT2 -uprv_max(int32_t x, int32_t y) -{ - return (x > y ? x : y); -} - U_CAPI double U_EXPORT2 uprv_fmin(double x, double y) { @@ -542,12 +436,6 @@ uprv_fmin(double x, double y) return (x > y ? y : x); } -U_CAPI int32_t U_EXPORT2 -uprv_min(int32_t x, int32_t y) -{ - return (x > y ? y : x); -} - /** * Truncates the given double. * trunc(3.3) = 3.0, trunc (-3.3) = -3.0 @@ -589,40 +477,6 @@ uprv_maxMantissa(void) return pow(2.0, DBL_MANT_DIG + 1.0) - 1.0; } -/** - * Return the floor of the log base 10 of a given double. - * This method compensates for inaccuracies which arise naturally when - * computing logs, and always give the correct value. The parameter - * must be positive and finite. - * (Thanks to Alan Liu for supplying this function.) - */ -U_CAPI int16_t U_EXPORT2 -uprv_log10(double d) -{ -#ifdef OS400 - /* We don't use the normal implementation because you can't underflow */ - /* a double otherwise an underflow exception occurs */ - return log10(d); -#else - /* The reason this routine is needed is that simply taking the*/ - /* log and dividing by log10 yields a result which may be off*/ - /* by 1 due to rounding errors. For example, the naive log10*/ - /* of 1.0e300 taken this way is 299, rather than 300.*/ - double alog10 = log(d) / log(10.0); - int16_t ailog10 = (int16_t) floor(alog10); - - /* Positive logs could be too small, e.g. 0.99 instead of 1.0*/ - if (alog10 > 0 && d >= pow(10.0, (double)(ailog10 + 1))) - ++ailog10; - - /* Negative logs could be too big, e.g. -0.99 instead of -1.0*/ - else if (alog10 < 0 && d < pow(10.0, (double)(ailog10))) - --ailog10; - - return ailog10; -#endif -} - U_CAPI double U_EXPORT2 uprv_log(double d) { @@ -681,487 +535,6 @@ uprv_digitsAfterDecimal(double x) platform with new implementations. ---------------------------------------------------------------------------*/ -/* Win32 time zone detection ------------------------------------------------ */ - -#ifdef U_WINDOWS - -/* - This code attempts to detect the Windows time zone, as set in the - Windows Date and Time control panel. It attempts to work on - multiple flavors of Windows (9x, Me, NT, 2000, XP) and on localized - installs. It works by directly interrogating the registry and - comparing the data there with the data returned by the - GetTimeZoneInformation API, along with some other strategies. The - registry contains time zone data under one of two keys (depending on - the flavor of Windows): - - HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\ - HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ - - Under this key are several subkeys, one for each time zone. These - subkeys are named "Pacific" on Win9x/Me and "Pacific Standard Time" - on WinNT/2k/XP. There are some other wrinkles; see the code for - details. The subkey name is NOT LOCALIZED, allowing us to support - localized installs. - - Under the subkey are data values. We care about: - - Std Standard time display name, localized - TZI Binary block of data - - The TZI data is of particular interest. It contains the offset, two - more offsets for standard and daylight time, and the start and end - rules. This is the same data returned by the GetTimeZoneInformation - API. The API may modify the data on the way out, so we have to be - careful, but essentially we do a binary comparison against the TZI - blocks of various registry keys. When we find a match, we know what - time zone Windows is set to. Since the registry key is not - localized, we can then translate the key through a simple table - lookup into the corresponding ICU time zone. - - This strategy doesn't always work because there are zones which - share an offset and rules, so more than one TZI block will match. - For example, both Tokyo and Seoul are at GMT+9 with no DST rules; - their TZI blocks are identical. For these cases, we fall back to a - name lookup. We attempt to match the display name as stored in the - registry for the current zone to the display name stored in the - registry for various Windows zones. By comparing the registry data - directly we avoid conversion complications. - - Author: Alan Liu - Since: ICU 2.6 - Based on original code by Carl Brown <cbrown@xnetinc.com> -*/ - -/** - * Layout of the binary registry data under the "TZI" key. - */ -typedef struct { - LONG Bias; - LONG StandardBias; - LONG DaylightBias; /* Tweaked by GetTimeZoneInformation */ - SYSTEMTIME StandardDate; - SYSTEMTIME DaylightDate; -} TZI; - -typedef struct { - const char* icuid; - const char* winid; -} WindowsICUMap; - -/** - * Mapping between Windows zone IDs and ICU zone IDs. This list has - * been mechanically checked; all zone offsets match (most important) - * and city names match the display city names (where possible). The - * presence or absence of DST differs in some cases, but this is - * acceptable as long as the zone is semantically the same (which has - * been manually checked). - * - * Windows 9x/Me zone IDs are listed as "Pacific" rather than "Pacific - * Standard Time", which is seen in NT/2k/XP. This is fixed-up at - * runtime as needed. The one exception is "Mexico Standard Time 2", - * which is not present on Windows 9x/Me. - * - * Zones that are not unique under Offset+Rules should be grouped - * together for efficiency (see code below). In addition, rules MUST - * be grouped so that all zones of a single offset are together. - * - * Comments list S(tandard) or D(aylight), as declared by Windows, - * followed by the display name (data from Windows XP). - * - * NOTE: Etc/GMT+12 is CORRECT for offset GMT-12:00. Consult - * documentation elsewhere for an explanation. - */ -static const WindowsICUMap ZONE_MAP[] = { - "Etc/GMT+12", "Dateline", /* S (GMT-12:00) International Date Line West */ - - "Pacific/Apia", "Samoa", /* S (GMT-11:00) Midway Island, Samoa */ - - "Pacific/Honolulu", "Hawaiian", /* S (GMT-10:00) Hawaii */ - - "America/Anchorage", "Alaskan", /* D (GMT-09:00) Alaska */ - - "America/Los_Angeles", "Pacific", /* D (GMT-08:00) Pacific Time (US & Canada); Tijuana */ - - "America/Phoenix", "US Mountain", /* S (GMT-07:00) Arizona */ - "America/Denver", "Mountain", /* D (GMT-07:00) Mountain Time (US & Canada) */ - "America/Chihuahua", "Mexico Standard Time 2", /* D (GMT-07:00) Chihuahua, La Paz, Mazatlan */ - - "America/Managua", "Central America", /* S (GMT-06:00) Central America */ - "America/Regina", "Canada Central", /* S (GMT-06:00) Saskatchewan */ - "America/Mexico_City", "Mexico", /* D (GMT-06:00) Guadalajara, Mexico City, Monterrey */ - "America/Chicago", "Central", /* D (GMT-06:00) Central Time (US & Canada) */ - - "America/Indianapolis", "US Eastern", /* S (GMT-05:00) Indiana (East) */ - "America/Bogota", "SA Pacific", /* S (GMT-05:00) Bogota, Lima, Quito */ - "America/New_York", "Eastern", /* D (GMT-05:00) Eastern Time (US & Canada) */ - - "America/Caracas", "SA Western", /* S (GMT-04:00) Caracas, La Paz */ - "America/Santiago", "Pacific SA", /* D (GMT-04:00) Santiago */ - "America/Halifax", "Atlantic", /* D (GMT-04:00) Atlantic Time (Canada) */ - - "America/St_Johns", "Newfoundland", /* D (GMT-03:30) Newfoundland */ - - "America/Buenos_Aires", "SA Eastern", /* S (GMT-03:00) Buenos Aires, Georgetown */ - "America/Godthab", "Greenland", /* D (GMT-03:00) Greenland */ - "America/Sao_Paulo", "E. South America", /* D (GMT-03:00) Brasilia */ - - "America/Noronha", "Mid-Atlantic", /* D (GMT-02:00) Mid-Atlantic */ - - "Atlantic/Cape_Verde", "Cape Verde", /* S (GMT-01:00) Cape Verde Is. */ - "Atlantic/Azores", "Azores", /* D (GMT-01:00) Azores */ - - "Africa/Casablanca", "Greenwich", /* S (GMT) Casablanca, Monrovia */ - "Europe/London", "GMT", /* D (GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London */ - - "Africa/Lagos", "W. Central Africa", /* S (GMT+01:00) West Central Africa */ - "Europe/Berlin", "W. Europe", /* D (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna */ - "Europe/Paris", "Romance", /* D (GMT+01:00) Brussels, Copenhagen, Madrid, Paris */ - "Europe/Sarajevo", "Central European", /* D (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb */ - "Europe/Belgrade", "Central Europe", /* D (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */ - - "Africa/Johannesburg", "South Africa", /* S (GMT+02:00) Harare, Pretoria */ - "Asia/Jerusalem", "Israel", /* S (GMT+02:00) Jerusalem */ - "Europe/Istanbul", "GTB", /* D (GMT+02:00) Athens, Istanbul, Minsk */ - "Europe/Helsinki", "FLE", /* D (GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */ - "Africa/Cairo", "Egypt", /* D (GMT+02:00) Cairo */ - "Europe/Bucharest", "E. Europe", /* D (GMT+02:00) Bucharest */ - - "Africa/Nairobi", "E. Africa", /* S (GMT+03:00) Nairobi */ - "Asia/Riyadh", "Arab", /* S (GMT+03:00) Kuwait, Riyadh */ - "Europe/Moscow", "Russian", /* D (GMT+03:00) Moscow, St. Petersburg, Volgograd */ - "Asia/Baghdad", "Arabic", /* D (GMT+03:00) Baghdad */ - - "Asia/Tehran", "Iran", /* D (GMT+03:30) Tehran */ - - "Asia/Muscat", "Arabian", /* S (GMT+04:00) Abu Dhabi, Muscat */ - "Asia/Tbilisi", "Caucasus", /* D (GMT+04:00) Baku, Tbilisi, Yerevan */ - - "Asia/Kabul", "Afghanistan", /* S (GMT+04:30) Kabul */ - - "Asia/Karachi", "West Asia", /* S (GMT+05:00) Islamabad, Karachi, Tashkent */ - "Asia/Yekaterinburg", "Ekaterinburg", /* D (GMT+05:00) Ekaterinburg */ - - "Asia/Calcutta", "India", /* S (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi */ - - "Asia/Katmandu", "Nepal", /* S (GMT+05:45) Kathmandu */ - - "Asia/Colombo", "Sri Lanka", /* S (GMT+06:00) Sri Jayawardenepura */ - "Asia/Dhaka", "Central Asia", /* S (GMT+06:00) Astana, Dhaka */ - "Asia/Novosibirsk", "N. Central Asia", /* D (GMT+06:00) Almaty, Novosibirsk */ - - "Asia/Rangoon", "Myanmar", /* S (GMT+06:30) Rangoon */ - - "Asia/Bangkok", "SE Asia", /* S (GMT+07:00) Bangkok, Hanoi, Jakarta */ - "Asia/Krasnoyarsk", "North Asia", /* D (GMT+07:00) Krasnoyarsk */ - - "Australia/Perth", "W. Australia", /* S (GMT+08:00) Perth */ - "Asia/Taipei", "Taipei", /* S (GMT+08:00) Taipei */ - "Asia/Singapore", "Singapore", /* S (GMT+08:00) Kuala Lumpur, Singapore */ - "Asia/Hong_Kong", "China", /* S (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi */ - "Asia/Irkutsk", "North Asia East", /* D (GMT+08:00) Irkutsk, Ulaan Bataar */ - - "Asia/Tokyo", "Tokyo", /* S (GMT+09:00) Osaka, Sapporo, Tokyo */ - "Asia/Seoul", "Korea", /* S (GMT+09:00) Seoul */ - "Asia/Yakutsk", "Yakutsk", /* D (GMT+09:00) Yakutsk */ - - "Australia/Darwin", "AUS Central", /* S (GMT+09:30) Darwin */ - "Australia/Adelaide", "Cen. Australia", /* D (GMT+09:30) Adelaide */ - - "Pacific/Guam", "West Pacific", /* S (GMT+10:00) Guam, Port Moresby */ - "Australia/Brisbane", "E. Australia", /* S (GMT+10:00) Brisbane */ - "Asia/Vladivostok", "Vladivostok", /* D (GMT+10:00) Vladivostok */ - "Australia/Hobart", "Tasmania", /* D (GMT+10:00) Hobart */ - "Australia/Sydney", "AUS Eastern", /* D (GMT+10:00) Canberra, Melbourne, Sydney */ - - "Asia/Magadan", "Central Pacific", /* S (GMT+11:00) Magadan, Solomon Is., New Caledonia */ - - "Pacific/Fiji", "Fiji", /* S (GMT+12:00) Fiji, Kamchatka, Marshall Is. */ - "Pacific/Auckland", "New Zealand", /* D (GMT+12:00) Auckland, Wellington */ - - "Pacific/Tongatapu", "Tonga", /* S (GMT+13:00) Nuku'alofa */ - NULL, NULL -}; - -typedef struct { - const char* winid; - const char* altwinid; -} WindowsZoneRemap; - -/** - * If a lookup fails, we attempt to remap certain Windows ids to - * alternate Windows ids. If the alternate listed here begins with - * '-', we use it as is (without the '-'). If it begins with '+', we - * append a " Standard Time" if appropriate. - */ -static const WindowsZoneRemap ZONE_REMAP[] = { - "Central European", "-Warsaw", - "Central Europe", "-Prague Bratislava", - "China", "-Beijing", - - "Greenwich", "+GMT", - "GTB", "+GFT", - "Arab", "+Saudi Arabia", - "SE Asia", "+Bangkok", - "AUS Eastern", "+Sydney", - NULL, NULL, -}; - -/** - * Various registry keys and key fragments. - */ -static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\"; -static const char STANDARD_NAME_REGKEY[] = "StandardName"; -static const char STANDARD_TIME_REGKEY[] = " Standard Time"; -static const char TZI_REGKEY[] = "TZI"; -static const char STD_REGKEY[] = "Std"; - -/** - * HKLM subkeys used to probe for the flavor of Windows. Note that we - * specifically check for the "GMT" zone subkey; this is present on - * NT, but on XP has become "GMT Standard Time". We need to - * discriminate between these cases. - */ -static const char* const WIN_TYPE_PROBE_REGKEY[] = { - /* WIN_9X_ME_TYPE */ - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones", - - /* WIN_NT_TYPE */ - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\GMT" - - /* otherwise: WIN_2K_XP_TYPE */ -}; - -/** - * The time zone root subkeys (under HKLM) for different flavors of - * Windows. - */ -static const char* const TZ_REGKEY[] = { - /* WIN_9X_ME_TYPE */ - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\", - - /* WIN_NT_TYPE | WIN_2K_XP_TYPE */ - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\" -}; - -/** - * Flavor of Windows, from our perspective. Not a real OS version, - * but rather the flavor of the layout of the time zone information in - * the registry. - */ -enum { - WIN_9X_ME_TYPE = 0, - WIN_NT_TYPE = 1, - WIN_2K_XP_TYPE = 2 -}; - -/** - * Auxiliary Windows time zone function. Attempts to open the given - * Windows time zone ID as a registry key. Returns ERROR_SUCCESS if - * successful. Caller must close the registry key. Handles - * variations in the resource layout in different flavors of Windows. - * - * @param hkey output parameter to receive opened registry key - * @param winid Windows zone ID, e.g., "Pacific", without the - * " Standard Time" suffix (if any). Special case "Mexico Standard Time 2" - * allowed. - * @param winType Windows flavor (WIN_9X_ME_TYPE, etc.) - * @return ERROR_SUCCESS upon success - */ -static LONG openTZRegKey(HKEY *hkey, const char* winid, int winType) { - LONG result; - char subKeyName[96]; - char* name; - int i; - - uprv_strcpy(subKeyName, TZ_REGKEY[(winType == WIN_9X_ME_TYPE) ? 0 : 1]); - name = &subKeyName[strlen(subKeyName)]; - uprv_strcat(subKeyName, winid); - if (winType != WIN_9X_ME_TYPE) { - /* Don't modify "Mexico Standard Time 2", which does not occur - on WIN_9X_ME_TYPE. Also, if the type is WIN_NT_TYPE, then - in practice this means the GMT key is not followed by - " Standard Time", so don't append in that case. */ - int isMexico2 = (winid[uprv_strlen(winid)- 1] == '2'); - if (!isMexico2 && - !(winType == WIN_NT_TYPE && uprv_strcmp(winid, "GMT") == 0)) { - uprv_strcat(subKeyName, STANDARD_TIME_REGKEY); - } - } - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - subKeyName, - 0, - KEY_QUERY_VALUE, - hkey); - - if (result != ERROR_SUCCESS) { - /* If the primary lookup fails, try to remap the Windows zone - ID, according to the remapping table. */ - for (i=0; ZONE_REMAP[i].winid; ++i) { - if (uprv_strcmp(winid, ZONE_REMAP[i].winid) == 0) { - uprv_strcpy(name, ZONE_REMAP[i].altwinid + 1); - if (*(ZONE_REMAP[i].altwinid) == '+' && - winType != WIN_9X_ME_TYPE) { - uprv_strcat(subKeyName, STANDARD_TIME_REGKEY); - } - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - subKeyName, - 0, - KEY_QUERY_VALUE, - hkey); - break; - } - } - } - - return result; -} - -/** - * Main Windows time zone detection function. Returns the Windows - * time zone, translated to an ICU time zone, or NULL upon failure. - */ -static const char* detectWindowsTimeZone() { - int winType; - LONG result; - HKEY hkey; - TZI tziKey; - TZI tziReg; - DWORD cbData = sizeof(TZI); - TIME_ZONE_INFORMATION apiTZI; - char stdName[32]; - DWORD stdNameSize; - char stdRegName[64]; - DWORD stdRegNameSize; - int firstMatch, lastMatch; - int j; - - /* Detect the version of windows by trying to open a sequence of - probe keys. We don't use the OS version API because what we - really want to know is how the registry is laid out. - Specifically, is it 9x/Me or not, and is it "GMT" or "GMT - Standard Time". */ - for (winType=0; winType<2; ++winType) { - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - WIN_TYPE_PROBE_REGKEY[winType], - 0, - KEY_QUERY_VALUE, - &hkey); - RegCloseKey(hkey); - if (result == ERROR_SUCCESS) { - break; - } - } - - /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it - to TZI. We could also interrogate the registry directly; we do - this below if needed. */ - uprv_memset(&apiTZI, 0, sizeof(apiTZI)); - GetTimeZoneInformation(&apiTZI); - tziKey.Bias = apiTZI.Bias; - uprv_memcpy((char *)&tziKey.StandardDate, (char*)&apiTZI.StandardDate, - sizeof(apiTZI.StandardDate)); - uprv_memcpy((char *)&tziKey.DaylightDate, (char*)&apiTZI.DaylightDate, - sizeof(apiTZI.DaylightDate)); - - /* For each zone that can be identified by Offset+Rules, see if we - have a match. Continue scanning after finding a match, - recording the index of the first and the last match. We have - to do this because some zones are not unique under - Offset+Rules. */ - firstMatch = lastMatch = -1; - for (j=0; ZONE_MAP[j].icuid; j++) { - result = openTZRegKey(&hkey, ZONE_MAP[j].winid, winType); - if (result == ERROR_SUCCESS) { - result = RegQueryValueEx(hkey, - TZI_REGKEY, - NULL, - NULL, - (LPBYTE)&tziReg, - &cbData); - } - RegCloseKey(hkey); - if (result == ERROR_SUCCESS) { - /* Assume that offsets are grouped together, and bail out - when we've scanned everything with a matching - offset. */ - if (firstMatch >= 0 && tziKey.Bias != tziReg.Bias) { - break; - } - /* Windows alters the DaylightBias in some situations. - Using the bias and the rules suffices, so overwrite - these unreliable fields. */ - tziKey.StandardBias = tziReg.StandardBias; - tziKey.DaylightBias = tziReg.DaylightBias; - if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, - sizeof(tziKey)) == 0) { - if (firstMatch < 0) { - firstMatch = j; - } - lastMatch = j; - } - } - } - - /* This should never happen; if it does it means our table doesn't - match Windows AT ALL, perhaps because this is post-XP? */ - if (firstMatch < 0) { - return NULL; - } - - if (firstMatch != lastMatch) { - /* Offset+Rules lookup yielded >= 2 matches. Try to match the - localized display name. Get the name from the registry - (not the API). This avoids conversion issues. Use the - standard name, since Windows modifies the daylight name to - match the standard name if there is no DST. */ - result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - CURRENT_ZONE_REGKEY, - 0, - KEY_QUERY_VALUE, - &hkey); - if (result == ERROR_SUCCESS) { - stdNameSize = sizeof(stdName); - result = RegQueryValueEx(hkey, - (LPTSTR)STANDARD_NAME_REGKEY, - NULL, - NULL, - (LPBYTE)stdName, - &stdNameSize); - RegCloseKey(hkey); - - /* Scan through the Windows time zone data in the registry - again (just the range of zones with matching TZIs) and - look for a standard display name match. */ - for (j=firstMatch; j<=lastMatch; j++) { - result = openTZRegKey(&hkey, ZONE_MAP[j].winid, winType); - if (result == ERROR_SUCCESS) { - stdRegNameSize = sizeof(stdRegName); - result = RegQueryValueEx(hkey, - (LPTSTR)STD_REGKEY, - NULL, - NULL, - (LPBYTE)stdRegName, - &stdRegNameSize); - } - RegCloseKey(hkey); - if (result == ERROR_SUCCESS && - stdRegNameSize == stdNameSize && - uprv_memcmp(stdName, stdRegName, stdNameSize) == 0) { - firstMatch = j; /* record the match */ - break; - } - } - } else { - RegCloseKey(hkey); /* should never get here */ - } - } - - return ZONE_MAP[firstMatch].icuid; -} - -#endif /*U_WINDOWS*/ - /* Generic time zone layer -------------------------------------------------- */ /* Time zone utilities */ @@ -1209,58 +582,103 @@ uprv_timezone() extern U_IMPORT char *U_TZNAME[]; #endif -#if defined(U_DARWIN) /* For Mac OS X */ +#if !UCONFIG_NO_FILE_IO && (defined(U_DARWIN) || defined(U_LINUX) || defined(U_BSD)) +/* These platforms are likely to use Olson timezone IDs. */ +#define CHECK_LOCALTIME_LINK 1 #define TZZONELINK "/etc/localtime" #define TZZONEINFO "/usr/share/zoneinfo/" -static char *gTimeZoneBuffer = NULL; /* Heap allocated */ +static char gTimeZoneBuffer[PATH_MAX]; +static char *gTimeZoneBufferPtr = NULL; +#endif + +#ifndef U_WINDOWS +#define isNonDigit(ch) (ch < '0' || '9' < ch) +static UBool isValidOlsonID(const char *id) { + int32_t idx = 0; + + /* Determine if this is something like Iceland (Olson ID) + or AST4ADT (non-Olson ID) */ + while (id[idx] && isNonDigit(id[idx]) && id[idx] != ',') { + idx++; + } + + /* If we went through the whole string, then it might be okay. + The timezone is sometimes set to "CST-7CDT", "CST6CDT5,J129,J131/19:30", + "GRNLNDST3GRNLNDDT" or similar, so we cannot use it. + The rest of the time it could be an Olson ID. George */ + return (UBool)(id[idx] == 0 + || uprv_strcmp(id, "PST8PDT") == 0 + || uprv_strcmp(id, "MST7MDT") == 0 + || uprv_strcmp(id, "CST6CDT") == 0 + || uprv_strcmp(id, "EST5EDT") == 0); +} #endif U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { #ifdef U_WINDOWS - char* id = (char*) detectWindowsTimeZone(); + const char *id = uprv_detectWindowsTimeZone(); + if (id != NULL) { return id; } -#endif +#else + const char *tzenv = NULL; -#if defined(U_DARWIN) +/*#if defined(U_DARWIN) int ret; - char *tzenv; - tzenv = getenv("TZFILE"); if (tzenv != NULL) { return tzenv; } +#endif*/ -#if 0 - /* TZ is often set to "PST8PDT" or similar, so we cannot use it. Alan */ tzenv = getenv("TZ"); - if (tzenv != NULL) { + if (tzenv != NULL && isValidOlsonID(tzenv)) + { + /* This might be a good Olson ID. */ + if (uprv_strncmp(tzenv, "posix/", 6) == 0 + || uprv_strncmp(tzenv, "right/", 6) == 0) + { + /* Remove the posix/ or right/ prefix. */ + tzenv += 6; + } return tzenv; } -#endif - - /* Caller must handle threading issues */ - if (gTimeZoneBuffer == NULL) { - gTimeZoneBuffer = (char *) uprv_malloc(MAXPATHLEN + 2); + /* else U_TZNAME will give a better result. */ - ret = readlink(TZZONELINK, gTimeZoneBuffer, MAXPATHLEN + 2); +#if defined(CHECK_LOCALTIME_LINK) + /* Caller must handle threading issues */ + if (gTimeZoneBufferPtr == NULL) { + /* + This is a trick to look at the name of the link to get the Olson ID + because the tzfile contents is underspecified. + This isn't guaranteed to work because it may not be a symlink. + */ + int32_t ret = (int32_t)readlink(TZZONELINK, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)); if (0 < ret) { - gTimeZoneBuffer[ret] = '\0'; - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, sizeof(TZZONEINFO) - 1) == 0) { - return (gTimeZoneBuffer += sizeof(TZZONEINFO) - 1); + int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO); + gTimeZoneBuffer[ret] = 0; + if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, tzZoneInfoLen) == 0 + && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) + { + return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); } } - - uprv_free(gTimeZoneBuffer); - gTimeZoneBuffer = NULL; } + else { + return gTimeZoneBufferPtr; + } +#endif #endif #ifdef U_TZNAME + /* + U_TZNAME is usually a non-unique abbreviation, + which isn't normally usable. + */ return U_TZNAME[n]; #else return ""; @@ -1384,7 +802,7 @@ u_getDataDirectory(void) { There may also be some platforms where environment variables are not allowed. */ -# if !defined(ICU_NO_USER_DATA_OVERRIDE) && (!defined(UCONFIG_NO_FILE_IO) || !UCONFIG_NO_FILE_IO) +# if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO /* First try to get the environment variable */ path=getenv("ICU_DATA"); # endif @@ -1520,32 +938,48 @@ static const char *uprv_getPOSIXID(void) { static const char* posixID = NULL; if (posixID == 0) { - posixID = getenv("LC_ALL"); - if (posixID == 0) { - posixID = getenv("LANG"); + /* + * On Solaris two different calls to setlocale can result in + * different values. Only get this value once. + * + * We must check this first because an application can set this. + * + * LC_ALL can't be used because it's platform dependent. The LANG + * environment variable seems to affect LC_CTYPE variable by default. + * Here is what setlocale(LC_ALL, NULL) can return. + * HPUX can return 'C C C C C C C' + * Solaris can return /en_US/C/C/C/C/C on the second try. + * Linux can return LC_CTYPE=C;LC_NUMERIC=C;... + * + * The default codepage detection also needs to use LC_CTYPE. + * + * Do not call setlocale(LC_*, "")! Using an empty string instead + * of NULL, will modify the libc behavior. + */ + posixID = setlocale(LC_CTYPE, NULL); + if ((posixID == 0) + || (uprv_strcmp("C", posixID) == 0) + || (uprv_strcmp("POSIX", posixID) == 0)) + { + /* Maybe we got some garbage. Try something more reasonable */ + posixID = getenv("LC_ALL"); if (posixID == 0) { - /* - * On Solaris two different calls to setlocale can result in - * different values. Only get this value once. - */ - posixID = setlocale(LC_ALL, NULL); + posixID = getenv("LC_CTYPE"); + if (posixID == 0) { + posixID = getenv("LANG"); + } } } - } - if (posixID==0) - { - /* Nothing worked. Give it a nice value. */ - posixID = "en_US"; - } - else if ((uprv_strcmp("C", posixID) == 0) - || (uprv_strchr(posixID, ' ') != NULL) - || (uprv_strchr(posixID, '/') != NULL)) - { /* HPUX returns 'C C C C C C C' */ - /* Solaris can return /en_US/C/C/C/C/C on the second try. */ - /* Maybe we got some garbage. Give it a nice value. */ - posixID = "en_US_POSIX"; + if ((posixID==0) + || (uprv_strcmp("C", posixID) == 0) + || (uprv_strcmp("POSIX", posixID) == 0)) + { + /* Nothing worked. Give it a nice POSIX default value. */ + posixID = "en_US_POSIX"; + } } + return posixID; } #endif @@ -1595,7 +1029,7 @@ The leftmost codepage (.xxx) wins. if ((p = uprv_strchr(posixID, '.')) != NULL) { /* assume new locale can't be larger than old one? */ - correctedPOSIXLocale = uprv_malloc(uprv_strlen(posixID)); + correctedPOSIXLocale = uprv_malloc(uprv_strlen(posixID)+1); uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); correctedPOSIXLocale[p-posixID] = 0; @@ -1608,7 +1042,7 @@ The leftmost codepage (.xxx) wins. /* Note that we scan the *uncorrected* ID. */ if ((p = uprv_strrchr(posixID, '@')) != NULL) { if (correctedPOSIXLocale == NULL) { - correctedPOSIXLocale = uprv_malloc(uprv_strlen(posixID)); + correctedPOSIXLocale = uprv_malloc(uprv_strlen(posixID)+1); uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); correctedPOSIXLocale[p-posixID] = 0; } @@ -1617,12 +1051,7 @@ The leftmost codepage (.xxx) wins. /* Take care of any special cases here.. */ if (!uprv_strcmp(p, "nynorsk")) { p = "NY"; - - /* Should we assume no_NO_NY instead of possible no__NY? - * if (!uprv_strcmp(correctedPOSIXLocale, "no")) { - * uprv_strcpy(correctedPOSIXLocale, "no_NO"); - * } - */ + /* Don't worry about no__NY. In practice, it won't appear. */ } if (uprv_strchr(correctedPOSIXLocale,'_') == NULL) { @@ -1645,6 +1074,8 @@ The leftmost codepage (.xxx) wins. /* Should there be a map from 'no@nynorsk' -> no_NO_NY here? * How about 'russian' -> 'ru'? + * Many of the other locales using ISO codes will be handled by the + * canonicalization functions in uloc_getDefault. */ } @@ -1810,6 +1241,81 @@ The leftmost codepage (.xxx) wins. } +#if U_POSIX_LOCALE +/* +Due to various platform differences, one platform may specify a charset, +when they really mean a different charset. Remap the names so that they are +compatible with ICU. +*/ +static const char* +remapPlatformDependentCodepage(const char *locale, const char *name) { + if (locale != NULL && *locale == 0) { + /* Make sure that an empty locale is handled the same way. */ + locale = NULL; + } + if (name == NULL) { + return NULL; + } +#if defined(U_AIX) + if (uprv_strcmp(name, "IBM-943") == 0) { + /* Use the ASCII compatible ibm-943 */ + name = "Shift-JIS"; + } + else if (uprv_strcmp(name, "IBM-1252") == 0) { + /* Use the windows-1252 that contains the Euro */ + name = "IBM-5348"; + } +#elif defined(U_SOLARIS) + if (locale != NULL && uprv_strcmp(name, "EUC") == 0) { + /* Solaris underspecifies the "EUC" name. */ + if (uprv_strcmp(locale, "zh_CN") == 0) { + name = "EUC-CN"; + } + else if (uprv_strcmp(locale, "zh_TW") == 0) { + name = "EUC-TW"; + } + else if (uprv_strcmp(locale, "ko_KR") == 0) { + name = "EUC-KR"; + } + } +#elif defined(U_DARWIN) + if (locale == NULL && *name == 0) { + /* + No locale was specified, and an empty name was passed in. + This usually indicates that nl_langinfo didn't return valid information. + Mac OS X uses UTF-8 by default (especially the locale data and console). + */ + name = "UTF-8"; + } +#endif + /* return NULL when "" is passed in */ + if (*name == 0) { + name = NULL; + } + return name; +} + +static const char* +getCodepageFromPOSIXID(const char *localeName, char * buffer, int32_t buffCapacity) +{ + char localeBuf[100]; + const char *name = NULL; + char *variant = NULL; + + if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { + size_t localeCapacity = uprv_min(sizeof(localeBuf), (name-localeName)+1); + uprv_strncpy(localeBuf, localeName, localeCapacity); + localeBuf[localeCapacity-1] = 0; /* ensure NULL termination */ + name = uprv_strncpy(buffer, name+1, buffCapacity); + buffer[buffCapacity-1] = 0; /* ensure NULL termination */ + if ((variant = (uprv_strchr(name, '@'))) != NULL) { + *variant = 0; + } + name = remapPlatformDependentCodepage(localeBuf, name); + } + return name; +} +#endif static const char* int_getDefaultCodepage() @@ -1850,58 +1356,32 @@ int_getDefaultCodepage() #elif U_POSIX_LOCALE static char codesetName[100]; - char *name = NULL; - char *euro = NULL; const char *localeName = NULL; + const char *name = NULL; uprv_memset(codesetName, 0, sizeof(codesetName)); - /* Check setlocale before the environment variables - because the application may have set it first */ - - /* Use setlocale in a nice way. + /* Use setlocale in a nice way, and then check some environment variables. Maybe the application used setlocale already. - Normally this won't work. */ - localeName = setlocale(LC_CTYPE, NULL); - if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { - /* strip the locale name and look at the suffix only */ - name = uprv_strncpy(codesetName, name+1, sizeof(codesetName)); - codesetName[sizeof(codesetName)-1] = 0; - if ((euro = (uprv_strchr(name, '@'))) != NULL) { - *euro = 0; - } - /* if we can find the codset name from setlocale, return that. */ - if (*name) { - return name; - } + */ + localeName = uprv_getPOSIXID(); + name = getCodepageFromPOSIXID(localeName, codesetName, sizeof(codesetName)); + if (name) { + /* if we can find the codeset name from setlocale, return that. */ + return name; } /* else "C" was probably returned. That's underspecified. */ - /* Use setlocale a little more forcefully. - The application didn't use setlocale */ - localeName = setlocale(LC_CTYPE, ""); - if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { - /* strip the locale name and look at the suffix only */ - name = uprv_strncpy(codesetName, name+1, sizeof(codesetName)); - codesetName[sizeof(codesetName)-1] = 0; - if ((euro = (uprv_strchr(name, '@'))) != NULL) { - *euro = 0; - } - /* if we can find the codset name from setlocale, return that. */ - if (*name) { - return name; - } - } - /* else "C" or something like it was returned. That's still underspecified. */ - #if U_HAVE_NL_LANGINFO_CODESET if (*codesetName) { uprv_memset(codesetName, 0, sizeof(codesetName)); } - /* When available, check nl_langinfo first because it usually gives more - useful names. It depends on LC_CTYPE and not LANG or LC_ALL */ + /* When available, check nl_langinfo because it usually gives more + useful names. It depends on LC_CTYPE and not LANG or LC_ALL. + nl_langinfo may use the same buffer as setlocale. */ { const char *codeset = nl_langinfo(U_NL_LANGINFO_CODESET); + codeset = remapPlatformDependentCodepage(NULL, codeset); if (codeset != NULL) { uprv_strncpy(codesetName, codeset, sizeof(codesetName)); codesetName[sizeof(codesetName)-1] = 0; @@ -1910,28 +1390,9 @@ int_getDefaultCodepage() } #endif - /* Try a locale specified by the user. - This is usually underspecified and usually checked by setlocale already. */ - if (*codesetName) { - uprv_memset(codesetName, 0, sizeof(codesetName)); - } - localeName = uprv_getPOSIXID(); - if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { - /* strip the locale name and look at the suffix only */ - name = uprv_strncpy(codesetName, name+1, sizeof(codesetName)); - codesetName[sizeof(codesetName)-1] = 0; - if ((euro = (uprv_strchr(name, '@'))) != NULL) { - *euro = 0; - } - /* if we can find the codset name, return that. */ - if (*name) { - return name; - } - } - if (*codesetName == 0) { - /* if the table lookup failed, return US ASCII (ISO 646). */ + /* Everything failed. Return US ASCII (ISO 646). */ uprv_strcpy(codesetName, "US-ASCII"); } return codesetName; diff --git a/Build/source/libs/icu-xetex/common/putilimp.h b/Build/source/libs/icu-xetex/common/putilimp.h index 1c3e1a9db94..04c91b39032 100644 --- a/Build/source/libs/icu-xetex/common/putilimp.h +++ b/Build/source/libs/icu-xetex/common/putilimp.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -135,19 +135,6 @@ U_INTERNAL int32_t U_EXPORT2 uprv_min(int32_t d, int32_t y); U_INTERNAL double U_EXPORT2 uprv_maxMantissa(void); /** - * Return the floor of the log base 10 of a given double. - * This method compensates for inaccuracies which arise naturally when - * computing logs, and always gives the correct value. The parameter - * must be positive and finite. - * (Thanks to Alan Liu for supplying this function.) - * - * @param d the double value to apply the common log function for. - * @return the log of value d. - * @internal - */ -U_INTERNAL int16_t U_EXPORT2 uprv_log10(double d); - -/** * Floating point utility to calculate the logarithm of a double. * @internal */ @@ -260,19 +247,34 @@ U_INTERNAL UBool U_EXPORT2 uprv_pathIsAbsolute(const char *path); # elif defined(OS400) /* * With the provided macro we should never be out of range of a given segment - * (a traditional/typical segment that is). Our segments have 5 bytes for the id - * and 3 bytes for the offset. The key is that the casting takes care of only - * retrieving the offset portion minus x1000. Hence, the smallest offset seen in - * a program is x001000 and when casted to an int would be 0. That's why we can - * only add 0xffefff. Otherwise, we would exceed the segment. + * (a traditional/typical segment that is). Our segments have 5 bytes for the + * id and 3 bytes for the offset. The key is that the casting takes care of + * only retrieving the offset portion minus x1000. Hence, the smallest offset + * seen in a program is x001000 and when casted to an int would be 0. + * That's why we can only add 0xffefff. Otherwise, we would exceed the segment. * * Currently, 16MB is the current addressing limitation on as/400. This macro * may eventually be changed to use 2GB addressability for the newer version of * as/400 machines. */ # define U_MAX_PTR(base) ((void *)(((char *)base)-((int32_t)(base))+((int32_t)0xffefff))) +# elif defined(__GNUC__) && __GNUC__ >= 4 +/* + * Due to a compiler optimization bug, gcc 4 causes test failures when doing + * this math arithmetic on pointers on some platforms. It seems like the + * pointers are considered signed instead of unsigned. The uintptr_t type + * isn't available on all platforms (i.e MSVC 6) and pointers aren't always + * a scalar value (i.e. i5/OS in the lines above). + */ +# define U_MAX_PTR(base) \ + ((void *)(((uintptr_t)(base)+0x7fffffffu) > (uintptr_t)(base) \ + ? ((uintptr_t)(base)+0x7fffffffu) \ + : (uintptr_t)-1)) # else -# define U_MAX_PTR(base) ((void *)(((char *)(base)+0x7fffffffu) > (char *)(base) ? ((char *)(base)+0x7fffffffu) : (char *)-1)) +# define U_MAX_PTR(base) \ + ((char *)(((char *)(base)+0x7fffffffu) > (char *)(base) \ + ? ((char *)(base)+0x7fffffffu) \ + : (char *)-1)) # endif #endif diff --git a/Build/source/libs/icu-xetex/common/rbbi.cpp b/Build/source/libs/icu-xetex/common/rbbi.cpp index 7bb5752e8b1..e5f5eeb469b 100644 --- a/Build/source/libs/icu-xetex/common/rbbi.cpp +++ b/Build/source/libs/icu-xetex/common/rbbi.cpp @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 1999-2005 International Business Machines Corporation * +* Copyright (C) 1999-2006 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -16,14 +16,28 @@ #include "unicode/rbbi.h" #include "unicode/schriter.h" +#include "unicode/uchriter.h" #include "unicode/udata.h" #include "unicode/uclean.h" #include "rbbidata.h" #include "rbbirb.h" #include "cmemory.h" #include "cstring.h" +#include "mutex.h" +#include "ucln_cmn.h" +#include "brkeng.h" #include "uassert.h" +#include "uvector.h" + +// if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included. +#if U_LOCAL_SERVICE_HOOK +#include "localsvc.h" +#endif + +#ifdef RBBI_DEBUG +static UBool fTrace = FALSE; +#endif U_NAMESPACE_BEGIN @@ -82,7 +96,6 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status) { - u_init(&status); // Just in case ICU is not yet initialized init(); if (U_FAILURE(status)) {return;} RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *) @@ -127,12 +140,34 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const RuleBasedBreakIterator& oth * Destructor */ RuleBasedBreakIterator::~RuleBasedBreakIterator() { - delete fText; - fText = NULL; + if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) { + // fCharIter was adopted from the outside. + delete fCharIter; + } + fCharIter = NULL; + delete fSCharIter; + fCharIter = NULL; + delete fDCharIter; + fDCharIter = NULL; + + utext_close(fText); + if (fData != NULL) { fData->removeReference(); fData = NULL; } + if (fCachedBreakPositions) { + uprv_free(fCachedBreakPositions); + fCachedBreakPositions = NULL; + } + if (fLanguageBreakEngines) { + delete fLanguageBreakEngines; + fLanguageBreakEngines = NULL; + } + if (fUnhandledBreakEngine) { + delete fUnhandledBreakEngine; + fUnhandledBreakEngine = NULL; + } } /** @@ -144,10 +179,26 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { if (this == &that) { return *this; } - delete fText; - fText = NULL; - if (that.fText != NULL) { - fText = that.fText->clone(); + reset(); // Delete break cache information + fBreakType = that.fBreakType; + if (fLanguageBreakEngines != NULL) { + delete fLanguageBreakEngines; + fLanguageBreakEngines = NULL; // Just rebuild for now + } + // TODO: clone fLanguageBreakEngines from "that" + UErrorCode status = U_ZERO_ERROR; + fText = utext_clone(fText, that.fText, FALSE, TRUE, &status); + + if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) { + delete fCharIter; + } + fCharIter = NULL; + + if (that.fCharIter != NULL ) { + // This is a little bit tricky - it will intially appear that + // this->fCharIter is adopted, even if that->fCharIter was + // not adopted. That's ok. + fCharIter = that.fCharIter->clone(); } if (fData != NULL) { @@ -157,7 +208,6 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { if (that.fData != NULL) { fData = that.fData->addReference(); } - fTrace = that.fTrace; return *this; } @@ -170,14 +220,24 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { // Initializes all fields, leaving the object in a consistent state. // //----------------------------------------------------------------------------- -UBool RuleBasedBreakIterator::fTrace = FALSE; void RuleBasedBreakIterator::init() { - - fText = NULL; + UErrorCode status = U_ZERO_ERROR; + fBufferClone = FALSE; + fText = utext_openUChars(NULL, NULL, 0, &status); + fCharIter = NULL; + fSCharIter = NULL; + fDCharIter = NULL; fData = NULL; fLastRuleStatusIndex = 0; fLastStatusIndexValid = TRUE; fDictionaryCharCount = 0; + fBreakType = -1; + + fCachedBreakPositions = NULL; + fLanguageBreakEngines = NULL; + fUnhandledBreakEngine = NULL; + fNumCachedBreakPositions = 0; + fPositionInCache = 0; #ifdef RBBI_DEBUG static UBool debugInitDone = FALSE; @@ -211,20 +271,26 @@ RuleBasedBreakIterator::clone(void) const { */ UBool RuleBasedBreakIterator::operator==(const BreakIterator& that) const { - UBool r = FALSE; if (that.getDynamicClassID() != getDynamicClassID()) { - return r; + return FALSE; } const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that; - if (fText == that2.fText || - (fText != NULL && that2.fText != NULL && *that2.fText == *fText)) { - if (that2.fData == fData || - (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) { - r = TRUE; + + if (!utext_equals(fText, that2.fText)) { + // The two break iterators are operating on different text, + // or have a different interation position. + return FALSE; + }; + + // TODO: need a check for when in a dictionary region at different offsets. + + if (that2.fData == fData || + (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) { + // The two break iterators are using the same rules. + return TRUE; } - } - return r; + return FALSE; } /** @@ -240,6 +306,42 @@ RuleBasedBreakIterator::hashCode(void) const { return hash; } + +void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + reset(); + fText = utext_clone(fText, ut, FALSE, TRUE, &status); + + // Set up a dummy CharacterIterator to be returned if anyone + // calls getText(). With input from UText, there is no reasonable + // way to return a characterIterator over the actual input text. + // Return one over an empty string instead - this is the closest + // we can come to signaling a failure. + // (GetText() is obsolete, this failure is sort of OK) + if (fDCharIter == NULL) { + static UChar c = 0; + fDCharIter = new UCharCharacterIterator(&c, 0); + } + + if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) { + // existing fCharIter was adopted from the outside. Delete it now. + delete fCharIter; + } + fCharIter = fDCharIter; + + this->first(); +} + + +UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const { + UText *result = utext_clone(fillIn, fText, FALSE, TRUE, &status); + return result; +} + + + /** * Returns the description used to create this iterator */ @@ -265,23 +367,11 @@ RuleBasedBreakIterator::getRules() const { //======================================================================= /** - * Return a CharacterIterator over the text being analyzed. This version - * of this method returns the actual CharacterIterator we're using internally. - * Changing the state of this iterator can have undefined consequences. If - * you need to change it, clone it first. - * @return An iterator over the text being analyzed. + * Return a CharacterIterator over the text being analyzed. */ -const CharacterIterator& +CharacterIterator& RuleBasedBreakIterator::getText() const { - RuleBasedBreakIterator* nonConstThis = (RuleBasedBreakIterator*)this; - - // The iterator is initialized pointing to no text at all, so if this - // function is called while we're in that state, we have to fudge an - // an iterator to return. - if (nonConstThis->fText == NULL) { - nonConstThis->fText = new StringCharacterIterator(UnicodeString()); - } - return *nonConstThis->fText; + return *fCharIter; } /** @@ -291,9 +381,22 @@ RuleBasedBreakIterator::getText() const { */ void RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { + // If we are holding a CharacterIterator adopted from a + // previous call to this function, delete it now. + if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) { + delete fCharIter; + } + + fCharIter = newText; + UErrorCode status = U_ZERO_ERROR; reset(); - delete fText; - fText = newText; + if (newText==NULL || newText->startIndex() != 0) { + // startIndex !=0 wants to be an error, but there's no way to report it. + // Make the iterator text be an empty string. + fText = utext_openUChars(fText, NULL, 0, &status); + } else { + fText = utext_openCharacterIterator(fText, newText, &status); + } this->first(); } @@ -304,15 +407,26 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { */ void RuleBasedBreakIterator::setText(const UnicodeString& newText) { + UErrorCode status = U_ZERO_ERROR; reset(); - if (fText != NULL && fText->getDynamicClassID() - == StringCharacterIterator::getStaticClassID()) { - ((StringCharacterIterator*)fText)->setText(newText); + fText = utext_openConstUnicodeString(fText, &newText, &status); + + // Set up a character iterator on the string. + // Needed in case someone calls getText(). + // Can not, unfortunately, do this lazily on the (probably never) + // call to getText(), because getText is const. + if (fSCharIter == NULL) { + fSCharIter = new StringCharacterIterator(newText); + } else { + fSCharIter->setText(newText); } - else { - delete fText; - fText = new StringCharacterIterator(newText); + + if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) { + // old fCharIter was adopted from the outside. Delete it. + delete fCharIter; } + fCharIter = fSCharIter; + this->first(); } @@ -320,24 +434,21 @@ RuleBasedBreakIterator::setText(const UnicodeString& newText) { /** * Sets the current iteration position to the beginning of the text. - * (i.e., the CharacterIterator's starting offset). * @return The offset of the beginning of the text. */ int32_t RuleBasedBreakIterator::first(void) { reset(); fLastRuleStatusIndex = 0; fLastStatusIndexValid = TRUE; - if (fText == NULL) - return BreakIterator::DONE; + //if (fText == NULL) + // return BreakIterator::DONE; - //fText->first(); - fText->setToStart(); - return fText->getIndex(); + utext_setNativeIndex(fText, 0); + return 0; } /** * Sets the current iteration position to the end of the text. - * (i.e., the CharacterIterator's ending offset). * @return The text's past-the-end offset. */ int32_t RuleBasedBreakIterator::last(void) { @@ -348,17 +459,9 @@ int32_t RuleBasedBreakIterator::last(void) { return BreakIterator::DONE; } - // I'm not sure why, but t.last() returns the offset of the last character, - // rather than the past-the-end offset - // - // (It's so a loop like for(p=it.last(); p!=DONE; p=it.previous()) ... - // will work correctly.) - - fLastStatusIndexValid = FALSE; - int32_t pos = fText->endIndex(); - fText->setIndex(pos); - + int32_t pos = (int32_t)utext_nativeLength(fText); + utext_setNativeIndex(fText, pos); return pos; } @@ -374,7 +477,7 @@ int32_t RuleBasedBreakIterator::last(void) { int32_t RuleBasedBreakIterator::next(int32_t n) { int32_t result = current(); while (n > 0) { - result = handleNext(); + result = next(); --n; } while (n < 0) { @@ -389,7 +492,26 @@ int32_t RuleBasedBreakIterator::next(int32_t n) { * @return The position of the first boundary after this one. */ int32_t RuleBasedBreakIterator::next(void) { - return handleNext(); + // if we have cached break positions and we're still in the range + // covered by them, just move one step forward in the cache + if (fCachedBreakPositions != NULL) { + if (fPositionInCache < fNumCachedBreakPositions - 1) { + ++fPositionInCache; + int32_t pos = fCachedBreakPositions[fPositionInCache]; + utext_setNativeIndex(fText, pos); + return pos; + } + else { + reset(); + } + } + + int32_t startPos = current(); + int32_t result = handleNext(fData->fForwardTable); + if (fDictionaryCharCount > 0) { + result = checkDictionary(startPos, result, FALSE); + } + return result; } /** @@ -397,15 +519,36 @@ int32_t RuleBasedBreakIterator::next(void) { * @return The position of the last boundary position preceding this one. */ int32_t RuleBasedBreakIterator::previous(void) { + int32_t result; + int32_t startPos; + + // if we have cached break positions and we're still in the range + // covered by them, just move one step backward in the cache + if (fCachedBreakPositions != NULL) { + if (fPositionInCache > 0) { + --fPositionInCache; + int32_t pos = fCachedBreakPositions[fPositionInCache]; + utext_setNativeIndex(fText, pos); + return pos; + } + else { + reset(); + } + } + // if we're already sitting at the beginning of the text, return DONE - if (fText == NULL || current() == fText->startIndex()) { + if (fText == NULL || (startPos = current()) == 0) { fLastRuleStatusIndex = 0; fLastStatusIndexValid = TRUE; return BreakIterator::DONE; } if (fData->fSafeRevTable != NULL || fData->fSafeFwdTable != NULL) { - return handlePrevious(fData->fReverseTable); + result = handlePrevious(fData->fReverseTable); + if (fDictionaryCharCount > 0) { + result = checkDictionary(result, startPos, TRUE); + } + return result; } // old rule syntax @@ -413,13 +556,18 @@ int32_t RuleBasedBreakIterator::previous(void) { // break position before the current position (we back our internal // iterator up one step to prevent handlePrevious() from returning // the current position), but not necessarily the last one before + // where we started int32_t start = current(); - fText->previous32(); - int32_t lastResult = handlePrevious(); - int32_t result = lastResult; + UTEXT_PREVIOUS32(fText); + int32_t lastResult = handlePrevious(fData->fReverseTable); + if (lastResult == UBRK_DONE) { + lastResult = 0; + utext_setNativeIndex(fText, 0); + } + result = lastResult; int32_t lastTag = 0; UBool breakTagValid = FALSE; @@ -428,7 +576,7 @@ int32_t RuleBasedBreakIterator::previous(void) { // point is our return value for (;;) { - result = handleNext(); + result = next(); if (result == BreakIterator::DONE || result >= start) { break; } @@ -440,15 +588,19 @@ int32_t RuleBasedBreakIterator::previous(void) { // fLastBreakTag wants to have the value for section of text preceding // the result position that we are to return (in lastResult.) If // the backwards rules overshot and the above loop had to do two or more - // handleNext()s to move up to the desired return position, we will have a valid + // next()s to move up to the desired return position, we will have a valid // tag value. But, if handlePrevious() took us to exactly the correct result positon, // we wont have a tag value for that position, which is only set by handleNext(). // set the current iteration position to be the last break position // before where we started, and then return that value - fText->setIndex(lastResult); + utext_setNativeIndex(fText, lastResult); fLastRuleStatusIndex = lastTag; // for use by getRuleStatus() fLastStatusIndexValid = breakTagValid; + + // No need to check the dictionary; it will have been handled by + // next() + return lastResult; } @@ -459,16 +611,37 @@ int32_t RuleBasedBreakIterator::previous(void) { * @return The position of the first break after the current position. */ int32_t RuleBasedBreakIterator::following(int32_t offset) { + // if we have cached break positions and offset is in the range + // covered by them, use them + // TODO: could use binary search + // TODO: what if offset is outside range, but break is not? + if (fCachedBreakPositions != NULL) { + if (offset >= fCachedBreakPositions[0] + && offset < fCachedBreakPositions[fNumCachedBreakPositions - 1]) { + fPositionInCache = 0; + // We are guaranteed not to leave the array due to range test above + while (offset >= fCachedBreakPositions[fPositionInCache]) { + ++fPositionInCache; + } + int32_t pos = fCachedBreakPositions[fPositionInCache]; + utext_setNativeIndex(fText, pos); + return pos; + } + else { + reset(); + } + } + // if the offset passed in is already past the end of the text, // just return DONE; if it's before the beginning, return the // text's starting offset fLastRuleStatusIndex = 0; fLastStatusIndexValid = TRUE; - if (fText == NULL || offset >= fText->endIndex()) { + if (fText == NULL || offset >= utext_nativeLength(fText)) { last(); return next(); } - else if (offset < fText->startIndex()) { + else if (offset < 0) { return first(); } @@ -480,12 +653,11 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { if (fData->fSafeRevTable != NULL) { // new rule syntax - /// todo synwee - fText->setIndex(offset); + utext_setNativeIndex(fText, offset); // move forward one codepoint to prepare for moving back to a // safe point. // this handles offset being between a supplementary character - fText->next32(); + UTEXT_NEXT32(fText); // handlePrevious will move most of the time to < 1 boundary away handlePrevious(fData->fSafeRevTable); int32_t result = next(); @@ -496,8 +668,8 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { } if (fData->fSafeFwdTable != NULL) { // backup plan if forward safe table is not available - fText->setIndex(offset); - fText->previous32(); + utext_setNativeIndex(fText, offset); + UTEXT_PREVIOUS32(fText); // handle next will give result >= offset handleNext(fData->fSafeFwdTable); // previous will give result 0 or 1 boundary away from offset, @@ -518,7 +690,7 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { return result; } // otherwise, we have to sync up first. Use handlePrevious() to back - // us up to a known break position before the specified position (if + // up to a known break position before the specified position (if // we can determine that the specified position is a break position, // we don't back up at all). This may or may not be the last break // position at or before our starting position. Advance forward @@ -526,9 +698,10 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { // we stop on will be the first break position after the specified one. // old rule syntax - fText->setIndex(offset); - if (offset == fText->startIndex()) { - return handleNext(); + utext_setNativeIndex(fText, offset); + if (offset==0 || + offset==1 && utext_getNativeIndex(fText)==0) { + return next(); } result = previous(); @@ -546,15 +719,34 @@ int32_t RuleBasedBreakIterator::following(int32_t offset) { * @return The position of the last boundary before the starting position. */ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { + // if we have cached break positions and offset is in the range + // covered by them, use them + if (fCachedBreakPositions != NULL) { + // TODO: binary search? + // TODO: What if offset is outside range, but break is not? + if (offset > fCachedBreakPositions[0] + && offset <= fCachedBreakPositions[fNumCachedBreakPositions - 1]) { + fPositionInCache = 0; + while (fPositionInCache < fNumCachedBreakPositions + && offset > fCachedBreakPositions[fPositionInCache]) + ++fPositionInCache; + --fPositionInCache; + utext_setNativeIndex(fText, fCachedBreakPositions[fPositionInCache]); + return fCachedBreakPositions[fPositionInCache]; + } + else { + reset(); + } + } + // if the offset passed in is already past the end of the text, // just return DONE; if it's before the beginning, return the - // text's starting offset - if (fText == NULL || offset > fText->endIndex()) { + if (fText == NULL || offset > utext_nativeLength(fText)) { // return BreakIterator::DONE; return last(); } - else if (offset < fText->startIndex()) { + else if (offset < 0) { return first(); } @@ -564,17 +756,16 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { if (fData->fSafeFwdTable != NULL) { // new rule syntax - fText->setIndex(offset); - - int32_t newOffset = fText->getIndex(); + utext_setNativeIndex(fText, offset); + int32_t newOffset = (int32_t)UTEXT_GETNATIVEINDEX(fText); if (newOffset != offset) { // Will come here if specified offset was not a code point boundary AND // the underlying implmentation is using UText, which snaps any non-code-point-boundary // indices to the containing code point. // For breakitereator::preceding only, these non-code-point indices need to be moved // up to refer to the following codepoint. - fText->next32(); - offset = fText->getIndex(); + UTEXT_NEXT32(fText); + offset = (int32_t)UTEXT_GETNATIVEINDEX(fText); } // TODO: (synwee) would it be better to just check for being in the middle of a surrogate pair, @@ -582,9 +773,9 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { // (Change would interact with safe rules.) // TODO: change RBBI behavior for off-boundary indices to match that of UText? // affects only preceding(), seems cleaner, but is slightly different. - fText->previous32(); + UTEXT_PREVIOUS32(fText); handleNext(fData->fSafeFwdTable); - int32_t result = fText->getIndex(); + int32_t result = (int32_t)UTEXT_GETNATIVEINDEX(fText); while (result >= offset) { result = previous(); } @@ -592,8 +783,13 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { } if (fData->fSafeRevTable != NULL) { // backup plan if forward safe table is not available - fText->setIndex(offset); - fText->next32(); + // TODO: check whether this path can be discarded + // It's probably OK to say that rules must supply both safe tables + // if they use safe tables at all. We have certainly never described + // to anyone how to work with just one safe table. + utext_setNativeIndex(fText, offset); + UTEXT_NEXT32(fText); + // handle previous will give result <= offset handlePrevious(fData->fSafeRevTable); @@ -616,7 +812,7 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { } // old rule syntax - fText->setIndex(offset); + utext_setNativeIndex(fText, offset); return previous(); } @@ -629,23 +825,23 @@ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { */ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { // the beginning index of the iterator is always a boundary position by definition - if (fText == NULL || offset == fText->startIndex()) { + if (offset == 0) { first(); // For side effects on current position, tag values. return TRUE; } - if (offset == fText->endIndex()) { + if (offset == (int32_t)utext_nativeLength(fText)) { last(); // For side effects on current position, tag values. return TRUE; } // out-of-range indexes are never boundary positions - if (offset < fText->startIndex()) { + if (offset < 0) { first(); // For side effects on current position, tag values. return FALSE; } - if (offset > fText->endIndex()) { + if (offset > utext_nativeLength(fText)) { last(); // For side effects on current position, tag values. return FALSE; } @@ -653,7 +849,10 @@ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { // otherwise, we can use following() on the position before the specified // one and return true if the position we get back is the one the user // specified - return following(offset - 1) == offset; + utext_previous32From(fText, offset); + int32_t backOne = (int32_t)UTEXT_GETNATIVEINDEX(fText); + UBool result = following(backOne) == offset; + return result; } /** @@ -661,112 +860,136 @@ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { * @return The current iteration position. */ int32_t RuleBasedBreakIterator::current(void) const { - return (fText != NULL) ? fText->getIndex() : (int32_t)BreakIterator::DONE; + int32_t pos = (int32_t)UTEXT_GETNATIVEINDEX(fText); + return pos; } - + //======================================================================= // implementation //======================================================================= +// +// RBBIRunMode - the state machine runs an extra iteration at the beginning and end +// of user text. A variable with this enum type keeps track of where we +// are. The state machine only fetches user input while in the RUN mode. +// +enum RBBIRunMode { + RBBI_START, // state machine processing is before first char of input + RBBI_RUN, // state machine processing is in the user text + RBBI_END // state machine processing is after end of user text. +}; + //----------------------------------------------------------------------------------- // -// handleNext() -// This method is the actual implementation of the next() method. All iteration -// vectors through here. This method initializes the state machine to state 1 +// handleNext(stateTable) +// This method is the actual implementation of the rbbi next() method. +// This method initializes the state machine to state 1 // and advances through the text character by character until we reach the end // of the text or the state machine transitions to state 0. We update our return // value every time the state machine passes through an accepting state. // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handleNext() { - return handleNext(fData->fForwardTable); -} - int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { - if (fTrace) { - RBBIDebugPuts("Handle Next pos char state category"); - } + int32_t state; + int16_t category = 0; + RBBIRunMode mode; + + RBBIStateTableRow *row; + UChar32 c; + int32_t lookaheadStatus = 0; + int32_t lookaheadTagIdx = 0; + int32_t result = 0; + int32_t initialPosition = 0; + int32_t lookaheadResult = 0; + UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0; + const char *tableData = statetable->fTableData; + uint32_t tableRowLen = statetable->fRowLen; + + #ifdef RBBI_DEBUG + if (fTrace) { + RBBIDebugPuts("Handle Next pos char state category"); + } + #endif // No matter what, handleNext alway correctly sets the break tag value. fLastStatusIndexValid = TRUE; + fLastRuleStatusIndex = 0; // if we're already at the end of the text, return DONE. - if (fText == NULL || fData == NULL || fText->hasNext() == FALSE) { - fLastRuleStatusIndex = 0; + initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText); + result = initialPosition; + c = UTEXT_NEXT32(fText); + if (fData == NULL || c==U_SENTINEL) { return BreakIterator::DONE; } - int32_t initialPosition = fText->getIndex(); - int32_t result = initialPosition; - int32_t lookaheadResult = 0; - - // Initialize the state machine. Begin in state 1 - int32_t state = START_STATE; - int16_t category; - UChar32 c = fText->current32(); - RBBIStateTableRow *row; - int32_t lookaheadStatus = 0; - int32_t lookaheadTagIdx = 0; - - fLastRuleStatusIndex = 0; - - row = (RBBIStateTableRow *) // Point to starting row of state table. - (statetable->fTableData + (statetable->fRowLen * state)); + // Set the initial state for the state machine + state = START_STATE; + row = (RBBIStateTableRow *) + //(statetable->fTableData + (statetable->fRowLen * state)); + (tableData + tableRowLen * state); + + + mode = RBBI_RUN; + if (statetable->fFlags & RBBI_BOF_REQUIRED) { + category = 2; + mode = RBBI_START; + } - // Character Category fetch for starting character. - // See comments on character category code within loop, below. - UTRIE_GET16(&fData->fTrie, c, category); - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - category &= ~0x4000; - } // loop until we reach the end of the text or transition to state 0 + // for (;;) { - if (c == CharacterIterator::DONE && fText->hasNext()==FALSE) { + if (c == U_SENTINEL) { // Reached end of input string. - // Note: CharacterIterator::DONE is 0xffff, which is also a legal - // character value. Check for DONE first, because it's quicker, - // but also need to check fText->hasNext() to be certain. - - if (lookaheadResult > result) { - // We ran off the end of the string with a pending look-ahead match. - // Treat this as if the look-ahead condition had been met, and return - // the match at the / position from the look-ahead rule. - result = lookaheadResult; - fLastRuleStatusIndex = lookaheadTagIdx; - lookaheadStatus = 0; - } else if (result == initialPosition) { - // Ran off end, no match found. - // move forward one - fText->setIndex(initialPosition); - fText->next32(); - fText->getIndex(); + if (mode == RBBI_END) { + // We have already run the loop one last time with the + // character set to the psueudo {eof} value. Now it is time + // to unconditionally bail out. + if (lookaheadResult > result) { + // We ran off the end of the string with a pending look-ahead match. + // Treat this as if the look-ahead condition had been met, and return + // the match at the / position from the look-ahead rule. + result = lookaheadResult; + fLastRuleStatusIndex = lookaheadTagIdx; + lookaheadStatus = 0; + } + break; } - break; + // Run the loop one last time with the fake end-of-input character category. + mode = RBBI_END; + category = 1; } - // look up the current character's character category, which tells us - // which column in the state table to look at. - // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, - // not the size of the character going in, which is a UChar32. - // - UTRIE_GET16(&fData->fTrie, c, category); - // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators (subclasses). - // Chars that need to be handled by a dictionary have a flag bit set - // in their category values. // - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - // And off the dictionary flag bit. - category &= ~0x4000; + // Get the char category. An incoming category of 1 or 2 means that + // we are preset for doing the beginning or end of input, and + // that we shouldn't get a category from an actual text input character. + // + if (mode == RBBI_RUN) { + // look up the current character's character category, which tells us + // which column in the state table to look at. + // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, + // not the size of the character going in, which is a UChar32. + // + UTRIE_GET16(&fData->fTrie, c, category); + + // Check the dictionary bit in the character's category. + // Counter is only used by dictionary based iterators (subclasses). + // Chars that need to be handled by a dictionary have a flag bit set + // in their category values. + // + if ((category & 0x4000) != 0) { + fDictionaryCharCount++; + // And off the dictionary flag bit. + category &= ~0x4000; + } } #ifdef RBBI_DEBUG if (fTrace) { - RBBIDebugPrintf(" %4d ", fText->getIndex()); + RBBIDebugPrintf(" %4d ", utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); } else { @@ -776,42 +999,40 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { } #endif - // look up a state transition in the state table + // State Transition - move machine to its next state + // state = row->fNextState[category]; row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + // (statetable->fTableData + (statetable->fRowLen * state)); + (tableData + tableRowLen * state); - // Get the next character. Doing it here positions the iterator - // to the correct position for recording matches in the code that - // follows. - c = fText->next32(); if (row->fAccepting == -1) { - // Match found, common case, could have lookahead so we move on to check it - result = fText->getIndex(); - /// added + // Match found, common case. + if (mode != RBBI_START) { + result = (int32_t)UTEXT_GETNATIVEINDEX(fText); + } fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. } if (row->fLookAhead != 0) { if (lookaheadStatus != 0 && row->fAccepting == lookaheadStatus) { - // Lookahead match is completed. Set the result accordingly, but only - // if no other rule has matched further in the mean time. + // Lookahead match is completed. result = lookaheadResult; fLastRuleStatusIndex = lookaheadTagIdx; lookaheadStatus = 0; - /// i think we have to back up to read the lookahead character again - /// fText->setIndex(lookaheadResult); - /// TODO: this is a simple hack since reverse rules only have simple - /// lookahead rules that we can definitely break out from. - /// we need to make the lookahead rules not chain eventually. - /// return result; - /// this is going to be the longest match again + // TODO: make a standalone hard break in a rule work. + if (lookAheadHardBreak) { + utext_setNativeIndex(fText, result); + return result; + } + // Look-ahead completed, but other rules may match further. Continue on + // TODO: junk this feature? I don't think it's used anywhwere. goto continueOn; } - int32_t r = fText->getIndex(); + int32_t r = (int32_t)UTEXT_GETNATIVEINDEX(fText); lookaheadResult = r; lookaheadStatus = row->fLookAhead; lookaheadTagIdx = row->fTagIdx; @@ -819,13 +1040,12 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { } - if (row->fAccepting == 0) { - // No match, nothing of interest happening, common case. - goto continueOn; + if (row->fAccepting != 0) { + // Because this is an accepting state, any in-progress look-ahead match + // is no longer relavant. Clear out the pending lookahead status. + lookaheadStatus = 0; // clear out any pending look-ahead match. } - lookaheadStatus = 0; // clear out any pending look-ahead matches. - continueOn: if (state == STOP_STATE) { // This is the normal exit from the lookup state machine. @@ -833,6 +1053,20 @@ continueOn: // longer match is possible, no matter what characters follow. break; } + + // Advance to the next character. + // If this is a beginning-of-input loop iteration, don't advance + // the input position. The next iteration will be processing the + // first real input character. + if (mode == RBBI_RUN) { + c = UTEXT_NEXT32(fText); + } else { + if (mode == RBBI_START) { + mode = RBBI_RUN; + } + } + + } // The state machine is done. Check whether it found a match... @@ -841,13 +1075,13 @@ continueOn: // (This really indicates a defect in the break rules. They should always match // at least one character.) if (result == initialPosition) { - result = fText->setIndex(initialPosition); - fText ->next32(); - result = fText->getIndex(); + utext_setNativeIndex(fText, initialPosition); + UTEXT_NEXT32(fText); + result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } // Leave the iterator at our result position. - fText->setIndex(result); + utext_setNativeIndex(fText, result); #ifdef RBBI_DEBUG if (fTrace) { RBBIDebugPrintf("result = %d\n\n", result); @@ -857,137 +1091,6 @@ continueOn: } -//---------------------------------------------------------------- -// -// handlePrevious(void) This is the variant used with old style rules -// (Overshoot to a safe point, then move forward) -// -//---------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handlePrevious(void) { - if (fText == NULL || fData == NULL) { - return 0; - } - if (fData->fReverseTable == NULL) { - return fText->setToStart(); - } - - int32_t state = START_STATE; - int32_t category; - int32_t lastCategory = 0; - int32_t result = fText->getIndex(); - int32_t lookaheadStatus = 0; - int32_t lookaheadResult = 0; - int32_t lookaheadTagIdx = 0; - UChar32 c = fText->current32(); - RBBIStateTableRow *row; - - row = (RBBIStateTableRow *) - (this->fData->fReverseTable->fTableData + (state * fData->fReverseTable->fRowLen)); - UTRIE_GET16(&fData->fTrie, c, category); - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - category &= ~0x4000; - } - - if (fTrace) { - RBBIDebugPuts("Handle Prev pos char state category"); - } - - // loop until we reach the beginning of the text or transition to state 0 - for (;;) { - if (c == CharacterIterator::DONE && fText->hasPrevious()==FALSE) { - break; - } - - // save the last character's category and look up the current - // character's category - lastCategory = category; - UTRIE_GET16(&fData->fTrie, c, category); - - // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators. - // - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - category &= ~0x4000; - } - - #ifdef RBBI_DEBUG - if (fTrace) { - RBBIDebugPrintf(" %4d ", fText->getIndex()); - if (0x20<=c && c<0x7f) { - RBBIDebugPrintf("\"%c\" ", c); - } else { - RBBIDebugPrintf("%5x ", c); - } - RBBIDebugPrintf("%3d %3d\n", state, category); - } - #endif - - // look up a state transition in the backwards state table - state = row->fNextState[category]; - row = (RBBIStateTableRow *) - (this->fData->fReverseTable->fTableData + (state * fData->fReverseTable->fRowLen)); - - if (row->fAccepting == 0 && row->fLookAhead == 0) { - // No match, nothing of interest happening, common case. - goto continueOn; - } - - if (row->fAccepting == -1) { - // Match found, common case, no lookahead involved. - result = fText->getIndex(); - lookaheadStatus = 0; // clear out any pending look-ahead matches. - goto continueOn; - } - - if (row->fAccepting == 0 && row->fLookAhead != 0) { - // Lookahead match point. Remember it, but only if no other rule - // has unconditionally matched to this point. - // TODO: handle case where there's a pending match from a different rule - // where lookaheadStatus != 0 && lookaheadStatus != row->fLookAhead. - int32_t r = fText->getIndex(); - if (r > result) { - lookaheadResult = r; - lookaheadStatus = row->fLookAhead; - lookaheadTagIdx = row->fTagIdx; - } - goto continueOn; - } - - if (row->fAccepting != 0 && row->fLookAhead != 0) { - // Lookahead match is completed. Set the result accordingly, but only - // if no other rule has matched further in the mean time. - if (lookaheadResult > result) { - U_ASSERT(row->fAccepting == lookaheadStatus); // TODO: handle this case - // of overlapping lookahead matches. - result = lookaheadResult; - fLastRuleStatusIndex = lookaheadTagIdx; - lookaheadStatus = 0; - } - goto continueOn; - } - -continueOn: - if (state == STOP_STATE) { - break; - } - - // then advance one character backwards - c = fText->previous32(); - } - - // Note: the result postion isn't what is returned to the user by previous(), - // but where the implementation of previous() turns around and - // starts iterating forward again. - if (c == CharacterIterator::DONE && fText->hasPrevious()==FALSE) { - result = fText->startIndex(); - } - fText->setIndex(result); - - return result; -} - //----------------------------------------------------------------------------------- // @@ -1000,72 +1103,110 @@ continueOn: // //----------------------------------------------------------------------------------- int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) { - if (fText == NULL || statetable == NULL) { - return 0; - } - // break tag is no longer valid after icu switched to exact backwards - // positioning. + int32_t state; + int16_t category = 0; + RBBIRunMode mode; + RBBIStateTableRow *row; + UChar32 c; + int32_t lookaheadStatus = 0; + int32_t result = 0; + int32_t initialPosition = 0; + int32_t lookaheadResult = 0; + UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0; + + #ifdef RBBI_DEBUG + if (fTrace) { + RBBIDebugPuts("Handle Previous pos char state category"); + } + #endif + + // handlePrevious() never gets the rule status. + // Flag the status as invalid; if the user ever asks for status, we will need + // to back up, then re-find the break position using handleNext(), which does + // get the status value. fLastStatusIndexValid = FALSE; - if (statetable == NULL) { - return fText->setToStart(); - } + fLastRuleStatusIndex = 0; - int32_t state = START_STATE; - int32_t category; - UBool hasPassedStartText = !fText->hasPrevious(); - UChar32 c = fText->previous32(); - // previous character - int32_t result = fText->getIndex(); - int32_t lookaheadStatus = 0; - int32_t lookaheadResult = 0; - UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0; + // if we're already at the start of the text, return DONE. + if (fText == NULL || fData == NULL || UTEXT_GETNATIVEINDEX(fText)==0) { + return BreakIterator::DONE; + } - RBBIStateTableRow *row; + // Set up the starting char. + initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText); + result = initialPosition; + c = UTEXT_PREVIOUS32(fText); + // Set the initial state for the state machine + state = START_STATE; row = (RBBIStateTableRow *) - (statetable->fTableData + (state * statetable->fRowLen)); - UTRIE_GET16(&fData->fTrie, c, category); - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - category &= ~0x4000; + (statetable->fTableData + (statetable->fRowLen * state)); + category = 3; + mode = RBBI_RUN; + if (statetable->fFlags & RBBI_BOF_REQUIRED) { + category = 2; + mode = RBBI_START; } - if (fTrace) { - RBBIDebugPuts("Handle Prev pos char state category"); - } - // loop until we reach the beginning of the text or transition to state 0 + // loop until we reach the start of the text or transition to state 0 + // for (;;) { - if (hasPassedStartText) { - // Ran off the beginning of text. - if (*(int32_t *)fData->fHeader->fFormatVersion == 1) { - // This is the old (ICU 3.2 and earlier) format data. - // No explicit support for matching {eof}. Did have hack, though... - if (row->fLookAhead != 0 && lookaheadResult == 0) { - result = 0; + if (c == U_SENTINEL) { + // Reached end of input string. + if (mode == RBBI_END || + *(int32_t *)fData->fHeader->fFormatVersion == 1 ) { + // We have already run the loop one last time with the + // character set to the psueudo {eof} value. Now it is time + // to unconditionally bail out. + // (Or we have an old format binary rule file that does not support {eof}.) + if (lookaheadResult < result) { + // We ran off the end of the string with a pending look-ahead match. + // Treat this as if the look-ahead condition had been met, and return + // the match at the / position from the look-ahead rule. + result = lookaheadResult; + lookaheadStatus = 0; + } else if (result == initialPosition) { + // Ran off start, no match found. + // move one index one (towards the start, since we are doing a previous()) + utext_setNativeIndex(fText, initialPosition); + UTEXT_PREVIOUS32(fText); // TODO: shouldn't be necessary. We're already at beginning. Check. } break; } - // Newer data format, with support for {eof}. - // end of input is hardwired by rule builder as category/column 1. + // Run the loop one last time with the fake end-of-input character category. + mode = RBBI_END; category = 1; - } else { - // Not at {eof}. - // look up the current character's category (the table column) - UTRIE_GET16(&fData->fTrie, c, category); } - // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators. // - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - category &= ~0x4000; + // Get the char category. An incoming category of 1 or 2 means that + // we are preset for doing the beginning or end of input, and + // that we shouldn't get a category from an actual text input character. + // + if (mode == RBBI_RUN) { + // look up the current character's character category, which tells us + // which column in the state table to look at. + // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, + // not the size of the character going in, which is a UChar32. + // + UTRIE_GET16(&fData->fTrie, c, category); + + // Check the dictionary bit in the character's category. + // Counter is only used by dictionary based iterators (subclasses). + // Chars that need to be handled by a dictionary have a flag bit set + // in their category values. + // + if ((category & 0x4000) != 0) { + fDictionaryCharCount++; + // And off the dictionary flag bit. + category &= ~0x4000; + } } #ifdef RBBI_DEBUG if (fTrace) { - RBBIDebugPrintf(" %4d ", fText->getIndex()); + RBBIDebugPrintf(" %4d ", (int32_t)utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); } else { @@ -1075,84 +1216,85 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) } #endif - // look up a state transition in the backwards state table + // State Transition - move machine to its next state + // state = row->fNextState[category]; row = (RBBIStateTableRow *) - (statetable->fTableData + (state * statetable->fRowLen)); + (statetable->fTableData + (statetable->fRowLen * state)); if (row->fAccepting == -1) { - // Match found, common case, could have lookahead so we move on to check it - result = fText->getIndex(); + // Match found, common case. + result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } if (row->fLookAhead != 0) { if (lookaheadStatus != 0 && row->fAccepting == lookaheadStatus) { - // Lookahead match is completed. Set the result accordingly, but only - // if no other rule has matched further in the mean time. + // Lookahead match is completed. result = lookaheadResult; lookaheadStatus = 0; - /// i think we have to back up to read the lookahead character again - /// fText->setIndex(lookaheadResult); - /// TODO: this is a simple hack since reverse rules only have simple - /// lookahead rules that we can definitely break out from. - /// we need to make the lookahead rules not chain eventually. - /// return result; - /// this is going to be the longest match again - - /// syn wee todo hard coded for line breaks stuff - /// needs to provide a tag in rules to ensure a stop. - + // TODO: make a standalone hard break in a rule work. if (lookAheadHardBreak) { - fText->setIndex(result); + utext_setNativeIndex(fText, result); return result; } - fText->setIndex(result); - + // Look-ahead completed, but other rules may match further. Continue on + // TODO: junk this feature? I don't think it's used anywhwere. goto continueOn; } - int32_t r = fText->getIndex(); - lookaheadResult = r; - lookaheadStatus = row->fLookAhead; - goto continueOn; - } - - // not lookahead - if (row->fAccepting == 0) { - // No match, nothing of interest happening, common case. + int32_t r = (int32_t)UTEXT_GETNATIVEINDEX(fText); + lookaheadResult = r; + lookaheadStatus = row->fLookAhead; goto continueOn; } - // This is a plain (non-look-ahead) accepting state - if (!lookAheadHardBreak) { - lookaheadStatus = 0; // clear out any pending look-ahead matches. - // But only if not doing the lookAheadHardBreak option, - // which needs to force a break no matter what is going - // on with the rest of the match, i.e. we can't abandon - // a partially completed look-ahead match because some - // other rule matched further than the '/' position - // in the look-ahead match. + if (row->fAccepting != 0) { + // Because this is an accepting state, any in-progress look-ahead match + // is no longer relavant. Clear out the pending lookahead status. + lookaheadStatus = 0; } continueOn: if (state == STOP_STATE) { + // This is the normal exit from the lookup state machine. + // We have advanced through the string until it is certain that no + // longer match is possible, no matter what characters follow. break; } - if (hasPassedStartText) { - break; + // Move (backwards) to the next character to process. + // If this is a beginning-of-input loop iteration, don't advance + // the input position. The next iteration will be processing the + // first real input character. + if (mode == RBBI_RUN) { + c = UTEXT_PREVIOUS32(fText); + } else { + if (mode == RBBI_START) { + mode = RBBI_RUN; + } } - - // Advance one character backwards - hasPassedStartText = !fText->hasPrevious(); - c = fText->previous32(); } + // The state machine is done. Check whether it found a match... - fText->setIndex(result); + // If the iterator failed to advance in the match engine, force it ahead by one. + // (This really indicates a defect in the break rules. They should always match + // at least one character.) + if (result == initialPosition) { + utext_setNativeIndex(fText, initialPosition); + UTEXT_PREVIOUS32(fText); + result = (int32_t)UTEXT_GETNATIVEINDEX(fText); + } + // Leave the iterator at our result position. + utext_setNativeIndex(fText, result); + #ifdef RBBI_DEBUG + if (fTrace) { + RBBIDebugPrintf("result = %d\n\n", result); + } + #endif return result; } @@ -1160,8 +1302,13 @@ continueOn: void RuleBasedBreakIterator::reset() { - // Base-class version of this function is a no-op. - // Subclasses may override with their own reset behavior. + if (fCachedBreakPositions) { + uprv_free(fCachedBreakPositions); + } + fCachedBreakPositions = NULL; + fNumCachedBreakPositions = 0; + fDictionaryCharCount = 0; + fPositionInCache = 0; } @@ -1182,7 +1329,7 @@ RuleBasedBreakIterator::reset() void RuleBasedBreakIterator::makeRuleStatusValid() { if (fLastStatusIndexValid == FALSE) { // No cached status is available. - if (fText == NULL || current() == fText->startIndex()) { + if (fText == NULL || current() == 0) { // At start of text, or there is no text. Status is always zero. fLastRuleStatusIndex = 0; fLastStatusIndexValid = TRUE; @@ -1190,6 +1337,9 @@ void RuleBasedBreakIterator::makeRuleStatusValid() { // Not at start of text. Find status the tedious way. int32_t pa = current(); previous(); + if (fNumCachedBreakPositions > 0) { + reset(); // Blow off the dictionary cache + } int32_t pb = next(); if (pa != pb) { // note: the if (pa != pb) test is here only to eliminate warnings for @@ -1198,7 +1348,6 @@ void RuleBasedBreakIterator::makeRuleStatusValid() { } } } - U_ASSERT(fLastStatusIndexValid == TRUE); U_ASSERT(fLastRuleStatusIndex >= 0 && fLastRuleStatusIndex < fData->fStatusMaxIdx); } @@ -1308,16 +1457,20 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void *stackBuffer, buf += offsetUp; } if (s < sizeof(RuleBasedBreakIterator)) { - buf = (char *) new RuleBasedBreakIterator; - if (buf == 0) { + // Not enough room in the caller-supplied buffer. + // Do a plain-vanilla heap based clone and return that, along with + // a warning that the clone was allocated. + RuleBasedBreakIterator *clonedBI = new RuleBasedBreakIterator(*this); + if (clonedBI == 0) { status = U_MEMORY_ALLOCATION_ERROR; - return NULL; + } else { + status = U_SAFECLONE_ALLOCATED_WARNING; } - status = U_SAFECLONE_ALLOCATED_WARNING; + return clonedBI; } // - // Clone the object. + // Clone the source BI into the caller-supplied buffer. // TODO: using an overloaded operator new to directly initialize the // copy in the user's buffer would be better, but it doesn't seem // to get along with namespaces. Investigate why. @@ -1328,17 +1481,15 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void *stackBuffer, // RuleBasedBreakIterator localIter; // Empty break iterator, source for memcpy RuleBasedBreakIterator *clone = (RuleBasedBreakIterator *)buf; - uprv_memcpy(clone, &localIter, sizeof(RuleBasedBreakIterator)); // clone = empty, but initialized, iterator. - *clone = *this; // clone = the real one we want. - if (status != U_SAFECLONE_ALLOCATED_WARNING) { - clone->fBufferClone = TRUE; - } + uprv_memcpy(clone, &localIter, sizeof(RuleBasedBreakIterator)); // init C++ gorp, BreakIterator base class part + clone->init(); // Init RuleBasedBreakIterator part, (user default constructor) + *clone = *this; // clone = the real BI we want. + clone->fBufferClone = TRUE; // Flag to prevent deleting storage on close (From C code) return clone; } - //------------------------------------------------------------------------------- // // isDictionaryChar Return true if the category lookup for this char @@ -1349,257 +1500,330 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void *stackBuffer, // break iterators. // //------------------------------------------------------------------------------- -UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) { +/*UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) { if (fData == NULL) { return FALSE; } uint16_t category; UTRIE_GET16(&fData->fTrie, c, category); return (category & 0x4000) != 0; -} +}*/ //------------------------------------------------------------------------------- // -// UText functions As a temporary implementation, create a type of CharacterIterator -// that works over UText, and let the RBBI engine continue to -// work on CharacterIterator, which it always has. -// -// The permanent solution is to rework the RBBI engine to use -// UText directly, which will be more efficient for all input -// sources. -// -// This CharacterIterator implementation over UText is not complete, -// it has only what is needed for RBBI, and is not intended -// to ever become public. +// checkDictionary This function handles all processing of characters in +// the "dictionary" set. It will determine the appropriate +// course of action, and possibly set up a cache in the +// process. // //------------------------------------------------------------------------------- +int32_t RuleBasedBreakIterator::checkDictionary(int32_t startPos, + int32_t endPos, + UBool reverse) { + // Reset the old break cache first. + uint32_t dictionaryCount = fDictionaryCharCount; + reset(); -class CharacterIteratorUT: public CharacterIterator { -public: - CharacterIteratorUT(UText *ut); - virtual ~CharacterIteratorUT(); - - virtual CharacterIterator *clone() const; - virtual UBool operator==(const ForwardCharacterIterator& that) const; - virtual UChar setIndex(int32_t position); - virtual UChar32 previous32(void); - virtual UChar32 next32(void); - virtual UBool hasNext(); - virtual UChar32 current32(void) const; - virtual UBool hasPrevious(); - virtual int32_t move(int32_t delta, EOrigin origin); - static UClassID getStaticClassID(void); - virtual UClassID getDynamicClassID(void) const; - - UText *fUText; - virtual void resetTo(const UText *ut, UErrorCode *status); - -private: - CharacterIteratorUT(); - - // The following functions are not needed by RBBI, - // but are pure virtual in CharacterIterator, so must be defined. - // Only stubs are provided in this implementation. - virtual int32_t hashCode(void) const {U_ASSERT(FALSE); return 0;}; - virtual UChar nextPostInc(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar32 next32PostInc(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar first(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar32 first32(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar last(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar32 last32(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar32 setIndex32(int32_t) {U_ASSERT(FALSE); return 0;}; - virtual UChar current(void) const {U_ASSERT(FALSE); return 0;}; - virtual UChar next(void) {U_ASSERT(FALSE); return 0;}; - virtual UChar previous(void) {U_ASSERT(FALSE); return 0;}; - virtual int32_t move32(int32_t, EOrigin) {U_ASSERT(FALSE); return 0;}; - virtual void getText(UnicodeString &) {U_ASSERT(FALSE);}; -}; - - - -// -// The following fields are inherited from CharacterIterator. -// This implementation __MUST__ keep them current because of non-virtual inline -// functions defined in CharacterIterator. -// int32_t textLength; // length of the text. -// int32_t pos; // current index position -// int32_t begin; // starting index. Always 0 for us. -// int32_t end; // ending index -// -// CharacterIterator was designed assuming that utf-16 indexing would be used, -// but native indexing will pass through OK. This partial implementation only -// provides the '32' flavored code point access, not UChar access. -// + if (dictionaryCount <= 1 || (endPos - startPos) <= 1) { + return (reverse ? startPos : endPos); + } + + // Starting from the starting point, scan towards the proposed result, + // looking for the first dictionary character (which may be the one + // we're on, if we're starting in the middle of a range). + utext_setNativeIndex(fText, reverse ? endPos : startPos); + if (reverse) { + UTEXT_PREVIOUS32(fText); + } + + int32_t rangeStart = startPos; + int32_t rangeEnd = endPos; -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CharacterIteratorUT) + uint16_t category; + int32_t current; + UErrorCode status = U_ZERO_ERROR; + UStack breaks(status); + int32_t foundBreakCount = 0; + UChar32 c = utext_current32(fText); -CharacterIteratorUT::CharacterIteratorUT(UText *ut) { - UErrorCode status = U_ZERO_ERROR; - fUText = utext_clone(NULL, ut, FALSE, &status); + UTRIE_GET16(&fData->fTrie, c, category); - // Set the inherited CharacterItertor fields - textLength = utext_nativeLength(ut); - pos = 0; - begin = 0; - end = textLength; -} - -CharacterIteratorUT::CharacterIteratorUT() { - fUText = NULL; - textLength = 0; - pos = 0; - begin = 0; - end = 0; -} + // Is the character we're starting on a dictionary character? If so, we + // need to back up to include the entire run; otherwise the results of + // the break algorithm will differ depending on where we start. Since + // the result is cached and there is typically a non-dictionary break + // within a small number of words, there should be little performance impact. + if (category & 0x4000) { + if (reverse) { + do { + utext_next32(fText); // TODO: recast to work directly with postincrement. + c = utext_current32(fText); + UTRIE_GET16(&fData->fTrie, c, category); + } while (c != U_SENTINEL && (category & 0x4000)); + // Back up to the last dictionary character + rangeEnd = (int32_t)UTEXT_GETNATIVEINDEX(fText); + if (c == U_SENTINEL) { + // c = fText->last32(); + // TODO: why was this if needed? + c = UTEXT_PREVIOUS32(fText); + } + else { + c = UTEXT_PREVIOUS32(fText); + } + } + else { + do { + c = UTEXT_PREVIOUS32(fText); + UTRIE_GET16(&fData->fTrie, c, category); + } + while (c != U_SENTINEL && (category & 0x4000)); + // Back up to the last dictionary character + if (c == U_SENTINEL) { + // c = fText->first32(); + c = utext_current32(fText); + } + else { + utext_next32(fText); + c = utext_current32(fText); + } + rangeStart = (int32_t)UTEXT_GETNATIVEINDEX(fText);; + } + UTRIE_GET16(&fData->fTrie, c, category); + } + + // Loop through the text, looking for ranges of dictionary characters. + // For each span, find the appropriate break engine, and ask it to find + // any breaks within the span. + while(U_SUCCESS(status)) { + if (reverse) { + while((current = (int32_t)UTEXT_GETNATIVEINDEX(fText)) > rangeStart && (category & 0x4000) == 0) { + c = UTEXT_PREVIOUS32(fText); + UTRIE_GET16(&fData->fTrie, c, category); + } + if (current <= rangeStart) { + break; + } + } + else { + while((current = (int32_t)UTEXT_GETNATIVEINDEX(fText)) < rangeEnd && (category & 0x4000) == 0) { + utext_next32(fText); // TODO: tweak for post-increment operation + c = utext_current32(fText); + UTRIE_GET16(&fData->fTrie, c, category); + } + if (current >= rangeEnd) { + break; + } + } + + // We now have a dictionary character. Get the appropriate language object + // to deal with it. + const LanguageBreakEngine *lbe = getLanguageBreakEngine(c); + + // Ask the language object if there are any breaks. It will leave the text + // pointer on the other side of its range, ready to search for the next one. + if (lbe != NULL) { + foundBreakCount += lbe->findBreaks(fText, rangeStart, rangeEnd, reverse, fBreakType, breaks); + } + + // Reload the loop variables for the next go-round + c = utext_current32(fText); + UTRIE_GET16(&fData->fTrie, c, category); + } + + // If we found breaks, build a new break cache. The first and last entries must + // be the original starting and ending position. + if (foundBreakCount > 0) { + int32_t totalBreaks = foundBreakCount; + if (startPos < breaks.elementAti(0)) { + totalBreaks += 1; + } + if (endPos > breaks.peeki()) { + totalBreaks += 1; + } + fCachedBreakPositions = (int32_t *)uprv_malloc(totalBreaks * sizeof(int32_t)); + if (fCachedBreakPositions != NULL) { + int32_t out = 0; + fNumCachedBreakPositions = totalBreaks; + if (startPos < breaks.elementAti(0)) { + fCachedBreakPositions[out++] = startPos; + } + for (int32_t i = 0; i < foundBreakCount; ++i) { + fCachedBreakPositions[out++] = breaks.elementAti(i); + } + if (endPos > fCachedBreakPositions[out-1]) { + fCachedBreakPositions[out] = endPos; + } + // If there are breaks, then by definition, we are replacing the original + // proposed break by one of the breaks we found. Use following() and + // preceding() to do the work. They should never recurse in this case. + if (reverse) { + return preceding(endPos - 1); + } + else { + return following(startPos); + } + } + // If the allocation failed, just fall through to the "no breaks found" case. + } -CharacterIteratorUT::~CharacterIteratorUT() { - utext_close(fUText); + // If we get here, there were no language-based breaks. As a result, the + // text pointer should be back to where it started, but set it just to + // make sure. + utext_setNativeIndex(fText, reverse ? startPos : endPos); + return (reverse ? startPos : endPos); } +static UStack *gLanguageBreakFactories = NULL; -CharacterIterator *CharacterIteratorUT::clone() const { - UErrorCode status = U_ZERO_ERROR; - CharacterIteratorUT *result = new CharacterIteratorUT(); - result->fUText = utext_clone(NULL, fUText, TRUE, &status); - if (U_SUCCESS(status)) { - result->textLength = utext_nativeLength(fUText); - result->pos = 0; - result->begin = 0; - result->end = textLength; - } - return result; -} +U_NAMESPACE_END -UBool CharacterIteratorUT::operator==(const ForwardCharacterIterator& that) const { - if (this->getDynamicClassID() != that.getDynamicClassID()) { - return FALSE; - } - const CharacterIteratorUT *realThat = (const CharacterIteratorUT *)&that; - UBool result = this->fUText->context == realThat->fUText->context; - return result; -} +// defined in ucln_cmn.h -UChar CharacterIteratorUT::setIndex(int32_t position) { - pos = position; - if (pos < 0) { - pos = 0; - } else if (pos > end) { - pos = end; +/** + * Release all static memory held by breakiterator. + */ +U_CDECL_BEGIN +static UBool U_CALLCONV breakiterator_cleanup_dict(void) { + if (gLanguageBreakFactories) { + delete gLanguageBreakFactories; + gLanguageBreakFactories = NULL; } - utext_setNativeIndex(fUText, pos); - pos = utext_getNativeIndex(fUText); // because utext snaps to code point boundary. - return 0x0000ffff; // RBBI doesn't use return value, and UText can't return a UChar easily. + return TRUE; } +U_CDECL_END -UChar32 CharacterIteratorUT::previous32(void) { - UChar32 result = UTEXT_PREVIOUS32(fUText); - pos = utext_getNativeIndex(fUText); // TODO: maybe optimize common case? - if (result < 0) { - result = 0x0000ffff; - } - return result; +U_CDECL_BEGIN +static void U_CALLCONV _deleteFactory(void *obj) { + delete (LanguageBreakFactory *) obj; } +U_CDECL_END +U_NAMESPACE_BEGIN -UChar32 CharacterIteratorUT::next32(void) { - // TODO: optimize. - UTEXT_NEXT32(fUText); - pos = utext_getNativeIndex(fUText); - UChar32 result = UTEXT_NEXT32(fUText); - if (result < 0) { - result = 0x0000ffff; - } else { - UTEXT_PREVIOUS32(fUText); +static const LanguageBreakEngine* +getLanguageBreakEngineFromFactory(UChar32 c, int32_t breakType) +{ + UBool needsInit; + UErrorCode status = U_ZERO_ERROR; + umtx_lock(NULL); + needsInit = (UBool)(gLanguageBreakFactories == NULL); + umtx_unlock(NULL); + + if (needsInit) { + UStack *factories = new UStack(_deleteFactory, NULL, status); + if (U_SUCCESS(status)) { + ICULanguageBreakFactory *builtIn = new ICULanguageBreakFactory(status); + factories->push(builtIn, status); +#ifdef U_LOCAL_SERVICE_HOOK + LanguageBreakFactory *extra = (LanguageBreakFactory *)uprv_svc_hook("languageBreakFactory", &status); + if (extra != NULL) { + factories->push(extra, status); + } +#endif + } + umtx_lock(NULL); + if (gLanguageBreakFactories == NULL) { + gLanguageBreakFactories = factories; + factories = NULL; + ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR_DICT, breakiterator_cleanup_dict); + } + umtx_unlock(NULL); + delete factories; } - return result; -} - -UBool CharacterIteratorUT::hasNext() { - // What would really be best for RBBI is a hasNext32() - UBool result = TRUE; - if (pos >= end) { - result = FALSE; + + if (gLanguageBreakFactories == NULL) { + return NULL; } - return result; -} - -UChar32 CharacterIteratorUT::current32(void) const { - UChar32 result = utext_current32(fUText); - if (result < 0) { - result = 0x0000ffff; + + int32_t i = gLanguageBreakFactories->size(); + const LanguageBreakEngine *lbe = NULL; + while (--i >= 0) { + LanguageBreakFactory *factory = (LanguageBreakFactory *)(gLanguageBreakFactories->elementAt(i)); + lbe = factory->getEngineFor(c, breakType); + if (lbe != NULL) { + break; + } } - return result; + return lbe; } -UBool CharacterIteratorUT::hasPrevious() { - UBool result = pos > 0; - return result; -} -int32_t CharacterIteratorUT::move(int32_t delta, EOrigin origin) { - // only needed for the inherited inline implementation of setToStart(). - int32_t result = pos; - switch (origin) { -case kStart: - result = delta; - break; -case kCurrent: - result = pos + delta; - break; -case kEnd: - result = end + delta; - break; -default: - U_ASSERT(FALSE); - } - utext_setNativeIndex(fUText, result); - pos = utext_getNativeIndex(fUText); // align to cp boundary - return result; +//------------------------------------------------------------------------------- +// +// getLanguageBreakEngine Find an appropriate LanguageBreakEngine for the +// the characer c. +// +//------------------------------------------------------------------------------- +const LanguageBreakEngine * +RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { + const LanguageBreakEngine *lbe = NULL; + UErrorCode status = U_ZERO_ERROR; + + if (fLanguageBreakEngines == NULL) { + fLanguageBreakEngines = new UStack(status); + if (U_FAILURE(status)) { + delete fLanguageBreakEngines; + fLanguageBreakEngines = 0; + return NULL; + } + } + + int32_t i = fLanguageBreakEngines->size(); + while (--i >= 0) { + lbe = (const LanguageBreakEngine *)(fLanguageBreakEngines->elementAt(i)); + if (lbe->handles(c, fBreakType)) { + return lbe; + } + } + + // No existing dictionary took the character. See if a factory wants to + // give us a new LanguageBreakEngine for this character. + lbe = getLanguageBreakEngineFromFactory(c, fBreakType); + + // If we got one, use it and push it on our stack. + if (lbe != NULL) { + fLanguageBreakEngines->push((void *)lbe, status); + // Even if we can't remember it, we can keep looking it up, so + // return it even if the push fails. + return lbe; + } + + // No engine is forthcoming for this character. Add it to the + // reject set. Create the reject break engine if needed. + if (fUnhandledBreakEngine == NULL) { + fUnhandledBreakEngine = new UnhandledEngine(status); + if (U_SUCCESS(status) && fUnhandledBreakEngine == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + // Put it last so that scripts for which we have an engine get tried + // first. + fLanguageBreakEngines->insertElementAt(fUnhandledBreakEngine, 0, status); + // If we can't insert it, or creation failed, get rid of it + if (U_FAILURE(status)) { + delete fUnhandledBreakEngine; + fUnhandledBreakEngine = 0; + return NULL; + } + } + + // Tell the reject engine about the character; at its discretion, it may + // add more than just the one character. + fUnhandledBreakEngine->handleCharacter(c, fBreakType); + + return fUnhandledBreakEngine; } -void CharacterIteratorUT::resetTo(const UText *ut, UErrorCode *status) { - // Reset this CharacterIteratorUT to use a new UText. - fUText = utext_clone(fUText, ut, FALSE, status); - utext_setNativeIndex(fUText, 0); - textLength = utext_nativeLength(fUText); - pos = 0; - end = textLength; -} +/*int32_t RuleBasedBreakIterator::getBreakType() const { + return fBreakType; +}*/ -void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { - if (U_FAILURE(status)) { - return; - } +void RuleBasedBreakIterator::setBreakType(int32_t type) { + fBreakType = type; reset(); - if (fText != NULL && - fText->getDynamicClassID() == CharacterIteratorUT::getStaticClassID()) - { - // The break iterator is already using a UText based character iterator. - // Copy the new UText into the existing character iterator's UText. - CharacterIteratorUT *utcr = (CharacterIteratorUT *)fText; - utcr->resetTo(ut, &status); - } else { - delete fText; - fText = new CharacterIteratorUT(ut); - } - this->first(); -} - - -UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const { - UText *result = NULL; - if (U_SUCCESS(status) && fText!=NULL && - fText->getDynamicClassID() == CharacterIteratorUT::getStaticClassID()) - { - CharacterIteratorUT *utcr = (CharacterIteratorUT *)fText; - result = utext_clone(fillIn, utcr->fUText, FALSE, &status); - } - return result; } - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/Build/source/libs/icu-xetex/common/rbbicst.pl b/Build/source/libs/icu-xetex/common/rbbicst.pl index 704c52f0d08..98b06cbc27d 100644 --- a/Build/source/libs/icu-xetex/common/rbbicst.pl +++ b/Build/source/libs/icu-xetex/common/rbbicst.pl @@ -1,19 +1,20 @@ #************************************************************************** -# Copyright (C) 2002-2004 International Business Machines Corporation * +# Copyright (C) 2002-2005 International Business Machines Corporation * # and others. All rights reserved. * #************************************************************************** # # rbbicst Compile the RBBI rule paser state table data into initialized C data. # Usage: # cd icu/source/common -# perl rbbicst.pl [-j] < rbbirpt.txt > rbbirpt.h +# perl rbbicst.pl < rbbirpt.txt > rbbirpt.h +# perl rbbicst.pl -j < rbbirpt.txt > RBBIRuleParseTable.java # # The output file, rbbrpt.h, is included by some of the .cpp rbbi # implementation files. This perl script is NOT run as part # of a normal ICU build. It is run by hand when needed, and the # rbbirpt.h generated file is put back into cvs. # -# See rbbirpt.h for a description of the input format for this script. +# See rbbirpt.txt for a description of the input format for this script. # if ($ARGV[0] eq "-j") { @@ -106,9 +107,9 @@ line_loop: while (<>) { # # do the 'n' flag # - $state_flag[$num_states] = "FALSE"; + $state_flag[$num_states] = $javaOutput? "false" : "FALSE"; if ($fields[0] eq "n") { - $state_flag[$num_states] = "TRUE"; + $state_flag[$num_states] = $javaOutput? "true": "TRUE"; shift @fields; } @@ -197,6 +198,33 @@ for ($state=1; $state<$num_states; $state++) { die if ($errors>0); +# +# Assign numbers to each of the character classes classes used. +# Sets are numbered from 128 - 250 +# The values 0-127 in the state table are used for matching +# individual ASCII characters (the only thing that can appear in the rules.) +# The "set" names appearing in the code below (default, etc.) need special +# handling because they do not correspond to a normal set of characters, +# but trigger special handling by code in the state machine. +# +$i = 128; +foreach $setName (sort keys %charClasses) { + if ($setName eq "default") { + $charClasses{$setName} = 255;} + elsif ($setName eq "escaped") { + $charClasses{$setName} = 254;} + elsif ($setName eq "escapedP") { + $charClasses{$setName} = 253;} + elsif ($setName eq "eof") { + $charClasses{$setName} = 252;} + else { + # Normal (single) character class. Number them. + $charClasses{$setName} = $i; + $i++; + } +} + + my ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime; $year += 1900; @@ -216,59 +244,87 @@ if ($javaOutput) { print " * rule parser.\n"; print " * It is generated by the Perl script \"rbbicst.pl\" from\n"; print " * the rule parser state definitions file \"rbbirpt.txt\".\n"; + print " * \@internal \n"; print " *\n"; print " */\n"; - print "public class RuleBasedBreakIteratorStateTable\n"; + print "class RBBIRuleParseTable\n"; print "{\n"; - # + # # Emit the constants for the actions to be performed. # $n = 1; - foreach $act (keys %actions) { - print " public static final int $act = $n;\n"; + foreach $act (sort keys %actions) { + print " static final short $act = $n;\n"; $n++; } print " \n"; + # - # emit the state transition table + # Emit constants for char class names # - print " public static final String[] gRuleParseStateTable = {\n"; - printf(" \"\\u%04.4x\\u%04.4x\\u%04.4x\\u%04.4x\\u%04.4x\"\n", doNOP, 0, 0, 0, 1); + foreach $setName (sort keys %charClasses) { + print " static final short kRuleSet_$setName = $charClasses{$setName};\n"; + } + print "\n\n"; + + + print " static class RBBIRuleTableElement { \n"; + print " short fAction; \n"; + print " short fCharClass; \n"; + print " short fNextState; \n"; + print " short fPushState; \n"; + print " boolean fNextChar; \n"; + print " String fStateName; \n"; + print " RBBIRuleTableElement(short a, int cc, int ns, int ps, boolean nc, String sn) { \n"; + print " fAction = a; \n"; + print " fCharClass = (short)cc; \n"; + print " fNextState = (short)ns; \n"; + print " fPushState = (short)ps; \n"; + print " fNextChar = nc; \n"; + print " fStateName = sn; \n"; + print " } \n"; + print " }; \n"; + print " \n"; + + + print " static RBBIRuleTableElement[] gRuleParseStateTable = { \n "; + print " new RBBIRuleTableElement(doNOP, 0, 0,0, true, null ) // 0 \n"; #output the unused state 0. for ($state=1; $state < $num_states; $state++) { - printf(" , \"\\u%04.4x", $state_func_name[$state]); - # print " , {$state_func_name[$state],"; + print " , new RBBIRuleTableElement($state_func_name[$state],"; if ($state_literal_chars[$state] ne "") { - printf("\\u%04.4x", $state_func_name[$state]); + $c = $state_literal_chars[$state]; + print("'$c', "); }else { - printf("\\u%04.4x", $charClasses{$state_char_class[$state]}); + print " $charClasses{$state_char_class[$state]},"; } - printf("\\u%04.4x", $states{$state_dest_state[$state]}); - + print " $states{$state_dest_state[$state]},"; + # The push-state field is optional. If omitted, fill field with a zero, which flags # the state machine that there is no push state. if ($state_push_state[$state] eq "") { - print "\\u0000"; + print "0, "; } else { - printf("\\u%04.4x", $states{$state_push_state[$state]}); + print " $states{$state_push_state[$state]},"; } - printf("\\u%04.4x", $state_flag[$state]); - - # For the first row of each state, append the state name. - # Used for debugging only. + print " $state_flag[$state], "; + + # if this is the first row of the table for this state, put out the state name. if ($stateNames[$state] ne "") { - printf("%-20s", $stateNames[$state]."\""); + print " \"$stateNames[$state]\") "; } else { - printf("%-20s", "\""); + print " null ) "; } - - # Put out a C++ comment showing the number (index) of this state row, - print " // $state "; + + # Put out a comment showing the number (index) of this state row, + print " // $state "; print "\n"; - }; - print " };\n"; - print "}\n"; + } + print " };\n"; + + print "}; \n"; + } else { @@ -302,25 +358,10 @@ else print "//\n"; print "// Character classes for RBBI rule scanning.\n"; print "//\n"; - $i = 128; # State Table values for Unicode char sets range from 128-250. - # Sets "default", "escaped", etc. get special handling. - # They have no corresponding UnicodeSet object in the state machine, - # but are handled by special case code. So we emit no reference - # to a UnicodeSet object to them here. - foreach $setName (keys %charClasses) { - if ($setName eq "default") { - $charClasses{$setName} = 255;} - elsif ($setName eq "escaped") { - $charClasses{$setName} = 254;} - elsif ($setName eq "escapedP") { - $charClasses{$setName} = 253;} - elsif ($setName eq "eof") { - $charClasses{$setName} = 252;} - else { - # Normal character class. Fill in array with a ptr to the corresponding UnicodeSet in the state machine. - print " static const uint8_t kRuleSet_$setName = $i;\n"; - $charClasses{$setName} = $i; - $i++; + foreach $setName (sort keys %charClasses) { + if ($charClasses{$setName} < 250) { + # Normal character class. + print " static const uint8_t kRuleSet_$setName = $charClasses{$setName};\n"; } } print "\n\n"; @@ -329,7 +370,7 @@ else # Emit the enum for the actions to be performed. # print "enum RBBI_RuleParseAction {\n"; - foreach $act (keys %actions) { + foreach $act (sort keys %actions) { print " $act,\n"; } print " rbbiLastAction};\n\n"; diff --git a/Build/source/libs/icu-xetex/common/rbbidata.cpp b/Build/source/libs/icu-xetex/common/rbbidata.cpp index 3d039a011fc..360290bd584 100644 --- a/Build/source/libs/icu-xetex/common/rbbidata.cpp +++ b/Build/source/libs/icu-xetex/common/rbbidata.cpp @@ -326,7 +326,8 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD // // Prefight operation? Just return the size // - int32_t totalSize = headerSize + ds->readUInt32(rbbiDH->fLength); + int32_t breakDataLength = ds->readUInt32(rbbiDH->fLength); + int32_t totalSize = headerSize + breakDataLength; if (length < 0) { return totalSize; } @@ -334,15 +335,12 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD // // Check that length passed in is consistent with length from RBBI data header. // - if (length > 0) { - length -= headerSize; - if ((uint32_t)length < ds->readUInt32(rbbiDH->fLength)) { - udata_printError(ds, "ubrk_swap(): too few bytes (%d after ICU Data header) for break data.\n", - length); - *status=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (length < totalSize) { + udata_printError(ds, "ubrk_swap(): too few bytes (%d after ICU Data header) for break data.\n", + breakDataLength); + *status=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } - } // @@ -362,7 +360,7 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD // when originally created. Any unused space between items needs to be zero. // if (inBytes != outBytes) { - uprv_memset(outBytes, 0, length); + uprv_memset(outBytes, 0, breakDataLength); } // diff --git a/Build/source/libs/icu-xetex/common/rbbidata.h b/Build/source/libs/icu-xetex/common/rbbidata.h index ceb7c1a8e6c..7ba1db05d65 100644 --- a/Build/source/libs/icu-xetex/common/rbbidata.h +++ b/Build/source/libs/icu-xetex/common/rbbidata.h @@ -131,7 +131,8 @@ struct RBBIStateTable { }; typedef enum { - RBBI_LOOKAHEAD_HARD_BREAK = 1 + RBBI_LOOKAHEAD_HARD_BREAK = 1, + RBBI_BOF_REQUIRED = 2 } RBBIStateTableFlags; diff --git a/Build/source/libs/icu-xetex/common/rbbinode.cpp b/Build/source/libs/icu-xetex/common/rbbinode.cpp index b873f218631..af467b6d064 100644 --- a/Build/source/libs/icu-xetex/common/rbbinode.cpp +++ b/Build/source/libs/icu-xetex/common/rbbinode.cpp @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 2002-2003 International Business Machines Corporation * +* Copyright (C) 2002-2006 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -33,8 +33,9 @@ U_NAMESPACE_BEGIN -int RBBINode::gLastSerial = 0; - +#ifdef RBBI_DEBUG +static int gLastSerial = 0; +#endif //------------------------------------------------------------------------- @@ -43,7 +44,9 @@ int RBBINode::gLastSerial = 0; // //------------------------------------------------------------------------- RBBINode::RBBINode(NodeType t) : UMemory() { +#ifdef RBBI_DEBUG fSerialNum = ++gLastSerial; +#endif fType = t; fParent = NULL; fLeftChild = NULL; @@ -69,7 +72,9 @@ RBBINode::RBBINode(NodeType t) : UMemory() { RBBINode::RBBINode(const RBBINode &other) : UMemory(other) { +#ifdef RBBI_DEBUG fSerialNum = ++gLastSerial; +#endif fType = other.fType; fParent = NULL; fLeftChild = NULL; diff --git a/Build/source/libs/icu-xetex/common/rbbinode.h b/Build/source/libs/icu-xetex/common/rbbinode.h index 68286792946..0cbf6a71abe 100644 --- a/Build/source/libs/icu-xetex/common/rbbinode.h +++ b/Build/source/libs/icu-xetex/common/rbbinode.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2001-2003, International Business Machines Corporation and + * Copyright (c) 2001-2006, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -96,20 +96,15 @@ class RBBINode : public UMemory { #ifdef RBBI_DEBUG void printNode(); void printTree(UBool withHeading); -#else - // Do-nothing inline functions for non-debug builds. Can't make empty defines for member - // functions - they won't compile at the call sites. - int fakeField; - #define printNode() fakeField=0; - #define printTree(withHeading) fakeField=0; #endif private: RBBINode &operator = (const RBBINode &other); // No defs. UBool operator == (const RBBINode &other); // Private, so these functions won't accidently be used. +#ifdef RBBI_DEBUG int fSerialNum; // Debugging aids. - static int gLastSerial; +#endif }; #ifdef RBBI_DEBUG diff --git a/Build/source/libs/icu-xetex/common/rbbirb.h b/Build/source/libs/icu-xetex/common/rbbirb.h index b39e3694524..d7a5383606c 100644 --- a/Build/source/libs/icu-xetex/common/rbbirb.h +++ b/Build/source/libs/icu-xetex/common/rbbirb.h @@ -1,7 +1,7 @@ // // rbbirb.h // -// Copyright (C) 2002-2004, International Business Machines Corporation and others. +// Copyright (C) 2002-2005, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains declarations for several classes from the @@ -84,7 +84,7 @@ public: #else // A do-nothing inline function for non-debug builds. Member funcs can't be empty // or the call sites won't compile. - int fFakeField; + int32_t fFakeField; #define rbbiSymtablePrint() fFakeField=0; #endif diff --git a/Build/source/libs/icu-xetex/common/rbbirpt.h b/Build/source/libs/icu-xetex/common/rbbirpt.h index 3b6473d45ef..deea57b7add 100644 --- a/Build/source/libs/icu-xetex/common/rbbirpt.h +++ b/Build/source/libs/icu-xetex/common/rbbirpt.h @@ -6,7 +6,7 @@ // It is generated by the Perl script "rbbicst.pl" from // the rule parser state definitions file "rbbirpt.txt". // -// Copyright (C) 2002-2004 International Business Machines Corporation +// Copyright (C) 2002-2005 International Business Machines Corporation // and others. All rights reserved. // //--------------------------------------------------------------------------------- @@ -18,44 +18,44 @@ U_NAMESPACE_BEGIN // Character classes for RBBI rule scanning. // static const uint8_t kRuleSet_digit_char = 128; - static const uint8_t kRuleSet_white_space = 129; - static const uint8_t kRuleSet_rule_char = 130; - static const uint8_t kRuleSet_name_start_char = 131; - static const uint8_t kRuleSet_name_char = 132; + static const uint8_t kRuleSet_name_char = 129; + static const uint8_t kRuleSet_name_start_char = 130; + static const uint8_t kRuleSet_rule_char = 131; + static const uint8_t kRuleSet_white_space = 132; enum RBBI_RuleParseAction { + doCheckVarDef, + doDotAny, + doEndAssign, + doEndOfRule, + doEndVariableName, + doExit, + doExprCatOperator, + doExprFinished, doExprOrOperator, + doExprRParen, + doExprStart, + doLParen, + doNOP, doOptionEnd, - doRuleErrorAssignExpr, - doTagValue, - doEndAssign, - doRuleError, - doVariableNameExpectedErr, + doOptionStart, + doReverseDir, doRuleChar, - doLParen, + doRuleError, + doRuleErrorAssignExpr, + doScanUnicodeSet, doSlash, + doStartAssign, doStartTagValue, - doDotAny, - doExprFinished, - doScanUnicodeSet, - doExprRParen, doStartVariableName, - doTagExpectedError, doTagDigit, - doUnaryOpStar, - doEndVariableName, - doNOP, - doUnaryOpQuestion, - doExit, - doStartAssign, - doEndOfRule, + doTagExpectedError, + doTagValue, doUnaryOpPlus, - doExprStart, - doOptionStart, - doExprCatOperator, - doReverseDir, - doCheckVarDef, + doUnaryOpQuestion, + doUnaryOpStar, + doVariableNameExpectedErr, rbbiLastAction}; //------------------------------------------------------------------------------- @@ -76,42 +76,42 @@ struct RBBIRuleTableEl { static const struct RBBIRuleTableEl gRuleParseStateTable[] = { {doNOP, 0, 0, 0, TRUE} , {doExprStart, 254, 21, 8, FALSE} // 1 start - , {doNOP, 129, 1,0, TRUE} // 2 + , {doNOP, 132, 1,0, TRUE} // 2 , {doExprStart, 36 /* $ */, 80, 90, FALSE} // 3 , {doNOP, 33 /* ! */, 11,0, TRUE} // 4 , {doNOP, 59 /* ; */, 1,0, TRUE} // 5 , {doNOP, 252, 0,0, FALSE} // 6 , {doExprStart, 255, 21, 8, FALSE} // 7 , {doEndOfRule, 59 /* ; */, 1,0, TRUE} // 8 break-rule-end - , {doNOP, 129, 8,0, TRUE} // 9 + , {doNOP, 132, 8,0, TRUE} // 9 , {doRuleError, 255, 95,0, FALSE} // 10 , {doNOP, 33 /* ! */, 13,0, TRUE} // 11 rev-option , {doReverseDir, 255, 20, 8, FALSE} // 12 - , {doOptionStart, 131, 15,0, TRUE} // 13 option-scan1 + , {doOptionStart, 130, 15,0, TRUE} // 13 option-scan1 , {doRuleError, 255, 95,0, FALSE} // 14 - , {doNOP, 132, 15,0, TRUE} // 15 option-scan2 + , {doNOP, 129, 15,0, TRUE} // 15 option-scan2 , {doOptionEnd, 255, 17,0, FALSE} // 16 , {doNOP, 59 /* ; */, 1,0, TRUE} // 17 option-scan3 - , {doNOP, 129, 17,0, TRUE} // 18 + , {doNOP, 132, 17,0, TRUE} // 18 , {doRuleError, 255, 95,0, FALSE} // 19 , {doExprStart, 255, 21, 8, FALSE} // 20 reverse-rule , {doRuleChar, 254, 30,0, TRUE} // 21 term - , {doNOP, 129, 21,0, TRUE} // 22 - , {doRuleChar, 130, 30,0, TRUE} // 23 + , {doNOP, 132, 21,0, TRUE} // 22 + , {doRuleChar, 131, 30,0, TRUE} // 23 , {doNOP, 91 /* [ */, 86, 30, FALSE} // 24 , {doLParen, 40 /* ( */, 21, 30, TRUE} // 25 , {doNOP, 36 /* $ */, 80, 29, FALSE} // 26 , {doDotAny, 46 /* . */, 30,0, TRUE} // 27 , {doRuleError, 255, 95,0, FALSE} // 28 , {doCheckVarDef, 255, 30,0, FALSE} // 29 term-var-ref - , {doNOP, 129, 30,0, TRUE} // 30 expr-mod + , {doNOP, 132, 30,0, TRUE} // 30 expr-mod , {doUnaryOpStar, 42 /* * */, 35,0, TRUE} // 31 , {doUnaryOpPlus, 43 /* + */, 35,0, TRUE} // 32 , {doUnaryOpQuestion, 63 /* ? */, 35,0, TRUE} // 33 , {doNOP, 255, 35,0, FALSE} // 34 , {doExprCatOperator, 254, 21,0, FALSE} // 35 expr-cont - , {doNOP, 129, 35,0, TRUE} // 36 - , {doExprCatOperator, 130, 21,0, FALSE} // 37 + , {doNOP, 132, 35,0, TRUE} // 36 + , {doExprCatOperator, 131, 21,0, FALSE} // 37 , {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 38 , {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 39 , {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 40 @@ -124,8 +124,8 @@ static const struct RBBIRuleTableEl gRuleParseStateTable[] = { , {doSlash, 47 /* / */, 49,0, TRUE} // 47 look-ahead , {doNOP, 255, 95,0, FALSE} // 48 , {doExprCatOperator, 254, 21,0, FALSE} // 49 expr-cont-no-slash - , {doNOP, 129, 35,0, TRUE} // 50 - , {doExprCatOperator, 130, 21,0, FALSE} // 51 + , {doNOP, 132, 35,0, TRUE} // 50 + , {doExprCatOperator, 131, 21,0, FALSE} // 51 , {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 52 , {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 53 , {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 54 @@ -133,19 +133,19 @@ static const struct RBBIRuleTableEl gRuleParseStateTable[] = { , {doExprOrOperator, 124 /* | */, 21,0, TRUE} // 56 , {doExprRParen, 41 /* ) */, 255,0, TRUE} // 57 , {doExprFinished, 255, 255,0, FALSE} // 58 - , {doNOP, 129, 59,0, TRUE} // 59 tag-open + , {doNOP, 132, 59,0, TRUE} // 59 tag-open , {doStartTagValue, 128, 62,0, FALSE} // 60 , {doTagExpectedError, 255, 95,0, FALSE} // 61 - , {doNOP, 129, 66,0, TRUE} // 62 tag-value + , {doNOP, 132, 66,0, TRUE} // 62 tag-value , {doNOP, 125 /* } */, 66,0, FALSE} // 63 , {doTagDigit, 128, 62,0, TRUE} // 64 , {doTagExpectedError, 255, 95,0, FALSE} // 65 - , {doNOP, 129, 66,0, TRUE} // 66 tag-close + , {doNOP, 132, 66,0, TRUE} // 66 tag-close , {doTagValue, 125 /* } */, 69,0, TRUE} // 67 , {doTagExpectedError, 255, 95,0, FALSE} // 68 , {doExprCatOperator, 254, 21,0, FALSE} // 69 expr-cont-no-tag - , {doNOP, 129, 69,0, TRUE} // 70 - , {doExprCatOperator, 130, 21,0, FALSE} // 71 + , {doNOP, 132, 69,0, TRUE} // 70 + , {doExprCatOperator, 131, 21,0, FALSE} // 71 , {doExprCatOperator, 91 /* [ */, 21,0, FALSE} // 72 , {doExprCatOperator, 40 /* ( */, 21,0, FALSE} // 73 , {doExprCatOperator, 36 /* $ */, 21,0, FALSE} // 74 @@ -156,15 +156,15 @@ static const struct RBBIRuleTableEl gRuleParseStateTable[] = { , {doExprFinished, 255, 255,0, FALSE} // 79 , {doStartVariableName, 36 /* $ */, 82,0, TRUE} // 80 scan-var-name , {doNOP, 255, 95,0, FALSE} // 81 - , {doNOP, 131, 84,0, TRUE} // 82 scan-var-start + , {doNOP, 130, 84,0, TRUE} // 82 scan-var-start , {doVariableNameExpectedErr, 255, 95,0, FALSE} // 83 - , {doNOP, 132, 84,0, TRUE} // 84 scan-var-body + , {doNOP, 129, 84,0, TRUE} // 84 scan-var-body , {doEndVariableName, 255, 255,0, FALSE} // 85 , {doScanUnicodeSet, 91 /* [ */, 255,0, TRUE} // 86 scan-unicode-set , {doScanUnicodeSet, 112 /* p */, 255,0, TRUE} // 87 , {doScanUnicodeSet, 80 /* P */, 255,0, TRUE} // 88 , {doNOP, 255, 95,0, FALSE} // 89 - , {doNOP, 129, 90,0, TRUE} // 90 assign-or-rule + , {doNOP, 132, 90,0, TRUE} // 90 assign-or-rule , {doStartAssign, 61 /* = */, 21, 93, TRUE} // 91 , {doNOP, 255, 29, 8, FALSE} // 92 , {doEndAssign, 59 /* ; */, 1,0, TRUE} // 93 assign-end diff --git a/Build/source/libs/icu-xetex/common/rbbiscan.cpp b/Build/source/libs/icu-xetex/common/rbbiscan.cpp index dd50ec5a946..75c69f525e9 100644 --- a/Build/source/libs/icu-xetex/common/rbbiscan.cpp +++ b/Build/source/libs/icu-xetex/common/rbbiscan.cpp @@ -2,7 +2,7 @@ // // file: rbbiscan.cpp // -// Copyright (C) 2002-2005, International Business Machines Corporation and others. +// Copyright (C) 2002-2006, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains the Rule Based Break Iterator Rule Builder functions for @@ -142,7 +142,7 @@ RBBIRuleScanner::RBBIRuleScanner(RBBIRuleBuilder *rb) } fSymbolTable = new RBBISymbolTable(this, rb->fRules, *rb->fStatus); - fSetTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, rb->fStatus); + fSetTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, rb->fStatus); uhash_setValueDeleter(fSetTable, RBBISetTable_deleter); } @@ -289,13 +289,13 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action) // Make a symbol table entry for the $variableRef node. fSymbolTable->addEntry(varRefNode->fText, varRefNode, *fRB->fStatus); - if (U_FAILURE(*fRB->fStatus)) { - // This is a round-about way to get the parse position set - // so that duplicate symbols error messages include a line number. - UErrorCode t = *fRB->fStatus; - *fRB->fStatus = U_ZERO_ERROR; - error(t); - } + if (U_FAILURE(*fRB->fStatus)) { + // This is a round-about way to get the parse position set + // so that duplicate symbols error messages include a line number. + UErrorCode t = *fRB->fStatus; + *fRB->fStatus = U_ZERO_ERROR; + error(t); + } // Clean up the stack. delete startExprNode; @@ -435,7 +435,6 @@ UBool RBBIRuleScanner::doParseActions(EParseAction action) fRB->fRules.extractBetween(n->fFirstPos, n->fLastPos, n->fText); break; } - break; case doSlash: // Scanned a '/', which identifies a look-ahead break position in a rule. @@ -1149,7 +1148,7 @@ void RBBIRuleScanner::scanSet() { // Verify that the set contains at least one code point. // - if (uset->charAt(0) == -1) { + if (uset->isEmpty()) { // This set is empty. // Make it an error, because it almost certainly is not what the user wanted. // Also, avoids having to think about corner cases in the tree manipulation code diff --git a/Build/source/libs/icu-xetex/common/rbbiscan.h b/Build/source/libs/icu-xetex/common/rbbiscan.h index fff5d475996..89748318eee 100644 --- a/Build/source/libs/icu-xetex/common/rbbiscan.h +++ b/Build/source/libs/icu-xetex/common/rbbiscan.h @@ -1,7 +1,7 @@ // // rbbiscan.h // -// Copyright (C) 2002-2003, International Business Machines Corporation and others. +// Copyright (C) 2002-2005, International Business Machines Corporation and others. // All Rights Reserved. // // This file contains declarations for class RBBIRuleScanner @@ -102,8 +102,8 @@ private: int32_t fNextIndex; // Index of the next character, which // is the first character not yet scanned. UBool fQuoteMode; // Scan is in a 'quoted region' - int fLineNum; // Line number in input file. - int fCharNum; // Char position within the line. + int32_t fLineNum; // Line number in input file. + int32_t fCharNum; // Char position within the line. UChar32 fLastChar; // Previous char, needed to count CR-LF // as a single line, not two. @@ -116,12 +116,12 @@ private: // parsing. index by p[state][char-class] uint16_t fStack[kStackSize]; // State stack, holds state pushes - int fStackPtr; // and pops as specified in the state + int32_t fStackPtr; // and pops as specified in the state // transition rules. RBBINode *fNodeStack[kStackSize]; // Node stack, holds nodes created // during the parse of a rule - int fNodeStackPtr; + int32_t fNodeStackPtr; UBool fReverseRule; // True if the rule currently being scanned diff --git a/Build/source/libs/icu-xetex/common/rbbisetb.cpp b/Build/source/libs/icu-xetex/common/rbbisetb.cpp index eceffb6bac3..0bbe8e920ee 100644 --- a/Build/source/libs/icu-xetex/common/rbbisetb.cpp +++ b/Build/source/libs/icu-xetex/common/rbbisetb.cpp @@ -94,6 +94,7 @@ RBBISetBuilder::RBBISetBuilder(RBBIRuleBuilder *rb) fTrie = 0; fTrieSize = 0; fGroupCount = 0; + fSawBOF = FALSE; } @@ -224,7 +225,8 @@ void RBBISetBuilder::build() { // // Numbering: # 0 (state table column 0) is unused. // # 1 is reserved - table column 1 is for end-of-input - // # 2 is the first range list. + // # 2 is reserved - table column 2 is for beginning-in-input + // # 3 is the first range list. // RangeDescriptor *rlSearchRange; for (rlRange = fRangeList; rlRange!=0; rlRange=rlRange->fNext) { @@ -236,20 +238,26 @@ void RBBISetBuilder::build() { } if (rlRange->fNum == 0) { fGroupCount ++; - rlRange->fNum = fGroupCount+1; + rlRange->fNum = fGroupCount+2; rlRange->setDictionaryFlag(); - addValToSets(rlRange->fIncludesSets, fGroupCount+1); + addValToSets(rlRange->fIncludesSets, fGroupCount+2); } } // Handle input sets that contain the special string {eof}. // Column 1 of the state table is reserved for EOF on input. - // Add this column value (1) to the equivalent expression + // Column 2 is reserved for before-the-start-input. + // (This column can be optimized away later if there are no rule + // references to {bof}.) + // Add this column value (1 or 2) to the equivalent expression // subtree for each UnicodeSet that contains the string {eof} - // Because EOF is not a character in the normal sense, it doesn't - // affect the computation of ranges or TRIE. + // Because {bof} and {eof} are not a characters in the normal sense, + // they doesn't affect the computation of ranges or TRIE. static const UChar eofUString[] = {0x65, 0x6f, 0x66, 0}; + static const UChar bofUString[] = {0x62, 0x6f, 0x66, 0}; + UnicodeString eofString(eofUString); + UnicodeString bofString(bofUString); for (ni=0; ; ni++) { // Loop over each of the UnicodeSets encountered in the input rules usetNode = (RBBINode *)this->fRB->fUSetNodes->elementAt(ni); if (usetNode==NULL) { @@ -259,6 +267,10 @@ void RBBISetBuilder::build() { if (inputSet->contains(eofString)) { addValToSet(usetNode, 1); } + if (inputSet->contains(bofString)) { + addValToSet(usetNode, 2); + fSawBOF = TRUE; + } } @@ -367,10 +379,19 @@ void RBBISetBuilder::addValToSet(RBBINode *usetNode, uint32_t val) { // //------------------------------------------------------------------------ int32_t RBBISetBuilder::getNumCharCategories() const { - return fGroupCount + 2; + return fGroupCount + 3; } +//------------------------------------------------------------------------ +// +// sawBOF +// +//------------------------------------------------------------------------ +UBool RBBISetBuilder::sawBOF() const { + return fSawBOF; +} + //------------------------------------------------------------------------ // diff --git a/Build/source/libs/icu-xetex/common/rbbisetb.h b/Build/source/libs/icu-xetex/common/rbbisetb.h index ec0a0dc855c..c8bc1df7786 100644 --- a/Build/source/libs/icu-xetex/common/rbbisetb.h +++ b/Build/source/libs/icu-xetex/common/rbbisetb.h @@ -82,11 +82,13 @@ public: void addValToSets(UVector *sets, uint32_t val); void addValToSet (RBBINode *usetNode, uint32_t val); int32_t getNumCharCategories() const; // CharCategories are the same as input symbol set to the - // runtime state machine, which are the same as - // columns in the DFA state table + // runtime state machine, which are the same as + // columns in the DFA state table int32_t getTrieSize() /*const*/; // Size in bytes of the serialized Trie. void serializeTrie(uint8_t *where); // write out the serialized Trie. UChar32 getFirstChar(int32_t val) const; + UBool sawBOF() const; // Indicate whether any references to the {bof} pseudo + // character were encountered. #ifdef RBBI_DEBUG void printSets(); void printRanges(); @@ -116,6 +118,8 @@ private: // column 2 is for group 0. Funny counting. int32_t fGroupCount; + UBool fSawBOF; + RBBISetBuilder(const RBBISetBuilder &other); // forbid copying of this class RBBISetBuilder &operator=(const RBBISetBuilder &other); // forbid copying of this class }; diff --git a/Build/source/libs/icu-xetex/common/rbbistbl.cpp b/Build/source/libs/icu-xetex/common/rbbistbl.cpp index 56676538ac0..771eb3136a4 100644 --- a/Build/source/libs/icu-xetex/common/rbbistbl.cpp +++ b/Build/source/libs/icu-xetex/common/rbbistbl.cpp @@ -44,7 +44,7 @@ RBBISymbolTable::RBBISymbolTable(RBBIRuleScanner *rs, const UnicodeString &rules fHashTable = NULL; fCachedSetLookup = NULL; - fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, &status); + fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, &status); // uhash_open checks status if (U_FAILURE(status)) { return; diff --git a/Build/source/libs/icu-xetex/common/rbbitblb.cpp b/Build/source/libs/icu-xetex/common/rbbitblb.cpp index e4c02f8d115..73ffd6dd0ad 100644 --- a/Build/source/libs/icu-xetex/common/rbbitblb.cpp +++ b/Build/source/libs/icu-xetex/common/rbbitblb.cpp @@ -1,13 +1,13 @@ -// -// rbbitblb.cpp -// - /* ********************************************************************** -* Copyright (c) 2002-2005, International Business Machines +* Copyright (c) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ +// +// rbbitblb.cpp +// + #include "unicode/utypes.h" @@ -75,10 +75,28 @@ void RBBITableBuilder::build() { // parse tree for the substition expression. // fTree = fTree->flattenVariables(); +#ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ftree")) { RBBIDebugPuts("Parse tree after flattening variable references."); fTree->printTree(TRUE); } +#endif + + // + // If the rules contained any references to {bof} + // add a {bof} <cat> <former root of tree> to the + // tree. Means that all matches must start out with the + // {bof} fake character. + // + if (fRB->fSetBuilder->sawBOF()) { + RBBINode *bofTop = new RBBINode(RBBINode::opCat); + RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar); + bofTop->fLeftChild = bofLeaf; + bofTop->fRightChild = fTree; + bofLeaf->fParent = bofTop; + bofLeaf->fVal = 2; // Reserved value for {bof}. + fTree = bofTop; + } // // Add a unique right-end marker to the expression. @@ -97,10 +115,12 @@ void RBBITableBuilder::build() { // expression. // fTree->flattenSets(); +#ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "stree")) { RBBIDebugPuts("Parse tree after flattening Unicode Set references."); fTree->printTree(TRUE); } +#endif // @@ -127,6 +147,13 @@ void RBBITableBuilder::build() { } // + // BOF (start of input) test fixup. + // + if (fRB->fSetBuilder->sawBOF()) { + bofFixup(); + } + + // // Build the DFA state transition tables. // buildStateTable(); @@ -349,8 +376,15 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree) { return; } - // Get all nodes that can be the start a match, which is FirstPosition(root) - UVector *matchStartNodes = tree->fFirstPosSet; + // Get all nodes that can be the start a match, which is FirstPosition() + // of the portion of the tree corresponding to user-written rules. + // See the tree description in bofFixup(). + RBBINode *userRuleRoot = tree; + if (fRB->fSetBuilder->sawBOF()) { + userRuleRoot = tree->fLeftChild->fRightChild; + } + U_ASSERT(userRuleRoot != NULL); + UVector *matchStartNodes = userRuleRoot->fFirstPosSet; // Iteratate over all leaf nodes, @@ -419,6 +453,62 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree) { //----------------------------------------------------------------------------- // +// bofFixup. Fixup for state tables that include {bof} beginning of input testing. +// Do an swizzle similar to chaining, modifying the followPos set of +// the bofNode to include the followPos nodes from other {bot} nodes +// scattered through the tree. +// +// This function has much in common with calcChainedFollowPos(). +// +//----------------------------------------------------------------------------- +void RBBITableBuilder::bofFixup() { + + if (U_FAILURE(*fStatus)) { + return; + } + + // The parse tree looks like this ... + // fTree root ---> <cat> + // / \ . + // <cat> <#end node> + // / \ . + // <bofNode> rest + // of tree + // + // We will be adding things to the followPos set of the <bofNode> + // + RBBINode *bofNode = fTree->fLeftChild->fLeftChild; + U_ASSERT(bofNode->fType == RBBINode::leafChar); + U_ASSERT(bofNode->fVal == 2); + + // Get all nodes that can be the start a match of the user-written rules + // (excluding the fake bofNode) + // We want the nodes that can start a match in the + // part labeled "rest of tree" + // + UVector *matchStartNodes = fTree->fLeftChild->fRightChild->fFirstPosSet; + + RBBINode *startNode; + int startNodeIx; + for (startNodeIx = 0; startNodeIx<matchStartNodes->size(); startNodeIx++) { + startNode = (RBBINode *)matchStartNodes->elementAt(startNodeIx); + if (startNode->fType != RBBINode::leafChar) { + continue; + } + + if (startNode->fVal == bofNode->fVal) { + // We found a leaf node corresponding to a {bof} that was + // explicitly written into a rule. + // Add everything from the followPos set of this node to the + // followPos set of the fake bofNode at the start of the tree. + // + setAdd(bofNode->fFollowPos, startNode->fFollowPos); + } + } +} + +//----------------------------------------------------------------------------- +// // buildStateTable() Determine the set of runtime DFA states and the // transition tables for these states, by the algorithm // of fig. 3.44 in Aho. @@ -576,27 +666,27 @@ void RBBITableBuilder::flagAcceptingStates() { // If no other value was specified, force it to -1. if (sd->fAccepting==0) { - // State hasn't been marked as accepting yet. Do it now. + // State hasn't been marked as accepting yet. Do it now. sd->fAccepting = endMarker->fVal; if (sd->fAccepting == 0) { sd->fAccepting = -1; - } + } } if (sd->fAccepting==-1 && endMarker->fVal != 0) { - // Both lookahead and non-lookahead accepting for this state. - // Favor the look-ahead. Expedient for line break. - // TODO: need a more elegant resolution for conflicting rules. - sd->fAccepting = endMarker->fVal; - } - // implicit else: - // if sd->fAccepting already had a value other than 0 or -1, leave it be. + // Both lookahead and non-lookahead accepting for this state. + // Favor the look-ahead. Expedient for line break. + // TODO: need a more elegant resolution for conflicting rules. + sd->fAccepting = endMarker->fVal; + } + // implicit else: + // if sd->fAccepting already had a value other than 0 or -1, leave it be. // If the end marker node is from a look-ahead rule, set // the fLookAhead field or this state also. if (endMarker->fLookAheadEnd) { - // TODO: don't change value if already set? - // TODO: allow for more than one active look-ahead rule in engine. - // Make value here an index to a side array in engine? + // TODO: don't change value if already set? + // TODO: allow for more than one active look-ahead rule in engine. + // Make value here an index to a side array in engine? sd->fLookAhead = sd->fAccepting; } } @@ -958,6 +1048,9 @@ void RBBITableBuilder::exportTable(void *where) { if (fRB->fLookAheadHardBreak) { table->fFlags |= RBBI_LOOKAHEAD_HARD_BREAK; } + if (fRB->fSetBuilder->sawBOF()) { + table->fFlags |= RBBI_BOF_REQUIRED; + } table->fReserved = 0; for (state=0; state<table->fNumStates; state++) { diff --git a/Build/source/libs/icu-xetex/common/rbbitblb.h b/Build/source/libs/icu-xetex/common/rbbitblb.h index e4a2b890bd1..3805b6752a3 100644 --- a/Build/source/libs/icu-xetex/common/rbbitblb.h +++ b/Build/source/libs/icu-xetex/common/rbbitblb.h @@ -4,7 +4,7 @@ /* ********************************************************************** -* Copyright (c) 2002-2004, International Business Machines +* Copyright (c) 2002-2005, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -51,6 +51,7 @@ private: void calcLastPos(RBBINode *n); void calcFollowPos(RBBINode *n); void calcChainedFollowPos(RBBINode *n); + void bofFixup(); void buildStateTable(); void flagAcceptingStates(); void flagLookAheadStates(); diff --git a/Build/source/libs/icu-xetex/common/resbund_cnv.cpp b/Build/source/libs/icu-xetex/common/resbund_cnv.cpp index 871f025e014..a18e57e3106 100644 --- a/Build/source/libs/icu-xetex/common/resbund_cnv.cpp +++ b/Build/source/libs/icu-xetex/common/resbund_cnv.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1997-2004, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -47,7 +47,8 @@ ResourceBundle::constructForLocale(const UnicodeString& path, } else { UnicodeString nullTerminatedPath(path); - fResource = ures_openU(nullTerminatedPath.getTerminatedBuffer(), locale.getName(), &error); + nullTerminatedPath.append((UChar)0); + fResource = ures_openU(nullTerminatedPath.getBuffer(), locale.getName(), &error); } } diff --git a/Build/source/libs/icu-xetex/common/ruleiter.h b/Build/source/libs/icu-xetex/common/ruleiter.h index 8438f5797b7..5c86020bd8b 100644 --- a/Build/source/libs/icu-xetex/common/ruleiter.h +++ b/Build/source/libs/icu-xetex/common/ruleiter.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2003-2005, International Business Machines +* Copyright (c) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Author: Alan Liu @@ -11,7 +11,7 @@ #ifndef _RULEITER_H_ #define _RULEITER_H_ -#include "unicode/utypes.h" +#include "unicode/uobject.h" U_NAMESPACE_BEGIN @@ -26,7 +26,7 @@ class SymbolTable; * @author Alan Liu * @since ICU 2.8 */ -class U_COMMON_API RuleCharacterIterator { +class RuleCharacterIterator : public UMemory { // TODO: Ideas for later. (Do not implement if not needed, lest the // code coverage numbers go down due to unused methods.) @@ -131,7 +131,7 @@ public: /** * An opaque object representing the position of a RuleCharacterIterator. */ - struct Pos { + struct Pos : public UMemory { private: const UnicodeString* buf; int32_t pos; diff --git a/Build/source/libs/icu-xetex/common/serv.h b/Build/source/libs/icu-xetex/common/serv.h index 835eb934334..72f0a9f4aee 100644 --- a/Build/source/libs/icu-xetex/common/serv.h +++ b/Build/source/libs/icu-xetex/common/serv.h @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2005, International Business Machines Corporation. * + * Copyright (C) 2001-2006, International Business Machines Corporation. * * All Rights Reserved. * ******************************************************************************* */ @@ -26,6 +26,7 @@ U_NAMESPACE_END #include "unicode/unistr.h" #include "unicode/locid.h" +#include "unicode/umisc.h" #include "hash.h" #include "uvector.h" @@ -436,11 +437,6 @@ private: U_CAPI void U_EXPORT2 userv_deleteStringPair(void *obj); -/** - * Opaque type returned by registerInstance and registerFactory. - */ -typedef const void* URegistryKey; - /******************************************************************* * ICUService */ diff --git a/Build/source/libs/icu-xetex/common/servnotf.cpp b/Build/source/libs/icu-xetex/common/servnotf.cpp index eb4a90164c6..6adf52ece2e 100644 --- a/Build/source/libs/icu-xetex/common/servnotf.cpp +++ b/Build/source/libs/icu-xetex/common/servnotf.cpp @@ -1,6 +1,6 @@ /** ******************************************************************************* - * Copyright (C) 2001-2004, International Business Machines Corporation and * + * Copyright (C) 2001-2006, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -20,7 +20,7 @@ EventListener::~EventListener() {} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener) ICUNotifier::ICUNotifier(void) - : notifyLock(0), listeners(NULL) +: notifyLock(0), listeners(NULL) { umtx_init(¬ifyLock); } @@ -38,75 +38,77 @@ ICUNotifier::~ICUNotifier(void) { void ICUNotifier::addListener(const EventListener* l, UErrorCode& status) { - if (U_SUCCESS(status)) { - if (l == NULL) { - status = U_ILLEGAL_ARGUMENT_ERROR; - } - - if (acceptsListener(*l)) { - Mutex lmx(¬ifyLock); - if (listeners == NULL) { - listeners = new UVector(5, status); - } else { - for (int i = 0, e = listeners->size(); i < e; ++i) { - const EventListener* el = (const EventListener*)(listeners->elementAt(i)); - if (l == el) { + if (U_SUCCESS(status)) { + if (l == NULL) { + status = U_ILLEGAL_ARGUMENT_ERROR; return; - } } - } - listeners->addElement((void*)l, status); // cast away const - } else { + if (acceptsListener(*l)) { + Mutex lmx(¬ifyLock); + if (listeners == NULL) { + listeners = new UVector(5, status); + } else { + for (int i = 0, e = listeners->size(); i < e; ++i) { + const EventListener* el = (const EventListener*)(listeners->elementAt(i)); + if (l == el) { + return; + } + } + } + + listeners->addElement((void*)l, status); // cast away const + } #ifdef NOTIFIER_DEBUG - fprintf(stderr, "Listener invalid for this notifier."); - exit(1); + else { + fprintf(stderr, "Listener invalid for this notifier."); + exit(1); + } #endif } - } } void ICUNotifier::removeListener(const EventListener *l, UErrorCode& status) { - if (U_SUCCESS(status)) { - if (l == NULL) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + if (U_SUCCESS(status)) { + if (l == NULL) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - { - Mutex lmx(¬ifyLock); - if (listeners != NULL) { - // identity equality check - for (int i = 0, e = listeners->size(); i < e; ++i) { - const EventListener* el = (const EventListener*)listeners->elementAt(i); - if (l == el) { - listeners->removeElementAt(i); - if (listeners->size() == 0) { - delete listeners; - listeners = NULL; + { + Mutex lmx(¬ifyLock); + if (listeners != NULL) { + // identity equality check + for (int i = 0, e = listeners->size(); i < e; ++i) { + const EventListener* el = (const EventListener*)listeners->elementAt(i); + if (l == el) { + listeners->removeElementAt(i); + if (listeners->size() == 0) { + delete listeners; + listeners = NULL; + } + return; + } + } } - return; - } } - } } - } } void ICUNotifier::notifyChanged(void) { - if (listeners != NULL) { - Mutex lmx(¬ifyLock); if (listeners != NULL) { - for (int i = 0, e = listeners->size(); i < e; ++i) { - EventListener* el = (EventListener*)listeners->elementAt(i); - notifyListener(*el); - } + Mutex lmx(¬ifyLock); + if (listeners != NULL) { + for (int i = 0, e = listeners->size(); i < e; ++i) { + EventListener* el = (EventListener*)listeners->elementAt(i); + notifyListener(*el); + } + } } - } } U_NAMESPACE_END diff --git a/Build/source/libs/icu-xetex/common/sprpimpl.h b/Build/source/libs/icu-xetex/common/sprpimpl.h index 36639b5ca13..1422cc3acd5 100644 --- a/Build/source/libs/icu-xetex/common/sprpimpl.h +++ b/Build/source/libs/icu-xetex/common/sprpimpl.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003-2005, International Business Machines + * Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -89,8 +89,8 @@ struct UStringPrepProfile{ const uint16_t* mappingData; UDataMemory* sprepData; const UBiDiProps *bdp; /* used only if checkBiDi is set */ - UBool isDataLoaded; int32_t refCount; + UBool isDataLoaded; UBool doNFKC; UBool checkBiDi; }; diff --git a/Build/source/libs/icu-xetex/common/triedict.cpp b/Build/source/libs/icu-xetex/common/triedict.cpp new file mode 100644 index 00000000000..2c58a550019 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/triedict.cpp @@ -0,0 +1,1407 @@ +/** + ******************************************************************************* + * Copyright (C) 2006, International Business Machines Corporation and others. * + * All Rights Reserved. * + ******************************************************************************* + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "triedict.h" +#include "unicode/chariter.h" +#include "unicode/uchriter.h" +#include "unicode/strenum.h" +#include "unicode/uenum.h" +#include "unicode/udata.h" +#include "cmemory.h" +#include "udataswp.h" +#include "uvector.h" +#include "uvectr32.h" +#include "uarrsort.h" + +//#define DEBUG_TRIE_DICT 1 + +#ifdef DEBUG_TRIE_DICT +#include <sys/times.h> +#include <limits.h> +#include <stdio.h> +#endif + +U_NAMESPACE_BEGIN + +/******************************************************************* + * TrieWordDictionary + */ + +TrieWordDictionary::TrieWordDictionary() { +} + +TrieWordDictionary::~TrieWordDictionary() { +} + +/******************************************************************* + * MutableTrieDictionary + */ + +// Node structure for the ternary, uncompressed trie +struct TernaryNode : public UMemory { + UChar ch; // UTF-16 code unit + uint16_t flags; // Flag word + TernaryNode *low; // Less-than link + TernaryNode *equal; // Equal link + TernaryNode *high; // Greater-than link + + TernaryNode(UChar uc); + ~TernaryNode(); +}; + +enum MutableTrieNodeFlags { + kEndsWord = 0x0001 // This node marks the end of a valid word +}; + +inline +TernaryNode::TernaryNode(UChar uc) { + ch = uc; + flags = 0; + low = NULL; + equal = NULL; + high = NULL; +} + +// Not inline since it's recursive +TernaryNode::~TernaryNode() { + delete low; + delete equal; + delete high; +} + +MutableTrieDictionary::MutableTrieDictionary( UChar median, UErrorCode &status ) { + // Start the trie off with something. Having the root node already present + // cuts a special case out of the search/insertion functions. + // Making it a median character cuts the worse case for searches from + // 4x a balanced trie to 2x a balanced trie. It's best to choose something + // that starts a word that is midway in the list. + fTrie = new TernaryNode(median); + if (fTrie == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + fIter = utext_openUChars(NULL, NULL, 0, &status); + if (U_SUCCESS(status) && fIter == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } +} + +MutableTrieDictionary::MutableTrieDictionary( UErrorCode &status ) { + fTrie = NULL; + fIter = utext_openUChars(NULL, NULL, 0, &status); + if (U_SUCCESS(status) && fIter == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } +} + +MutableTrieDictionary::~MutableTrieDictionary() { + delete fTrie; + utext_close(fIter); +} + +int32_t +MutableTrieDictionary::search( UText *text, + int32_t maxLength, + int32_t *lengths, + int &count, + int limit, + TernaryNode *&parent, + UBool &pMatched ) const { + // TODO: current implementation works in UTF-16 space + const TernaryNode *up = NULL; + const TernaryNode *p = fTrie; + int mycount = 0; + pMatched = TRUE; + int i; + + UChar uc = utext_current32(text); + for (i = 0; i < maxLength && p != NULL; ++i) { + while (p != NULL) { + if (uc < p->ch) { + up = p; + p = p->low; + } + else if (uc == p->ch) { + break; + } + else { + up = p; + p = p->high; + } + } + if (p == NULL) { + pMatched = FALSE; + break; + } + // Must be equal to get here + if (limit > 0 && (p->flags & kEndsWord)) { + lengths[mycount++] = i+1; + --limit; + } + up = p; + p = p->equal; + uc = utext_next32(text); + uc = utext_current32(text); + } + + // Note that there is no way to reach here with up == 0 unless + // maxLength is 0 coming in. + parent = (TernaryNode *)up; + count = mycount; + return i; +} + +void +MutableTrieDictionary::addWord( const UChar *word, + int32_t length, + UErrorCode &status ) { +#if 0 + if (length <= 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } +#endif + TernaryNode *parent; + UBool pMatched; + int count; + fIter = utext_openUChars(fIter, word, length, &status); + + int matched; + matched = search(fIter, length, NULL, count, 0, parent, pMatched); + + while (matched++ < length) { + UChar32 uc = utext_next32(fIter); // TODO: supplemetary support? + U_ASSERT(uc != U_SENTINEL); + TernaryNode *newNode = new TernaryNode(uc); + if (newNode == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + if (pMatched) { + parent->equal = newNode; + } + else { + pMatched = TRUE; + if (uc < parent->ch) { + parent->low = newNode; + } + else { + parent->high = newNode; + } + } + parent = newNode; + } + + parent->flags |= kEndsWord; +} + +#if 0 +void +MutableTrieDictionary::addWords( UEnumeration *words, + UErrorCode &status ) { + int32_t length; + const UChar *word; + while ((word = uenum_unext(words, &length, &status)) && U_SUCCESS(status)) { + addWord(word, length, status); + } +} +#endif + +int32_t +MutableTrieDictionary::matches( UText *text, + int32_t maxLength, + int32_t *lengths, + int &count, + int limit ) const { + TernaryNode *parent; + UBool pMatched; + return search(text, maxLength, lengths, count, limit, parent, pMatched); +} + +// Implementation of iteration for MutableTrieDictionary +class MutableTrieEnumeration : public StringEnumeration { +private: + UStack fNodeStack; // Stack of nodes to process + UVector32 fBranchStack; // Stack of which branch we are working on + TernaryNode *fRoot; // Root node + static const char fgClassID; + enum StackBranch { + kLessThan, + kEqual, + kGreaterThan, + kDone + }; + +public: + static UClassID U_EXPORT2 getStaticClassID(void) { return (UClassID)&fgClassID; } + virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } +public: + MutableTrieEnumeration(TernaryNode *root, UErrorCode &status) + : fNodeStack(status), fBranchStack(status) { + fRoot = root; + fNodeStack.push(root, status); + fBranchStack.push(kLessThan, status); + unistr.remove(); + } + + virtual ~MutableTrieEnumeration() { + } + + virtual StringEnumeration *clone() const { + UErrorCode status = U_ZERO_ERROR; + return new MutableTrieEnumeration(fRoot, status); + } + + virtual const UnicodeString *snext(UErrorCode &status) { + if (fNodeStack.empty() || U_FAILURE(status)) { + return NULL; + } + TernaryNode *node = (TernaryNode *) fNodeStack.peek(); + StackBranch where = (StackBranch) fBranchStack.peeki(); + while (!fNodeStack.empty() && U_SUCCESS(status)) { + UBool emit; + UBool equal; + + switch (where) { + case kLessThan: + if (node->low != NULL) { + fBranchStack.setElementAt(kEqual, fBranchStack.size()-1); + node = (TernaryNode *) fNodeStack.push(node->low, status); + where = (StackBranch) fBranchStack.push(kLessThan, status); + break; + } + case kEqual: + emit = (node->flags & kEndsWord) != 0; + equal = (node->equal != NULL); + // If this node should be part of the next emitted string, append + // the UChar to the string, and make sure we pop it when we come + // back to this node. The character should only be in the string + // for as long as we're traversing the equal subtree of this node + if (equal || emit) { + unistr.append(node->ch); + fBranchStack.setElementAt(kGreaterThan, fBranchStack.size()-1); + } + if (equal) { + node = (TernaryNode *) fNodeStack.push(node->equal, status); + where = (StackBranch) fBranchStack.push(kLessThan, status); + } + if (emit) { + return &unistr; + } + if (equal) { + break; + } + case kGreaterThan: + // If this node's character is in the string, remove it. + if (node->equal != NULL || (node->flags & kEndsWord)) { + unistr.truncate(unistr.length()-1); + } + if (node->high != NULL) { + fBranchStack.setElementAt(kDone, fBranchStack.size()-1); + node = (TernaryNode *) fNodeStack.push(node->high, status); + where = (StackBranch) fBranchStack.push(kLessThan, status); + break; + } + case kDone: + fNodeStack.pop(); + fBranchStack.popi(); + node = (TernaryNode *) fNodeStack.peek(); + where = (StackBranch) fBranchStack.peeki(); + break; + default: + return NULL; + } + } + return NULL; + } + + // Very expensive, but this should never be used. + virtual int32_t count(UErrorCode &status) const { + MutableTrieEnumeration counter(fRoot, status); + int32_t result = 0; + while (counter.snext(status) != NULL && U_SUCCESS(status)) { + ++result; + } + return result; + } + + virtual void reset(UErrorCode &status) { + fNodeStack.removeAllElements(); + fBranchStack.removeAllElements(); + fNodeStack.push(fRoot, status); + fBranchStack.push(kLessThan, status); + unistr.remove(); + } +}; + +const char MutableTrieEnumeration::fgClassID = '\0'; + +StringEnumeration * +MutableTrieDictionary::openWords( UErrorCode &status ) const { + if (U_FAILURE(status)) { + return NULL; + } + return new MutableTrieEnumeration(fTrie, status); +} + +/******************************************************************* + * CompactTrieDictionary + */ + +struct CompactTrieHeader { + uint32_t size; // Size of the data in bytes + uint32_t magic; // Magic number (including version) + uint16_t nodeCount; // Number of entries in offsets[] + uint16_t root; // Node number of the root node + uint32_t offsets[1]; // Offsets to nodes from start of data +}; + +// Note that to avoid platform-specific alignment issues, all members of the node +// structures should be the same size, or should contain explicit padding to +// natural alignment boundaries. + +// We can't use a bitfield for the flags+count field, because the layout of those +// is not portable. 12 bits of count allows for up to 4096 entries in a node. +struct CompactTrieNode { + uint16_t flagscount; // Count of sub-entries, plus flags +}; + +enum CompactTrieNodeFlags { + kVerticalNode = 0x1000, // This is a vertical node + kParentEndsWord = 0x2000, // The node whose equal link points to this ends a word + kReservedFlag1 = 0x4000, + kReservedFlag2 = 0x8000, + kCountMask = 0x0FFF, // The count portion of flagscount + kFlagMask = 0xF000 // The flags portion of flagscount +}; + +// The two node types are distinguished by the kVerticalNode flag. + +struct CompactTrieHorizontalEntry { + uint16_t ch; // UChar + uint16_t equal; // Equal link node index +}; + +// We don't use inheritance here because C++ does not guarantee that the +// base class comes first in memory!! + +struct CompactTrieHorizontalNode { + uint16_t flagscount; // Count of sub-entries, plus flags + CompactTrieHorizontalEntry entries[1]; +}; + +struct CompactTrieVerticalNode { + uint16_t flagscount; // Count of sub-entries, plus flags + uint16_t equal; // Equal link node index + uint16_t chars[1]; // Code units +}; + +// {'Dic', 1}, version 1 +#define COMPACT_TRIE_MAGIC_1 0x44696301 + +CompactTrieDictionary::CompactTrieDictionary(UDataMemory *dataObj, + UErrorCode &status ) +: fUData(dataObj) +{ + fData = (const CompactTrieHeader *) udata_getMemory(dataObj); + fOwnData = FALSE; + if (fData->magic != COMPACT_TRIE_MAGIC_1) { + status = U_ILLEGAL_ARGUMENT_ERROR; + fData = NULL; + } +} +CompactTrieDictionary::CompactTrieDictionary( const void *data, + UErrorCode &status ) +: fUData(NULL) +{ + fData = (const CompactTrieHeader *) data; + fOwnData = FALSE; + if (fData->magic != COMPACT_TRIE_MAGIC_1) { + status = U_ILLEGAL_ARGUMENT_ERROR; + fData = NULL; + } +} + +CompactTrieDictionary::CompactTrieDictionary( const MutableTrieDictionary &dict, + UErrorCode &status ) +: fUData(NULL) +{ + fData = compactMutableTrieDictionary(dict, status); + fOwnData = !U_FAILURE(status); +} + +CompactTrieDictionary::~CompactTrieDictionary() { + if (fOwnData) { + uprv_free((void *)fData); + } + if (fUData) { + udata_close(fUData); + } +} + +uint32_t +CompactTrieDictionary::dataSize() const { + return fData->size; +} + +const void * +CompactTrieDictionary::data() const { + return fData; +} + +// This function finds the address of a node for us, given its node ID +static inline const CompactTrieNode * +getCompactNode(const CompactTrieHeader *header, uint16_t node) { + return (const CompactTrieNode *)((const uint8_t *)header + header->offsets[node]); +} + +int32_t +CompactTrieDictionary::matches( UText *text, + int32_t maxLength, + int32_t *lengths, + int &count, + int limit ) const { + // TODO: current implementation works in UTF-16 space + const CompactTrieNode *node = getCompactNode(fData, fData->root); + int mycount = 0; + + UChar uc = utext_current32(text); + int i = 0; + + while (node != NULL) { + // Check if the node we just exited ends a word + if (limit > 0 && (node->flagscount & kParentEndsWord)) { + lengths[mycount++] = i; + --limit; + } + // Check that we haven't exceeded the maximum number of input characters. + // We have to do that here rather than in the while condition so that + // we can check for ending a word, above. + if (i >= maxLength) { + break; + } + + int nodeCount = (node->flagscount & kCountMask); + if (nodeCount == 0) { + // Special terminal node; return now + break; + } + if (node->flagscount & kVerticalNode) { + // Vertical node; check all the characters in it + const CompactTrieVerticalNode *vnode = (const CompactTrieVerticalNode *)node; + for (int j = 0; j < nodeCount && i < maxLength; ++j) { + if (uc != vnode->chars[j]) { + // We hit a non-equal character; return + goto exit; + } + utext_next32(text); + uc = utext_current32(text); + ++i; + } + // To get here we must have come through the whole list successfully; + // go on to the next node. Note that a word cannot end in the middle + // of a vertical node. + node = getCompactNode(fData, vnode->equal); + } + else { + // Horizontal node; do binary search + const CompactTrieHorizontalNode *hnode = (const CompactTrieHorizontalNode *)node; + int low = 0; + int high = nodeCount-1; + int middle; + node = NULL; // If we don't find a match, we'll fall out of the loop + while (high >= low) { + middle = (high+low)/2; + if (uc == hnode->entries[middle].ch) { + // We hit a match; get the next node and next character + node = getCompactNode(fData, hnode->entries[middle].equal); + utext_next32(text); + uc = utext_current32(text); + ++i; + break; + } + else if (uc < hnode->entries[middle].ch) { + high = middle-1; + } + else { + low = middle+1; + } + } + } + } +exit: + count = mycount; + return i; +} + +// Implementation of iteration for CompactTrieDictionary +class CompactTrieEnumeration : public StringEnumeration { +private: + UVector32 fNodeStack; // Stack of nodes to process + UVector32 fIndexStack; // Stack of where in node we are + const CompactTrieHeader *fHeader; // Trie data + static const char fgClassID; + +public: + static UClassID U_EXPORT2 getStaticClassID(void) { return (UClassID)&fgClassID; } + virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } +public: + CompactTrieEnumeration(const CompactTrieHeader *header, UErrorCode &status) + : fNodeStack(status), fIndexStack(status) { + fHeader = header; + fNodeStack.push(header->root, status); + fIndexStack.push(0, status); + unistr.remove(); + } + + virtual ~CompactTrieEnumeration() { + } + + virtual StringEnumeration *clone() const { + UErrorCode status = U_ZERO_ERROR; + return new CompactTrieEnumeration(fHeader, status); + } + + virtual const UnicodeString * snext(UErrorCode &status); + + // Very expensive, but this should never be used. + virtual int32_t count(UErrorCode &status) const { + CompactTrieEnumeration counter(fHeader, status); + int32_t result = 0; + while (counter.snext(status) != NULL && U_SUCCESS(status)) { + ++result; + } + return result; + } + + virtual void reset(UErrorCode &status) { + fNodeStack.removeAllElements(); + fIndexStack.removeAllElements(); + fNodeStack.push(fHeader->root, status); + fIndexStack.push(0, status); + unistr.remove(); + } +}; + +const char CompactTrieEnumeration::fgClassID = '\0'; + +const UnicodeString * +CompactTrieEnumeration::snext(UErrorCode &status) { + if (fNodeStack.empty() || U_FAILURE(status)) { + return NULL; + } + const CompactTrieNode *node = getCompactNode(fHeader, fNodeStack.peeki()); + int where = fIndexStack.peeki(); + while (!fNodeStack.empty() && U_SUCCESS(status)) { + int nodeCount = (node->flagscount & kCountMask); + UBool goingDown = FALSE; + if (nodeCount == 0) { + // Terminal node; go up immediately + fNodeStack.popi(); + fIndexStack.popi(); + node = getCompactNode(fHeader, fNodeStack.peeki()); + where = fIndexStack.peeki(); + } + else if (node->flagscount & kVerticalNode) { + // Vertical node + const CompactTrieVerticalNode *vnode = (const CompactTrieVerticalNode *)node; + if (where == 0) { + // Going down + unistr.append((const UChar *)vnode->chars, (int32_t) nodeCount); + fIndexStack.setElementAt(1, fIndexStack.size()-1); + node = getCompactNode(fHeader, fNodeStack.push(vnode->equal, status)); + where = fIndexStack.push(0, status); + goingDown = TRUE; + } + else { + // Going up + unistr.truncate(unistr.length()-nodeCount); + fNodeStack.popi(); + fIndexStack.popi(); + node = getCompactNode(fHeader, fNodeStack.peeki()); + where = fIndexStack.peeki(); + } + } + else { + // Horizontal node + const CompactTrieHorizontalNode *hnode = (const CompactTrieHorizontalNode *)node; + if (where > 0) { + // Pop previous char + unistr.truncate(unistr.length()-1); + } + if (where < nodeCount) { + // Push on next node + unistr.append((UChar)hnode->entries[where].ch); + fIndexStack.setElementAt(where+1, fIndexStack.size()-1); + node = getCompactNode(fHeader, fNodeStack.push(hnode->entries[where].equal, status)); + where = fIndexStack.push(0, status); + goingDown = TRUE; + } + else { + // Going up + fNodeStack.popi(); + fIndexStack.popi(); + node = getCompactNode(fHeader, fNodeStack.peeki()); + where = fIndexStack.peeki(); + } + } + // Check if the parent of the node we've just gone down to ends a + // word. If so, return it. + if (goingDown && (node->flagscount & kParentEndsWord)) { + return &unistr; + } + } + return NULL; +} + +StringEnumeration * +CompactTrieDictionary::openWords( UErrorCode &status ) const { + if (U_FAILURE(status)) { + return NULL; + } + return new CompactTrieEnumeration(fData, status); +} + +// +// Below here is all code related to converting a ternary trie to a compact trie +// and back again +// + +// Helper classes to construct the compact trie +class BuildCompactTrieNode: public UMemory { + public: + UBool fParentEndsWord; + UBool fVertical; + UBool fHasDuplicate; + int32_t fNodeID; + UnicodeString fChars; + + public: + BuildCompactTrieNode(UBool parentEndsWord, UBool vertical, UStack &nodes, UErrorCode &status) { + fParentEndsWord = parentEndsWord; + fHasDuplicate = FALSE; + fVertical = vertical; + fNodeID = nodes.size(); + nodes.push(this, status); + } + + virtual ~BuildCompactTrieNode() { + } + + virtual uint32_t size() { + return sizeof(uint16_t); + } + + virtual void write(uint8_t *bytes, uint32_t &offset, const UVector32 &/*translate*/) { + // Write flag/count + *((uint16_t *)(bytes+offset)) = (fChars.length() & kCountMask) + | (fVertical ? kVerticalNode : 0) | (fParentEndsWord ? kParentEndsWord : 0 ); + offset += sizeof(uint16_t); + } +}; + +class BuildCompactTrieHorizontalNode: public BuildCompactTrieNode { + public: + UStack fLinks; + + public: + BuildCompactTrieHorizontalNode(UBool parentEndsWord, UStack &nodes, UErrorCode &status) + : BuildCompactTrieNode(parentEndsWord, FALSE, nodes, status), fLinks(status) { + } + + virtual ~BuildCompactTrieHorizontalNode() { + } + + virtual uint32_t size() { + return offsetof(CompactTrieHorizontalNode,entries) + + (fChars.length()*sizeof(CompactTrieHorizontalEntry)); + } + + virtual void write(uint8_t *bytes, uint32_t &offset, const UVector32 &translate) { + BuildCompactTrieNode::write(bytes, offset, translate); + int32_t count = fChars.length(); + for (int32_t i = 0; i < count; ++i) { + CompactTrieHorizontalEntry *entry = (CompactTrieHorizontalEntry *)(bytes+offset); + entry->ch = fChars[i]; + entry->equal = translate.elementAti(((BuildCompactTrieNode *)fLinks[i])->fNodeID); +#ifdef DEBUG_TRIE_DICT + if (entry->equal == 0) { + fprintf(stderr, "ERROR: horizontal link %d, logical node %d maps to physical node zero\n", + i, ((BuildCompactTrieNode *)fLinks[i])->fNodeID); + } +#endif + offset += sizeof(CompactTrieHorizontalEntry); + } + } + + void addNode(UChar ch, BuildCompactTrieNode *link, UErrorCode &status) { + fChars.append(ch); + fLinks.push(link, status); + } +}; + +class BuildCompactTrieVerticalNode: public BuildCompactTrieNode { + public: + BuildCompactTrieNode *fEqual; + + public: + BuildCompactTrieVerticalNode(UBool parentEndsWord, UStack &nodes, UErrorCode &status) + : BuildCompactTrieNode(parentEndsWord, TRUE, nodes, status) { + fEqual = NULL; + } + + virtual ~BuildCompactTrieVerticalNode() { + } + + virtual uint32_t size() { + return offsetof(CompactTrieVerticalNode,chars) + (fChars.length()*sizeof(uint16_t)); + } + + virtual void write(uint8_t *bytes, uint32_t &offset, const UVector32 &translate) { + CompactTrieVerticalNode *node = (CompactTrieVerticalNode *)(bytes+offset); + BuildCompactTrieNode::write(bytes, offset, translate); + node->equal = translate.elementAti(fEqual->fNodeID); + offset += sizeof(node->equal); +#ifdef DEBUG_TRIE_DICT + if (node->equal == 0) { + fprintf(stderr, "ERROR: vertical link, logical node %d maps to physical node zero\n", + fEqual->fNodeID); + } +#endif + fChars.extract(0, fChars.length(), (UChar *)node->chars); + offset += sizeof(uint16_t)*fChars.length(); + } + + void addChar(UChar ch) { + fChars.append(ch); + } + + void setLink(BuildCompactTrieNode *node) { + fEqual = node; + } +}; + +// Forward declaration +static void walkHorizontal(const TernaryNode *node, + BuildCompactTrieHorizontalNode *building, + UStack &nodes, + UErrorCode &status); + +// Convert one node. Uses recursion. + +static BuildCompactTrieNode * +compactOneNode(const TernaryNode *node, UBool parentEndsWord, UStack &nodes, UErrorCode &status) { + if (U_FAILURE(status)) { + return NULL; + } + BuildCompactTrieNode *result = NULL; + UBool horizontal = (node->low != NULL || node->high != NULL); + if (horizontal) { + BuildCompactTrieHorizontalNode *hResult = + new BuildCompactTrieHorizontalNode(parentEndsWord, nodes, status); + if (hResult == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_SUCCESS(status)) { + walkHorizontal(node, hResult, nodes, status); + result = hResult; + } + } + else { + BuildCompactTrieVerticalNode *vResult = + new BuildCompactTrieVerticalNode(parentEndsWord, nodes, status); + if (vResult == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_SUCCESS(status)) { + UBool endsWord = FALSE; + // Take up nodes until we end a word, or hit a node with < or > links + do { + vResult->addChar(node->ch); + endsWord = (node->flags & kEndsWord) != 0; + node = node->equal; + } + while(node != NULL && !endsWord && node->low == NULL && node->high == NULL); + if (node == NULL) { + if (!endsWord) { + status = U_ILLEGAL_ARGUMENT_ERROR; // Corrupt input trie + } + else { + vResult->setLink((BuildCompactTrieNode *)nodes[1]); + } + } + else { + vResult->setLink(compactOneNode(node, endsWord, nodes, status)); + } + result = vResult; + } + } + return result; +} + +// Walk the set of peers at the same level, to build a horizontal node. +// Uses recursion. + +static void walkHorizontal(const TernaryNode *node, + BuildCompactTrieHorizontalNode *building, + UStack &nodes, + UErrorCode &status) { + while (U_SUCCESS(status) && node != NULL) { + if (node->low != NULL) { + walkHorizontal(node->low, building, nodes, status); + } + BuildCompactTrieNode *link = NULL; + if (node->equal != NULL) { + link = compactOneNode(node->equal, (node->flags & kEndsWord) != 0, nodes, status); + } + else if (node->flags & kEndsWord) { + link = (BuildCompactTrieNode *)nodes[1]; + } + if (U_SUCCESS(status) && link != NULL) { + building->addNode(node->ch, link, status); + } + // Tail recurse manually instead of leaving it to the compiler. + //if (node->high != NULL) { + // walkHorizontal(node->high, building, nodes, status); + //} + node = node->high; + } +} + +U_NAMESPACE_END +U_CDECL_BEGIN +static int32_t U_CALLCONV +_sortBuildNodes(const void * /*context*/, const void *voidl, const void *voidr) { + BuildCompactTrieNode *left = *(BuildCompactTrieNode **)voidl; + BuildCompactTrieNode *right = *(BuildCompactTrieNode **)voidr; + // Check for comparing a node to itself, to avoid spurious duplicates + if (left == right) { + return 0; + } + // Most significant is type of node. Can never coalesce. + if (left->fVertical != right->fVertical) { + return left->fVertical - right->fVertical; + } + // Next, the "parent ends word" flag. If that differs, we cannot coalesce. + if (left->fParentEndsWord != right->fParentEndsWord) { + return left->fParentEndsWord - right->fParentEndsWord; + } + // Next, the string. If that differs, we can never coalesce. + int32_t result = left->fChars.compare(right->fChars); + if (result != 0) { + return result; + } + // We know they're both the same node type, so branch for the two cases. + if (left->fVertical) { + result = ((BuildCompactTrieVerticalNode *)left)->fEqual->fNodeID + - ((BuildCompactTrieVerticalNode *)right)->fEqual->fNodeID; + } + else { + // We need to compare the links vectors. They should be the + // same size because the strings were equal. + // We compare the node IDs instead of the pointers, to handle + // coalesced nodes. + BuildCompactTrieHorizontalNode *hleft, *hright; + hleft = (BuildCompactTrieHorizontalNode *)left; + hright = (BuildCompactTrieHorizontalNode *)right; + int32_t count = hleft->fLinks.size(); + for (int32_t i = 0; i < count && result == 0; ++i) { + result = ((BuildCompactTrieNode *)(hleft->fLinks[i]))->fNodeID - + ((BuildCompactTrieNode *)(hright->fLinks[i]))->fNodeID; + } + } + // If they are equal to each other, mark them (speeds coalescing) + if (result == 0) { + left->fHasDuplicate = TRUE; + right->fHasDuplicate = TRUE; + } + return result; +} +U_CDECL_END +U_NAMESPACE_BEGIN + +static void coalesceDuplicates(UStack &nodes, UErrorCode &status) { + // We sort the array of nodes to place duplicates next to each other + if (U_FAILURE(status)) { + return; + } + int32_t size = nodes.size(); + void **array = (void **)uprv_malloc(sizeof(void *)*size); + if (array == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + (void) nodes.toArray(array); + + // Now repeatedly identify duplicates until there are no more + int32_t dupes = 0; + long passCount = 0; +#ifdef DEBUG_TRIE_DICT + long totalDupes = 0; +#endif + do { + BuildCompactTrieNode *node; + BuildCompactTrieNode *first = NULL; + BuildCompactTrieNode **p; + BuildCompactTrieNode **pFirst = NULL; + int32_t counter = size - 2; + // Sort the array, skipping nodes 0 and 1. Use quicksort for the first + // pass for speed. For the second and subsequent passes, we use stable + // (insertion) sort for two reasons: + // 1. The array is already mostly ordered, so we get better performance. + // 2. The way we find one and only one instance of a set of duplicates is to + // check that the node ID equals the array index. If we used an unstable + // sort for the second or later passes, it's possible that none of the + // duplicates would wind up with a node ID equal to its array index. + // The sort stability guarantees that, because as we coalesce more and + // more groups, the first element of the resultant group will be one of + // the first elements of the groups being coalesced. + // To use quicksort for the second and subsequent passes, we would have to + // find the minimum of the node numbers in a group, and set all the nodes + // in the group to that node number. + uprv_sortArray(array+2, counter, sizeof(void *), _sortBuildNodes, NULL, (passCount > 0), &status); + dupes = 0; + for (p = (BuildCompactTrieNode **)array + 2; counter > 0; --counter, ++p) { + node = *p; + if (node->fHasDuplicate) { + if (first == NULL) { + first = node; + pFirst = p; + } + else if (_sortBuildNodes(NULL, pFirst, p) != 0) { + // Starting a new run of dupes + first = node; + pFirst = p; + } + else if (node->fNodeID != first->fNodeID) { + // Slave one to the other, note duplicate + node->fNodeID = first->fNodeID; + dupes += 1; + } + } + else { + // This node has no dupes + first = NULL; + pFirst = NULL; + } + } + passCount += 1; +#ifdef DEBUG_TRIE_DICT + totalDupes += dupes; + fprintf(stderr, "Trie node dupe removal, pass %d: %d nodes tagged\n", passCount, dupes); +#endif + } + while (dupes > 0); +#ifdef DEBUG_TRIE_DICT + fprintf(stderr, "Trie node dupe removal complete: %d tagged in %d passes\n", totalDupes, passCount); +#endif + + // We no longer need the temporary array, as the nodes have all been marked appropriately. + uprv_free(array); +} + +U_NAMESPACE_END +U_CDECL_BEGIN +static void U_CALLCONV _deleteBuildNode(void *obj) { + delete (BuildCompactTrieNode *) obj; +} +U_CDECL_END +U_NAMESPACE_BEGIN + +CompactTrieHeader * +CompactTrieDictionary::compactMutableTrieDictionary( const MutableTrieDictionary &dict, + UErrorCode &status ) { + if (U_FAILURE(status)) { + return NULL; + } +#ifdef DEBUG_TRIE_DICT + struct tms timing; + struct tms previous; + (void) ::times(&previous); +#endif + UStack nodes(_deleteBuildNode, NULL, status); // Index of nodes + + // Add node 0, used as the NULL pointer/sentinel. + nodes.addElement((int32_t)0, status); + + // Start by creating the special empty node we use to indicate that the parent + // terminates a word. This must be node 1, because the builder assumes + // that. + if (U_FAILURE(status)) { + return NULL; + } + BuildCompactTrieNode *terminal = new BuildCompactTrieNode(TRUE, FALSE, nodes, status); + if (terminal == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + + // This call does all the work of building the new trie structure. The root + // will be node 2. + BuildCompactTrieNode *root = compactOneNode(dict.fTrie, FALSE, nodes, status); +#ifdef DEBUG_TRIE_DICT + (void) ::times(&timing); + fprintf(stderr, "Compact trie built, %d nodes, time user %f system %f\n", + nodes.size(), (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK, + (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK); + previous = timing; +#endif + + // Now coalesce all duplicate nodes. + coalesceDuplicates(nodes, status); +#ifdef DEBUG_TRIE_DICT + (void) ::times(&timing); + fprintf(stderr, "Duplicates coalesced, time user %f system %f\n", + (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK, + (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK); + previous = timing; +#endif + + // Next, build the output trie. + // First we compute all the sizes and build the node ID translation table. + uint32_t totalSize = offsetof(CompactTrieHeader,offsets); + int32_t count = nodes.size(); + int32_t nodeCount = 1; // The sentinel node we already have + BuildCompactTrieNode *node; + UVector32 translate(count, status); // Should be no growth needed after this + translate.push(0, status); // The sentinel node + + if (U_FAILURE(status)) { + return NULL; + } + + for (int32_t i = 1; i < count; ++i) { + node = (BuildCompactTrieNode *)nodes[i]; + if (node->fNodeID == i) { + // Only one node out of each duplicate set is used + if (i >= translate.size()) { + // Logically extend the mapping table + translate.setSize(i+1); + } + translate.setElementAt(nodeCount++, i); + totalSize += node->size(); + } + } + + // Check for overflowing 16 bits worth of nodes. + if (nodeCount > 0x10000) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + // Add enough room for the offsets. + totalSize += nodeCount*sizeof(uint32_t); +#ifdef DEBUG_TRIE_DICT + (void) ::times(&timing); + fprintf(stderr, "Sizes/mapping done, time user %f system %f\n", + (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK, + (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK); + previous = timing; + fprintf(stderr, "%d nodes, %d unique, %d bytes\n", nodes.size(), nodeCount, totalSize); +#endif + uint8_t *bytes = (uint8_t *)uprv_malloc(totalSize); + if (bytes == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + CompactTrieHeader *header = (CompactTrieHeader *)bytes; + header->size = totalSize; + header->nodeCount = nodeCount; + header->offsets[0] = 0; // Sentinel + header->root = translate.elementAti(root->fNodeID); +#ifdef DEBUG_TRIE_DICT + if (header->root == 0) { + fprintf(stderr, "ERROR: root node %d translate to physical zero\n", root->fNodeID); + } +#endif + uint32_t offset = offsetof(CompactTrieHeader,offsets)+(nodeCount*sizeof(uint32_t)); + nodeCount = 1; + // Now write the data + for (int32_t i = 1; i < count; ++i) { + node = (BuildCompactTrieNode *)nodes[i]; + if (node->fNodeID == i) { + header->offsets[nodeCount++] = offset; + node->write(bytes, offset, translate); + } + } +#ifdef DEBUG_TRIE_DICT + (void) ::times(&timing); + fprintf(stderr, "Trie built, time user %f system %f\n", + (double)(timing.tms_utime-previous.tms_utime)/CLK_TCK, + (double)(timing.tms_stime-previous.tms_stime)/CLK_TCK); + previous = timing; + fprintf(stderr, "Final offset is %d\n", offset); + + // Collect statistics on node types and sizes + int hCount = 0; + int vCount = 0; + size_t hSize = 0; + size_t vSize = 0; + size_t hItemCount = 0; + size_t vItemCount = 0; + uint32_t previousOff = offset; + for (uint16_t i = nodeCount-1; i >= 2; --i) { + const CompactTrieNode *node = getCompactNode(header, i); + if (node->flagscount & kVerticalNode) { + vCount += 1; + vItemCount += (node->flagscount & kCountMask); + vSize += previousOff-header->offsets[i]; + } + else { + hCount += 1; + hItemCount += (node->flagscount & kCountMask); + hSize += previousOff-header->offsets[i]; + } + previousOff = header->offsets[i]; + } + fprintf(stderr, "Horizontal nodes: %d total, average %f bytes with %f items\n", hCount, + (double)hSize/hCount, (double)hItemCount/hCount); + fprintf(stderr, "Vertical nodes: %d total, average %f bytes with %f items\n", vCount, + (double)vSize/vCount, (double)vItemCount/vCount); +#endif + + if (U_FAILURE(status)) { + uprv_free(bytes); + header = NULL; + } + else { + header->magic = COMPACT_TRIE_MAGIC_1; + } + return header; +} + +// Forward declaration +static TernaryNode * +unpackOneNode( const CompactTrieHeader *header, const CompactTrieNode *node, UErrorCode &status ); + + +// Convert a horizontal node (or subarray thereof) into a ternary subtrie +static TernaryNode * +unpackHorizontalArray( const CompactTrieHeader *header, const CompactTrieHorizontalEntry *array, + int low, int high, UErrorCode &status ) { + if (U_FAILURE(status) || low > high) { + return NULL; + } + int middle = (low+high)/2; + TernaryNode *result = new TernaryNode(array[middle].ch); + if (result == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + const CompactTrieNode *equal = getCompactNode(header, array[middle].equal); + if (equal->flagscount & kParentEndsWord) { + result->flags |= kEndsWord; + } + result->low = unpackHorizontalArray(header, array, low, middle-1, status); + result->high = unpackHorizontalArray(header, array, middle+1, high, status); + result->equal = unpackOneNode(header, equal, status); + return result; +} + +// Convert one compact trie node into a ternary subtrie +static TernaryNode * +unpackOneNode( const CompactTrieHeader *header, const CompactTrieNode *node, UErrorCode &status ) { + int nodeCount = (node->flagscount & kCountMask); + if (nodeCount == 0 || U_FAILURE(status)) { + // Failure, or terminal node + return NULL; + } + if (node->flagscount & kVerticalNode) { + const CompactTrieVerticalNode *vnode = (const CompactTrieVerticalNode *)node; + TernaryNode *head = NULL; + TernaryNode *previous = NULL; + TernaryNode *latest = NULL; + for (int i = 0; i < nodeCount; ++i) { + latest = new TernaryNode(vnode->chars[i]); + if (latest == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + break; + } + if (head == NULL) { + head = latest; + } + if (previous != NULL) { + previous->equal = latest; + } + previous = latest; + } + if (latest != NULL) { + const CompactTrieNode *equal = getCompactNode(header, vnode->equal); + if (equal->flagscount & kParentEndsWord) { + latest->flags |= kEndsWord; + } + latest->equal = unpackOneNode(header, equal, status); + } + return head; + } + else { + // Horizontal node + const CompactTrieHorizontalNode *hnode = (const CompactTrieHorizontalNode *)node; + return unpackHorizontalArray(header, &hnode->entries[0], 0, nodeCount-1, status); + } +} + +MutableTrieDictionary * +CompactTrieDictionary::cloneMutable( UErrorCode &status ) const { + MutableTrieDictionary *result = new MutableTrieDictionary( status ); + if (result == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + TernaryNode *root = unpackOneNode(fData, getCompactNode(fData, fData->root), status); + if (U_FAILURE(status)) { + delete root; // Clean up + delete result; + return NULL; + } + result->fTrie = root; + return result; +} + +U_NAMESPACE_END + +U_CAPI int32_t U_EXPORT2 +triedict_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, + UErrorCode *status) { + + if (status == NULL || U_FAILURE(*status)) { + return 0; + } + if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + // + // Check that the data header is for for dictionary data. + // (Header contents are defined in genxxx.cpp) + // + const UDataInfo *pInfo = (const UDataInfo *)((const uint8_t *)inData+4); + if(!( pInfo->dataFormat[0]==0x54 && /* dataFormat="TrDc" */ + pInfo->dataFormat[1]==0x72 && + pInfo->dataFormat[2]==0x44 && + pInfo->dataFormat[3]==0x63 && + pInfo->formatVersion[0]==1 )) { + udata_printError(ds, "triedict_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *status=U_UNSUPPORTED_ERROR; + return 0; + } + + // + // Swap the data header. (This is the generic ICU Data Header, not the + // CompactTrieHeader). This swap also conveniently gets us + // the size of the ICU d.h., which lets us locate the start + // of the RBBI specific data. + // + int32_t headerSize=udata_swapDataHeader(ds, inData, length, outData, status); + + // + // Get the CompactTrieHeader, and check that it appears to be OK. + // + const uint8_t *inBytes =(const uint8_t *)inData+headerSize; + const CompactTrieHeader *header = (const CompactTrieHeader *)inBytes; + if (ds->readUInt32(header->magic) != COMPACT_TRIE_MAGIC_1 + || ds->readUInt32(header->size) < sizeof(CompactTrieHeader)) + { + udata_printError(ds, "triedict_swap(): CompactTrieHeader is invalid.\n"); + *status=U_UNSUPPORTED_ERROR; + return 0; + } + + // + // Prefight operation? Just return the size + // + uint32_t totalSize = ds->readUInt32(header->size); + int32_t sizeWithUData = (int32_t)totalSize + headerSize; + if (length < 0) { + return sizeWithUData; + } + + // + // Check that length passed in is consistent with length from RBBI data header. + // + if (length < sizeWithUData) { + udata_printError(ds, "triedict_swap(): too few bytes (%d after ICU Data header) for trie data.\n", + totalSize); + *status=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + // + // Swap the Data. Do the data itself first, then the CompactTrieHeader, because + // we need to reference the header to locate the data, and an + // inplace swap of the header leaves it unusable. + // + uint8_t *outBytes = (uint8_t *)outData + headerSize; + CompactTrieHeader *outputHeader = (CompactTrieHeader *)outBytes; + +#if 0 + // + // If not swapping in place, zero out the output buffer before starting. + // + if (inBytes != outBytes) { + uprv_memset(outBytes, 0, totalSize); + } + + // We need to loop through all the nodes in the offset table, and swap each one. + uint16_t nodeCount = ds->readUInt16(header->nodeCount); + // Skip node 0, which should always be 0. + for (int i = 1; i < nodeCount; ++i) { + uint32_t nodeOff = ds->readUInt32(header->offsets[i]); + const CompactTrieNode *inNode = (const CompactTrieNode *)(inBytes + nodeOff); + CompactTrieNode *outNode = (CompactTrieNode *)(outBytes + nodeOff); + uint16_t flagscount = ds->readUInt16(inNode->flagscount); + uint16_t itemCount = flagscount & kCountMask; + ds->writeUInt16(&outNode->flagscount, flagscount); + if (itemCount > 0) { + if (flagscount & kVerticalNode) { + ds->swapArray16(ds, inBytes+nodeOff+offsetof(CompactTrieVerticalNode,chars), + itemCount*sizeof(uint16_t), + outBytes+nodeOff+offsetof(CompactTrieVerticalNode,chars), status); + uint16_t equal = ds->readUInt16(inBytes+nodeOff+offsetof(CompactTrieVerticalNode,equal); + ds->writeUInt16(outBytes+nodeOff+offsetof(CompactTrieVerticalNode,equal)); + } + else { + const CompactTrieHorizontalNode *inHNode = (const CompactTrieHorizontalNode *)inNode; + CompactTrieHorizontalNode *outHNode = (CompactTrieHorizontalNode *)outNode; + for (int j = 0; j < itemCount; ++j) { + uint16_t word = ds->readUInt16(inHNode->entries[j].ch); + ds->writeUInt16(&outHNode->entries[j].ch, word); + word = ds->readUInt16(inHNode->entries[j].equal); + ds->writeUInt16(&outHNode->entries[j].equal, word); + } + } + } + } +#endif + + // All the data in all the nodes consist of 16 bit items. Swap them all at once. + uint16_t nodeCount = ds->readUInt16(header->nodeCount); + uint32_t nodesOff = offsetof(CompactTrieHeader,offsets)+((uint32_t)nodeCount*sizeof(uint32_t)); + ds->swapArray16(ds, inBytes+nodesOff, totalSize-nodesOff, outBytes+nodesOff, status); + + // Swap the header + ds->writeUInt32(&outputHeader->size, totalSize); + uint32_t magic = ds->readUInt32(header->magic); + ds->writeUInt32(&outputHeader->magic, magic); + ds->writeUInt16(&outputHeader->nodeCount, nodeCount); + uint16_t root = ds->readUInt16(header->root); + ds->writeUInt16(&outputHeader->root, root); + ds->swapArray32(ds, inBytes+offsetof(CompactTrieHeader,offsets), + sizeof(uint32_t)*(int32_t)nodeCount, + outBytes+offsetof(CompactTrieHeader,offsets), status); + + return sizeWithUData; +} + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/Build/source/libs/icu-xetex/common/triedict.h b/Build/source/libs/icu-xetex/common/triedict.h new file mode 100644 index 00000000000..b8796617690 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/triedict.h @@ -0,0 +1,346 @@ +/** + ******************************************************************************* + * Copyright (C) 2006, International Business Machines Corporation and others. * + * All Rights Reserved. * + ******************************************************************************* + */ + +#ifndef TRIEDICT_H +#define TRIEDICT_H + +#include "unicode/utypes.h" +#include "unicode/uobject.h" +#include "unicode/utext.h" + +struct UEnumeration; +struct UDataSwapper; +struct UDataMemory; + + /** + * <p>UDataSwapFn function for use in swapping a compact dictionary.</p> + * + * @param ds Pointer to UDataSwapper containing global data about the + * transformation and function pointers for handling primitive + * types. + * @param inData Pointer to the input data to be transformed or examined. + * @param length Length of the data, counting bytes. May be -1 for preflighting. + * If length>=0, then transform the data. + * If length==-1, then only determine the length of the data. + * The length cannot be determined from the data itself for all + * types of data (e.g., not for simple arrays of integers). + * @param outData Pointer to the output data buffer. + * If length>=0 (transformation), then the output buffer must + * have a capacity of at least length. + * If length==-1, then outData will not be used and can be NULL. + * @param pErrorCode ICU UErrorCode parameter, must not be NULL and must + * fulfill U_SUCCESS on input. + * @return The actual length of the data. + * + * @see UDataSwapper + */ + +U_CAPI int32_t U_EXPORT2 +triedict_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode); + +U_NAMESPACE_BEGIN + +class StringEnumeration; +struct CompactTrieHeader; + +/******************************************************************* + * TrieWordDictionary + */ + +/** + * <p>TrieWordDictionary is an abstract class that represents a word + * dictionary based on a trie. The base protocol is read-only. + * Subclasses may allow writing.</p> + */ +class U_COMMON_API TrieWordDictionary : public UMemory { + public: + + /** + * <p>Default constructor.</p> + * + */ + TrieWordDictionary(); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~TrieWordDictionary(); + + /** + * <p>Find dictionary words that match the text.</p> + * + * @param text A UText representing the text. The + * iterator is left after the longest prefix match in the dictionary. + * @param start The current position in text. + * @param maxLength The maximum number of code units to match. + * @param lengths An array that is filled with the lengths of words that matched. + * @param count Filled with the number of elements output in lengths. + * @param limit The size of the lengths array; this limits the number of words output. + * @return The number of characters in text that were matched. + */ + virtual int32_t matches( UText *text, + int32_t maxLength, + int32_t *lengths, + int &count, + int limit ) const = 0; + + /** + * <p>Return a StringEnumeration for iterating all the words in the dictionary.</p> + * + * @param status A status code recording the success of the call. + * @return A StringEnumeration that will iterate through the whole dictionary. + * The caller is responsible for closing it. The order is unspecified. + */ + virtual StringEnumeration *openWords( UErrorCode &status ) const = 0; + +}; + +/******************************************************************* + * MutableTrieDictionary + */ + +/** + * <p>MutableTrieDictionary is a TrieWordDictionary that allows words to be + * added.</p> + */ + +struct TernaryNode; // Forwards declaration + +class U_COMMON_API MutableTrieDictionary : public TrieWordDictionary { + private: + /** + * The root node of the trie + * @internal + */ + + TernaryNode *fTrie; + + /** + * A UText for internal use + * @internal + */ + + UText *fIter; + + friend class CompactTrieDictionary; // For fast conversion + + public: + + /** + * <p>Constructor.</p> + * + * @param median A UChar around which to balance the trie. Ideally, it should + * begin at least one word that is near the median of the set in the dictionary + * @param status A status code recording the success of the call. + */ + MutableTrieDictionary( UChar median, UErrorCode &status ); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~MutableTrieDictionary(); + + /** + * <p>Find dictionary words that match the text.</p> + * + * @param text A UText representing the text. The + * iterator is left after the longest prefix match in the dictionary. + * @param maxLength The maximum number of code units to match. + * @param lengths An array that is filled with the lengths of words that matched. + * @param count Filled with the number of elements output in lengths. + * @param limit The size of the lengths array; this limits the number of words output. + * @return The number of characters in text that were matched. + */ + virtual int32_t matches( UText *text, + int32_t maxLength, + int32_t *lengths, + int &count, + int limit ) const; + + /** + * <p>Return a StringEnumeration for iterating all the words in the dictionary.</p> + * + * @param status A status code recording the success of the call. + * @return A StringEnumeration that will iterate through the whole dictionary. + * The caller is responsible for closing it. The order is unspecified. + */ + virtual StringEnumeration *openWords( UErrorCode &status ) const; + + /** + * <p>Add one word to the dictionary.</p> + * + * @param word A UChar buffer containing the word. + * @param length The length of the word. + * @param status The resultant status + */ + virtual void addWord( const UChar *word, + int32_t length, + UErrorCode &status); + +#if 0 + /** + * <p>Add all strings from a UEnumeration to the dictionary.</p> + * + * @param words A UEnumeration that will return the desired words. + * @param status The resultant status + */ + virtual void addWords( UEnumeration *words, UErrorCode &status ); +#endif + +protected: + /** + * <p>Search the dictionary for matches.</p> + * + * @param text A UText representing the text. The + * iterator is left after the longest prefix match in the dictionary. + * @param maxLength The maximum number of code units to match. + * @param lengths An array that is filled with the lengths of words that matched. + * @param count Filled with the number of elements output in lengths. + * @param limit The size of the lengths array; this limits the number of words output. + * @param parent The parent of the current node + * @param pMatched The returned parent node matched the input + * @return The number of characters in text that were matched. + */ + virtual int32_t search( UText *text, + int32_t maxLength, + int32_t *lengths, + int &count, + int limit, + TernaryNode *&parent, + UBool &pMatched ) const; + +private: + /** + * <p>Private constructor. The root node it not allocated.</p> + * + * @param status A status code recording the success of the call. + */ + MutableTrieDictionary( UErrorCode &status ); +}; + +/******************************************************************* + * CompactTrieDictionary + */ + +/** + * <p>CompactTrieDictionary is a TrieWordDictionary that has been compacted + * to save space.</p> + */ +class U_COMMON_API CompactTrieDictionary : public TrieWordDictionary { + private: + /** + * The root node of the trie + */ + + const CompactTrieHeader *fData; + + /** + * A UBool indicating whether or not we own the fData. + */ + + UBool fOwnData; + + UDataMemory *fUData; + public: + /** + * <p>Construct a dictionary from a UDataMemory.</p> + * + * @param data A pointer to a UDataMemory, which is adopted + * @param status A status code giving the result of the constructor + */ + CompactTrieDictionary(UDataMemory *dataObj, UErrorCode &status); + + /** + * <p>Construct a dictionary from raw saved data.</p> + * + * @param data A pointer to the raw data, which is still owned by the caller + * @param status A status code giving the result of the constructor + */ + CompactTrieDictionary(const void *dataObj, UErrorCode &status); + + /** + * <p>Construct a dictionary from a MutableTrieDictionary.</p> + * + * @param dict The dictionary to use as input. + * @param status A status code recording the success of the call. + */ + CompactTrieDictionary( const MutableTrieDictionary &dict, UErrorCode &status ); + + /** + * <p>Virtual destructor.</p> + */ + virtual ~CompactTrieDictionary(); + + /** + * <p>Find dictionary words that match the text.</p> + * + * @param text A UText representing the text. The + * iterator is left after the longest prefix match in the dictionary. + * @param maxLength The maximum number of code units to match. + * @param lengths An array that is filled with the lengths of words that matched. + * @param count Filled with the number of elements output in lengths. + * @param limit The size of the lengths array; this limits the number of words output. + * @return The number of characters in text that were matched. + */ + virtual int32_t matches( UText *text, + int32_t rangeEnd, + int32_t *lengths, + int &count, + int limit ) const; + + /** + * <p>Return a StringEnumeration for iterating all the words in the dictionary.</p> + * + * @param status A status code recording the success of the call. + * @return A StringEnumeration that will iterate through the whole dictionary. + * The caller is responsible for closing it. The order is unspecified. + */ + virtual StringEnumeration *openWords( UErrorCode &status ) const; + + /** + * <p>Return the size of the compact data.</p> + * + * @return The size of the dictionary's compact data. + */ + virtual uint32_t dataSize() const; + + /** + * <p>Return a void * pointer to the compact data, platform-endian.</p> + * + * @return The data for the compact dictionary, suitable for passing to the + * constructor. + */ + virtual const void *data() const; + + /** + * <p>Return a MutableTrieDictionary clone of this dictionary.</p> + * + * @param status A status code recording the success of the call. + * @return A MutableTrieDictionary with the same data as this dictionary + */ + virtual MutableTrieDictionary *cloneMutable( UErrorCode &status ) const; + + private: + + /** + * <p>Convert a MutableTrieDictionary into a compact data blob.</p> + * + * @param dict The dictionary to convert. + * @param status A status code recording the success of the call. + * @return A single data blob starting with a CompactTrieHeader. + */ + static CompactTrieHeader *compactMutableTrieDictionary( const MutableTrieDictionary &dict, + UErrorCode &status ); + +}; + +U_NAMESPACE_END + + /* TRIEDICT_H */ +#endif diff --git a/Build/source/libs/icu-xetex/common/ubidi.c b/Build/source/libs/icu-xetex/common/ubidi.c index f7cc5b7a8d9..bccdbfaa72c 100644 --- a/Build/source/libs/icu-xetex/common/ubidi.c +++ b/Build/source/libs/icu-xetex/common/ubidi.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -215,6 +215,9 @@ ubidi_getMemory(void **pMemory, int32_t *pSize, UBool mayAllocate, int32_t sizeN /* not enough memory, and we must not allocate */ return FALSE; } else if(sizeNeeded!=*pSize && mayAllocate) { + /* FOOD FOR THOUGHT: in hope to improve performance, we should + * try never shrinking memory, only growing it when required. + */ /* we may try to grow or shrink */ void *memory; @@ -243,12 +246,16 @@ ubidi_close(UBiDi *pBiDi) { if(pBiDi->levelsMemory!=NULL) { uprv_free(pBiDi->levelsMemory); } + if(pBiDi->runsMemory!=NULL) { + uprv_free(pBiDi->runsMemory); + } if(pBiDi->parasMemory!=NULL) { uprv_free(pBiDi->parasMemory); } - if(pBiDi->runsMemory!=NULL) { - uprv_free(pBiDi->runsMemory); + if(pBiDi->insertPoints.points!=NULL) { + uprv_free(pBiDi->insertPoints.points); } + uprv_free(pBiDi); } } @@ -259,6 +266,8 @@ U_CAPI void U_EXPORT2 ubidi_setInverse(UBiDi *pBiDi, UBool isInverse) { if(pBiDi!=NULL) { pBiDi->isInverse=isInverse; + pBiDi->reorderingMode = isInverse ? UBIDI_REORDER_INVERSE_NUMBERS_AS_L + : UBIDI_REORDER_DEFAULT; } } @@ -271,6 +280,58 @@ ubidi_isInverse(UBiDi *pBiDi) { } } +/* FOOD FOR THOUGHT: currently the reordering modes are a mixture of + * algorithm for direct BiDi, algorithm for inverse BiDi and the bizarre + * concept of RUNS_ONLY which is a double operation. + * It could be advantageous to divide this into 3 concepts: + * a) Operation: direct / inverse / RUNS_ONLY + * b) Direct algorithm: default / NUMBERS_SPECIAL / GROUP_NUMBERS_WITH_L + * c) Inverse algorithm: default / INVERSE_LIKE_DIRECT / NUMBERS_SPECIAL + * This would allow combinations not possible today like RUNS_ONLY with + * NUMBERS_SPECIAL. + * Also allow to set INSERT_MARKS for the direct step of RUNS_ONLY and + * REMOVE_CONTROLS for the inverse step. + * Not all combinations would be supported, and probably not all do make sense. + * This would need to document which ones are supported and what are the + * fallbacks for unsupported combinations. + */ +U_CAPI void U_EXPORT2 +ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode) { + if ((pBiDi != NULL) && (reorderingMode >= UBIDI_REORDER_DEFAULT) + && (reorderingMode < UBIDI_REORDER_COUNT)) { + pBiDi->reorderingMode = reorderingMode; + pBiDi->isInverse = reorderingMode == UBIDI_REORDER_INVERSE_NUMBERS_AS_L; + } +} + +U_CAPI UBiDiReorderingMode U_EXPORT2 +ubidi_getReorderingMode(UBiDi *pBiDi) { + if (pBiDi != NULL) { + return pBiDi->reorderingMode; + } else { + return UBIDI_REORDER_DEFAULT; + } +} + +U_CAPI void U_EXPORT2 +ubidi_setReorderingOptions(UBiDi *pBiDi, uint32_t reorderingOptions) { + if (reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { + reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; + } + if (pBiDi != NULL) { + pBiDi->reorderingOptions = reorderingOptions; + } +} + +U_CAPI uint32_t U_EXPORT2 +ubidi_getReorderingOptions(UBiDi *pBiDi) { + if (pBiDi != NULL) { + return pBiDi->reorderingOptions; + } else { + return 0; + } +} + /* perform (P2)..(P3) ------------------------------------------------------- */ /* @@ -283,12 +344,20 @@ getDirProps(UBiDi *pBiDi) { const UChar *text=pBiDi->text; DirProp *dirProps=pBiDi->dirPropsMemory; /* pBiDi->dirProps is const */ - int32_t i=0, i0, i1, length=pBiDi->length; + int32_t i=0, i0, i1, length=pBiDi->originalLength; Flags flags=0; /* collect all directionalities in the text */ UChar32 uchar; - DirProp dirProp = 0, paraDirDefault = 0; /* initialize to avoid compiler warnings */ + DirProp dirProp=0, paraDirDefault=0;/* initialize to avoid compiler warnings */ UBool isDefaultLevel=IS_DEFAULT_LEVEL(pBiDi->paraLevel); - UBool paraLevelStillDefault=FALSE; /* flag for real value not set */ + /* for inverse BiDi, the default para level is set to RTL if there is a + strong character at either end of the text */ + UBool isDefaultLevelInverse=isDefaultLevel && + (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || + pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL); + int32_t lastArabicPos=-1; + int32_t controlCount=0; + UBool removeBiDiControls = pBiDi->reorderingOptions & + UBIDI_OPTION_REMOVE_CONTROLS; typedef enum { NOT_CONTEXTUAL, /* 0: not contextual paraLevel */ @@ -299,14 +368,18 @@ getDirProps(UBiDi *pBiDi) { int32_t paraStart=0; /* index of first char in paragraph */ DirProp paraDir; /* == CONTEXT_RTL within paragraphs starting with strong R char */ + DirProp lastStrongDir=0; /* for default level & inverse BiDi */ + int32_t lastStrongLTR=0; /* for STREAMING option */ + if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { + pBiDi->length=0; + lastStrongLTR=0; + } if(isDefaultLevel) { paraDirDefault=pBiDi->paraLevel&1 ? CONTEXT_RTL : 0; - state=LOOKING_FOR_STRONG; - paraStart=0; paraDir=paraDirDefault; - pBiDi->paraLevel&=1; /* set to default */ - paraLevelStillDefault=TRUE; + lastStrongDir=paraDirDefault; + state=LOOKING_FOR_STRONG; } else { state=NOT_CONTEXTUAL; paraDir=0; @@ -317,11 +390,12 @@ getDirProps(UBiDi *pBiDi) { * the DEFAULT_XXX values are designed so that * their bit 0 alone yields the intended default */ - for( /* i=0 above */ ; i<length; /* i is incremented by UTF_NEXT_CHAR */) { + for( /* i=0 above */ ; i<length; ) { + /* i is incremented by UTF_NEXT_CHAR */ i0=i; /* index of first code unit */ UTF_NEXT_CHAR(text, i, length, uchar); i1=i-1; /* index of last code unit, gets the directional property */ - flags|=DIRPROP_FLAG(dirProp=ubidi_getClass(pBiDi->bdp, uchar)); + flags|=DIRPROP_FLAG(dirProp=ubidi_getCustomizedClass(pBiDi, uchar)); dirProps[i1]=dirProp|paraDir; if(i1>i0) { /* set previous code units' properties to BN */ flags|=DIRPROP_FLAG(BN); @@ -332,13 +406,9 @@ getDirProps(UBiDi *pBiDi) { if(state==LOOKING_FOR_STRONG) { if(dirProp==L) { state=FOUND_STRONG_CHAR; - if(paraLevelStillDefault) { - paraLevelStillDefault=FALSE; - pBiDi->paraLevel=0; - } if(paraDir) { paraDir=0; - for(i1=paraStart; i1<=i; i1++) { + for(i1=paraStart; i1<i; i1++) { dirProps[i1]&=~CONTEXT_RTL; } } @@ -346,32 +416,67 @@ getDirProps(UBiDi *pBiDi) { } if(dirProp==R || dirProp==AL) { state=FOUND_STRONG_CHAR; - if(paraLevelStillDefault) { - paraLevelStillDefault=FALSE; - pBiDi->paraLevel=1; - } if(paraDir==0) { paraDir=CONTEXT_RTL; - for(i1=paraStart; i1<=i; i1++) { + for(i1=paraStart; i1<i; i1++) { dirProps[i1]|=CONTEXT_RTL; } } continue; } } - if((dirProp==B)&&(i<length)) { /* B not last char in text */ - if(!((uchar==CR) && (text[i]==LF))) { - pBiDi->paraCount++; + if(dirProp==L) { + lastStrongDir=0; + lastStrongLTR=i; /* i is index to next character */ + } + else if(dirProp==R) { + lastStrongDir=CONTEXT_RTL; + } + else if(dirProp==AL) { + lastStrongDir=CONTEXT_RTL; + lastArabicPos=i-1; + } + else if(dirProp==B) { + if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { + pBiDi->length=i; /* i is index to next character */ + } + if(isDefaultLevelInverse && (lastStrongDir==CONTEXT_RTL) &&(paraDir!=lastStrongDir)) { + for( ; paraStart<i; paraStart++) { + dirProps[paraStart]|=CONTEXT_RTL; + } + } + if(i<length) { /* B not last char in text */ + if(!((uchar==CR) && (text[i]==LF))) { + pBiDi->paraCount++; + } if(isDefaultLevel) { state=LOOKING_FOR_STRONG; paraStart=i; /* i is index to next character */ paraDir=paraDirDefault; - /* keep the paraLevel of the first paragraph even if it - defaulted (no strong char was found) */ - paraLevelStillDefault=FALSE; + lastStrongDir=paraDirDefault; } } } + if(removeBiDiControls && IS_BIDI_CONTROL_CHAR(uchar)) { + controlCount++; + } + } + if(isDefaultLevelInverse && (lastStrongDir==CONTEXT_RTL) &&(paraDir!=lastStrongDir)) { + for(i1=paraStart; i1<length; i1++) { + dirProps[i1]|=CONTEXT_RTL; + } + } + if(isDefaultLevel) { + pBiDi->paraLevel=GET_PARALEVEL(pBiDi, 0); + } + if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) { + if((lastStrongLTR>pBiDi->length) && + (GET_PARALEVEL(pBiDi, lastStrongLTR)==0)) { + pBiDi->length = lastStrongLTR; + } + if(pBiDi->length<pBiDi->originalLength) { + pBiDi->paraCount--; + } } /* The following line does nothing new for contextual paraLevel, but is needed for absolute paraLevel. */ @@ -381,14 +486,17 @@ getDirProps(UBiDi *pBiDi) { flags|=DIRPROP_FLAG(L); } + pBiDi->controlCount = controlCount; pBiDi->flags=flags; + pBiDi->lastArabicPos=lastArabicPos; } /* perform (X1)..(X9) ------------------------------------------------------- */ /* determine if the text is mixed-directional or single-directional */ static UBiDiDirection -directionFromFlags(Flags flags) { +directionFromFlags(UBiDi *pBiDi) { + Flags flags=pBiDi->flags; /* if the text contains AN and neutrals, then some neutrals may become RTL */ if(!(flags&MASK_RTL || ((flags&DIRPROP_FLAG(AN)) && (flags&MASK_POSSIBLE_N)))) { return UBIDI_LTR; @@ -466,13 +574,15 @@ resolveExplicitLevels(UBiDi *pBiDi) { int32_t paraIndex=0; /* determine if the text is mixed-directional or single-directional */ - direction=directionFromFlags(flags); + direction=directionFromFlags(pBiDi); - /* we may not need to resolve any explicit levels */ - if(direction!=UBIDI_MIXED) { + /* we may not need to resolve any explicit levels, but for multiple + paragraphs we want to loop on all chars to set the para boundaries */ + if((direction!=UBIDI_MIXED) && (pBiDi->paraCount==1)) { /* not mixed directionality: levels don't matter - trailingWSStart will be 0 */ } else if((pBiDi->paraCount==1) && - (!(flags&MASK_EXPLICIT) || pBiDi->isInverse)) { + (!(flags&MASK_EXPLICIT) || + (pBiDi->reorderingMode > UBIDI_REORDER_LAST_LOGICAL_TO_VISUAL))) { /* mixed, but all characters are at the same embedding level */ /* or we are in "inverse BiDi" */ /* and we don't have contextual multiple paragraphs with some B char */ @@ -604,8 +714,9 @@ resolveExplicitLevels(UBiDi *pBiDi) { /* again, determine if the text is mixed-directional or single-directional */ pBiDi->flags=flags; - direction=directionFromFlags(flags); + direction=directionFromFlags(pBiDi); } + return direction; } @@ -661,7 +772,408 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { /* determine if the text is mixed-directional or single-directional */ pBiDi->flags=flags; - return directionFromFlags(flags); + return directionFromFlags(pBiDi); +} + +/*********************************************************************/ +/* The Properties state machine table */ +/*********************************************************************/ +/* */ +/* All table cells are 8 bits: */ +/* bits 0..4: next state */ +/* bits 5..7: action to perform (if > 0) */ +/* */ +/* Cells may be of format "n" where n represents the next state */ +/* (except for the rightmost column). */ +/* Cells may also be of format "_(x,y)" where x represents an action */ +/* to perform and y represents the next state. */ +/* */ +/*********************************************************************/ +/* Definitions and type for properties state table */ +/*********************************************************************/ +#define IMPTABPROPS_COLUMNS 14 +#define IMPTABPROPS_RES (IMPTABPROPS_COLUMNS - 1) +#define GET_STATEPROPS(cell) ((cell)&0x1f) +#define GET_ACTIONPROPS(cell) ((cell)>>5) +#define _(action, newState) ((uint8_t)(newState+(action<<5))) + +static const uint8_t groupProp[] = /* dirProp regrouped */ +{ +/* L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN */ + 0, 1, 2, 7, 8, 3, 9, 6, 5, 4, 4, 10, 10, 12, 10, 10, 10, 11, 10 +}; +enum { _L=0, _R=1, _EN=2, _AN=3, _ON=4, _S=5, _B=6 }; /* reduced dirProp */ + +/*********************************************************************/ +/* */ +/* PROPERTIES STATE TABLE */ +/* */ +/* In table impTabProps, */ +/* - the ON column regroups ON and WS */ +/* - the BN column regroups BN, LRE, RLE, LRO, RLO, PDF */ +/* - the Res column is the reduced property assigned to a run */ +/* */ +/* Action 1: process current run1, init new run1 */ +/* 2: init new run2 */ +/* 3: process run1, process run2, init new run1 */ +/* 4: process run1, set run1=run2, init new run2 */ +/* */ +/* Notes: */ +/* 1) This table is used in resolveImplicitLevels(). */ +/* 2) This table triggers actions when there is a change in the Bidi*/ +/* property of incoming characters (action 1). */ +/* 3) Most such property sequences are processed immediately (in */ +/* fact, passed to processPropertySeq(). */ +/* 4) However, numbers are assembled as one sequence. This means */ +/* that undefined situations (like CS following digits, until */ +/* it is known if the next char will be a digit) are held until */ +/* following chars define them. */ +/* Example: digits followed by CS, then comes another CS or ON; */ +/* the digits will be processed, then the CS assigned */ +/* as the start of an ON sequence (action 3). */ +/* 5) There are cases where more than one sequence must be */ +/* processed, for instance digits followed by CS followed by L: */ +/* the digits must be processed as one sequence, and the CS */ +/* must be processed as an ON sequence, all this before starting */ +/* assembling chars for the opening L sequence. */ +/* */ +/* */ +static const uint8_t impTabProps[][IMPTABPROPS_COLUMNS] = +{ +/* L , R , EN , AN , ON , S , B , ES , ET , CS , BN , NSM , AL , Res */ +/* 0 Init */ { 1 , 2 , 4 , 5 , 7 , 15 , 17 , 7 , 9 , 7 , 0 , 7 , 3 , _ON }, +/* 1 L */ { 1 , _(1,2), _(1,4), _(1,5), _(1,7),_(1,15),_(1,17), _(1,7), _(1,9), _(1,7), 1 , 1 , _(1,3), _L }, +/* 2 R */ { _(1,1), 2 , _(1,4), _(1,5), _(1,7),_(1,15),_(1,17), _(1,7), _(1,9), _(1,7), 2 , 2 , _(1,3), _R }, +/* 3 AL */ { _(1,1), _(1,2), _(1,6), _(1,6), _(1,8),_(1,16),_(1,17), _(1,8), _(1,8), _(1,8), 3 , 3 , 3 , _R }, +/* 4 EN */ { _(1,1), _(1,2), 4 , _(1,5), _(1,7),_(1,15),_(1,17),_(2,10), 11 ,_(2,10), 4 , 4 , _(1,3), _EN }, +/* 5 AN */ { _(1,1), _(1,2), _(1,4), 5 , _(1,7),_(1,15),_(1,17), _(1,7), _(1,9),_(2,12), 5 , 5 , _(1,3), _AN }, +/* 6 AL:EN/AN */ { _(1,1), _(1,2), 6 , 6 , _(1,8),_(1,16),_(1,17), _(1,8), _(1,8),_(2,13), 6 , 6 , _(1,3), _AN }, +/* 7 ON */ { _(1,1), _(1,2), _(1,4), _(1,5), 7 ,_(1,15),_(1,17), 7 ,_(2,14), 7 , 7 , 7 , _(1,3), _ON }, +/* 8 AL:ON */ { _(1,1), _(1,2), _(1,6), _(1,6), 8 ,_(1,16),_(1,17), 8 , 8 , 8 , 8 , 8 , _(1,3), _ON }, +/* 9 ET */ { _(1,1), _(1,2), 4 , _(1,5), 7 ,_(1,15),_(1,17), 7 , 9 , 7 , 9 , 9 , _(1,3), _ON }, +/*10 EN+ES/CS */ { _(3,1), _(3,2), 4 , _(3,5), _(4,7),_(3,15),_(3,17), _(4,7),_(4,14), _(4,7), 10 , _(4,7), _(3,3), _EN }, +/*11 EN+ET */ { _(1,1), _(1,2), 4 , _(1,5), _(1,7),_(1,15),_(1,17), _(1,7), 11 , _(1,7), 11 , 11 , _(1,3), _EN }, +/*12 AN+CS */ { _(3,1), _(3,2), _(3,4), 5 , _(4,7),_(3,15),_(3,17), _(4,7),_(4,14), _(4,7), 12 , _(4,7), _(3,3), _AN }, +/*13 AL:EN/AN+CS */ { _(3,1), _(3,2), 6 , 6 , _(4,8),_(3,16),_(3,17), _(4,8), _(4,8), _(4,8), 13 , _(4,8), _(3,3), _AN }, +/*14 ON+ET */ { _(1,1), _(1,2), _(4,4), _(1,5), 7 ,_(1,15),_(1,17), 7 , 14 , 7 , 14 , 14 , _(1,3), _ON }, +/*15 S */ { _(1,1), _(1,2), _(1,4), _(1,5), _(1,7), 15 ,_(1,17), _(1,7), _(1,9), _(1,7), 15 , _(1,7), _(1,3), _S }, +/*16 AL:S */ { _(1,1), _(1,2), _(1,6), _(1,6), _(1,8), 16 ,_(1,17), _(1,8), _(1,8), _(1,8), 16 , _(1,8), _(1,3), _S }, +/*17 B */ { _(1,1), _(1,2), _(1,4), _(1,5), _(1,7),_(1,15), 17 , _(1,7), _(1,9), _(1,7), 17 , _(1,7), _(1,3), _B } +}; + +/* we must undef macro _ because the levels table have a different + * structure (4 bits for action and 4 bits for next state. + */ +#undef _ + +/*********************************************************************/ +/* The levels state machine tables */ +/*********************************************************************/ +/* */ +/* All table cells are 8 bits: */ +/* bits 0..3: next state */ +/* bits 4..7: action to perform (if > 0) */ +/* */ +/* Cells may be of format "n" where n represents the next state */ +/* (except for the rightmost column). */ +/* Cells may also be of format "_(x,y)" where x represents an action */ +/* to perform and y represents the next state. */ +/* */ +/* This format limits each table to 16 states each and to 15 actions.*/ +/* */ +/*********************************************************************/ +/* Definitions and type for levels state tables */ +/*********************************************************************/ +#define IMPTABLEVELS_COLUMNS (_B + 2) +#define IMPTABLEVELS_RES (IMPTABLEVELS_COLUMNS - 1) +#define GET_STATE(cell) ((cell)&0x0f) +#define GET_ACTION(cell) ((cell)>>4) +#define _(action, newState) ((uint8_t)(newState+(action<<4))) + +typedef uint8_t ImpTab[][IMPTABLEVELS_COLUMNS]; +typedef uint8_t ImpAct[]; + +/* FOOD FOR THOUGHT: each ImpTab should have its associated ImpAct, + * instead of having a pair of ImpTab and a pair of ImpAct. + */ +typedef struct ImpTabPair { + ImpTab * pImpTab[2]; + ImpAct * pImpAct[2]; +} ImpTabPair; + +/*********************************************************************/ +/* */ +/* LEVELS STATE TABLES */ +/* */ +/* In all levels state tables, */ +/* - state 0 is the initial state */ +/* - the Res column is the increment to add to the text level */ +/* for this property sequence. */ +/* */ +/* The impAct arrays for each table of a pair map the local action */ +/* numbers of the table to the total list of actions. For instance, */ +/* action 2 in a given table corresponds to the action number which */ +/* appears in entry [2] of the impAct array for that table. */ +/* The first entry of all impAct arrays must be 0. */ +/* */ +/* Action 1: init conditional sequence */ +/* 2: prepend conditional sequence to current sequence */ +/* 3: set ON sequence to new level - 1 */ +/* 4: init EN/AN/ON sequence */ +/* 5: fix EN/AN/ON sequence followed by R */ +/* 6: set previous level sequence to level 2 */ +/* */ +/* Notes: */ +/* 1) These tables are used in processPropertySeq(). The input */ +/* is property sequences as determined by resolveImplicitLevels. */ +/* 2) Most such property sequences are processed immediately */ +/* (levels are assigned). */ +/* 3) However, some sequences cannot be assigned a final level till */ +/* one or more following sequences are received. For instance, */ +/* ON following an R sequence within an even-level paragraph. */ +/* If the following sequence is R, the ON sequence will be */ +/* assigned basic run level+1, and so will the R sequence. */ +/* 4) S is generally handled like ON, since its level will be fixed */ +/* to paragraph level in adjustWSLevels(). */ +/* */ + +static const ImpTab impTabL_DEFAULT = /* Even paragraph level */ +/* In this table, conditional sequences receive the higher possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , 1 , 0 , 2 , 0 , 0 , 0 , 0 }, +/* 1 : R */ { 0 , 1 , 3 , 3 , _(1,4), _(1,4), 0 , 1 }, +/* 2 : AN */ { 0 , 1 , 0 , 2 , _(1,5), _(1,5), 0 , 2 }, +/* 3 : R+EN/AN */ { 0 , 1 , 3 , 3 , _(1,4), _(1,4), 0 , 2 }, +/* 4 : R+ON */ { _(2,0), 1 , 3 , 3 , 4 , 4 , _(2,0), 1 }, +/* 5 : AN+ON */ { _(2,0), 1 , _(2,0), 2 , 5 , 5 , _(2,0), 1 } +}; +static const ImpTab impTabR_DEFAULT = /* Odd paragraph level */ +/* In this table, conditional sequences receive the lower possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, +/* 1 : L */ { 1 , 0 , 1 , 3 , _(1,4), _(1,4), 0 , 1 }, +/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 }, +/* 3 : L+AN */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 1 }, +/* 4 : L+ON */ { _(2,1), 0 , _(2,1), 3 , 4 , 4 , 0 , 0 }, +/* 5 : L+AN+ON */ { 1 , 0 , 1 , 3 , 5 , 5 , 0 , 0 } +}; +static const ImpAct impAct0 = {0,1,2,3,4,5,6}; +static const ImpTabPair impTab_DEFAULT = {{(ImpTab*)&impTabL_DEFAULT, + (ImpTab*)&impTabR_DEFAULT}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct0}}; + +static const ImpTab impTabL_NUMBERS_SPECIAL = /* Even paragraph level */ +/* In this table, conditional sequences receive the higher possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , 2 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L+EN/AN */ { 0 , 2 , 1 , 1 , 0 , 0 , 0 , 2 }, +/* 2 : R */ { 0 , 2 , 4 , 4 , _(1,3), 0 , 0 , 1 }, +/* 3 : R+ON */ { _(2,0), 2 , 4 , 4 , 3 , 3 , _(2,0), 1 }, +/* 4 : R+EN/AN */ { 0 , 2 , 4 , 4 , _(1,3), _(1,3), 0 , 2 } + }; +static const ImpTabPair impTab_NUMBERS_SPECIAL = {{(ImpTab*)&impTabL_NUMBERS_SPECIAL, + (ImpTab*)&impTabR_DEFAULT}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct0}}; + +static const ImpTab impTabL_GROUP_NUMBERS_WITH_R = +/* In this table, EN/AN+ON sequences receive levels as if associated with R + until proven that there is L or sor/eor on both sides. AN is handled like EN. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 init */ { 0 , 3 , _(1,1), _(1,1), 0 , 0 , 0 , 0 }, +/* 1 EN/AN */ { _(2,0), 3 , 1 , 1 , 2 , _(2,0), _(2,0), 2 }, +/* 2 EN/AN+ON */ { _(2,0), 3 , 1 , 1 , 2 , _(2,0), _(2,0), 1 }, +/* 3 R */ { 0 , 3 , 5 , 5 , _(1,4), 0 , 0 , 1 }, +/* 4 R+ON */ { _(2,0), 3 , 5 , 5 , 4 , _(2,0), _(2,0), 1 }, +/* 5 R+EN/AN */ { 0 , 3 , 5 , 5 , _(1,4), 0 , 0 , 2 } +}; +static const ImpTab impTabR_GROUP_NUMBERS_WITH_R = +/* In this table, EN/AN+ON sequences receive levels as if associated with R + until proven that there is L on both sides. AN is handled like EN. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 init */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 EN/AN */ { 2 , 0 , 1 , 1 , 0 , 0 , 0 , 1 }, +/* 2 L */ { 2 , 0 , _(1,4), _(1,4), _(1,3), 0 , 0 , 1 }, +/* 3 L+ON */ { _(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 0 }, +/* 4 L+EN/AN */ { _(2,2), 0 , 4 , 4 , 3 , 0 , 0 , 1 } +}; +static const ImpTabPair impTab_GROUP_NUMBERS_WITH_R = { + {(ImpTab*)&impTabL_GROUP_NUMBERS_WITH_R, + (ImpTab*)&impTabR_GROUP_NUMBERS_WITH_R}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct0}}; + + +static const ImpTab impTabL_INVERSE_NUMBERS_AS_L = +/* This table is identical to the Default LTR table except that EN and AN are + handled like L. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 }, +/* 1 : R */ { 0 , 1 , 0 , 0 , _(1,4), _(1,4), 0 , 1 }, +/* 2 : AN */ { 0 , 1 , 0 , 0 , _(1,5), _(1,5), 0 , 2 }, +/* 3 : R+EN/AN */ { 0 , 1 , 0 , 0 , _(1,4), _(1,4), 0 , 2 }, +/* 4 : R+ON */ { _(2,0), 1 , _(2,0), _(2,0), 4 , 4 , _(2,0), 1 }, +/* 5 : AN+ON */ { _(2,0), 1 , _(2,0), _(2,0), 5 , 5 , _(2,0), 1 } +}; +static const ImpTab impTabR_INVERSE_NUMBERS_AS_L = +/* This table is identical to the Default RTL table except that EN and AN are + handled like L. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L */ { 1 , 0 , 1 , 1 , _(1,4), _(1,4), 0 , 1 }, +/* 2 : EN/AN */ { 1 , 0 , 1 , 1 , 0 , 0 , 0 , 1 }, +/* 3 : L+AN */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 1 }, +/* 4 : L+ON */ { _(2,1), 0 , _(2,1), _(2,1), 4 , 4 , 0 , 0 }, +/* 5 : L+AN+ON */ { 1 , 0 , 1 , 1 , 5 , 5 , 0 , 0 } +}; +static const ImpTabPair impTab_INVERSE_NUMBERS_AS_L = { + {(ImpTab*)&impTabL_INVERSE_NUMBERS_AS_L, + (ImpTab*)&impTabR_INVERSE_NUMBERS_AS_L}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct0}}; + +static const ImpTab impTabR_INVERSE_LIKE_DIRECT = /* Odd paragraph level */ +/* In this table, conditional sequences receive the lower possible level + until proven otherwise. +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, +/* 1 : L */ { 1 , 0 , 1 , 2 , _(1,3), _(1,3), 0 , 1 }, +/* 2 : EN/AN */ { 1 , 0 , 2 , 2 , 0 , 0 , 0 , 1 }, +/* 3 : L+ON */ { _(2,1), _(3,0), 6 , 4 , 3 , 3 , _(3,0), 0 }, +/* 4 : L+ON+AN */ { _(2,1), _(3,0), 6 , 4 , 5 , 5 , _(3,0), 3 }, +/* 5 : L+AN+ON */ { _(2,1), _(3,0), 6 , 4 , 5 , 5 , _(3,0), 2 }, +/* 6 : L+ON+EN */ { _(2,1), _(3,0), 6 , 4 , 3 , 3 , _(3,0), 1 } +}; +static const ImpAct impAct1 = {0,1,11,12}; +/* FOOD FOR THOUGHT: in LTR table below, check case "JKL 123abc" + */ +static const ImpTabPair impTab_INVERSE_LIKE_DIRECT = { + {(ImpTab*)&impTabL_DEFAULT, + (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct1}}; + +static const ImpTab impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS = +/* The case handled in this table is (visually): R EN L +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , _(6,3), 0 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L+AN */ { 0 , _(6,3), 0 , 1 , _(1,2), _(3,0), 0 , 4 }, +/* 2 : L+AN+ON */ { _(2,0), _(6,3), _(2,0), 1 , 2 , _(3,0), _(2,0), 3 }, +/* 3 : R */ { 0 , _(6,3), _(5,5), _(5,6), _(1,4), _(3,0), 0 , 3 }, +/* 4 : R+ON */ { _(3,0), _(4,3), _(5,5), _(5,6), 4 , _(3,0), _(3,0), 3 }, +/* 5 : R+EN */ { _(3,0), _(4,3), 5 , _(5,6), _(1,4), _(3,0), _(3,0), 4 }, +/* 6 : R+AN */ { _(3,0), _(4,3), _(5,5), 6 , _(1,4), _(3,0), _(3,0), 4 } +}; +static const ImpTab impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS = +/* The cases handled in this table are (visually): R EN L + R L AN L +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { _(1,3), 0 , 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : R+EN/AN */ { _(2,3), 0 , 1 , 1 , 2 , _(4,0), 0 , 1 }, +/* 2 : R+EN/AN+ON */ { _(2,3), 0 , 1 , 1 , 2 , _(4,0), 0 , 0 }, +/* 3 : L */ { 3 , 0 , 3 , _(3,6), _(1,4), _(4,0), 0 , 1 }, +/* 4 : L+ON */ { _(5,3), _(4,0), 5 , _(3,6), 4 , _(4,0), _(4,0), 0 }, +/* 5 : L+ON+EN */ { _(5,3), _(4,0), 5 , _(3,6), 4 , _(4,0), _(4,0), 1 }, +/* 6 : L+AN */ { _(5,3), _(4,0), 6 , 6 , 4 , _(4,0), _(4,0), 3 } +}; +static const ImpAct impAct2 = {0,1,7,8,9,10}; +static const ImpTabPair impTab_INVERSE_LIKE_DIRECT_WITH_MARKS = { + {(ImpTab*)&impTabL_INVERSE_LIKE_DIRECT_WITH_MARKS, + (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct2}}; + +static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL = { + {(ImpTab*)&impTabL_NUMBERS_SPECIAL, + (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct1}}; + +static const ImpTab impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = +/* The case handled in this table is (visually): R EN L +*/ +{ +/* L , R , EN , AN , ON , S , B , Res */ +/* 0 : init */ { 0 , _(6,2), 1 , 1 , 0 , 0 , 0 , 0 }, +/* 1 : L+EN/AN */ { 0 , _(6,2), 1 , 1 , 0 , _(3,0), 0 , 4 }, +/* 2 : R */ { 0 , _(6,2), _(5,4), _(5,4), _(1,3), _(3,0), 0 , 3 }, +/* 3 : R+ON */ { _(3,0), _(4,2), _(5,4), _(5,4), 3 , _(3,0), _(3,0), 3 }, +/* 4 : R+EN/AN */ { _(3,0), _(4,2), 4 , 4 , _(1,3), _(3,0), _(3,0), 4 } +}; +static const ImpTabPair impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS = { + {(ImpTab*)&impTabL_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS, + (ImpTab*)&impTabR_INVERSE_LIKE_DIRECT_WITH_MARKS}, + {(ImpAct*)&impAct0, (ImpAct*)&impAct2}}; + +#undef _ + +typedef struct { + ImpTab * pImpTab; /* level table pointer */ + ImpAct * pImpAct; /* action map array */ + int32_t startON; /* start of ON sequence */ + int32_t startL2EN; /* start of level 2 sequence */ + int32_t lastStrongRTL; /* index of last found R or AL */ + int32_t state; /* current state */ + UBiDiLevel runLevel; /* run level before implicit solving */ +} LevState; + +/*------------------------------------------------------------------------*/ + +static void +addPoint(UBiDi *pBiDi, int32_t pos, int32_t flag) + /* param pos: position where to insert + param flag: one of LRM_BEFORE, LRM_AFTER, RLM_BEFORE, RLM_AFTER + */ +{ +#define FIRSTALLOC 10 + Point point; + InsertPoints * pInsertPoints=&(pBiDi->insertPoints); + + if (pInsertPoints->capacity == 0) + { + pInsertPoints->points=uprv_malloc(sizeof(Point)*FIRSTALLOC); + if (pInsertPoints->points == NULL) + { + pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + pInsertPoints->capacity=FIRSTALLOC; + } + if (pInsertPoints->size >= pInsertPoints->capacity) /* no room for new point */ + { + void * savePoints=pInsertPoints->points; + pInsertPoints->points=uprv_realloc(pInsertPoints->points, + pInsertPoints->capacity*2*sizeof(Point)); + if (pInsertPoints->points == NULL) + { + pInsertPoints->points=savePoints; + pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; + return; + } + else pInsertPoints->capacity*=2; + } + point.pos=pos; + point.flag=flag; + pInsertPoints->points[pInsertPoints->size]=point; + pInsertPoints->size++; +#undef FIRSTALLOC } /* perform rules (Wn), (Nn), and (In) on a run of the text ------------------ */ @@ -672,16 +1184,6 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { * (except for W5: sequences of ET) and keeps track of changes * in a rule Wp that affect a later Wq (p<q). * - * historyOfEN is a variable-saver: it contains 4 boolean states; - * a bit in it set to 1 means: - * bit 0: the current code is an EN after W2 - * bit 1: the current code is an EN after W4 - * bit 2: the previous code was an EN after W2 - * bit 3: the previous code was an EN after W4 - * In other words, b0..1 have transitions of EN in the current iteration, - * while b2..3 have the transitions of EN in the previous iteration. - * A simple historyOfEN<<=2 suffices for the propagation. - * * The (Nn) and (In) rules are also performed in that same single loop, * but effectively one iteration behind for white space. * @@ -689,356 +1191,310 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { * to actually store the intermediate directional properties in dirProps[]. */ -#define EN_SHIFT 2 -#define EN_AFTER_W2 1 -#define EN_AFTER_W4 2 -#define EN_ALL 3 -#define PREV_EN_AFTER_W2 4 -#define PREV_EN_AFTER_W4 8 - static void -resolveImplicitLevels(UBiDi *pBiDi, - int32_t start, int32_t limit, - DirProp sor, DirProp eor) { - const DirProp *dirProps=pBiDi->dirProps; - UBiDiLevel *levels=pBiDi->levels; - - int32_t i, next, neutralStart=-1; - DirProp prevDirProp, dirProp, nextDirProp, lastStrong, beforeNeutral=L; - UBiDiLevel numberLevel; - uint8_t historyOfEN; - - /* initialize: current at sor, next at start (it is start<limit) */ - next=start; - dirProp=lastStrong=sor; - nextDirProp=NO_CONTEXT_RTL(dirProps[next]); - historyOfEN=0; - - if(pBiDi->isInverse) { - /* - * For "inverse BiDi", we set the levels of numbers just like for - * regular L characters, plus a flag that ubidi_getRuns() will use - * to set a similar flag on the corresponding output run. - */ - numberLevel=levels[start]; - if(numberLevel&1) { - ++numberLevel; - } - } else { - /* normal BiDi: least greater even level */ - numberLevel=(UBiDiLevel)((levels[start]+2)&~1); - } - - /* - * In all steps of this implementation, BN and explicit embedding codes - * must be treated as if they didn't exist (X9). - * They will get levels set before a non-neutral character, and remain - * undefined before a neutral one, but adjustWSLevels() will take care - * of all of them. - */ - while(DIRPROP_FLAG(nextDirProp)&MASK_BN_EXPLICIT) { - if(++next<limit) { - nextDirProp=NO_CONTEXT_RTL(dirProps[next]); - } else { - nextDirProp=eor; +processPropertySeq(UBiDi *pBiDi, LevState *pLevState, uint8_t _prop, + int32_t start, int32_t limit) { + uint8_t cell, oldStateSeq, actionSeq; + ImpTab * pImpTab=pLevState->pImpTab; + ImpAct * pImpAct=pLevState->pImpAct; + UBiDiLevel * levels=pBiDi->levels; + UBiDiLevel level, addLevel; + InsertPoints * pInsertPoints; + int32_t start0, k; + + start0=start; /* save original start position */ + oldStateSeq=pLevState->state; + cell=(*pImpTab)[oldStateSeq][_prop]; + pLevState->state=GET_STATE(cell); /* isolate the new state */ + actionSeq=(*pImpAct)[GET_ACTION(cell)]; /* isolate the action */ + addLevel=(*pImpTab)[pLevState->state][IMPTABLEVELS_RES]; + + if(actionSeq) { + switch(actionSeq) { + case 1: /* init ON seq */ + pLevState->startON=start0; break; - } - } - /* - * Note: at the end of this file, there is a prototype - * of a version of this function that uses a statetable - * at the core of this state machine. - * If you make changes to this state machine, - * please update that prototype as well. - */ + case 2: /* prepend ON seq to current seq */ + start=pLevState->startON; + break; - /* loop for entire run */ - while(next<limit) { - /* advance */ - prevDirProp=dirProp; - dirProp=nextDirProp; - i=next; - do { - if(++next<limit) { - nextDirProp=NO_CONTEXT_RTL(dirProps[next]); - } else { - nextDirProp=eor; - break; + case 3: /* L or S after possible relevant EN/AN */ + /* check if we had EN after R/AL */ + if (pLevState->startL2EN >= 0) { + addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE); } - } while(DIRPROP_FLAG(nextDirProp)&MASK_BN_EXPLICIT); - historyOfEN<<=EN_SHIFT; - - /* (W1..W7) */ - switch(dirProp) { - case L: - lastStrong=L; - break; - case R: - lastStrong=R; - break; - case AL: - /* (W3) */ - lastStrong=AL; - dirProp=R; - break; - case EN: - /* we have to set historyOfEN correctly */ - if(lastStrong==AL) { - /* (W2) */ - dirProp=AN; - } else { - if(lastStrong==L) { - /* (W7) */ - dirProp=L; + pLevState->startL2EN=-1; /* not within previous if since could also be -2 */ + /* check if we had any relevant EN/AN after R/AL */ + pInsertPoints=&(pBiDi->insertPoints); + if ((pInsertPoints->capacity == 0) || + (pInsertPoints->size <= pInsertPoints->confirmed)) + { + /* nothing, just clean up */ + pLevState->lastStrongRTL=-1; + /* check if we have a pending conditional segment */ + level=(*pImpTab)[oldStateSeq][IMPTABLEVELS_RES]; + if ((level & 1) && (pLevState->startON > 0)) { /* after ON */ + start=pLevState->startON; /* reset to basic run level */ } - /* this EN stays after (W2) and (W4) - at least before (W7) */ - historyOfEN|=EN_ALL; - } - break; - case ES: - if( historyOfEN&PREV_EN_AFTER_W2 && /* previous was EN before (W4) */ - nextDirProp==EN && lastStrong!=AL /* next is EN and (W2) won't make it AN */ - ) { - /* (W4) */ - if(lastStrong!=L) { - dirProp=EN; - } else { - /* (W7) */ - dirProp=L; + if (_prop == _S) /* add LRM before S */ + { + addPoint(pBiDi, start0, LRM_BEFORE); + pInsertPoints->confirmed=pInsertPoints->size; } - historyOfEN|=EN_AFTER_W4; - } else { - /* (W6) */ - dirProp=ON; + break; } - break; - case CS: - if( historyOfEN&PREV_EN_AFTER_W2 && /* previous was EN before (W4) */ - nextDirProp==EN && lastStrong!=AL /* next is EN and (W2) won't make it AN */ - ) { - /* (W4) */ - if(lastStrong!=L) { - dirProp=EN; - } else { - /* (W7) */ - dirProp=L; - } - historyOfEN|=EN_AFTER_W4; - } else if(prevDirProp==AN && /* previous was AN */ - (nextDirProp==AN || /* next is AN */ - (nextDirProp==EN && lastStrong==AL)) /* or (W2) will make it one */ - ) { - /* (W4) */ - dirProp=AN; - } else { - /* (W6) */ - dirProp=ON; + /* reset previous RTL cont to level for LTR text */ + for (k=pLevState->lastStrongRTL+1; k<start0; k++) + { + /* reset odd level, leave runLevel+2 as is */ + levels[k]=(levels[k] - 2) & ~1; } - break; - case ET: - /* get sequence of ET; advance only next, not current, previous or historyOfEN */ - if(next<limit) { - while(DIRPROP_FLAG(nextDirProp)&MASK_ET_NSM_BN /* (W1), (X9) */) { - if(++next<limit) { - nextDirProp=NO_CONTEXT_RTL(dirProps[next]); - } else { - nextDirProp=eor; - break; - } - } + /* mark insert points as confirmed */ + pInsertPoints->confirmed=pInsertPoints->size; + pLevState->lastStrongRTL=-1; + if (_prop == _S) /* add LRM before S */ + { + addPoint(pBiDi, start0, LRM_BEFORE); + pInsertPoints->confirmed=pInsertPoints->size; } + break; - /* now process the sequence of ET like a single ET */ - if((historyOfEN&PREV_EN_AFTER_W4) || /* previous was EN before (W5) */ - (nextDirProp==EN && lastStrong!=AL) /* next is EN and (W2) won't make it AN */ - ) { - /* (W5) */ - if(lastStrong!=L) { - dirProp=EN; - } else { - /* (W7) */ - dirProp=L; + case 4: /* R/AL after possible relevant EN/AN */ + /* just clean up */ + pInsertPoints=&(pBiDi->insertPoints); + if (pInsertPoints->capacity > 0) + /* remove all non confirmed insert points */ + pInsertPoints->size=pInsertPoints->confirmed; + pLevState->startON=-1; + pLevState->startL2EN=-1; + pLevState->lastStrongRTL=limit - 1; + break; + + case 5: /* EN/AN after R/AL + possible cont */ + /* check for real AN */ + if ((_prop == _AN) && (NO_CONTEXT_RTL(pBiDi->dirProps[start0]) == AN) && + (pBiDi->reorderingMode!=UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)) + { + /* real AN */ + if (pLevState->startL2EN == -1) /* if no relevant EN already found */ + { + /* just note the righmost digit as a strong RTL */ + pLevState->lastStrongRTL=limit - 1; + break; } - } else { - /* (W6) */ - dirProp=ON; + if (pLevState->startL2EN >= 0) /* after EN, no AN */ + { + addPoint(pBiDi, pLevState->startL2EN, LRM_BEFORE); + pLevState->startL2EN=-2; + } + /* note AN */ + addPoint(pBiDi, start0, LRM_BEFORE); + break; + } + /* if first EN/AN after R/AL */ + if (pLevState->startL2EN == -1) { + pLevState->startL2EN=start0; } - - /* apply the result of (W1), (W5)..(W7) to the entire sequence of ET */ break; - case NSM: - /* (W1) */ - dirProp=prevDirProp; - /* set historyOfEN back to prevDirProp's historyOfEN */ - historyOfEN>>=EN_SHIFT; - /* - * Technically, this should be done before the switch() in the form - * if(nextDirProp==NSM) { - * dirProps[next]=nextDirProp=dirProp; - * } - * - * - effectively one iteration ahead. - * However, whether the next dirProp is NSM or is equal to the current dirProp - * does not change the outcome of any condition in (W2)..(W7). - */ + + case 6: /* note location of latest R/AL */ + pLevState->lastStrongRTL=limit - 1; + pLevState->startON=-1; break; - case B: - lastStrong=sor; - dirProp=GET_LR_FROM_LEVEL(levels[i]); + + case 7: /* L after R+ON/EN/AN */ + /* include possible adjacent number on the left */ + for (k=start0-1; k>=0 && !(levels[k]&1); k--); + if(k>=0) { + addPoint(pBiDi, k, RLM_BEFORE); /* add RLM before */ + pInsertPoints=&(pBiDi->insertPoints); + pInsertPoints->confirmed=pInsertPoints->size; /* confirm it */ + } + pLevState->startON=start0; break; - default: + + case 8: /* AN after L */ + /* AN numbers between L text on both sides may be trouble. */ + /* tentatively bracket with LRMs; will be confirmed if followed by L */ + addPoint(pBiDi, start0, LRM_BEFORE); /* add LRM before */ + addPoint(pBiDi, start0, LRM_AFTER); /* add LRM after */ break; - } - /* here, it is always [prev,this,next]dirProp!=BN; it may be next>i+1 */ + case 9: /* R after L+ON/EN/AN */ + /* false alert, infirm LRMs around previous AN */ + pInsertPoints=&(pBiDi->insertPoints); + pInsertPoints->size=pInsertPoints->confirmed; + if (_prop == _S) /* add RLM before S */ + { + addPoint(pBiDi, start0, RLM_BEFORE); + pInsertPoints->confirmed=pInsertPoints->size; + } + break; - /* perform (Nn) - here, only L, R, EN, AN, and neutrals are left */ - /* for "inverse BiDi", treat neutrals like L */ - /* this is one iteration late for the neutrals */ - if(DIRPROP_FLAG(dirProp)&MASK_N) { - if(neutralStart<0) { - /* start of a sequence of neutrals */ - neutralStart=i; - beforeNeutral=prevDirProp; + case 10: /* L after L+ON/AN */ + level=pLevState->runLevel + addLevel; + for(k=pLevState->startON; k<start0; k++) { + if (levels[k]<level) + levels[k]=level; } - } else /* not a neutral, can be only one of { L, R, EN, AN } */ { - /* - * Note that all levels[] values are still the same at this - * point because this function is called for an entire - * same-level run. - * Therefore, we need to read only one actual level. - */ - UBiDiLevel level=levels[i]; - - if(neutralStart>=0) { - UBiDiLevel final; - /* end of a sequence of neutrals (dirProp is "afterNeutral") */ - if(!(pBiDi->isInverse)) { - if(beforeNeutral==L) { - if(dirProp==L) { - final=0; /* make all neutrals L (N1) */ - } else { - final=level; /* make all neutrals "e" (N2) */ - } - } else /* beforeNeutral is one of { R, EN, AN } */ { - if(dirProp==L) { - final=level; /* make all neutrals "e" (N2) */ - } else { - final=1; /* make all neutrals R (N1) */ - } + pInsertPoints=&(pBiDi->insertPoints); + pInsertPoints->confirmed=pInsertPoints->size; /* confirm inserts */ + pLevState->startON=start0; + break; + + case 11: /* L after L+ON+EN/AN/ON */ + level=pLevState->runLevel; + for(k=start0-1; k>=pLevState->startON; k--) { + if(levels[k]==level+3) { + while(levels[k]==level+3) { + levels[k--]-=2; } - } else { - /* "inverse BiDi": collapse [before]dirProps L, EN, AN into L */ - if(beforeNeutral!=R) { - if(dirProp!=R) { - final=0; /* make all neutrals L (N1) */ - } else { - final=level; /* make all neutrals "e" (N2) */ - } - } else /* beforeNeutral is one of { R, EN, AN } */ { - if(dirProp!=R) { - final=level; /* make all neutrals "e" (N2) */ - } else { - final=1; /* make all neutrals R (N1) */ - } + while(levels[k]==level) { + k--; } } - /* perform (In) on the sequence of neutrals */ - if((level^final)&1) { - /* do something only if we need to _change_ the level */ - do { - ++levels[neutralStart]; - } while(++neutralStart<i); + if(levels[k]==level+2) { + levels[k]=level; + continue; } - neutralStart=-1; + levels[k]=level+1; } + break; - /* perform (In) on the non-neutral character */ - /* - * in the cases of (W5), processing a sequence of ET, - * and of (X9), skipping BN, - * there may be multiple characters from i to <next - * that all get (virtually) the same dirProp and (really) the same level - */ - if(dirProp==L) { - if(level&1) { - ++level; - } else { - i=next; /* we keep the levels */ - } - } else if(dirProp==R) { - if(!(level&1)) { - ++level; - } else { - i=next; /* we keep the levels */ + case 12: /* R after L+ON+EN/AN/ON */ + level=pLevState->runLevel+1; + for(k=start0-1; k>=pLevState->startON; k--) { + if(levels[k]>level) { + levels[k]-=2; } - } else /* EN or AN */ { - /* this level depends on whether we do "inverse BiDi" */ - level=numberLevel; } + break; - /* apply the new level to the sequence, if necessary */ - while(i<next) { - levels[i++]=level; - } + default: /* we should never get here */ + start=start0+25; + start/=(start-start0-25); /* force program crash */ + break; } - if(pBiDi->defaultParaLevel&&((i+1)<limit)&&(dirProps[i]==B)) { - dirProp=GET_LR_FROM_LEVEL(levels[i+1]); + } + if((addLevel) || (start < start0)) { + level=pLevState->runLevel + addLevel; + for(k=start; k<limit; k++) { + levels[k]=level; } } +} - /* perform (Nn) - here, - the character after the neutrals is eor, which is either L or R */ - /* this is one iteration late for the neutrals */ - if(neutralStart>=0) { - /* - * Note that all levels[] values are still the same at this - * point because this function is called for an entire - * same-level run. - * Therefore, we need to read only one actual level. - */ - UBiDiLevel level=levels[neutralStart], final; +static void +resolveImplicitLevels(UBiDi *pBiDi, + int32_t start, int32_t limit, + DirProp sor, DirProp eor) { + const DirProp *dirProps=pBiDi->dirProps; - /* end of a sequence of neutrals (eor is "afterNeutral") */ - if(!(pBiDi->isInverse)) { - if(beforeNeutral==L) { - if(eor==L) { - final=0; /* make all neutrals L (N1) */ - } else { - final=level; /* make all neutrals "e" (N2) */ - } - } else /* beforeNeutral is one of { R, EN, AN } */ { - if(eor==L) { - final=level; /* make all neutrals "e" (N2) */ - } else { - final=1; /* make all neutrals R (N1) */ - } - } + LevState levState; + int32_t i, start1, start2; + uint8_t oldStateImp, stateImp, actionImp; + uint8_t gprop, resProp, cell; + UBool inverseRTL; + DirProp nextStrongProp=R; + int32_t nextStrongPos=-1; + + /* check for RTL inverse BiDi mode */ + /* FOOD FOR THOUGHT: in case of RTL inverse BiDi, it would make sense to + * loop on the text characters from end to start. + * This would need a different properties state table (at least different + * actions) and different levels state tables (maybe very similar to the + * LTR corresponding ones. + */ + inverseRTL=((start<pBiDi->lastArabicPos) && (GET_PARALEVEL(pBiDi, start) & 1) && + (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || + pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)); + /* initialize for levels state table */ + levState.startL2EN=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ + levState.lastStrongRTL=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ + levState.state=0; + levState.runLevel=pBiDi->levels[start]; + levState.pImpTab=((pBiDi->pImpTabPair)->pImpTab)[levState.runLevel&1]; + levState.pImpAct=((pBiDi->pImpTabPair)->pImpAct)[levState.runLevel&1]; + processPropertySeq(pBiDi, &levState, sor, start, start); + /* initialize for property state table */ + if(dirProps[start]==NSM) { + stateImp = 1 + sor; + } else { + stateImp=0; + } + start1=start; + start2=start; + + for(i=start; i<=limit; i++) { + if(i>=limit) { + gprop=eor; } else { - /* "inverse BiDi": collapse [before]dirProps L, EN, AN into L */ - if(beforeNeutral!=R) { - if(eor!=R) { - final=0; /* make all neutrals L (N1) */ - } else { - final=level; /* make all neutrals "e" (N2) */ - } - } else /* beforeNeutral is one of { R, EN, AN } */ { - if(eor!=R) { - final=level; /* make all neutrals "e" (N2) */ - } else { - final=1; /* make all neutrals R (N1) */ + DirProp prop, prop1; + prop=NO_CONTEXT_RTL(dirProps[i]); + if(inverseRTL) { + if(prop==AL) { + /* AL before EN does not make it AN */ + prop=R; + } else if(prop==EN) { + if(nextStrongPos<=i) { + /* look for next strong char (L/R/AL) */ + int32_t j; + nextStrongProp=R; /* set default */ + nextStrongPos=limit; + for(j=i+1; j<limit; j++) { + prop1=NO_CONTEXT_RTL(dirProps[j]); + if(prop1==L || prop1==R || prop1==AL) { + nextStrongProp=prop1; + nextStrongPos=j; + break; + } + } + } + if(nextStrongProp==AL) { + prop=AN; + } } } + gprop=groupProp[prop]; } - /* perform (In) on the sequence of neutrals */ - if((level^final)&1) { - /* do something only if we need to _change_ the level */ - do { - ++levels[neutralStart]; - } while(++neutralStart<limit); + oldStateImp=stateImp; + cell=impTabProps[oldStateImp][gprop]; + stateImp=GET_STATEPROPS(cell); /* isolate the new state */ + actionImp=GET_ACTIONPROPS(cell); /* isolate the action */ + if((i==limit) && (actionImp==0)) { + /* there is an unprocessed sequence if its property == eor */ + actionImp=1; /* process the last sequence */ + } + if(actionImp) { + resProp=impTabProps[oldStateImp][IMPTABPROPS_RES]; + switch(actionImp) { + case 1: /* process current seq1, init new seq1 */ + processPropertySeq(pBiDi, &levState, resProp, start1, i); + start1=i; + break; + case 2: /* init new seq2 */ + start2=i; + break; + case 3: /* process seq1, process seq2, init new seq1 */ + processPropertySeq(pBiDi, &levState, resProp, start1, start2); + processPropertySeq(pBiDi, &levState, _ON, start2, i); + start1=i; + break; + case 4: /* process seq1, set seq1=seq2, init new seq2 */ + processPropertySeq(pBiDi, &levState, resProp, start1, start2); + start1=start2; + start2=i; + break; + default: /* we should never get here */ + start=start1+25; + start/=(start-start1-25); /* force program crash */ + break; + } } } + /* flush possible pending sequence, e.g. ON */ + processPropertySeq(pBiDi, &levState, eor, limit, limit); } /* perform (L1) and (X9) ---------------------------------------------------- */ @@ -1088,6 +1544,159 @@ adjustWSLevels(UBiDi *pBiDi) { } } +#define BIDI_MIN(x, y) ((x)<(y) ? (x) : (y)) +#define BIDI_ABS(x) ((x)>=0 ? (x) : (-(x))) +static void +setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, + UBiDiLevel paraLevel, UErrorCode *pErrorCode) { + void *runsOnlyMemory; + int32_t *visualMap; + UChar *visualText; + const UBiDiLevel *levels; + UBiDiLevel *saveLevels; + Run *runs; + int32_t visualLength, i, j, visualStart, logicalStart, + runCount, runLength, addedRuns, insertRemove, + start, limit, step, indexOddBit, logicalPos, + index, index1; + uint32_t saveOptions; + + pBiDi->reorderingMode=UBIDI_REORDER_DEFAULT; + if(length==0) { + ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode); + goto cleanup3; + } + /* obtain memory for mapping table and visual text */ + runsOnlyMemory=uprv_malloc(length*(sizeof(int32_t)+sizeof(UChar)+sizeof(UBiDiLevel))); + if(runsOnlyMemory==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + goto cleanup3; + } + visualMap=runsOnlyMemory; + visualText=(UChar *)&visualMap[length]; + saveLevels=(UBiDiLevel *)&visualText[length]; + saveOptions=pBiDi->reorderingOptions; + if(saveOptions & UBIDI_OPTION_INSERT_MARKS) { + pBiDi->reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; + pBiDi->reorderingOptions|=UBIDI_OPTION_REMOVE_CONTROLS; + } + ubidi_setPara(pBiDi, text, length, paraLevel, NULL, pErrorCode); + levels=ubidi_getLevels(pBiDi, pErrorCode); + + /* FOOD FOR THOUGHT: instead of writing the visual text, we could use + * the visual map and the dirProps array to drive the second call + * to ubidi_setPara (but must make provision for possible removal of + * BiDi controls. Alternatively, only use the dirProps array via + * customized classifier callback. + */ + visualLength=ubidi_writeReordered(pBiDi, visualText, length, + UBIDI_DO_MIRRORING, pErrorCode); + pBiDi->reorderingOptions=saveOptions; + ubidi_getVisualMap(pBiDi, visualMap, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup2; + } + uprv_memcpy(saveLevels, levels, length*sizeof(UBiDiLevel)); + + pBiDi->reorderingMode=UBIDI_REORDER_INVERSE_LIKE_DIRECT; + paraLevel=pBiDi->paraLevel^1; + ubidi_setPara(pBiDi, visualText, visualLength, paraLevel, NULL, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + goto cleanup1; + } + ubidi_getRuns(pBiDi); + /* check if some runs must be split, count how many splits */ + addedRuns=0; + runCount=pBiDi->runCount; + runs=pBiDi->runs; + visualStart=0; + for(i=0; i<runCount; i++, visualStart+=runLength) { + runLength=runs[i].visualLimit-visualStart; + if(runLength<2) { + continue; + } + logicalStart=GET_INDEX(runs[i].logicalStart); + for(j=logicalStart+1; j<logicalStart+runLength; j++) { + index=visualMap[j]; + index1=visualMap[j-1]; + if((BIDI_ABS(index-index1)!=1) || (saveLevels[index]!=saveLevels[index1])) { + addedRuns++; + } + } + } + if(addedRuns) { + if(getRunsMemory(pBiDi, runCount+addedRuns)) { + if(runCount==1) { + /* because we switch from UBiDi.simpleRuns to UBiDi.runs */ + pBiDi->runsMemory[0]=runs[0]; + } + runs=pBiDi->runs=pBiDi->runsMemory; + pBiDi->runCount+=addedRuns; + } else { + goto cleanup1; + } + } + /* split runs which are not consecutive in source text */ + for(i=runCount-1; i>=0; i--) { + runLength= i==0 ? runs[0].visualLimit : + runs[i].visualLimit-runs[i-1].visualLimit; + logicalStart=runs[i].logicalStart; + indexOddBit=GET_ODD_BIT(logicalStart); + logicalStart=GET_INDEX(logicalStart); + if(runLength<2) { + if(addedRuns) { + runs[i+addedRuns]=runs[i]; + } + logicalPos=visualMap[logicalStart]; + runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, + saveLevels[logicalPos]^indexOddBit); + continue; + } + if(indexOddBit) { + start=logicalStart; + limit=logicalStart+runLength-1; + step=1; + } else { + start=logicalStart+runLength-1; + limit=logicalStart; + step=-1; + } + for(j=start; j!=limit; j+=step) { + index=visualMap[j]; + index1=visualMap[j+step]; + if((BIDI_ABS(index-index1)!=1) || (saveLevels[index]!=saveLevels[index1])) { + logicalPos=BIDI_MIN(visualMap[start], index); + runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, + saveLevels[logicalPos]^indexOddBit); + runs[i+addedRuns].visualLimit=runs[i].visualLimit; + runs[i].visualLimit-=BIDI_ABS(j-start)+1; + insertRemove=runs[i].insertRemove&(LRM_AFTER|RLM_AFTER); + runs[i+addedRuns].insertRemove=insertRemove; + runs[i].insertRemove&=~insertRemove; + start=j+step; + addedRuns--; + } + } + if(addedRuns) { + runs[i+addedRuns]=runs[i]; + } + logicalPos=BIDI_MIN(visualMap[start], visualMap[limit]); + runs[i+addedRuns].logicalStart=MAKE_INDEX_ODD_PAIR(logicalPos, + saveLevels[logicalPos]^indexOddBit); + } + + cleanup1: + /* restore initial paraLevel */ + pBiDi->paraLevel^=1; + cleanup2: + /* restore real text */ + pBiDi->text=text; + /* free memory for mapping table and visual text */ + uprv_free(runsOnlyMemory); + cleanup3: + pBiDi->reorderingMode=UBIDI_REORDER_RUNS_ONLY; +} + /* ubidi_setPara ------------------------------------------------------------ */ U_CAPI void U_EXPORT2 @@ -1111,22 +1720,26 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, length=u_strlen(text); } + /* special treatment for RUNS_ONLY mode */ + if(pBiDi->reorderingMode==UBIDI_REORDER_RUNS_ONLY) { + setParaRunsOnly(pBiDi, text, length, paraLevel, pErrorCode); + return; + } + /* initialize the UBiDi structure */ pBiDi->pParaBiDi=NULL; /* mark unfinished setPara */ pBiDi->text=text; - pBiDi->length=length; + pBiDi->length=pBiDi->originalLength=pBiDi->resultLength=length; pBiDi->paraLevel=paraLevel; pBiDi->direction=UBIDI_LTR; - pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */ + pBiDi->paraCount=1; pBiDi->dirProps=NULL; pBiDi->levels=NULL; pBiDi->runs=NULL; + pBiDi->insertPoints.size=0; /* clean up from last call */ + pBiDi->insertPoints.confirmed=0; /* clean up from last call */ - /* initialize paras for single paragraph */ - pBiDi->paraCount=1; - pBiDi->paras=pBiDi->simpleParas; - pBiDi->simpleParas[0]=length; /* * Save the original paraLevel if contextual; otherwise, set to 0. */ @@ -1173,6 +1786,9 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return; } + /* the processed length may have changed if UBIDI_OPTION_STREAMING */ + length= pBiDi->length; + pBiDi->trailingWSStart=length; /* the levels[] will reflect the WS run */ /* allocate paras memory */ if(pBiDi->paraCount>1) { if(getInitialParasMemory(pBiDi, pBiDi->paraCount)) { @@ -1182,6 +1798,10 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return; } + } else { + /* initialize paras for single paragraph */ + pBiDi->paras=pBiDi->simpleParas; + pBiDi->simpleParas[0]=length; } /* are explicit levels specified? */ @@ -1225,6 +1845,45 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, break; default: /* + * Choose the right implicit state table + */ + switch(pBiDi->reorderingMode) { + case UBIDI_REORDER_DEFAULT: + pBiDi->pImpTabPair=&impTab_DEFAULT; + break; + case UBIDI_REORDER_NUMBERS_SPECIAL: + pBiDi->pImpTabPair=&impTab_NUMBERS_SPECIAL; + break; + case UBIDI_REORDER_GROUP_NUMBERS_WITH_R: + pBiDi->pImpTabPair=&impTab_GROUP_NUMBERS_WITH_R; + break; + case UBIDI_REORDER_RUNS_ONLY: + /* we should never get here */ + pBiDi=NULL; + pBiDi->text=NULL; /* make the program crash! */ + break; + case UBIDI_REORDER_INVERSE_NUMBERS_AS_L: + pBiDi->pImpTabPair=&impTab_INVERSE_NUMBERS_AS_L; + break; + case UBIDI_REORDER_INVERSE_LIKE_DIRECT: + if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { + pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT_WITH_MARKS; + } else { + pBiDi->pImpTabPair=&impTab_INVERSE_LIKE_DIRECT; + } + break; + case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL: + if (pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { + pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL_WITH_MARKS; + } else { + pBiDi->pImpTabPair=&impTab_INVERSE_FOR_NUMBERS_SPECIAL; + } + break; + default: + pBiDi->pImpTabPair=&impTab_DEFAULT; + break; + } + /* * If there are no external levels specified and there * are no significant explicit level codes in the text, * then we can treat the entire paragraph as one run. @@ -1297,19 +1956,21 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, } } while(limit<length); } - + /* check if we got any memory shortage while adding insert points */ + if (U_FAILURE(pBiDi->insertPoints.errorCode)) + { + *pErrorCode=pBiDi->insertPoints.errorCode; + return; + } /* reset the embedding levels for some non-graphic characters (L1), (X9) */ adjustWSLevels(pBiDi); - - /* for "inverse BiDi", ubidi_getRuns() modifies the levels of numeric runs following RTL runs */ - if(pBiDi->isInverse) { - if(!ubidi_getRuns(pBiDi)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return; - } - } break; } + if(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { + pBiDi->resultLength -= pBiDi->controlCount; + } else { + pBiDi->resultLength += pBiDi->insertPoints.size; + } pBiDi->pParaBiDi=pBiDi; /* mark successful setPara */ } @@ -1350,12 +2011,30 @@ ubidi_getText(const UBiDi *pBiDi) { U_CAPI int32_t U_EXPORT2 ubidi_getLength(const UBiDi *pBiDi) { if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->originalLength; + } else { + return 0; + } +} + +U_CAPI int32_t U_EXPORT2 +ubidi_getProcessedLength(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { return pBiDi->length; } else { return 0; } } +U_CAPI int32_t U_EXPORT2 +ubidi_getResultLength(const UBiDi *pBiDi) { + if(IS_VALID_PARA_OR_LINE(pBiDi)) { + return pBiDi->resultLength; + } else { + return 0; + } +} + /* paragraphs API functions ------------------------------------------------- */ U_CAPI UBiDiLevel U_EXPORT2 @@ -1376,7 +2055,7 @@ ubidi_countParagraphs(UBiDi *pBiDi) { } } -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 ubidi_getParagraphByIndex(const UBiDi *pBiDi, int32_t paraIndex, int32_t *pParaStart, int32_t *pParaLimit, UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) { @@ -1408,7 +2087,7 @@ ubidi_getParagraphByIndex(const UBiDi *pBiDi, int32_t paraIndex, return; } -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ubidi_getParagraph(const UBiDi *pBiDi, int32_t charIndex, int32_t *pParaStart, int32_t *pParaLimit, UBiDiLevel *pParaLevel, UErrorCode *pErrorCode) { @@ -1430,140 +2109,53 @@ ubidi_getParagraph(const UBiDi *pBiDi, int32_t charIndex, return paraIndex; } -/* statetable prototype ----------------------------------------------------- */ - -/* - * This is here for possible future - * performance work and is not compiled right now. - */ - -#if 0 -/* - * This is a piece of code that could be part of ubidi.c/resolveImplicitLevels(). - * It replaces in the (Wn) state machine the switch()-if()-cascade with - * just a few if()s and a state table. - */ - -/* use the state table only for the following dirProp's */ -#define MASK_W_TABLE (FLAG(L)|FLAG(R)|FLAG(AL)|FLAG(EN)|FLAG(ES)|FLAG(CS)|FLAG(ET)|FLAG(AN)) - -/* - * inputs: - * - * 0..1 historyOfEN - 2b - * 2 prevDirProp==AN - 1b - * 3..4 lastStrong, one of { L, R, AL, none } - 2b - * 5..7 dirProp, one of { L, R, AL, EN, ES, CS, ET, AN } - 3b - * 8..9 nextDirProp, one of { EN, AN, other } - * - * total: 10b=1024 states - */ -enum { _L, _R, _AL, _EN, _ES, _CS, _ET, _AN, _OTHER }; /* lastStrong, dirProp */ -enum { __EN, __AN, __OTHER }; /* nextDirProp */ - -#define LAST_STRONG_SHIFT 3 -#define DIR_PROP_SHIFT 5 -#define NEXT_DIR_PROP_SHIFT 8 - -/* masks after shifting */ -#define LAST_STRONG_MASK 3 -#define DIR_PROP_MASK 7 -#define STATE_MASK 0x1f - -/* convert dirProp into _dirProp (above enum) */ -static DirProp inputDirProp[dirPropCount]={ _X<<DIR_PROP_SHIFT, ... }; - -/* convert dirProp into __dirProp (above enum) */ -static DirProp inputNextDirProp[dirPropCount]={ __X<<NEXT_DIR_PROP_SHIFT, ... }; - -/* - * outputs: - * - * dirProp, one of { L, R, EN, AN, ON } - 3b - * - * 0..1 historyOfEN - 2b - * 2 prevDirProp==AN - 1b - * 3..4 lastStrong, one of { L, R, AL, none } - 2b - * 5..7 new dirProp, one of { L, R, EN, AN, ON } - * - * total: 8 bits=1 byte per state - */ -enum { ___L, ___R, ___EN, ___AN, ___ON, ___count }; - -/* convert ___dirProp into dirProp (above enum) */ -static DirProp outputDirProp[___count]={ X, ... }; - -/* state table */ -static uint8_t wnTable[1024]={ /* calculate with switch()-if()-cascade */ }; +U_CAPI void U_EXPORT2 +ubidi_setClassCallback(UBiDi *pBiDi, UBiDiClassCallback *newFn, + const void *newContext, UBiDiClassCallback **oldFn, + const void **oldContext, UErrorCode *pErrorCode) +{ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return; + } else if(pBiDi==NULL) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if( oldFn ) + { + *oldFn = pBiDi->fnClassCallback; + } + if( oldContext ) + { + *oldContext = pBiDi->coClassCallback; + } + pBiDi->fnClassCallback = newFn; + pBiDi->coClassCallback = newContext; +} -static void -resolveImplicitLevels(BiDi *pBiDi, - Index start, Index end, - DirProp sor, DirProp eor) { - /* new variable */ - uint8_t state; - - /* remove variable lastStrong */ - - /* set initial state (set lastStrong, the rest is 0) */ - state= sor==L ? 0 : _R<<LAST_STRONG_SHIFT; - - while(next<limit) { - /* advance */ - prevDirProp=dirProp; - dirProp=nextDirProp; - i=next; - do { - if(++next<limit) { - nextDirProp=NO_CONTEXT_RTL(dirProps[next]); - } else { - nextDirProp=eor; - break; - } - } while(FLAG(nextDirProp)&MASK_BN_EXPLICIT); - - /* (W1..W7) */ - /* ### This may be more efficient with a switch(dirProp). */ - if(FLAG(dirProp)&MASK_W_TABLE) { - state=wnTable[ - ((int)state)| - inputDirProp[dirProp]| - inputNextDirProp[nextDirProp] - ]; - dirProp=outputDirProp[state>>DIR_PROP_SHIFT]; - state&=STATE_MASK; - } else if(dirProp==ET) { - /* get sequence of ET; advance only next, not current, previous or historyOfEN */ - while(next<limit && FLAG(nextDirProp)&MASK_ET_NSM_BN /* (W1), (X9) */) { - if(++next<limit) { - nextDirProp=NO_CONTEXT_RTL(dirProps[next]); - } else { - nextDirProp=eor; - break; - } - } +U_CAPI void U_EXPORT2 +ubidi_getClassCallback(UBiDi *pBiDi, UBiDiClassCallback **fn, const void **context) +{ + if( fn ) + { + *fn = pBiDi->fnClassCallback; + } + if( context ) + { + *context = pBiDi->coClassCallback; + } +} - state=wnTable[ - ((int)state)| - _ET<<DIR_PROP_SHIFT| - inputNextDirProp[nextDirProp] - ]; - dirProp=outputDirProp[state>>DIR_PROP_SHIFT]; - state&=STATE_MASK; - - /* apply the result of (W1), (W5)..(W7) to the entire sequence of ET */ - } else if(dirProp==NSM) { - /* (W1) */ - dirProp=prevDirProp; - /* keep prevDirProp's EN and AN states! */ - } else /* other */ { - /* set EN and AN states to 0 */ - state&=LAST_STRONG_MASK<<LAST_STRONG_SHIFT; - } +U_CAPI UCharDirection U_EXPORT2 +ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c) +{ + UCharDirection dir; - /* perform (Nn) and (In) as usual */ + if( pBiDi->fnClassCallback == NULL || + (dir = (*pBiDi->fnClassCallback)(pBiDi->coClassCallback, c)) == U_BIDI_CLASS_DEFAULT ) + { + return ubidi_getClass(pBiDi->bdp, c); + } else { + return dir; } - /* perform (Nn) and (In) as usual */ } -#endif diff --git a/Build/source/libs/icu-xetex/common/ubidi_props.c b/Build/source/libs/icu-xetex/common/ubidi_props.c index 4cba512d648..8538c6c5bd4 100644 --- a/Build/source/libs/icu-xetex/common/ubidi_props.c +++ b/Build/source/libs/icu-xetex/common/ubidi_props.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2004-2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -191,7 +191,9 @@ ubidi_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) { U_CAPI void U_EXPORT2 ubidi_closeProps(UBiDiProps *bdp) { if(bdp!=NULL) { +#if !UBIDI_HARDCODE_DATA udata_close(bdp->mem); +#endif uprv_free(bdp); } } @@ -199,17 +201,21 @@ ubidi_closeProps(UBiDiProps *bdp) { /* UBiDiProps singleton ----------------------------------------------------- */ static UBiDiProps *gBdp=NULL, *gBdpDummy=NULL; +#if !UBIDI_HARDCODE_DATA static UErrorCode gErrorCode=U_ZERO_ERROR; static int8_t gHaveData=0; +#endif static UBool U_CALLCONV ubidi_cleanup(void) { ubidi_closeProps(gBdp); gBdp=NULL; - gErrorCode=U_ZERO_ERROR; - gHaveData=0; ubidi_closeProps(gBdpDummy); gBdpDummy=NULL; +#if !UBIDI_HARDCODE_DATA + gErrorCode=U_ZERO_ERROR; + gHaveData=0; +#endif return TRUE; } diff --git a/Build/source/libs/icu-xetex/common/ubidi_props_data.c b/Build/source/libs/icu-xetex/common/ubidi_props_data.c index 1716c90a8e9..9b188ed53a2 100644 --- a/Build/source/libs/icu-xetex/common/ubidi_props_data.c +++ b/Build/source/libs/icu-xetex/common/ubidi_props_data.c @@ -1,43 +1,43 @@ /* - * Copyright (C) 1999-2005, International Business Machines + * Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * * file name: ubidi_props_data.c * - * machine-generated on: 2005-04-28 + * machine-generated on: 2006-06-13 */ -static const UVersionInfo ubidi_props_dataVersion={4,1,0,0}; +static const UVersionInfo ubidi_props_dataVersion={5,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x3bdc,0x39e8,0x1a,0x622,0x76e,0,0,0,0,0,0,0,0,0,0x3500b2}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x3f14,0x3d20,0x1a,0x622,0x76e,0,0,0,0,0,0,0,0,0,0x3500b2}; -static const uint16_t ubidi_props_trieIndex[7404]={ +static const uint16_t ubidi_props_trieIndex[7816]={ 0x250,0x258,0x260,0x268,0x270,0x278,0x280,0x288,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x28e,0x296,0x29e,0x2a6,0x2a6,0x2a6,0x2aa,0x2b2,0x248,0x248,0x2b5, 0x248,0x248,0x248,0x248,0x2bd,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x2c3,0x2c8,0x2d0,0x2d2, -0x2da,0x2e2,0x2ea,0x2f2,0x2f8,0x2ff,0x307,0x30f,0x317,0x31f,0x325,0x32c,0x330,0x337,0x2d2,0x2d2, -0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x33f,0x340,0x348,0x350,0x358,0x340,0x360,0x368, -0x33f,0x340,0x370,0x374,0x33f,0x340,0x37c,0x384,0x358,0x389,0x391,0x248,0x396,0x248,0x39e,0x3a2, -0x248,0x3a9,0x3b1,0x248,0x248,0x3b7,0x3bf,0x248,0x248,0x248,0x3c7,0x248,0x248,0x248,0x3cd,0x248, -0x248,0x3d3,0x3db,0x248,0x248,0x3df,0x3e7,0x248,0x3eb,0x3f2,0x248,0x3fa,0x402,0x409,0x395,0x248, -0x248,0x411,0x3eb,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x418,0x248,0x420,0x248,0x248,0x248, +0x2da,0x2e2,0x2ea,0x2f2,0x2f8,0x2ff,0x307,0x30f,0x317,0x31f,0x325,0x32c,0x330,0x337,0x33f,0x345, +0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x34d,0x34e,0x356,0x35e,0x366,0x34e,0x36e,0x376, +0x34d,0x34e,0x37e,0x382,0x34d,0x34e,0x38a,0x392,0x366,0x397,0x39f,0x248,0x3a4,0x248,0x3ac,0x3b0, +0x248,0x3b7,0x3bf,0x248,0x248,0x3c5,0x3cd,0x3d5,0x248,0x248,0x3dd,0x248,0x248,0x248,0x3e3,0x248, +0x248,0x3e9,0x3f1,0x248,0x248,0x3f5,0x3fd,0x248,0x401,0x408,0x248,0x410,0x418,0x41f,0x3a3,0x248, +0x248,0x427,0x401,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x42e,0x248,0x436,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x428,0x248,0x248,0x248,0x430,0x430,0x364,0x364,0x248,0x436,0x43e,0x420, -0x446,0x248,0x248,0x248,0x248,0x356,0x248,0x248,0x248,0x44e,0x456,0x248,0x248,0x248,0x458,0x460, -0x468,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x470,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x471,0x479,0x47d, -0x485,0x48b,0x492,0x49a,0x4a2,0x4aa,0x4b0,0x4b5,0x4bd,0x4c5,0x4cd,0x248,0x4d5,0x460,0x460,0x460, -0x4dd,0x4e5,0x4ed,0x4f5,0x4fa,0x502,0x50a,0x510,0x518,0x520,0x248,0x526,0x52d,0x460,0x461,0x248, -0x460,0x534,0x533,0x460,0x53c,0x248,0x248,0x45d,0x460,0x460,0x460,0x460,0x460,0x460,0x460,0x460, -0x460,0x460,0x460,0x460,0x544,0x54c,0x248,0x248,0x554,0x55a,0x55f,0x567,0x546,0x56d,0x575,0x57d, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x460,0x460,0x460,0x460,0x585,0x58c,0x594,0x59c, -0x5a4,0x5ac,0x5b4,0x5bb,0x5c3,0x5cb,0x5d2,0x5da,0x463,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x5e2,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x5ea,0x248,0x248,0x248,0x5f2,0x460,0x460,0x463,0x460,0x460,0x460,0x460,0x460,0x460,0x5f9,0x5ff, -0x607,0x60f,0x248,0x248,0x617,0x61e,0x248,0x287,0x248,0x248,0x248,0x248,0x248,0x248,0x464,0x248, -0x61f,0x248,0x4d5,0x627,0x248,0x62f,0x637,0x248,0x248,0x248,0x248,0x63b,0x248,0x248,0x458,0x286, +0x248,0x248,0x248,0x248,0x43e,0x248,0x248,0x248,0x446,0x446,0x372,0x372,0x248,0x44c,0x454,0x436, +0x45c,0x248,0x248,0x248,0x248,0x364,0x248,0x248,0x248,0x464,0x46c,0x248,0x248,0x248,0x46e,0x476, +0x47e,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x486,0x489,0x3a4,0x491,0x248,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x499,0x3b7, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x49c,0x4a4,0x4a8, +0x4b0,0x4b8,0x4bf,0x4c7,0x4cf,0x4d7,0x4dd,0x4e1,0x4e9,0x4f1,0x4f9,0x248,0x501,0x476,0x476,0x476, +0x509,0x511,0x519,0x521,0x526,0x52e,0x536,0x53c,0x544,0x54c,0x248,0x552,0x559,0x476,0x476,0x55f, +0x476,0x567,0x56f,0x476,0x577,0x248,0x248,0x473,0x476,0x476,0x476,0x476,0x476,0x476,0x476,0x476, +0x476,0x476,0x476,0x476,0x57f,0x587,0x248,0x248,0x58f,0x595,0x59a,0x5a2,0x581,0x5a8,0x5b0,0x5b8, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x476,0x476,0x476,0x476,0x5c0,0x5c7,0x5cf,0x5d7, +0x5df,0x5e7,0x5ef,0x5f6,0x5fe,0x606,0x60d,0x615,0x61d,0x625,0x248,0x248,0x248,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x62c,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, +0x634,0x248,0x248,0x248,0x63c,0x476,0x476,0x479,0x476,0x476,0x476,0x476,0x476,0x476,0x643,0x649, +0x651,0x659,0x248,0x248,0x661,0x668,0x248,0x287,0x248,0x248,0x248,0x248,0x248,0x248,0x47a,0x248, +0x669,0x248,0x501,0x671,0x248,0x679,0x681,0x248,0x248,0x248,0x248,0x685,0x248,0x248,0x46e,0x286, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, @@ -50,7 +50,7 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x460,0x460, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x476,0x476, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, @@ -94,9 +94,9 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x4d5,0x460,0x534,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x643,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x64b,0x652,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x501,0x476,0x567,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x61d,0x46d,0x248,0x248,0x248,0x248,0x248,0x248, +0x68d,0x694,0x248,0x697,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, @@ -120,8 +120,8 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x720,0x723,0x248,0x72b,0x248,0x72b,0x248,0x72b,0x248,0x72b,0x248,0x72b,0x248,0x72b,0x248,0x72b, -0x248,0x72b,0x248,0x72b,0x248,0x72b,0x248,0x72b,0x248,0x72b,0x733,0x72b,0x248,0x72b,0x248,0x72b, +0x787,0x78a,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792, +0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x248,0x792,0x79a,0x792,0x248,0x792,0x248,0x792, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, @@ -137,27 +137,27 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x655,0x65d,0x661,0x330,0x330,0x330,0x330,0x330, -0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x665,0x330,0x330,0x330,0x330,0x66d,0x671, -0x679,0x681,0x685,0x68d,0x330,0x330,0x330,0x691,0x699,0x260,0x6a1,0x6a9,0x248,0x248,0x248,0x6b1, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x69d,0x6a5,0x6a9,0x330,0x330,0x330,0x330,0x330, +0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x6ad,0x330,0x330,0x330,0x330,0x6b5,0x6b9, +0x6c1,0x6c9,0x6cd,0x6d5,0x330,0x330,0x330,0x6d9,0x6e1,0x260,0x6e9,0x6f1,0x248,0x248,0x248,0x6f9, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x6b9,0x248,0x460,0x460,0x533,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x6bd,0x248, -0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2, -0x6c5,0x6c9,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x701,0x248,0x476,0x476,0x56f,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, +0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x709,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2, +0x711,0x715,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2, 0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2, 0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2,0x2d2, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x6d1,0x6d9,0x6df,0x248,0x248, -0x460,0x460,0x6e7,0x248,0x248,0x248,0x248,0x248,0x460,0x460,0x643,0x248,0x248,0x248,0x248,0x248, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x71d,0x725,0x72b,0x248,0x248, +0x476,0x476,0x733,0x248,0x248,0x248,0x248,0x248,0x476,0x476,0x73b,0x248,0x248,0x248,0x248,0x248, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x6ec,0x6f0, +0x248,0x248,0x248,0x248,0x248,0x248,0x741,0x248,0x748,0x248,0x744,0x248,0x74b,0x248,0x753,0x757, 0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248, -0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x6f8, -0x700,0x708,0x708,0x708,0x710,0x710,0x710,0x710,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x718, -0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710, -0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710, -0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710,0x710, +0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x248,0x75f, +0x767,0x76f,0x76f,0x76f,0x777,0x777,0x777,0x777,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x77f, +0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777, +0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777, +0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777,0x777, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12, @@ -191,7 +191,7 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xa,0,0,0,0,0,1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1, 1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, @@ -219,108 +219,119 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, 0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0,0xb1,0xb1,0, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1, +1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa,0xa,0xa,0x21,1, +1,1,1,1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0, -0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0xb1,0,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, -0xa,4,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,0,0,0,0, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,4,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x300a,0xf00a,0x300a,0xf00a,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0,0xa0,0,0,0,0, -0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1, -0,0xb1,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0xb1,0xb1,0,0xb1,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0, +0,0,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,9,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, -9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa0,0xa0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,4,0,0xb1,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xb1,0xb1,0xb1,9,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0xb1, -0xb1,0x11,0x11,0x11,0,0,0,0,0,0,0xb1,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0,0,0,0,0xa,0,0,0,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0x300a,0xf00a,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa0,0xa0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4,0,0xb1,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,9,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0,9,9,9,9,9,9,9,9,9,9,9,0xb2, -0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,4,4,4,4, -4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,6,0x300a,0xf00a,0xa, +0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0x11,0x11,0x11,0,0,0,0, +0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, +0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,0x12,0x12,0x12,0x12, -0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2, -2,2,3,3,0xa,0x300a,0xf00a,0,2,2,2,2,2,2,2,2, -2,2,3,3,0xa,0x300a,0xf00a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, +9,9,9,9,9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6, +4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +6,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2, +0x12,0x12,0x12,0x12,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0, +2,2,2,2,2,2,3,3,0xa,0x300a,0xf00a,0,2,2,2,2, +2,2,2,2,2,2,3,3,0xa,0x300a,0xf00a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0, 0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0, 0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0, -0,0,4,0,0,0,0xa,0,0,0,0,0,0,0,0xa,0xa, +0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, 0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, -0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a, @@ -345,78 +356,85 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0xa,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0xa,0xa,0xa,0, -0,0,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x700a,0x300a,0xf00a,0xb00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a, -0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa, -0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a, -0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, +0xa,0xa,0xa,0xa,0,0xa,0,0xa,0xa,0xa,0xa,0,0,0,0xa,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a, -0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a, -0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a, -0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, -0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0x300a,0xf00a,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0,0,0,0,0, +0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0,0,0,0, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,9,0xa,0xa,0xa, -0xa,0,0,0,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0,0,0, -0,0,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, +0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x700a,0x300a,0xf00a, +0xb00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a, +0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa, +0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, +0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa, +0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa, +0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, +0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x100a,0xa,0x900a,0xa,0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a, +0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0x300a,0xf00a,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,9,0xa,0xa,0xa,0xa,0,0,0,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0xa,0x300a,0xf00a,0x100a,0xa,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0xa,0xa,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xa, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0, +0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0,0,0,0,0, +0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,0,0x11,0,0,0,0xb1,0,0,0,0,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0x11,0, -0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0, 0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0xb1,1,1,1,1,1,1,1,1,1,1,3,1,1, @@ -430,8 +448,8 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, 0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,4,0xa,0xa,3,3,0xa,0xa,0xa,0,0xa,4,4,0xa, +0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa,0xa,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0,0xa,4,4,0xa, 0,0,0,0,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xb2,0,0xa,0xa,4,4,4,0xa,0xa,0x300a,0xf00a,0xa,3, @@ -444,8 +462,9 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa, 0xa,0xa,0x12,0x12,0,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1, 0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,1, 1,1,1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, @@ -455,26 +474,33 @@ static const uint16_t ubidi_props_trieIndex[7404]={ 0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1, 0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1000, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x1000,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1000, +0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12, -0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0xb2,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x820,0,0x840,0x860,0,0,0,0,0,0,0,0,0,0,0,0, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x820,0,0x840,0x860, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x880,0x8a0,0,0,0,0,0,0,0,0,0,0x8c0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x880,0x8a0,0,0, +0,0,0,0,0,0,0,0x8c0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x8c0,0x8e0,0x900,0x900,0x900, +0,0,0,0,0,0,0,0x8c0,0x8e0,0x900,0x900,0x900,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0 }; static const uint32_t ubidi_props_mirrors[26]={ @@ -516,7 +542,7 @@ static const UBiDiProps ubidi_props_singleton={ NULL, utrie_defaultGetFoldingOffset, 2336, - 5068, + 5480, 0, TRUE }, diff --git a/Build/source/libs/icu-xetex/common/ubidiimp.h b/Build/source/libs/icu-xetex/common/ubidiimp.h index 2864aac6361..ca68858d32c 100644 --- a/Build/source/libs/icu-xetex/common/ubidiimp.h +++ b/Build/source/libs/icu-xetex/common/ubidiimp.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -119,34 +119,73 @@ enum { (UBiDiLevel)((ubidi)->defaultParaLevel ? (ubidi)->dirProps[index]>>7 \ : (ubidi)->paraLevel) -/* Paragraph type for multiple paragraph support --- -------------------- */ +/* Paragraph type for multiple paragraph support ---------------------------- */ typedef int32_t Para; #define CR 0x000D #define LF 0x000A /* Run structure for reordering --------------------------------------------- */ +enum { + LRM_BEFORE=1, + LRM_AFTER=2, + RLM_BEFORE=4, + RLM_AFTER=8 +}; typedef struct Run { int32_t logicalStart, /* first character of the run; b31 indicates even/odd level */ - visualLimit; /* last visual position of the run +1 */ + visualLimit, /* last visual position of the run +1 */ + insertRemove; /* if >0, flags for inserting LRM/RLM before/after run, + if <0, count of bidi controls within run */ } Run; /* in a Run, logicalStart will get this bit set if the run level is odd */ #define INDEX_ODD_BIT (1UL<<31) -#define MAKE_INDEX_ODD_PAIR(index, level) (index|((int32_t)level<<31)) -#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)level<<31)) +#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31)) +#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)(level)<<31)) #define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT) -#define GET_INDEX(x) (x&~INDEX_ODD_BIT) -#define GET_ODD_BIT(x) ((uint32_t)x>>31) -#define IS_ODD_RUN(x) ((x&INDEX_ODD_BIT)!=0) -#define IS_EVEN_RUN(x) ((x&INDEX_ODD_BIT)==0) +#define GET_INDEX(x) ((x)&~INDEX_ODD_BIT) +#define GET_ODD_BIT(x) ((uint32_t)(x)>>31) +#define IS_ODD_RUN(x) (((x)&INDEX_ODD_BIT)!=0) +#define IS_EVEN_RUN(x) (((x)&INDEX_ODD_BIT)==0) U_CFUNC UBool ubidi_getRuns(UBiDi *pBiDi); +/** BiDi control code points */ +enum { + ZWNJ_CHAR=0x200c, + ZWJ_CHAR, + LRM_CHAR, + RLM_CHAR, + LRE_CHAR=0x202a, + RLE_CHAR, + PDF_CHAR, + LRO_CHAR, + RLO_CHAR +}; + +#define IS_BIDI_CONTROL_CHAR(c) (((uint32_t)(c)&0xfffffffc)==ZWNJ_CHAR || (uint32_t)((c)-LRE_CHAR)<5) + +/* InsertPoints structure for noting where to put BiDi marks ---------------- */ + +typedef struct Point { + int32_t pos; /* position in text */ + int32_t flag; /* flag for LRM/RLM, before/after */ +} Point; + +typedef struct InsertPoints { + int32_t capacity; /* number of points allocated */ + int32_t size; /* number of points used */ + int32_t confirmed; /* number of points confirmed */ + UErrorCode errorCode; /* for eventual memory shortage */ + Point *points; /* pointer to array of points */ +} InsertPoints; + + /* UBiDi structure ----------------------------------------------------------- */ struct UBiDi { @@ -162,8 +201,21 @@ struct UBiDi { const UChar *text; /* length of the current text */ + int32_t originalLength; + + /* if the UBIDI_OPTION_STREAMING option is set, this is the length + * of text actually processed by ubidi_setPara, which may be shorter than + * the original length. + * Otherwise, it is identical to the original length. + */ int32_t length; + /* if the UBIDI_OPTION_REMOVE_CONTROLS option is set, and/or + * marks are allowed to be inserted in one of the reordering mode, the + * length of the result string may be different from the processed length. + */ + int32_t resultLength; + /* memory sizes in bytes */ int32_t dirPropsSize, levelsSize, parasSize, runsSize; @@ -182,7 +234,18 @@ struct UBiDi { /* are we performing an approximation of the "inverse BiDi" algorithm? */ UBool isInverse; - UBool isInverse2; + + /* are we using the basic algorithm or its variation? */ + UBiDiReorderingMode reorderingMode; + + /* UBIDI_REORDER_xxx values must be ordered so that all the regular + * logical to visual modes come first, and all inverse BiDi modes + * come last. + */ + #define UBIDI_REORDER_LAST_LOGICAL_TO_VISUAL UBIDI_REORDER_NUMBERS_SPECIAL + + /* bitmask for reordering options */ + uint32_t reorderingOptions; /* must block separators receive level 0? */ UBool orderParagraphsLTR; @@ -202,6 +265,9 @@ struct UBiDi { /* flags is a bit set for which directional properties are in the text */ Flags flags; + /* lastArabicPos is index to the last AL in the text, -1 if none */ + int32_t lastArabicPos; + /* characters after trailingWSStart are WS and are */ /* implicitly at the paraLevel (rule (L1)) - levels may not reflect that */ int32_t trailingWSStart; @@ -220,6 +286,16 @@ struct UBiDi { /* for non-mixed text, we only need a tiny array of runs (no malloc()) */ Run simpleRuns[1]; + + /* for inverse Bidi with insertion of directional marks */ + InsertPoints insertPoints; + + /* for option UBIDI_OPTION_REMOVE_CONTROLS */ + int32_t controlCount; + + /* for Bidi class callback */ + UBiDiClassCallback *fnClassCallback; /* action pointer */ + const void *coClassCallback; /* context pointer */ }; #define IS_VALID_PARA(x) ((x) && ((x)->pParaBiDi==(x))) diff --git a/Build/source/libs/icu-xetex/common/ubidiln.c b/Build/source/libs/icu-xetex/common/ubidiln.c index 71e5d15d164..31866b4764d 100644 --- a/Build/source/libs/icu-xetex/common/ubidiln.c +++ b/Build/source/libs/icu-xetex/common/ubidiln.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -142,6 +142,7 @@ ubidi_setLine(const UBiDi *pParaBiDi, return; } else if(ubidi_getParagraph(pParaBiDi, start, NULL, NULL, NULL, pErrorCode) != ubidi_getParagraph(pParaBiDi, limit-1, NULL, NULL, NULL, pErrorCode)) { + /* the line crosses a paragraph boundary */ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -150,10 +151,22 @@ ubidi_setLine(const UBiDi *pParaBiDi, pLineBiDi->pParaBiDi=NULL; /* mark unfinished setLine */ pLineBiDi->text=pParaBiDi->text+start; length=pLineBiDi->length=limit-start; + pLineBiDi->resultLength=pLineBiDi->originalLength=length; pLineBiDi->paraLevel=GET_PARALEVEL(pParaBiDi, start); pLineBiDi->paraCount=pParaBiDi->paraCount; pLineBiDi->runs=NULL; pLineBiDi->flags=0; + pLineBiDi->reorderingMode=pParaBiDi->reorderingMode; + pLineBiDi->reorderingOptions=pParaBiDi->reorderingOptions; + pLineBiDi->controlCount=0; + if(pParaBiDi->controlCount>0) { + int32_t j; + for(j=start; j<limit; j++) { + if(IS_BIDI_CONTROL_CHAR(pParaBiDi->text[j])) { + pLineBiDi->controlCount++; + } + } + } if(length>0) { pLineBiDi->dirProps=pParaBiDi->dirProps+start; @@ -384,6 +397,7 @@ getSingleRun(UBiDi *pBiDi, UBiDiLevel level) { /* fill and reorder the single run */ pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level); pBiDi->runs[0].visualLimit=pBiDi->length; + pBiDi->runs[0].insertRemove=0; } /* reorder the runs array (L2) ---------------------------------------------- */ @@ -469,7 +483,6 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { tempRun = runs[firstRun]; runs[firstRun]=runs[endRun]; runs[endRun]=tempRun; - ++firstRun; --endRun; } @@ -496,7 +509,6 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { tempRun=runs[firstRun]; runs[firstRun]=runs[runCount]; runs[runCount]=tempRun; - ++firstRun; --runCount; } @@ -505,12 +517,34 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { /* compute the runs array --------------------------------------------------- */ +static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex) { + Run *runs=pBiDi->runs; + int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart; + + for(i=0; i<runCount; i++) { + length=runs[i].visualLimit-visualStart; + logicalStart=GET_INDEX(runs[i].logicalStart); + if((logicalIndex>=logicalStart) && (logicalIndex<(logicalStart+length))) { + return i; + } + visualStart+=length; + } + /* we should never get here */ + i=length+25; + i/=(i-length-25); /* force program crash */ + return 0; +} + /* * Compute the runs array from the levels array. * After ubidi_getRuns() returns TRUE, runCount is guaranteed to be >0 * and the runs are reordered. * Odd-level runs have visualStart on their visual right edge and * they progress visually to the left. + * If option UBIDI_OPTION_INSERT_MARKS is set, insertRemove will contain the + * sum of appropriate LRM/RLM_BEFORE/AFTER flags. + * If option UBIDI_OPTION_REMOVE_CONTROLS is set, insertRemove will contain the + * negative number of BiDi control characters within this run. */ U_CFUNC UBool ubidi_getRuns(UBiDi *pBiDi) { @@ -578,8 +612,11 @@ ubidi_getRuns(UBiDi *pBiDi) { } /* set the runs */ - /* this could be optimized, e.g.: 464->444, 484->444, 575->555, 595->555 */ - /* however, that would take longer and make other functions more complicated */ + /* FOOD FOR THOUGHT: this could be optimized, e.g.: + * 464->444, 484->444, 575->555, 595->555 + * However, that would take longer. Check also how it would + * interact with BiDi control removal and inserting Marks. + */ runIndex=0; /* search for the run limits and initialize visualLimit values with the run lengths */ @@ -601,6 +638,7 @@ ubidi_getRuns(UBiDi *pBiDi) { /* i is another run limit */ runs[runIndex].logicalStart=start; runs[runIndex].visualLimit=i-start; + runs[runIndex].insertRemove=0; ++runIndex; } while(i<limit); @@ -622,11 +660,9 @@ ubidi_getRuns(UBiDi *pBiDi) { reorderLine(pBiDi, minLevel, maxLevel); /* now add the direction flags and adjust the visualLimit's to be just that */ - ADD_ODD_BIT_FROM_LEVEL(runs[0].logicalStart, levels[runs[0].logicalStart]); - limit=runs[0].visualLimit; - /* this loop will also handle the trailing WS run */ - for(i=1; i<runCount; ++i) { + limit=0; + for(i=0; i<runCount; ++i) { ADD_ODD_BIT_FROM_LEVEL(runs[i].logicalStart, levels[runs[i].logicalStart]); limit=runs[i].visualLimit+=limit; } @@ -643,6 +679,30 @@ ubidi_getRuns(UBiDi *pBiDi) { } } } + + /* handle insert LRM/RLM BEFORE/AFTER run */ + if(pBiDi->insertPoints.size>0) { + Point *point, *start=pBiDi->insertPoints.points, + *limit=start+pBiDi->insertPoints.size; + int32_t runIndex; + for(point=start; point<limit; point++) { + runIndex=getRunFromLogicalIndex(pBiDi, point->pos); + pBiDi->runs[runIndex].insertRemove|=point->flag; + } + } + + /* handle remove BiDi control characters */ + if(pBiDi->controlCount>0) { + int32_t runIndex; + const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu; + for(pu=start; pu<limit; pu++) { + if(IS_BIDI_CONTROL_CHAR(*pu)) { + runIndex=getRunFromLogicalIndex(pBiDi, pu-start); + pBiDi->runs[runIndex].insertRemove--; + } + } + } + return TRUE; } @@ -813,6 +873,7 @@ ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) U_CAPI int32_t U_EXPORT2 ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) { + int32_t visualIndex; if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return 0; } else if(!IS_VALID_PARA_OR_LINE(pBiDi)) { @@ -825,9 +886,11 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) /* we can do the trivial cases without the runs array */ switch(pBiDi->direction) { case UBIDI_LTR: - return logicalIndex; + visualIndex=logicalIndex; + break; case UBIDI_RTL: - return pBiDi->length-logicalIndex-1; + visualIndex=pBiDi->length-logicalIndex-1; + break; default: if(pBiDi->runCount<0 && !ubidi_getRuns(pBiDi)) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; @@ -843,92 +906,288 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) if(offset>=0 && offset<length) { if(IS_EVEN_RUN(runs[i].logicalStart)) { /* LTR */ - return visualStart+offset; + visualIndex=visualStart+offset; } else { /* RTL */ - return visualStart+length-offset-1; + visualIndex=visualStart+length-offset-1; } + break; /* exit for loop */ } visualStart+=length; } } } } + + if(pBiDi->insertPoints.size>0) { + /* add the number of added marks until the calculated visual index */ + Run *runs=pBiDi->runs; + int32_t i, length, insertRemove; + int32_t visualStart=0, markFound=0; + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + if(insertRemove & (LRM_BEFORE|RLM_BEFORE)) { + markFound++; + } + /* is it the run containing the visual index? */ + if(visualIndex<runs[i].visualLimit) { + return visualIndex+markFound; + } + if(insertRemove & (LRM_AFTER|RLM_AFTER)) { + markFound++; + } + } + } + else if(pBiDi->controlCount>0) { + /* subtract the number of controls until the calculated visual index */ + Run *runs=pBiDi->runs; + int32_t i, j, start, limit, length, insertRemove; + int32_t visualStart=0, controlFound=0; + UChar uchar=pBiDi->text[logicalIndex]; + /* is the logical index pointing to a control ? */ + if(IS_BIDI_CONTROL_CHAR(uchar)) { + return UBIDI_MAP_NOWHERE; + } + /* loop on runs */ + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + /* calculated visual index is beyond this run? */ + if(visualIndex>=runs[i].visualLimit) { + controlFound-=insertRemove; + continue; + } + /* calculated visual index must be within current run */ + if(insertRemove==0) { + return visualIndex-controlFound; + } + if(IS_EVEN_RUN(runs[i].logicalStart)) { + /* LTR: check from run start to logical index */ + start=runs[i].logicalStart; + limit=logicalIndex; + } else { + /* RTL: check from logical index to run end */ + start=logicalIndex+1; + limit=runs[i].logicalStart+length; + } + for(j=start; j<limit; j++) { + uchar=pBiDi->text[j]; + if(IS_BIDI_CONTROL_CHAR(uchar)) { + controlFound++; + } + } + return visualIndex-controlFound; + } + } + + return visualIndex; } U_CAPI int32_t U_EXPORT2 ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode) { + Run *runs; + int32_t i, runCount, start; if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return 0; } else if(!IS_VALID_PARA_OR_LINE(pBiDi)) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; - } else if(visualIndex<0 || pBiDi->length<=visualIndex) { + } else if(visualIndex<0 || pBiDi->resultLength<=visualIndex) { *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; - } else { - /* we can do the trivial cases without the runs array */ - switch(pBiDi->direction) { - case UBIDI_LTR: + } + /* we can do the trivial cases without the runs array */ + if(pBiDi->insertPoints.size==0 && pBiDi->controlCount==0) { + if(pBiDi->direction==UBIDI_LTR) { return visualIndex; - case UBIDI_RTL: + } + else if(pBiDi->direction==UBIDI_RTL) { return pBiDi->length-visualIndex-1; - default: - if(pBiDi->runCount<0 && !ubidi_getRuns(pBiDi)) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; - } else { - Run *runs=pBiDi->runs; - int32_t i, runCount=pBiDi->runCount, start; - - if(runCount<=10) { - /* linear search for the run */ - for(i=0; visualIndex>=runs[i].visualLimit; ++i) {} - } else { - /* binary search for the run */ - int32_t begin=0, limit=runCount; + } + if(pBiDi->runCount<0 && !ubidi_getRuns(pBiDi)) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + return 0; + } + } - /* the middle if() is guaranteed to find the run, we don't need a loop limit */ - for(;;) { - i=(begin+limit)/2; - if(visualIndex>=runs[i].visualLimit) { - begin=i+1; - } else if(i==0 || visualIndex>=runs[i-1].visualLimit) { - break; - } else { - limit=i; - } - } + runs=pBiDi->runs; + runCount=pBiDi->runCount; + if(pBiDi->insertPoints.size>0) { + /* handle inserted LRM/RLM */ + int32_t markFound=0, insertRemove; + int32_t visualStart=0, length; + runs=pBiDi->runs; + /* subtract number of marks until visual index */ + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { + if(visualIndex<=(visualStart+markFound)) { + return UBIDI_MAP_NOWHERE; } - - start=runs[i].logicalStart; - if(IS_EVEN_RUN(start)) { - /* LTR */ - /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */ - if(i>0) { - visualIndex-=runs[i-1].visualLimit; - } - return GET_INDEX(start)+visualIndex; - } else { - /* RTL */ - return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1; + markFound++; + } + /* is adjusted visual index within this run? */ + if(visualIndex<(runs[i].visualLimit+markFound)) { + visualIndex-=markFound; + break; + } + if(insertRemove&(LRM_AFTER|RLM_AFTER)) { + if(visualIndex==(visualStart+length+markFound)) { + return UBIDI_MAP_NOWHERE; + } + markFound++; + } + } + } + else if(pBiDi->controlCount>0) { + /* handle removed BiDi control characters */ + int32_t controlFound=0, insertRemove, length; + int32_t logicalStart, logicalEnd, visualStart=0, j, k; + UChar uchar; + UBool evenRun; + /* add number of controls until visual index */ + for(i=0; ; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + /* is adjusted visual index beyond current run? */ + if(visualIndex>=(runs[i].visualLimit-controlFound+insertRemove)) { + controlFound-=insertRemove; + continue; + } + /* adjusted visual index is within current run */ + if(insertRemove==0) { + visualIndex+=controlFound; + break; + } + /* count non-control chars until visualIndex */ + logicalStart=runs[i].logicalStart; + evenRun=IS_EVEN_RUN(logicalStart); + REMOVE_ODD_BIT(logicalStart); + logicalEnd=logicalStart+length-1; + for(j=0; j<length; j++) { + k= evenRun ? logicalStart+j : logicalEnd-j; + uchar=pBiDi->text[k]; + if(IS_BIDI_CONTROL_CHAR(uchar)) { + controlFound++; + } + if((visualIndex+controlFound)==(visualStart+j)) { + break; } } + visualIndex+=controlFound; + break; + } + } + /* handle all cases */ + if(runCount<=10) { + /* linear search for the run */ + for(i=0; visualIndex>=runs[i].visualLimit; ++i) {} + } else { + /* binary search for the run */ + int32_t begin=0, limit=runCount; + + /* the middle if() is guaranteed to find the run, we don't need a loop limit */ + for(;;) { + i=(begin+limit)/2; + if(visualIndex>=runs[i].visualLimit) { + begin=i+1; + } else if(i==0 || visualIndex>=runs[i-1].visualLimit) { + break; + } else { + limit=i; + } } } + + start=runs[i].logicalStart; + if(IS_EVEN_RUN(start)) { + /* LTR */ + /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */ + if(i>0) { + visualIndex-=runs[i-1].visualLimit; + } + return start+visualIndex; + } else { + /* RTL */ + return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1; + } } U_CAPI void U_EXPORT2 ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { - UBiDiLevel *levels; + const UBiDiLevel *levels; /* ubidi_getLevels() checks all of its and our arguments */ - if((levels=(UBiDiLevel *)ubidi_getLevels(pBiDi, pErrorCode))==NULL) { + if((levels=ubidi_getLevels(pBiDi, pErrorCode))==NULL) { /* no op */ } else if(indexMap==NULL) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; } else { ubidi_reorderLogical(levels, pBiDi->length, indexMap); + + if(pBiDi->insertPoints.size>0) { + int32_t markFound=0, runCount=pBiDi->runCount; + int32_t visualStart=0, length, insertRemove, i, j; + Run *runs=pBiDi->runs; + /* add number of marks found until each index */ + for(i=0; i<runCount; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { + markFound++; + } + if(markFound>0) { + int32_t logicalStart=GET_INDEX(runs[i].logicalStart); + int32_t limit=logicalStart+length; + for(j=logicalStart; j<limit; j++) { + indexMap[j]+=markFound; + } + } + if(insertRemove&(LRM_AFTER|RLM_AFTER)) { + markFound++; + } + } + } + else if(pBiDi->controlCount>0) { + int32_t controlFound=0, runCount=pBiDi->runCount; + int32_t visualStart=0, length, insertRemove, i, j, k; + int32_t logicalStart, logicalEnd; + UBool evenRun; + UChar uchar; + Run *runs=pBiDi->runs; + /* subtract number of controls found until each index */ + for(i=0; i<runCount; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + /* no control found within previous runs nor within this run */ + if((controlFound-insertRemove)==0) { + continue; + } + logicalStart=runs[i].logicalStart; + evenRun=IS_EVEN_RUN(logicalStart); + REMOVE_ODD_BIT(logicalStart); + logicalEnd=logicalStart+length-1; + /* if no control within this run */ + if(insertRemove==0) { + for(j=logicalStart; j<=logicalEnd; j++) { + indexMap[j]-=controlFound; + } + continue; + } + for(j=0; j<length; j++) { + k= evenRun ? logicalStart+j : logicalEnd-j; + uchar=pBiDi->text[k]; + if(IS_BIDI_CONTROL_CHAR(uchar)) { + controlFound++; + indexMap[k]=UBIDI_MAP_NOWHERE; + continue; + } + indexMap[k]-=controlFound; + } + } + } } } @@ -942,7 +1201,7 @@ ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { } else { /* fill a visual-to-logical index map using the runs[] */ Run *runs=pBiDi->runs, *runsLimit=runs+pBiDi->runCount; - int32_t logicalStart, visualStart, visualLimit; + int32_t logicalStart, visualStart, visualLimit, *pi=indexMap; visualStart=0; for(; runs<runsLimit; ++runs) { @@ -950,26 +1209,118 @@ ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode) { visualLimit=runs->visualLimit; if(IS_EVEN_RUN(logicalStart)) { do { /* LTR */ - *indexMap++ = logicalStart++; + *pi++ = logicalStart++; } while(++visualStart<visualLimit); } else { REMOVE_ODD_BIT(logicalStart); logicalStart+=visualLimit-visualStart; /* logicalLimit */ do { /* RTL */ - *indexMap++ = --logicalStart; + *pi++ = --logicalStart; } while(++visualStart<visualLimit); } /* visualStart==visualLimit; */ } + + if(pBiDi->insertPoints.size>0) { + int32_t markFound=0, runCount=pBiDi->runCount; + int32_t insertRemove, i, j, k; + runs=pBiDi->runs; + /* count all inserted marks */ + for(i=0; i<runCount; i++) { + insertRemove=runs[i].insertRemove; + if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { + markFound++; + } + if(insertRemove&(LRM_AFTER|RLM_AFTER)) { + markFound++; + } + } + /* move back indexes by number of preceding marks */ + k=pBiDi->resultLength; + for(i=runCount-1; i>=0 && markFound>0; i--) { + insertRemove=runs[i].insertRemove; + if(insertRemove&(LRM_AFTER|RLM_AFTER)) { + indexMap[--k]= UBIDI_MAP_NOWHERE; + markFound--; + } + visualStart= i>0 ? runs[i-1].visualLimit : 0; + for(j=runs[i].visualLimit-1; j>=visualStart && markFound>0; j--) { + indexMap[--k]=indexMap[j]; + } + if(insertRemove&(LRM_BEFORE|RLM_BEFORE)) { + indexMap[--k]= UBIDI_MAP_NOWHERE; + markFound--; + } + } + } + else if(pBiDi->controlCount>0) { + int32_t runCount=pBiDi->runCount, logicalEnd; + int32_t insertRemove, length, i, j, k, m; + UChar uchar; + UBool evenRun; + runs=pBiDi->runs; + visualStart=0; + /* move forward indexes by number of preceding controls */ + k=0; + for(i=0; i<runCount; i++, visualStart+=length) { + length=runs[i].visualLimit-visualStart; + insertRemove=runs[i].insertRemove; + /* if no control found yet, nothing to do in this run */ + if((insertRemove==0)&&(k==visualStart)) { + k+=length; + continue; + } + /* if no control in this run */ + if(insertRemove==0) { + visualLimit=runs[i].visualLimit; + for(j=visualStart; j<visualLimit; j++) { + indexMap[k++]=indexMap[j]; + } + continue; + } + logicalStart=runs[i].logicalStart; + evenRun=IS_EVEN_RUN(logicalStart); + REMOVE_ODD_BIT(logicalStart); + logicalEnd=logicalStart+length-1; + for(j=0; j<length; j++) { + m= evenRun ? logicalStart+j : logicalEnd-j; + uchar=pBiDi->text[m]; + if(!IS_BIDI_CONTROL_CHAR(uchar)) { + indexMap[k++]=m; + } + } + } + } } } U_CAPI void U_EXPORT2 ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) { - if(srcMap!=NULL && destMap!=NULL) { - srcMap+=length; + if(srcMap!=NULL && destMap!=NULL && length>0) { + const int32_t *pi; + int32_t destLength=-1, count=0; + /* find highest value and count positive indexes in srcMap */ + pi=srcMap+length; + while(pi>srcMap) { + if(*--pi>destLength) { + destLength=*pi; + } + if(*pi>=0) { + count++; + } + } + destLength++; /* add 1 for origin 0 */ + if(count<destLength) { + /* we must fill unmatched destMap entries with -1 */ + uprv_memset(destMap, 0xFF, destLength*sizeof(int32_t)); + } + pi=srcMap+length; while(length>0) { - destMap[*--srcMap]=--length; + if(*--pi>=0) { + destMap[*pi]=--length; + } else { + --length; + } } } } diff --git a/Build/source/libs/icu-xetex/common/ubidiwrt.c b/Build/source/libs/icu-xetex/common/ubidiwrt.c index 53b1bc1dd01..acbc4bb47ab 100644 --- a/Build/source/libs/icu-xetex/common/ubidiwrt.c +++ b/Build/source/libs/icu-xetex/common/ubidiwrt.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2005, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -46,18 +46,6 @@ # error reimplement ubidi_writeReordered() for UTF-8, see comment above #endif -/** BiDi control code points */ -enum { - LRM_CHAR=0x200e, - RLM_CHAR, - LRE_CHAR=0x202a, - RLE_CHAR, - PDF_CHAR, - LRO_CHAR, - RLO_CHAR -}; - -#define IS_BIDI_CONTROL_CHAR(c) (((uint32_t)(c)&0xfffffffe)==LRM_CHAR || (uint32_t)((c)-LRE_CHAR)<5) #define IS_COMBINING(type) ((1UL<<(type))&(1UL<<U_NON_SPACING_MARK|1UL<<U_COMBINING_SPACING_MARK|1UL<<U_ENCLOSING_MARK)) /* @@ -378,7 +366,7 @@ ubidi_writeReordered(UBiDi *pBiDi, /* more error checking */ if( pBiDi==NULL || - (text=ubidi_getText(pBiDi))==NULL || (length=ubidi_getLength(pBiDi))<0 || + (text=pBiDi->text)==NULL || (length=pBiDi->length)<0 || destSize<0 || (destSize>0 && dest==NULL)) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; @@ -388,7 +376,7 @@ ubidi_writeReordered(UBiDi *pBiDi, /* do input and output overlap? */ if( dest!=NULL && ((text>=dest && text<dest+destSize) || - (dest>=text && dest<text+length))) + (dest>=text && dest<text+pBiDi->originalLength))) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; @@ -409,13 +397,31 @@ ubidi_writeReordered(UBiDi *pBiDi, destCapacity=destSize; /* + * Option "insert marks" implies UBIDI_INSERT_LRM_FOR_NUMERIC if the + * reordering mode (checked below) is appropriate. + */ + if(pBiDi->reorderingOptions & UBIDI_OPTION_INSERT_MARKS) { + options|=UBIDI_INSERT_LRM_FOR_NUMERIC; + options&=~UBIDI_REMOVE_BIDI_CONTROLS; + } + /* + * Option "remove controls" implies UBIDI_REMOVE_BIDI_CONTROLS + * and cancels UBIDI_INSERT_LRM_FOR_NUMERIC. + */ + if(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS) { + options|=UBIDI_REMOVE_BIDI_CONTROLS; + options&=~UBIDI_INSERT_LRM_FOR_NUMERIC; + } + /* * If we do not perform the "inverse BiDi" algorithm, then we * don't need to insert any LRMs, and don't need to test for it. */ - if(!ubidi_isInverse(pBiDi)) { + if((pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_NUMBERS_AS_L) && + (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_LIKE_DIRECT) && + (pBiDi->reorderingMode != UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) && + (pBiDi->reorderingMode != UBIDI_REORDER_RUNS_ONLY)) { options&=~UBIDI_INSERT_LRM_FOR_NUMERIC; } - /* * Iterate through all visual runs and copy the run text segments to * the destination, according to the options. @@ -449,16 +455,34 @@ ubidi_writeReordered(UBiDi *pBiDi, /* insert BiDi controls for "inverse BiDi" */ const DirProp *dirProps=pBiDi->dirProps; const UChar *src; + UChar uc; UBiDiDirection dir; + int32_t markFlag; for(run=0; run<runCount; ++run) { dir=ubidi_getVisualRun(pBiDi, run, &logicalStart, &runLength); src=text+logicalStart; + /* check if something relevant in insertPoints */ + markFlag=pBiDi->runs[run].insertRemove; + if(markFlag<0) { /* insert count */ + markFlag=0; + } if(UBIDI_LTR==dir) { - if(/*run>0 &&*/ dirProps[logicalStart]!=L) { + if((pBiDi->isInverse) && + (/*run>0 &&*/ dirProps[logicalStart]!=L)) { + markFlag |= LRM_BEFORE; + } + if (markFlag & LRM_BEFORE) { + uc=LRM_CHAR; + } + else if (markFlag & RLM_BEFORE) { + uc=RLM_CHAR; + } + else uc=0; + if(uc) { if(destSize>0) { - *dest++=LRM_CHAR; + *dest++=uc; } --destSize; } @@ -469,16 +493,38 @@ ubidi_writeReordered(UBiDi *pBiDi, dest+=runLength; destSize-=runLength; - if(/*run<runCount-1 &&*/ dirProps[logicalStart+runLength-1]!=L) { + if((pBiDi->isInverse) && + (/*run<runCount-1 &&*/ dirProps[logicalStart+runLength-1]!=L)) { + markFlag |= LRM_AFTER; + } + if (markFlag & LRM_AFTER) { + uc=LRM_CHAR; + } + else if (markFlag & RLM_AFTER) { + uc=RLM_CHAR; + } + else uc=0; + if(uc) { if(destSize>0) { - *dest++=LRM_CHAR; + *dest++=uc; } --destSize; } - } else { - if(/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) { + } else { /* RTL run */ + if((pBiDi->isInverse) && + (/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1])))) { + markFlag |= RLM_BEFORE; + } + if (markFlag & LRM_BEFORE) { + uc=LRM_CHAR; + } + else if (markFlag & RLM_BEFORE) { + uc=RLM_CHAR; + } + else uc=0; + if(uc) { if(destSize>0) { - *dest++=RLM_CHAR; + *dest++=uc; } --destSize; } @@ -489,9 +535,20 @@ ubidi_writeReordered(UBiDi *pBiDi, dest+=runLength; destSize-=runLength; - if(/*run<runCount-1 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart]))) { + if((pBiDi->isInverse) && + (/*run<runCount-1 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart])))) { + markFlag |= RLM_AFTER; + } + if (markFlag & LRM_AFTER) { + uc=LRM_CHAR; + } + else if (markFlag & RLM_AFTER) { + uc=RLM_CHAR; + } + else uc=0; + if(uc) { if(destSize>0) { - *dest++=RLM_CHAR; + *dest++=uc; } --destSize; } diff --git a/Build/source/libs/icu-xetex/common/ubrk.cpp b/Build/source/libs/icu-xetex/common/ubrk.cpp index 7bf3e1066b6..3f941a5459f 100644 --- a/Build/source/libs/icu-xetex/common/ubrk.cpp +++ b/Build/source/libs/icu-xetex/common/ubrk.cpp @@ -1,6 +1,6 @@ /* ***************************************************************************************** -* Copyright (C) 1996-2005, International Business Machines +* Copyright (C) 1996-2006, International Business Machines * Corporation and others. All Rights Reserved. ***************************************************************************************** */ @@ -17,6 +17,7 @@ #include "unicode/uchriter.h" #include "unicode/rbbi.h" #include "rbbirb.h" +#include "uassert.h" U_NAMESPACE_USE @@ -59,6 +60,9 @@ ubrk_open(UBreakIteratorType type, case UBRK_TITLE: result = BreakIterator::createTitleInstance(Locale(locale), *status); break; + + default: + *status = U_ILLEGAL_ARGUMENT_ERROR; } // check for allocation error @@ -70,18 +74,12 @@ ubrk_open(UBreakIteratorType type, return 0; } + + UBreakIterator *uBI = (UBreakIterator *)result; if (text != NULL) { - UCharCharacterIterator *iter = 0; - iter = new UCharCharacterIterator(text, textLength); - if(iter == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - delete result; - return 0; - } - result->adoptText(iter); + ubrk_setText(uBI, text, textLength, status); } - - return (UBreakIterator*)result; + return uBI; } @@ -111,17 +109,11 @@ ubrk_openRules( const UChar *rules, return 0; } + UBreakIterator *uBI = (UBreakIterator *)result; if (text != NULL) { - UCharCharacterIterator *iter = 0; - iter = new UCharCharacterIterator(text, textLength); - if(iter == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - delete result; - return 0; - } - result->adoptText(iter); + ubrk_setText(uBI, text, textLength, status); } - return (UBreakIterator *)result; + return uBI; } @@ -142,6 +134,12 @@ ubrk_safeClone( *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } + // Clear any incoming Safe Clone Allocated warning. + // Propagating this through to our return would really + // confuse our caller. + if (*status==U_SAFECLONE_ALLOCATED_WARNING) { + *status = U_ZERO_ERROR; + } return (UBreakIterator *)(((BreakIterator*)bi)-> createBufferClone(stackBuffer, *pBufferSize, *status)); } @@ -168,33 +166,23 @@ ubrk_setText(UBreakIterator* bi, int32_t textLength, UErrorCode* status) { + BreakIterator *brit = (BreakIterator *)bi; + UText ut = UTEXT_INITIALIZER; + utext_openUChars(&ut, text, textLength, status); + brit->setText(&ut, *status); + // A stack allocated UText wrapping a UCHar * string + // can be dumped without explicitly closing it. +} - if (U_FAILURE(*status)) return; - - const CharacterIterator& biText = ((BreakIterator*)bi)->getText(); - int32_t textLen = (textLength == -1 ? u_strlen(text) : textLength); - if (biText.getDynamicClassID() == UCharCharacterIterator::getStaticClassID()) { - ((UCharCharacterIterator&)biText).setText(text, textLen); - } - else { - UCharCharacterIterator *iter = 0; - iter = new UCharCharacterIterator(text, textLen); - if(iter == 0) { - *status = U_MEMORY_ALLOCATION_ERROR; - return; - } - ((BreakIterator*)bi)->adoptText(iter); - } -} U_DRAFT void U_EXPORT2 ubrk_setUText(UBreakIterator *bi, UText *text, UErrorCode *status) { - BreakIterator *brit = (BreakIterator *)bi; - brit->setText(text, *status); + RuleBasedBreakIterator *brit = (RuleBasedBreakIterator *)bi; + brit->RuleBasedBreakIterator::setText(text, *status); } @@ -205,35 +193,35 @@ U_CAPI int32_t U_EXPORT2 ubrk_current(const UBreakIterator *bi) { - return ((BreakIterator*)bi)->current(); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::current(); } U_CAPI int32_t U_EXPORT2 ubrk_next(UBreakIterator *bi) { - return ((BreakIterator*)bi)->next(); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::next(); } U_CAPI int32_t U_EXPORT2 ubrk_previous(UBreakIterator *bi) { - return ((BreakIterator*)bi)->previous(); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::previous(); } U_CAPI int32_t U_EXPORT2 ubrk_first(UBreakIterator *bi) { - return ((BreakIterator*)bi)->first(); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::first(); } U_CAPI int32_t U_EXPORT2 ubrk_last(UBreakIterator *bi) { - return ((BreakIterator*)bi)->last(); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::last(); } U_CAPI int32_t U_EXPORT2 @@ -241,7 +229,7 @@ ubrk_preceding(UBreakIterator *bi, int32_t offset) { - return ((BreakIterator*)bi)->preceding(offset); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::preceding(offset); } U_CAPI int32_t U_EXPORT2 @@ -249,7 +237,7 @@ ubrk_following(UBreakIterator *bi, int32_t offset) { - return ((BreakIterator*)bi)->following(offset); + return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::following(offset); } U_CAPI const char* U_EXPORT2 @@ -270,20 +258,20 @@ ubrk_countAvailable() U_CAPI UBool U_EXPORT2 ubrk_isBoundary(UBreakIterator *bi, int32_t offset) { - return ((BreakIterator *)bi)->isBoundary(offset); + return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::isBoundary(offset); } U_CAPI int32_t U_EXPORT2 ubrk_getRuleStatus(UBreakIterator *bi) { - return ((RuleBasedBreakIterator *)bi)->getRuleStatus(); + return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::getRuleStatus(); } U_CAPI int32_t U_EXPORT2 ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status) { - return ((RuleBasedBreakIterator *)bi)->getRuleStatusVec(fillInVec, capacity, *status); + return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::getRuleStatusVec(fillInVec, capacity, *status); } diff --git a/Build/source/libs/icu-xetex/common/ubrkimpl.h b/Build/source/libs/icu-xetex/common/ubrkimpl.h new file mode 100644 index 00000000000..e4909712566 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/ubrkimpl.h @@ -0,0 +1,13 @@ +/* +********************************************************************** +* Copyright (C) 2006, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +*/ + +#ifndef UBRKIMPL_H +#define UBRKIMPL_H + +#define U_ICUDATA_BRKITR U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "brkitr" + +#endif /*UBRKIMPL_H*/ diff --git a/Build/source/libs/icu-xetex/common/ucase.c b/Build/source/libs/icu-xetex/common/ucase.c index de3f79a7ed4..c21045a06a4 100644 --- a/Build/source/libs/icu-xetex/common/ucase.c +++ b/Build/source/libs/icu-xetex/common/ucase.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2004-2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -196,7 +196,9 @@ ucase_openBinary(const uint8_t *bin, int32_t length, UErrorCode *pErrorCode) { U_CAPI void U_EXPORT2 ucase_close(UCaseProps *csp) { if(csp!=NULL) { +#if !UCASE_HARDCODE_DATA udata_close(csp->mem); +#endif uprv_free(csp); } } @@ -204,16 +206,20 @@ ucase_close(UCaseProps *csp) { /* UCaseProps singleton ----------------------------------------------------- */ static UCaseProps *gCsp=NULL, *gCspDummy=NULL; +#if !UCASE_HARDCODE_DATA static UErrorCode gErrorCode=U_ZERO_ERROR; static int8_t gHaveData=0; +#endif static UBool U_CALLCONV ucase_cleanup(void) { ucase_close(gCsp); gCsp=NULL; - gErrorCode=U_ZERO_ERROR; - gHaveData=0; ucase_close(gCspDummy); gCspDummy=NULL; +#if !UCASE_HARDCODE_DATA + gErrorCode=U_ZERO_ERROR; + gHaveData=0; +#endif return TRUE; } @@ -605,7 +611,7 @@ strcmpMax(const UChar *s, int32_t length, const UChar *t, int32_t max) { U_CAPI UBool U_EXPORT2 ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa) { const UChar *unfold, *p; - int32_t i, start, limit, result, unfoldRows, unfoldRowWidth, unfoldStringWidth, unfoldCPWidth; + int32_t i, start, limit, result, unfoldRows, unfoldRowWidth, unfoldStringWidth; if(csp->unfold==NULL || s==NULL) { return FALSE; /* no reverse case folding data, or no string */ @@ -625,7 +631,6 @@ ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length unfoldRows=unfold[UCASE_UNFOLD_ROWS]; unfoldRowWidth=unfold[UCASE_UNFOLD_ROW_WIDTH]; unfoldStringWidth=unfold[UCASE_UNFOLD_STRING_WIDTH]; - unfoldCPWidth=unfoldRowWidth-unfoldStringWidth; unfold+=unfoldRowWidth; if(length>unfoldStringWidth) { @@ -1479,3 +1484,116 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c, return (result==c) ? ~result : result; } + +/* case mapping properties API ---------------------------------------------- */ + +/* get the UCaseProps singleton, or else its dummy, once and for all */ +static const UCaseProps * +getCaseProps() { + /* + * This lazy intialization with double-checked locking (without mutex protection for + * the initial check) is transiently unsafe under certain circumstances. + * Check the readme and use u_init() if necessary. + */ + + /* the initial check is performed by the GET_CASE_PROPS() macro */ + const UCaseProps *csp; + UErrorCode errorCode=U_ZERO_ERROR; + + csp=ucase_getSingleton(&errorCode); + if(U_FAILURE(errorCode)) { + errorCode=U_ZERO_ERROR; + csp=ucase_getDummy(&errorCode); + if(U_FAILURE(errorCode)) { + return NULL; + } + } + + return csp; +} + +/* + * In ICU 3.0, most Unicode properties were loaded from uprops.icu. + * ICU 3.2 adds ucase.icu for case mapping properties. + * ICU 3.4 adds ubidi.icu for bidi/shaping properties and + * removes case/bidi/shaping properties from uprops.icu. + * + * Loading of uprops.icu was never mutex-protected and required u_init() + * for thread safety. + * In order to maintain performance for all such properties, + * ucase.icu and ubidi.icu are loaded lazily, without mutexing. + * u_init() will try to load them for thread safety, + * but u_init() will not fail if they are missing. + * + * uchar.c maintains a tri-state flag for (not loaded/loaded/failed to load) + * and an error code for load failure. + * Instead, here we try to load at most once. + * If it works, we use the resulting singleton object. + * If it fails, then we get a dummy object, which always works unless + * we are seriously out of memory. + * After the first try, we have a never-changing pointer to either the + * real singleton or the dummy. + * + * This method is used in Unicode properties APIs (uchar.h) that + * do not have a service object and also do not have an error code parameter. + * Other API implementations get the singleton themselves + * (with mutexing), store it in the service object, and report errors. + */ +#define GET_CASE_PROPS() (gCsp!=NULL ? gCsp : getCaseProps()) + +/* public API (see uchar.h) */ + +U_CAPI UBool U_EXPORT2 +u_isULowercase(UChar32 c) { + return (UBool)(UCASE_LOWER==ucase_getType(GET_CASE_PROPS(), c)); +} + +U_CAPI UBool U_EXPORT2 +u_isUUppercase(UChar32 c) { + return (UBool)(UCASE_UPPER==ucase_getType(GET_CASE_PROPS(), c)); +} + +/* Transforms the Unicode character to its lower case equivalent.*/ +U_CAPI UChar32 U_EXPORT2 +u_tolower(UChar32 c) { + return ucase_tolower(GET_CASE_PROPS(), c); +} + +/* Transforms the Unicode character to its upper case equivalent.*/ +U_CAPI UChar32 U_EXPORT2 +u_toupper(UChar32 c) { + return ucase_toupper(GET_CASE_PROPS(), c); +} + +/* Transforms the Unicode character to its title case equivalent.*/ +U_CAPI UChar32 U_EXPORT2 +u_totitle(UChar32 c) { + return ucase_totitle(GET_CASE_PROPS(), c); +} + +/* return the simple case folding mapping for c */ +U_CAPI UChar32 U_EXPORT2 +u_foldCase(UChar32 c, uint32_t options) { + return ucase_fold(GET_CASE_PROPS(), c, options); +} + +U_CFUNC int32_t U_EXPORT2 +ucase_hasBinaryProperty(UChar32 c, UProperty which) { + /* case mapping properties */ + const UCaseProps *csp=GET_CASE_PROPS(); + if(csp==NULL) { + return FALSE; + } + switch(which) { + case UCHAR_LOWERCASE: + return (UBool)(UCASE_LOWER==ucase_getType(csp, c)); + case UCHAR_UPPERCASE: + return (UBool)(UCASE_UPPER==ucase_getType(csp, c)); + case UCHAR_SOFT_DOTTED: + return ucase_isSoftDotted(csp, c); + case UCHAR_CASE_SENSITIVE: + return ucase_isCaseSensitive(csp, c); + default: + return FALSE; + } +} diff --git a/Build/source/libs/icu-xetex/common/ucase.h b/Build/source/libs/icu-xetex/common/ucase.h index 5781756692f..e3e5be0517d 100644 --- a/Build/source/libs/icu-xetex/common/ucase.h +++ b/Build/source/libs/icu-xetex/common/ucase.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2004-2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -238,6 +238,9 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c, const UChar **pString, uint32_t options); +U_CFUNC int32_t U_EXPORT2 +ucase_hasBinaryProperty(UChar32 c, UProperty which); + /* file definitions --------------------------------------------------------- */ #define UCASE_DATA_NAME "ucase" diff --git a/Build/source/libs/icu-xetex/common/ucase_props_data.c b/Build/source/libs/icu-xetex/common/ucase_props_data.c index 4bd3d7292db..854e67c3bae 100644 --- a/Build/source/libs/icu-xetex/common/ucase_props_data.c +++ b/Build/source/libs/icu-xetex/common/ucase_props_data.c @@ -1,42 +1,42 @@ /* - * Copyright (C) 1999-2005, International Business Machines + * Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * * file name: ucase_props_data.c * - * machine-generated on: 2005-04-28 + * machine-generated on: 2006-06-13 */ -static const UVersionInfo ucase_props_dataVersion={4,1,0,0}; +static const UVersionInfo ucase_props_dataVersion={5,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x44aa,0x37e8,0x4cf,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x466a,0x3980,0x4e3,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[7148]={ +static const uint16_t ucase_props_trieIndex[7352]={ 0x238,0x240,0x248,0x250,0x258,0x260,0x268,0x270,0x278,0x27e,0x285,0x288,0x290,0x298,0x2a0,0x2a8, -0x278,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0x2e8,0x2ee,0x2f6,0x2fe,0x305,0x30d,0x315,0x31b, -0x323,0x327,0x32b,0x278,0x333,0x278,0x33b,0x33f,0x347,0x34b,0x350,0x358,0x35f,0x367,0x36f,0x372, -0x37a,0x230,0x382,0x38a,0x230,0x230,0x38f,0x397,0x39c,0x3a1,0x3a9,0x230,0x230,0x3b0,0x230,0x230, +0x278,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0x2e8,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31c, +0x324,0x328,0x32c,0x278,0x334,0x278,0x33c,0x278,0x340,0x345,0x34a,0x352,0x359,0x361,0x369,0x36c, +0x374,0x230,0x37c,0x384,0x230,0x230,0x389,0x391,0x396,0x39b,0x3a3,0x230,0x230,0x3aa,0x230,0x3b0, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x3b8,0x3b9,0x3c1,0x3c9,0x3d1,0x3b9,0x3d9,0x3c9, 0x3b8,0x3b9,0x3e1,0x3e5,0x3b8,0x3b9,0x3ed,0x3c9,0x3d1,0x3f1,0x3f9,0x230,0x3fe,0x230,0x406,0x230, -0x230,0x40a,0x412,0x230,0x230,0x3f1,0x419,0x230,0x230,0x230,0x421,0x230,0x230,0x230,0x427,0x230, +0x230,0x40a,0x412,0x230,0x230,0x3f1,0x419,0x3c9,0x230,0x230,0x421,0x230,0x230,0x230,0x427,0x230, 0x230,0x42d,0x434,0x230,0x230,0x438,0x440,0x230,0x444,0x44b,0x230,0x452,0x45a,0x461,0x469,0x230, 0x230,0x46e,0x475,0x230,0x230,0x47d,0x485,0x3ff,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x487,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x48f,0x48f,0x495,0x495,0x230,0x49a,0x4a2,0x230, 0x4aa,0x230,0x4b2,0x230,0x230,0x407,0x230,0x230,0x230,0x4ba,0x230,0x230,0x230,0x230,0x230,0x230, -0x4c1,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x4c9,0x4c9,0x4c9,0x4d1,0x4cc,0x4d8,0x4e0,0x230, -0x278,0x4e8,0x278,0x4f0,0x4f3,0x278,0x4fb,0x33f,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x533,0x53b, -0x543,0x54a,0x230,0x552,0x55a,0x230,0x560,0x568,0x570,0x578,0x580,0x588,0x230,0x230,0x230,0x230, +0x4c1,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x4c9,0x4cc,0x4d4,0x4da,0x230,0x230,0x230,0x230, +0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x4e2,0x4e2,0x4e2,0x4ea,0x4e5,0x4f2,0x4fa,0x4fd, +0x278,0x505,0x278,0x50d,0x510,0x278,0x518,0x51b,0x523,0x52b,0x533,0x53b,0x543,0x54b,0x553,0x55b, +0x563,0x56a,0x230,0x572,0x57a,0x230,0x580,0x588,0x590,0x598,0x5a0,0x5a8,0x5b0,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x230,0x230,0x230,0x230,0x230,0x590,0x596,0x59c,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x230,0x230,0x230,0x230,0x230,0x5b3,0x5b9,0x5bf,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x5a4,0x5a9,0x5ad,0x230,0x278,0x278,0x278,0x5b5,0x5bd,0x5c5,0x230,0x23e,0x230,0x230,0x230,0x230, +0x5c7,0x5cc,0x5d0,0x5d8,0x278,0x278,0x278,0x5e0,0x5e8,0x5f0,0x230,0x23e,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x3d0,0x5cb,0x230,0x230,0x5d2,0x230,0x230,0x4b3,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x3d0,0x5f6,0x230,0x230,0x5fd,0x230,0x230,0x4b3,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, @@ -95,8 +95,8 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0x3cc,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x5da,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x5e1,0x3b7,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x605,0x60d,0x230,0x230,0x230,0x230,0x230,0x230, +0x614,0x3b7,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, @@ -120,8 +120,8 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x6e8,0x6eb,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x6f3,0x230,0x230,0x230,0x230,0x230, +0x71b,0x71e,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x726,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, @@ -137,20 +137,20 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x5e9,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x61c,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x5f1,0x5f9,0x230,0x230,0x230,0x230,0x230,0x23a,0x230,0x601,0x609,0x610,0x40a,0x230,0x230,0x618, +0x624,0x62c,0x230,0x230,0x230,0x230,0x230,0x23a,0x230,0x634,0x63c,0x643,0x40a,0x230,0x230,0x64b, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x620,0x626,0x62a,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x653,0x659,0x65d,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x632,0x636,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x63e,0x646,0x64c,0x230,0x230, -0x230,0x230,0x654,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, -0x65c,0x664,0x669,0x66f,0x677,0x67f,0x687,0x660,0x68f,0x697,0x69f,0x6a6,0x661,0x65c,0x664,0x65f, -0x66f,0x662,0x65d,0x6ae,0x660,0x6b6,0x6be,0x6c6,0x6cd,0x6b9,0x6c1,0x6c9,0x6d0,0x6bc,0x6d8,0x230, -0x3d1,0x6e0,0x6e0,0x6e0,0x230,0x230,0x230,0x230,0x6e0,0x6e0,0x6e0,0x6e0,0x6e0,0x6e0,0x6e0,0x5f1, +0x665,0x669,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x671,0x679,0x67f,0x230,0x230, +0x230,0x230,0x687,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, +0x68f,0x697,0x69c,0x6a2,0x6aa,0x6b2,0x6ba,0x693,0x6c2,0x6ca,0x6d2,0x6d9,0x694,0x68f,0x697,0x692, +0x6a2,0x695,0x690,0x6e1,0x693,0x6e9,0x6f1,0x6f9,0x700,0x6ec,0x6f4,0x6fc,0x703,0x6ef,0x70b,0x230, +0x3d1,0x713,0x713,0x713,0x230,0x230,0x230,0x230,0x713,0x713,0x713,0x713,0x713,0x713,0x713,0x624, 0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230,0x230, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -176,7 +176,7 @@ static const uint16_t ucase_props_trieIndex[7148]={ 1,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x41d,0x46,0xffc5, 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0xe1c6,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x49d, -1,0x3486,0x46,0xffc5,0x46,0xffc5,0x3386,0x46,0xffc5,0x3346,0x3346,0x46,0xffc5,1,0x13c6,0x3286, +0x30c5,0x3486,0x46,0xffc5,0x46,0xffc5,0x3386,0x46,0xffc5,0x3346,0x3346,0x46,0xffc5,1,0x13c6,0x3286, 0x32c6,0x46,0xffc5,0x3346,0x33c6,0x1845,0x34c6,0x3446,0x46,0xffc5,0x28c5,1,0x34c6,0x3546,0x2085,0x3586, 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x3686,0x46,0xffc5,0x3686,1,1,0x46,0xffc5,0x3686,0x46, 0xffc5,0x3646,0x3646,0x46,0xffc5,0x46,0xffc5,0x36c6,0x46,0xffc5,1,0,0x46,0xffc5,1,0xe05, @@ -185,71 +185,71 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, 0x6ad,0x72e,0x75f,0x79d,0x46,0xffc5,0xe7c6,0xf206,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, 0xdf86,1,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,1,1,1,1,1,1,2,0x46,0xffc5,0xd746,2,1, -1,0x14c6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x46,0xffc5,0x46,0xffc5,1,1,1,1,1,1,0x7ce,0x46,0xffc5,0xd746,0x7ee,1, +1,0x46,0xffc5,0xcf46,0x1146,0x11c6,0x46,0xffc5,0x46,0xffd5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, 1,1,1,0xcb85,0xcc85,1,0xccc5,0xccc5,1,0xcd85,1,0xcd45,1,1,1,1, -0xccc5,1,1,0xcc45,1,1,1,1,0xcbd5,0xcb45,1,1,1,1,1,0xcb45, -1,1,0xcac5,1,1,0xca85,1,1,1,1,1,1,1,1,1,1, -0xc985,1,1,0xc985,1,1,1,1,0xc985,1,0xc9c5,0xc9c5,1,1,1,1, -1,1,0xc945,1,0xeb45,1,1,1,1,1,1,1,1,0x11,1,1, +0xccc5,1,1,0xcc45,1,1,1,1,0xcbd5,0xcb45,1,0x80d,1,1,1,0xcb45, +1,1,0xcac5,1,1,0xca85,1,1,1,1,1,1,1,0x82d,1,1, +0xc985,1,1,0xc985,1,1,1,1,0xc985,0xeec5,0xc9c5,0xc9c5,0xee45,1,1,1, +1,1,0xc945,1,0,1,1,1,1,1,1,1,1,0x11,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0x11,1,1,1,1,1,1,0x40,0x40,0x40,0x44,0x40,0x44,0x40, 1,1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 1,1,1,1,1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x64,0x64,0x60,0x60,0x60,0x60,0x60,0x7cc,0x64,0x60,0x64,0x60,0x64,0x60,0x60,0x60, +0x64,0x64,0x60,0x60,0x60,0x60,0x60,0x84c,0x64,0x60,0x64,0x60,0x64,0x60,0x60,0x60, 0x60,0x60,0x60,0x64,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70, 0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x74,0x70,0x70,0x70,0x70,0x70,0x70, -0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x64,0x60,0x60,0x7dd,0x60,0x70, +0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x64,0x60,0x60,0x85d,0x60,0x70, 0x70,0x70,0x60,0x60,0x60,0x70,0x70,0x40,0x60,0x60,0x60,0x70,0x70,0x70,0x70,0x60, 0x70,0x70,0x70,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0,0x40,0x40,0,0, -0,0,1,0,0,0,0,0,0x40,0x40,0x986,0,0x946,0x946,0x946,0, -0x1006,0,0xfc6,0xfc6,0x82d,0x806,0x8fe,0x806,0x806,0x93e,0x806,0x806,0x97e,0x9ce,0xa1e,0x806, -0xa5e,0x806,0x806,0x806,0xa9e,0xade,0,0xb1e,0x806,0x806,0xb5e,0x806,0x806,0xb9e,0x806,0x806, -0xf685,0xf6c5,0xf6c5,0xf6c5,0xbdd,0xf805,0xcad,0xf805,0xf805,0xced,0xf805,0xf805,0xd2d,0xd7d,0xdcd,0xf805, -0xe0d,0xf805,0xf805,0xf805,0xe4d,0xe8d,0xecd,0xefd,0xf805,0xf805,0xf3d,0xf805,0xf805,0xf7d,0xf805,0xf805, -0xf005,0xf045,0xf045,0,0xfbd,0xfed,2,2,2,0x103d,0x106d,1,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x109d,0x10cd,0x1c5,0x11, -0x10fe,0x114d,0,0x46,0xffc5,0xfe46,0x46,0xffc5,1,2,2,2,0x1406,0x1406,0x1406,0x1406, -0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x806,0x806,0x806,0x806, -0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0xf805,0xf805,0xf805,0xf805, -0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xec05,0xec05,0xec05,0xec05, -0xec05,0xec05,0xec15,0xec05,0xec15,0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,0x46,0xffc5,0,0x60, -0x60,0x60,0x60,0,0x40,0x40,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,2,0x46,0xffc5,0x46, -0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0x46,0xffc5,0x46,0xffc5, +0,0,1,0x2085,0x2085,0x2085,0,0,0,0,0,0,0x40,0x40,0x986,0, +0x946,0x946,0x946,0,0x1006,0,0xfc6,0xfc6,0x8ad,0x806,0x97e,0x806,0x806,0x9be,0x806,0x806, +0x9fe,0xa4e,0xa9e,0x806,0xade,0x806,0x806,0x806,0xb1e,0xb5e,0,0xb9e,0x806,0x806,0xbde,0x806, +0x806,0xc1e,0x806,0x806,0xf685,0xf6c5,0xf6c5,0xf6c5,0xc5d,0xf805,0xd2d,0xf805,0xf805,0xd6d,0xf805,0xf805, +0xdad,0xdfd,0xe4d,0xf805,0xe8d,0xf805,0xf805,0xf805,0xecd,0xf0d,0xf4d,0xf7d,0xf805,0xf805,0xfbd,0xf805, +0xf805,0xffd,0xf805,0xf805,0xf005,0xf045,0xf045,0,0x103d,0x106d,2,2,2,0x10bd,0x10ed,1, 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0,0,0,0,0,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xc06,0xc06,0xc06, -0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, -0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0,0,0x40,0,0,0,0,0,0, -0,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405, +0x111d,0x114d,0x1c5,0x11,0x117e,0x11cd,0,0x46,0xffc5,0xfe46,0x46,0xffc5,1,0xdf86,0xdf86,0xdf86, +0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406,0x1406, +0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806, +0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805, +0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,0xec15,0xec05,0xec15,0xec05,0xec05,0xec05,0xec05,0xec05,0xec05,0xec05, +0x46,0xffc5,0,0x60,0x60,0x60,0x60,0,0x40,0x40,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, +0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, +0x3c6,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0xfc45, +0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, +0x46,0xffc5,0x46,0xffc5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, +0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0, +0,0x40,0,0,0,0,0,0,0,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405, 0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405, -0xf405,0xf405,0xf405,0x117d,0,0,0,0,0,0,0,0,0,0x70,0x60,0x60, -0x60,0x60,0x70,0x60,0x60,0x60,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x70,0x70, -0x70,0x70,0x70,0x70,0x60,0x60,0x70,0x60,0x60,0x70,0x70,0x60,0x70,0x70,0x70,0x70, -0x70,0x70,0x70,0x70,0x70,0x70,0,0x70,0x70,0x70,0,0x70,0,0x70,0x70,0, -0x60,0x70,0,0x70,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x40,0,0,0, -0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0,0,0,0, -0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,0,0, -0,0,0,0,0,0,0,0,0x40,0,0,0,0,0,0,0, -0,0,0,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x70,0x70,0x60, -0x60,0x60,0x60,0x60,0x70,0x60,0x60,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x70,0,0,0,0,0,0,0, +0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0x11fd,0,0,0,0, +0,0,0,0,0,0x70,0x60,0x60,0x60,0x60,0x70,0x60,0x60,0x60,0x70,0x70, +0x60,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x60,0x60,0x70,0x60, +0x60,0x70,0x70,0x60,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70, +0x70,0x70,0,0x70,0,0x70,0x70,0,0x60,0x70,0,0x70,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x40,0x40,0x60,0x60,0x60,0x60,0x70, -0x60,0x40,0x40,0x60,0x60,0,0x70,0x60,0x60,0x70,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40, -0,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x60,0x70,0x60,0x60,0x70,0x60,0x60,0x70,0x70,0x70,0x60,0x70, -0x70,0x60,0x70,0x60,0x60,0x60,0x70,0x60,0x70,0x60,0x70,0x60,0x70,0x60,0x60,0, +0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0, +0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0,0,0, +0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0,0,0,0,0,0,0, +0x40,0,0,0,0,0,0,0,0,0,0,0x70,0x70,0x70,0x70,0x70, +0x70,0x70,0x70,0x60,0x60,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x70,0x60,0x60,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x40,0x40,0x60,0x60,0x60,0x60,0x70,0x60,0x40,0x40,0x60,0x60,0,0x70,0x60, +0x60,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x40,0,0x70,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x60,0x70,0x60,0x60, +0x70,0x60,0x60,0x70,0x70,0x70,0x60,0x70,0x70,0x60,0x70,0x60,0x60,0x60,0x70,0x60, +0x70,0x60,0x70,0x60,0x70,0x60,0x60,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x70,0x60,0x40,0x40,0,0,0,0,0x40,0,0,0,0,0, 0,0x40,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x70,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0, @@ -299,9 +299,9 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0,0,0,0,0,0x40,0x40,0x40,0x40,0,0x40,0,0,0,0x40,0x70, 0,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0,0, -0,0,0,0,0x11fe,0x121e,0x123e,0x125e,0x127e,0x129e,0x12be,0x12de,0x12fe,0x131e,0x133e,0x135e, -0x137e,0x139e,0x13be,0x13de,0x13fe,0x141e,0x143e,0x145e,0x147e,0x149e,0x14be,0x14de,0x14fe,0x151e,0x153e,0x155e, -0x157e,0x159e,0x15be,0x15de,0x15fe,0x161e,0x163e,0x165e,0x167e,0x169e,0,0,0,0,0,0, +0,0,0,0,0x127e,0x129e,0x12be,0x12de,0x12fe,0x131e,0x133e,0x135e,0x137e,0x139e,0x13be,0x13de, +0x13fe,0x141e,0x143e,0x145e,0x147e,0x149e,0x14be,0x14de,0x14fe,0x151e,0x153e,0x155e,0x157e,0x159e,0x15be,0x15de, +0x15fe,0x161e,0x163e,0x165e,0x167e,0x169e,0x16be,0x16de,0x16fe,0x171e,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0x60,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40, @@ -318,37 +318,45 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0x40,0,0,0,0,0,0,0,0,0,0x40,0,0,0,0,0, 0,0x70,0x60,0x70,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0x60,0x70,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x11,1,1,1,1,1,1,1,1,1, +0,0,0,0,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x70,0,0x40,0x40,0x40,0x40,0x40,0,0x40,0,0,0, +0,0,0x40,0,0x30,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x60,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0, +0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x11,1,1,1,0x11,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x11,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x60,0x60,0x70,0x60,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffd5,0x46,0xffc5, +1,1,1,1,1,0x173d,1,1,1,1,1,1,0x11,1,1,1, +0x11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x60,0x60,0x70,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x60,0x70,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, +0x46,0xffd5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, +0x46,0xffc5,0x46,0xffc5,0x175e,0x179d,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, -0x16be,0x16fd,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, +0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x17dd,0x185d,0x18dd,0x195d,0x19dd,0x1a5d,0,0,0,0, +0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffd5,0x46,0xffc5,0x46,0xffc5, 0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x173d,0x17bd,0x183d,0x18bd,0x193d,0x19bd,0,0,0,0,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffd5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5, -0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0x205,0x205,0x205,0x205, +0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0,0,0,0,0,0x205,0x205,0x205,0x205, 0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x205,0x205,0x205,0x205, 0x205,0x205,0,0,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0,0,0x205,0x205,0x205,0x205, 0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x205,0x205,0x205,0x205, 0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x205,0x205,0x205,0x205, -0x205,0x205,0,0,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0,0,0x19ed,0x205,0x1a6d,0x205, -0x1b1d,0x205,0x1bcd,0x205,0,0xfe06,0,0xfe06,0,0xfe06,0,0xfe06,0x205,0x205,0x205,0x205, +0x205,0x205,0,0,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0,0,0x1a8d,0x205,0x1b0d,0x205, +0x1bbd,0x205,0x1c6d,0x205,0,0xfe06,0,0xfe06,0,0xfe06,0,0xfe06,0x205,0x205,0x205,0x205, 0x205,0x205,0x205,0x205,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0xfe06,0x1285,0x1285,0x1585,0x1585, -0x1585,0x1585,0x1905,0x1905,0x2005,0x2005,0x1c05,0x1c05,0x1f85,0x1f85,0,0,0x1c7d,0x1ced,0x1d5d,0x1dcd, -0x1e3d,0x1ead,0x1f1d,0x1f8d,0x1fff,0x206f,0x20df,0x214f,0x21bf,0x222f,0x229f,0x230f,0x237d,0x23ed,0x245d,0x24cd, -0x253d,0x25ad,0x261d,0x268d,0x26ff,0x276f,0x27df,0x284f,0x28bf,0x292f,0x299f,0x2a0f,0x2a7d,0x2aed,0x2b5d,0x2bcd, -0x2c3d,0x2cad,0x2d1d,0x2d8d,0x2dff,0x2e6f,0x2edf,0x2f4f,0x2fbf,0x302f,0x309f,0x310f,0x205,0x205,0x317d,0x31fd, -0x326d,0,0x32ed,0x336d,0xfe06,0xfe06,0xed86,0xed86,0x341f,0x40,0x348d,0x40,0x40,0x40,0x34dd,0x355d, -0x35cd,0,0x364d,0x36cd,0xea86,0xea86,0xea86,0xea86,0x377f,0x40,0x40,0x40,0x205,0x205,0x37ed,0x389d, -0,0,0x396d,0x39ed,0xfe06,0xfe06,0xe706,0xe706,0,0x40,0x40,0x40,0x205,0x205,0x3a9d,0x3b4d, -0x3c1d,0x1c5,0x3c9d,0x3d1d,0xfe06,0xfe06,0xe406,0xe406,0xfe46,0x40,0x40,0x40,0,0,0x3dcd,0x3e4d, -0x3ebd,0,0x3f3d,0x3fbd,0xe006,0xe006,0xe086,0xe086,0x406f,0x40,0x40,0,0,0,0,0, +0x1585,0x1585,0x1905,0x1905,0x2005,0x2005,0x1c05,0x1c05,0x1f85,0x1f85,0,0,0x1d1d,0x1d8d,0x1dfd,0x1e6d, +0x1edd,0x1f4d,0x1fbd,0x202d,0x209f,0x210f,0x217f,0x21ef,0x225f,0x22cf,0x233f,0x23af,0x241d,0x248d,0x24fd,0x256d, +0x25dd,0x264d,0x26bd,0x272d,0x279f,0x280f,0x287f,0x28ef,0x295f,0x29cf,0x2a3f,0x2aaf,0x2b1d,0x2b8d,0x2bfd,0x2c6d, +0x2cdd,0x2d4d,0x2dbd,0x2e2d,0x2e9f,0x2f0f,0x2f7f,0x2fef,0x305f,0x30cf,0x313f,0x31af,0x205,0x205,0x321d,0x329d, +0x330d,0,0x338d,0x340d,0xfe06,0xfe06,0xed86,0xed86,0x34bf,0x40,0x352d,0x40,0x40,0x40,0x357d,0x35fd, +0x366d,0,0x36ed,0x376d,0xea86,0xea86,0xea86,0xea86,0x381f,0x40,0x40,0x40,0x205,0x205,0x388d,0x393d, +0,0,0x3a0d,0x3a8d,0xfe06,0xfe06,0xe706,0xe706,0,0x40,0x40,0x40,0x205,0x205,0x3b3d,0x3bed, +0x3cbd,0x1c5,0x3d3d,0x3dbd,0xfe06,0xfe06,0xe406,0xe406,0xfe46,0x40,0x40,0x40,0,0,0x3e6d,0x3eed, +0x3f5d,0,0x3fdd,0x405d,0xe006,0xe006,0xe086,0xe086,0x410f,0x40,0x40,0,0,0,0,0, 0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0,0,0,0, 0,0,0,0,0,0x40,0,0,0,0,0,0,0,0,0,0x40, 0,0,0x40,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0, @@ -358,110 +366,115 @@ static const uint16_t ucase_props_trieIndex[7148]={ 0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x60,0x60,0x70,0x70,0x60,0x60,0x60,0x60,0x70,0x70,0x70,0x60,0x60,0x40,0x40,0x40, -0x40,0x60,0x40,0x40,0x40,0x70,0x70,0x60,0x70,0x60,0x70,0x70,0,0,0,0, +0x40,0x60,0x40,0x40,0x40,0x70,0x70,0x60,0x70,0x60,0x70,0x70,0x70,0x70,0x70,0x70, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,0,2,0,0,1,2,2,2,1,1, 2,2,2,1,0,2,0,0,0,2,2,2,2,2,0,0, -0,0,0,0,2,0,0x40de,0,2,0,0x411e,0x415e,2,2,0,1, -2,2,0,2,1,0,0,0,0,1,0,0,1,1,2,2, -0,0,0,0,0,2,1,1,0x11,0x11,0,0,0,0,0,0, +0,0,0,0,2,0,0x417e,0,2,0,0x41be,0x41fe,2,2,0,1, +2,2,0x706,2,1,0,0,0,0,1,0,0,1,1,2,2, +0,0,0,0,0,2,1,1,0x11,0x11,0,0,0,0,0xf905,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406,0x406, 0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05,0xfc05, +0,0,0,0x46,0xffc5,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686, -0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985, -0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, +0,0,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686,0x686, +0x686,0x686,0x686,0x686,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0xf985, +0xf985,0xf985,0xf985,0xf985,0xf985,0xf985,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc06,0xc06,0xc06,0xc06, 0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, -0xc06,0xc06,0xc06,0,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405, +0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0, 0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405, -0xf405,0xf405,0xf405,0,0x46,0xffc5,0x46,0xffc5,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x419d,0x41bd,0x41dd,0x41fd,0x421d,0x423d,0x425d,0x427d,0x429d,0x42bd,0x42dd,0x42fd, -0x431d,0x433d,0x435d,0x437d,0x439d,0x43bd,0x43dd,0x43fd,0x441d,0x443d,0x445d,0x447d,0x449d,0x44bd,0x44dd,0x44fd, -0x451d,0x453d,0x455d,0x457d,0x459d,0x45bd,0x45dd,0x45fd,0x461d,0x463d,0,0,0,0,0,0, +0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0xf405,0, +0x46,0xffc5,0x423e,0x425e,0x427e,0x429d,0x42bd,0x46,0xffc5,0x46,0xffc5,0x46,0xffc5,0,0,0, +0,0,0,0,1,0x46,0xffc5,1,0,0,0,0,0,0,0,0, +0x46,0xffc5,0x46,0xffc5,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x70,0x70,0x70,0x70,0x70,0x70,0,0x40,0x40,0x40, -0x40,0x40,0,0,0,0,0,0x40,0,0,0,0,0,0,0,0, +0x42dd,0x42fd,0x431d,0x433d,0x435d,0x437d,0x439d,0x43bd,0x43dd,0x43fd,0x441d,0x443d,0x445d,0x447d,0x449d,0x44bd, +0x44dd,0x44fd,0x451d,0x453d,0x455d,0x457d,0x459d,0x45bd,0x45dd,0x45fd,0x461d,0x463d,0x465d,0x467d,0x469d,0x46bd, +0x46dd,0x46fd,0x471d,0x473d,0x475d,0x477d,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x70,0x70,0x40,0x40,0x40,0x40,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0,0,0x70,0x70,0x70,0x70,0x70,0x70,0,0x40,0x40,0x40,0x40,0x40,0,0, +0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x70,0x70,0x40, +0x40,0x40,0x40,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0, -0,0,0,0,0,0,0,0,0,0,0x70,0,0,0,0,0x40, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x465d,0x46dd,0x475d,0x47dd,0x488d,0x493d,0x49dd,0,0,0,0,0, -0,0,0,0,0,0,0,0x4a7d,0x4afd,0x4b7d,0x4bfd,0x4c7d,0,0,0,0, -0,0,0x70,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x60,0x60,0x60,0x60,0,0,0,0,0,0,0,0, +0,0,0,0,0x40,0x40,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806, -0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0, -0,0,0x40,0,0x40,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805, -0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0, +0,0,0,0,0,0,0x70,0,0,0,0,0x40,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x40,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0,0,0,0, -0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06, -0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06, -0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605, -0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0,0x40,0x40,0, -0,0,0,0,0x40,0x70,0x40,0x60,0,0,0,0,0,0,0,0, +0x479d,0x481d,0x489d,0x491d,0x49cd,0x4a7d,0x4b1d,0,0,0,0,0,0,0,0,0, +0,0,0,0x4bbd,0x4c3d,0x4cbd,0x4d3d,0x4dbd,0,0,0,0,0,0,0x70,0, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x60,0x70,0x70,0,0,0,0,0x70,0,0,0,0,0,0x30,0x30,0x70, -0x70,0x70,0,0,0,0x30,0x30,0x30,0x30,0x30,0x30,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0,0,0x60,0x60,0x60, -0x60,0x60,0x70,0x70,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0,0, +0x60,0x60,0x60,0x60,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x60,0x60,0x60,0,0,0,0,0,0,0,0,0,0,0, +0,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806, +0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0x806,0,0,0,0x40,0, +0x40,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805, +0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0xf805,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x40,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x40, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x40,0x40,0x40,0,0,0,0,0xa06,0xa06,0xa06,0xa06, +0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06, +0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xa06,0xf605,0xf605,0xf605,0xf605, +0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605,0xf605, +0xf605,0xf605,0xf605,0xf605,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x40,0x40,0x40,0,0x40,0x40,0,0,0,0,0, +0x40,0x70,0x40,0x60,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x60,0x70,0x70,0, +0,0,0,0x70,0,0,0,0,0,0x30,0x30,0x70,0x70,0x70,0,0, +0,0x30,0x30,0x30,0x30,0x30,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, +0x70,0x70,0x70,0x70,0x70,0x70,0x70,0,0,0x60,0x60,0x60,0x60,0x60,0x70,0x70, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x60,0x60,0x60,0x60,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x60,0x60, +0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, -1,1,0x11,0x11,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,1,1,1,1,1,1,1,0,0x11,0x11,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,1,1,1,1,1,1,1,1,0x11,0x11, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1, -1,1,1,1,1,1,0x11,0x11,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,0,2,2,0,0,2,0, -0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2, -2,2,1,1,1,1,0,1,0,1,0x11,0x11,1,1,1,1, -0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1, +1,1,1,1,1,0,0x11,0x11,1,1,1,1,1,1,1,1, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, 1,1,0x11,0x11,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,0,2,2,2,2,0,2,2,2,2, -2,0,2,0,0,0,2,2,2,2,2,2,2,0,1,1, -1,1,1,1,1,1,0x11,0x11,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, +1,1,1,1,2,0,2,2,0,0,2,0,0,2,2,0, +0,2,2,2,2,0,2,2,2,2,2,2,2,2,1,1, +1,1,0,1,0,1,0x11,0x11,1,1,1,1,0,1,1,1, 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1, +2,2,2,2,2,2,2,2,1,1,1,1,2,2,0,2, +2,2,2,0,0,2,2,2,2,2,2,2,2,0,2,2, +2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x11,0x11, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2, +2,2,0,2,2,2,2,0,2,2,2,2,2,0,2,0, +0,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1, +1,1,0x11,0x11,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,0,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0, +1,1,1,1,1,1,2,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0,0x820,0x840,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0x820,0x840,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x860,0x880,0,0,0,0,0,0,0,0,0,0,0x8a0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x860,0x880,0,0, +0,0,0,0,0,0,0,0,0x8a0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0 }; -static const uint16_t ucase_props_exceptions[1231]={ +static const uint16_t ucase_props_exceptions[1251]={ 0xc041,0x69,2,0x130,0x131,0x4001,0x6a,0x41,0x6b,1,0x212a,0x41,0x73,1,0x17f,0x5044, 0x49,2,0x130,0x131,0x44,0x4b,1,0x212a,0x44,0x53,1,0x17f,6,0x3bc,0x39c,0x41, 0xe5,1,0x212b,0x4001,0xec,0x4001,0xed,0x80,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x44, @@ -469,76 +482,78 @@ static const uint16_t ucase_props_exceptions[1231]={ 0x130,0x80,0x2220,0x2bc,0x6e,0x2bc,0x4e,0x2bc,0x4e,6,0x73,0x53,9,0x1c6,0x1c5,0xd, 0x1c6,0x1c4,0x1c5,0xc,0x1c4,0x1c5,9,0x1c9,0x1c8,0xd,0x1c9,0x1c7,0x1c8,0xc,0x1c7,0x1c8, 9,0x1cc,0x1cb,0xd,0x1cc,0x1ca,0x1cb,0xc,0x1ca,0x1cb,0x80,0x2220,0x6a,0x30c,0x4a,0x30c, -0x4a,0x30c,9,0x1f3,0x1f2,0xd,0x1f3,0x1f1,0x1f2,0xc,0x1f1,0x1f2,0x6000,0x3046,0x3b9,0x399, -1,0x1fbe,0xc0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x41, -0x3b2,1,0x3d0,0x41,0x3b5,1,0x3f5,0x41,0x3b8,2,0x3d1,0x3f4,0x41,0x3b9,2,0x345, -0x1fbe,0x41,0x3ba,1,0x3f0,0x41,0x3bc,1,0xb5,0x41,0x3c0,1,0x3d6,0x41,0x3c1,1, -0x3f1,0x4041,0x3c3,1,0x3c2,0x41,0x3c6,1,0x3d5,0x41,0x3c9,1,0x2126,0xc0,1,0x3330, -0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x44,0x392,1,0x3d0,0x44,0x395, -1,0x3f5,0x44,0x398,2,0x3d1,0x3f4,0x44,0x399,2,0x345,0x1fbe,0x44,0x39a,1,0x3f0, -0x44,0x39c,1,0xb5,0x44,0x3a0,1,0x3d6,0x44,0x3a1,1,0x3f1,6,0x3c3,0x3a3,0x44, -0x3a3,1,0x3c2,0x44,0x3a6,1,0x3d5,0x44,0x3a9,1,0x2126,6,0x3b2,0x392,0x46,0x3b8, -0x398,1,0x3f4,6,0x3c6,0x3a6,6,0x3c0,0x3a0,6,0x3ba,0x39a,6,0x3c1,0x3a1,0x41, -0x3b8,2,0x398,0x3d1,6,0x3b5,0x395,0x80,0x2220,0x565,0x582,0x535,0x552,0x535,0x582,1, -0x2d00,1,0x2d01,1,0x2d02,1,0x2d03,1,0x2d04,1,0x2d05,1,0x2d06,1,0x2d07,1, -0x2d08,1,0x2d09,1,0x2d0a,1,0x2d0b,1,0x2d0c,1,0x2d0d,1,0x2d0e,1,0x2d0f,1, -0x2d10,1,0x2d11,1,0x2d12,1,0x2d13,1,0x2d14,1,0x2d15,1,0x2d16,1,0x2d17,1, -0x2d18,1,0x2d19,1,0x2d1a,1,0x2d1b,1,0x2d1c,1,0x2d1d,1,0x2d1e,1,0x2d1f,1, -0x2d20,1,0x2d21,1,0x2d22,1,0x2d23,1,0x2d24,1,0x2d25,0x41,0x1e61,1,0x1e9b,0x44, -0x1e60,1,0x1e9b,0x80,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x80,0x2220,0x74,0x308,0x54, -0x308,0x54,0x308,0x80,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x80,0x2220,0x79,0x30a,0x59, -0x30a,0x59,0x30a,0x80,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,6,0x1e61,0x1e60,0x80,0x2220, -0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x80,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313, -0x300,0x80,0x3330,0x3c5,0x313,0x301,0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x80,0x3330,0x3c5,0x313, -0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x84,0x1f88,0x220,0x1f00,0x3b9,0x1f08,0x399,0x84,0x1f89, -0x220,0x1f01,0x3b9,0x1f09,0x399,0x84,0x1f8a,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x84,0x1f8b,0x220,0x1f03, -0x3b9,0x1f0b,0x399,0x84,0x1f8c,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x84,0x1f8d,0x220,0x1f05,0x3b9,0x1f0d, -0x399,0x84,0x1f8e,0x220,0x1f06,0x3b9,0x1f0e,0x399,0x84,0x1f8f,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x81, -0x1f80,0x220,0x1f00,0x3b9,0x1f08,0x399,0x81,0x1f81,0x220,0x1f01,0x3b9,0x1f09,0x399,0x81,0x1f82,0x220, -0x1f02,0x3b9,0x1f0a,0x399,0x81,0x1f83,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x81,0x1f84,0x220,0x1f04,0x3b9, -0x1f0c,0x399,0x81,0x1f85,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x81,0x1f86,0x220,0x1f06,0x3b9,0x1f0e,0x399, -0x81,0x1f87,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x84,0x1f98,0x220,0x1f20,0x3b9,0x1f28,0x399,0x84,0x1f99, -0x220,0x1f21,0x3b9,0x1f29,0x399,0x84,0x1f9a,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x84,0x1f9b,0x220,0x1f23, -0x3b9,0x1f2b,0x399,0x84,0x1f9c,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x84,0x1f9d,0x220,0x1f25,0x3b9,0x1f2d, -0x399,0x84,0x1f9e,0x220,0x1f26,0x3b9,0x1f2e,0x399,0x84,0x1f9f,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x81, -0x1f90,0x220,0x1f20,0x3b9,0x1f28,0x399,0x81,0x1f91,0x220,0x1f21,0x3b9,0x1f29,0x399,0x81,0x1f92,0x220, -0x1f22,0x3b9,0x1f2a,0x399,0x81,0x1f93,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x81,0x1f94,0x220,0x1f24,0x3b9, -0x1f2c,0x399,0x81,0x1f95,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x81,0x1f96,0x220,0x1f26,0x3b9,0x1f2e,0x399, -0x81,0x1f97,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x84,0x1fa8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x84,0x1fa9, -0x220,0x1f61,0x3b9,0x1f69,0x399,0x84,0x1faa,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x84,0x1fab,0x220,0x1f63, -0x3b9,0x1f6b,0x399,0x84,0x1fac,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x84,0x1fad,0x220,0x1f65,0x3b9,0x1f6d, -0x399,0x84,0x1fae,0x220,0x1f66,0x3b9,0x1f6e,0x399,0x84,0x1faf,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x81, -0x1fa0,0x220,0x1f60,0x3b9,0x1f68,0x399,0x81,0x1fa1,0x220,0x1f61,0x3b9,0x1f69,0x399,0x81,0x1fa2,0x220, -0x1f62,0x3b9,0x1f6a,0x399,0x81,0x1fa3,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x81,0x1fa4,0x220,0x1f64,0x3b9, -0x1f6c,0x399,0x81,0x1fa5,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x81,0x1fa6,0x220,0x1f66,0x3b9,0x1f6e,0x399, -0x81,0x1fa7,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x80,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x84, -0x1fbc,0x220,0x3b1,0x3b9,0x391,0x399,0x80,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x80,0x2220, -0x3b1,0x342,0x391,0x342,0x391,0x342,0x80,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342, -0x345,0x81,0x1fb3,0x220,0x3b1,0x3b9,0x391,0x399,0x46,0x3b9,0x399,1,0x345,0x80,0x2220,0x1f74, -0x3b9,0x1fca,0x399,0x1fca,0x345,0x84,0x1fcc,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x2220,0x3ae,0x3b9, -0x389,0x399,0x389,0x345,0x80,0x2220,0x3b7,0x342,0x397,0x342,0x397,0x342,0x80,0x3330,0x3b7,0x342, -0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0x81,0x1fc3,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x3330, -0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308,0x300,0xc0,1,0x3330,0x3b9,0x308,0x301,0x399, -0x308,0x301,0x399,0x308,0x301,0x390,0x80,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x80,0x3330, -0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308,0x342,0x80,0x3330,0x3c5,0x308,0x300,0x3a5,0x308, -0x300,0x3a5,0x308,0x300,0xc0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301, -0x3b0,0x80,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1,0x313,0x80,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5, -0x342,0x80,0x3330,0x3c5,0x308,0x342,0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x80,0x2220,0x1f7c,0x3b9, -0x1ffa,0x399,0x1ffa,0x345,0x84,0x1ffc,0x220,0x3c9,0x3b9,0x3a9,0x399,0x80,0x2220,0x3ce,0x3b9,0x38f, -0x399,0x38f,0x345,0x80,0x2220,0x3c9,0x342,0x3a9,0x342,0x3a9,0x342,0x80,0x3330,0x3c9,0x342,0x3b9, -0x3a9,0x342,0x399,0x3a9,0x342,0x345,0x81,0x1ff3,0x220,0x3c9,0x3b9,0x3a9,0x399,0x41,0x3c9,1, -0x3a9,0x41,0x6b,1,0x4b,0x41,0xe5,1,0xc5,4,0x10a0,4,0x10a1,4,0x10a2,4, -0x10a3,4,0x10a4,4,0x10a5,4,0x10a6,4,0x10a7,4,0x10a8,4,0x10a9,4,0x10aa,4, -0x10ab,4,0x10ac,4,0x10ad,4,0x10ae,4,0x10af,4,0x10b0,4,0x10b1,4,0x10b2,4, -0x10b3,4,0x10b4,4,0x10b5,4,0x10b6,4,0x10b7,4,0x10b8,4,0x10b9,4,0x10ba,4, -0x10bb,4,0x10bc,4,0x10bd,4,0x10be,4,0x10bf,4,0x10c0,4,0x10c1,4,0x10c2,4, -0x10c3,4,0x10c4,4,0x10c5,0x80,0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x80,0x2220,0x66, -0x69,0x46,0x49,0x46,0x69,0x80,0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x80,0x3330,0x66, -0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x80,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c, -0x46,0x66,0x6c,0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb06,0xc0,1,0x2220, -0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x80,0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x80, -0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x80,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x80, -0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x80,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d +0x4a,0x30c,9,0x1f3,0x1f2,0xd,0x1f3,0x1f1,0x1f2,0xc,0x1f1,0x1f2,1,0x2c65,1,0x2c66, +4,0x2c62,4,0x2c64,0x6000,0x3046,0x3b9,0x399,1,0x1fbe,0xc0,1,0x3330,0x3b9,0x308,0x301, +0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x41,0x3b2,1,0x3d0,0x41,0x3b5,1,0x3f5,0x41, +0x3b8,2,0x3d1,0x3f4,0x41,0x3b9,2,0x345,0x1fbe,0x41,0x3ba,1,0x3f0,0x41,0x3bc,1, +0xb5,0x41,0x3c0,1,0x3d6,0x41,0x3c1,1,0x3f1,0x4041,0x3c3,1,0x3c2,0x41,0x3c6,1, +0x3d5,0x41,0x3c9,1,0x2126,0xc0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308, +0x301,0x1fe3,0x44,0x392,1,0x3d0,0x44,0x395,1,0x3f5,0x44,0x398,2,0x3d1,0x3f4,0x44, +0x399,2,0x345,0x1fbe,0x44,0x39a,1,0x3f0,0x44,0x39c,1,0xb5,0x44,0x3a0,1,0x3d6, +0x44,0x3a1,1,0x3f1,6,0x3c3,0x3a3,0x44,0x3a3,1,0x3c2,0x44,0x3a6,1,0x3d5,0x44, +0x3a9,1,0x2126,6,0x3b2,0x392,0x46,0x3b8,0x398,1,0x3f4,6,0x3c6,0x3a6,6,0x3c0, +0x3a0,6,0x3ba,0x39a,6,0x3c1,0x3a1,0x41,0x3b8,2,0x398,0x3d1,6,0x3b5,0x395,0x80, +0x2220,0x565,0x582,0x535,0x552,0x535,0x582,1,0x2d00,1,0x2d01,1,0x2d02,1,0x2d03,1, +0x2d04,1,0x2d05,1,0x2d06,1,0x2d07,1,0x2d08,1,0x2d09,1,0x2d0a,1,0x2d0b,1, +0x2d0c,1,0x2d0d,1,0x2d0e,1,0x2d0f,1,0x2d10,1,0x2d11,1,0x2d12,1,0x2d13,1, +0x2d14,1,0x2d15,1,0x2d16,1,0x2d17,1,0x2d18,1,0x2d19,1,0x2d1a,1,0x2d1b,1, +0x2d1c,1,0x2d1d,1,0x2d1e,1,0x2d1f,1,0x2d20,1,0x2d21,1,0x2d22,1,0x2d23,1, +0x2d24,1,0x2d25,4,0x2c63,0x41,0x1e61,1,0x1e9b,0x44,0x1e60,1,0x1e9b,0x80,0x2220,0x68, +0x331,0x48,0x331,0x48,0x331,0x80,0x2220,0x74,0x308,0x54,0x308,0x54,0x308,0x80,0x2220,0x77, +0x30a,0x57,0x30a,0x57,0x30a,0x80,0x2220,0x79,0x30a,0x59,0x30a,0x59,0x30a,0x80,0x2220,0x61, +0x2be,0x41,0x2be,0x41,0x2be,6,0x1e61,0x1e60,0x80,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313, +0x80,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x80,0x3330,0x3c5,0x313,0x301, +0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x80,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313, +0x342,0x84,0x1f88,0x220,0x1f00,0x3b9,0x1f08,0x399,0x84,0x1f89,0x220,0x1f01,0x3b9,0x1f09,0x399,0x84, +0x1f8a,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x84,0x1f8b,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x84,0x1f8c,0x220, +0x1f04,0x3b9,0x1f0c,0x399,0x84,0x1f8d,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x84,0x1f8e,0x220,0x1f06,0x3b9, +0x1f0e,0x399,0x84,0x1f8f,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x81,0x1f80,0x220,0x1f00,0x3b9,0x1f08,0x399, +0x81,0x1f81,0x220,0x1f01,0x3b9,0x1f09,0x399,0x81,0x1f82,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x81,0x1f83, +0x220,0x1f03,0x3b9,0x1f0b,0x399,0x81,0x1f84,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x81,0x1f85,0x220,0x1f05, +0x3b9,0x1f0d,0x399,0x81,0x1f86,0x220,0x1f06,0x3b9,0x1f0e,0x399,0x81,0x1f87,0x220,0x1f07,0x3b9,0x1f0f, +0x399,0x84,0x1f98,0x220,0x1f20,0x3b9,0x1f28,0x399,0x84,0x1f99,0x220,0x1f21,0x3b9,0x1f29,0x399,0x84, +0x1f9a,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x84,0x1f9b,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x84,0x1f9c,0x220, +0x1f24,0x3b9,0x1f2c,0x399,0x84,0x1f9d,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x84,0x1f9e,0x220,0x1f26,0x3b9, +0x1f2e,0x399,0x84,0x1f9f,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x81,0x1f90,0x220,0x1f20,0x3b9,0x1f28,0x399, +0x81,0x1f91,0x220,0x1f21,0x3b9,0x1f29,0x399,0x81,0x1f92,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x81,0x1f93, +0x220,0x1f23,0x3b9,0x1f2b,0x399,0x81,0x1f94,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x81,0x1f95,0x220,0x1f25, +0x3b9,0x1f2d,0x399,0x81,0x1f96,0x220,0x1f26,0x3b9,0x1f2e,0x399,0x81,0x1f97,0x220,0x1f27,0x3b9,0x1f2f, +0x399,0x84,0x1fa8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x84,0x1fa9,0x220,0x1f61,0x3b9,0x1f69,0x399,0x84, +0x1faa,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x84,0x1fab,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x84,0x1fac,0x220, +0x1f64,0x3b9,0x1f6c,0x399,0x84,0x1fad,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x84,0x1fae,0x220,0x1f66,0x3b9, +0x1f6e,0x399,0x84,0x1faf,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x81,0x1fa0,0x220,0x1f60,0x3b9,0x1f68,0x399, +0x81,0x1fa1,0x220,0x1f61,0x3b9,0x1f69,0x399,0x81,0x1fa2,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x81,0x1fa3, +0x220,0x1f63,0x3b9,0x1f6b,0x399,0x81,0x1fa4,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x81,0x1fa5,0x220,0x1f65, +0x3b9,0x1f6d,0x399,0x81,0x1fa6,0x220,0x1f66,0x3b9,0x1f6e,0x399,0x81,0x1fa7,0x220,0x1f67,0x3b9,0x1f6f, +0x399,0x80,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x84,0x1fbc,0x220,0x3b1,0x3b9,0x391,0x399, +0x80,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x80,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342, +0x80,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0x81,0x1fb3,0x220,0x3b1,0x3b9, +0x391,0x399,0x46,0x3b9,0x399,1,0x345,0x80,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x84, +0x1fcc,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x80,0x2220, +0x3b7,0x342,0x397,0x342,0x397,0x342,0x80,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342, +0x345,0x81,0x1fc3,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300, +0x399,0x308,0x300,0xc0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390, +0x80,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x80,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342, +0x399,0x308,0x342,0x80,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0xc0,1, +0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x80,0x2220,0x3c1,0x313,0x3a1, +0x313,0x3a1,0x313,0x80,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x80,0x3330,0x3c5,0x308,0x342, +0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x80,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x84,0x1ffc, +0x220,0x3c9,0x3b9,0x3a9,0x399,0x80,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x80,0x2220,0x3c9, +0x342,0x3a9,0x342,0x3a9,0x342,0x80,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345, +0x81,0x1ff3,0x220,0x3c9,0x3b9,0x3a9,0x399,0x41,0x3c9,1,0x3a9,0x41,0x6b,1,0x4b,0x41, +0xe5,1,0xc5,1,0x26b,1,0x1d7d,1,0x27d,4,0x23a,4,0x23e,4,0x10a0,4, +0x10a1,4,0x10a2,4,0x10a3,4,0x10a4,4,0x10a5,4,0x10a6,4,0x10a7,4,0x10a8,4, +0x10a9,4,0x10aa,4,0x10ab,4,0x10ac,4,0x10ad,4,0x10ae,4,0x10af,4,0x10b0,4, +0x10b1,4,0x10b2,4,0x10b3,4,0x10b4,4,0x10b5,4,0x10b6,4,0x10b7,4,0x10b8,4, +0x10b9,4,0x10ba,4,0x10bb,4,0x10bc,4,0x10bd,4,0x10be,4,0x10bf,4,0x10c0,4, +0x10c1,4,0x10c2,4,0x10c3,4,0x10c4,4,0x10c5,0x80,0x2220,0x66,0x66,0x46,0x46,0x46, +0x66,0x80,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x80,0x2220,0x66,0x6c,0x46,0x4c,0x46, +0x6c,0x80,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x80,0x3330,0x66,0x66, +0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74, +0xfb06,0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x80,0x2220,0x574,0x576,0x544, +0x546,0x544,0x576,0x80,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x80,0x2220,0x574,0x56b,0x544, +0x53b,0x544,0x56b,0x80,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x80,0x2220,0x574,0x56d,0x544, +0x53d,0x544,0x56d }; static const uint16_t ucase_props_unfold[370]={ @@ -578,7 +593,7 @@ static const UCaseProps ucase_props_singleton={ NULL, utrie_defaultGetFoldingOffset, 2240, - 4908, + 5112, 0, TRUE }, diff --git a/Build/source/libs/icu-xetex/common/uchar.c b/Build/source/libs/icu-xetex/common/uchar.c index 3e71d98dcf0..718e87a4c9d 100644 --- a/Build/source/libs/icu-xetex/common/uchar.c +++ b/Build/source/libs/icu-xetex/common/uchar.c @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1996-2005, International Business Machines +* Copyright (C) 1996-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -154,11 +154,9 @@ _openProps(UCharProps *ucp, UErrorCode *pErrorCode) { #endif -U_CFUNC int8_t +#if !UCHAR_HARDCODE_DATA +static int8_t uprv_loadPropsData(UErrorCode *pErrorCode) { -#if UCHAR_HARDCODE_DATA - return TRUE; -#else /* load Unicode character properties data from file if necessary */ /* @@ -168,7 +166,6 @@ uprv_loadPropsData(UErrorCode *pErrorCode) { */ if(havePropsData==0) { UCharProps ucp={ NULL }; - UCaseProps *csp; if(U_FAILURE(*pErrorCode)) { return havePropsData; @@ -187,7 +184,6 @@ uprv_loadPropsData(UErrorCode *pErrorCode) { ucp.pData32=NULL; uprv_memcpy(&propsTrie, &ucp.propsTrie, sizeof(propsTrie)); uprv_memcpy(&propsVectorsTrie, &ucp.propsVectorsTrie, sizeof(propsVectorsTrie)); - csp=NULL; } /* initialize some variables */ @@ -213,11 +209,8 @@ uprv_loadPropsData(UErrorCode *pErrorCode) { } return havePropsData; -#endif } -#if !UCHAR_HARDCODE_DATA - static int8_t loadPropsData(void) { UErrorCode errorCode = U_ZERO_ERROR; @@ -806,11 +799,11 @@ u_charAge(UChar32 c, UVersionInfo versionArray) { U_CAPI UScriptCode U_EXPORT2 uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; + return USCRIPT_INVALID_CODE; } if((uint32_t)c>0x10ffff) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return USCRIPT_INVALID_CODE; } return (UScriptCode)(u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_MASK); diff --git a/Build/source/libs/icu-xetex/common/uchar_props_data.c b/Build/source/libs/icu-xetex/common/uchar_props_data.c index 6a75ed185fa..0d329f8e563 100644 --- a/Build/source/libs/icu-xetex/common/uchar_props_data.c +++ b/Build/source/libs/icu-xetex/common/uchar_props_data.c @@ -1,181 +1,185 @@ /* - * Copyright (C) 1999-2005, International Business Machines + * Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * * file name: uchar_props_data.c * - * machine-generated on: 2005-04-29 + * machine-generated on: 2006-06-13 */ static const UVersionInfo formatVersion={4,0,5,2}; -static const UVersionInfo dataVersion={4,1,0,0}; +static const UVersionInfo dataVersion={5,0,0,0}; -static const uint16_t propsTrie_index[12724]={ -0x298,0x2a0,0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2da,0x2e0,0x2e3,0x2eb,0x2f3,0x2fb,0x303, -0x2d8,0x309,0x311,0x315,0x315,0x319,0x321,0x329,0x331,0x331,0x331,0x335,0x33d,0x345,0x34a,0x350, -0x358,0x35c,0x315,0x2d8,0x364,0x2d8,0x36c,0x370,0x378,0x37c,0x381,0x389,0x38f,0x394,0x39c,0x3a2, -0x3aa,0x3b2,0x3ba,0x3c2,0x3c7,0x3c7,0x3ca,0x3d2,0x3da,0x3df,0x3e5,0x3ea,0x3c7,0x3f2,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x3fa,0x3fc,0x404,0x40c,0x414,0x41a,0x422,0x42a, -0x432,0x438,0x440,0x448,0x450,0x456,0x45e,0x466,0x414,0x46e,0x476,0x47e,0x486,0x48e,0x496,0x49d, -0x4a5,0x4ab,0x4b3,0x4bb,0x4c3,0x4c9,0x4d1,0x4bb,0x4c3,0x4d9,0x4e1,0x4bb,0x4e9,0x4f0,0x4f8,0x500, -0x508,0x50c,0x514,0x290,0x51c,0x524,0x52c,0x290,0x534,0x53c,0x544,0x54a,0x552,0x559,0x561,0x290, -0x3c7,0x569,0x571,0x290,0x290,0x358,0x579,0x57d,0x3c7,0x3c7,0x585,0x3c7,0x3c7,0x58d,0x3c7,0x58f, -0x3c7,0x3c7,0x597,0x3c7,0x59f,0x5a3,0x5ab,0x3c7,0x5b1,0x3c7,0x5b7,0x5bf,0x5c7,0x3c7,0x3c7,0x5cf, -0x508,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x5d7,0x5df,0x3c7,0x3c7,0x5e7,0x5ef,0x5f7,0x5ff,0x607,0x3c7,0x60f,0x617,0x61f, -0x627,0x3c7,0x62f,0x631,0x3c7,0x639,0x290,0x290,0x641,0x649,0x651,0x656,0x3c7,0x65e,0x666,0x66e, -0x676,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x315,0x67e,0x681,0x689,0x690,0x681,0x698,0x290, -0x2d8,0x2d8,0x2d8,0x2d8,0x6a0,0x2d8,0x2d8,0x370,0x6a8,0x6b0,0x6b8,0x6c0,0x6c8,0x6cc,0x6d4,0x6dc, -0x6e4,0x6ec,0x6f4,0x6fc,0x704,0x70c,0x712,0x71a,0x722,0x72a,0x732,0x73a,0x742,0x74a,0x74f,0x755, -0x75a,0x75a,0x75a,0x75a,0x75a,0x75a,0x75a,0x75a,0x762,0x76a,0x66e,0x76d,0x775,0x77c,0x782,0x290, -0x66e,0x78a,0x792,0x79a,0x79d,0x66e,0x66e,0x7a4,0x66e,0x66e,0x66e,0x66e,0x66e,0x7ac,0x7b4,0x7b6, -0x66e,0x66e,0x66e,0x7be,0x7c2,0x7ca,0x290,0x290,0x7d2,0x7d8,0x7dd,0x7e5,0x7ed,0x7f3,0x7fb,0x802, -0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x75a,0x75a,0x75a,0x75a,0x80a,0x75a,0x811,0x818, -0x75a,0x75a,0x75a,0x75a,0x75a,0x75a,0x75a,0x75a,0x820,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x358,0x828,0x82c,0x290,0x2d8,0x2d8,0x2d8,0x834,0x315,0x83c,0x3c7,0x843,0x84b,0x853,0x853,0x290, -0x85b,0x290,0x290,0x290,0x863,0x66e,0x66e,0x820,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x86a,0x870, -0x878,0x880,0x508,0x3c7,0x888,0x890,0x3c7,0x892,0x507,0x89a,0x3c7,0x3c7,0x89f,0x631,0x8a5,0x63d, -0x8ad,0x8b5,0x8bc,0x66e,0x8b5,0x8c4,0x66e,0x8ad,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e, -0xbb1,0x3c7,0x3c7,0x3c7,0xb49,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0xbb7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xbd1,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb00,0x66e,0x66e, -0xb29,0x3c7,0xbe6,0x3c7,0xb4e,0xc2b,0xbfe,0xb64,0xbaf,0x3c7,0x3c7,0xc1a,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xc33,0x3c7,0xc3a,0xb54,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xc06,0x3c7,0x3c7,0x3c7,0xb6c,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb8f,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb2d,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0xb34,0x3c7,0x3c7,0x3c7,0xbee,0xb3b,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xc0a,0x3c7,0x3c7,0xbe2,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xbd5,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xbf6,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0xc1f,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0xb96,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0xc27,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb59,0x3c7,0x3c7,0x3c7,0xb5e,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0xbc6,0xbca,0x3c7,0x3c7,0x3c7,0xb21,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x630,0x290,0x290, -0x8cc,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x8d2,0x66e,0x78a,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x8da,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x8e2,0x8ea,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb08,0x290,0x290, -0xc42,0xc45,0xc4d,0xc54,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0xc5c,0x290,0xc64,0xc65,0xc64,0xc65, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x8f2,0x3c7,0x8f8,0x3c7,0x3c7,0x58f,0x290,0x900,0x908,0x910,0x3c7,0x3c7,0x3e9,0x918,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x91d,0x63d,0x3c7,0x925,0x3c7,0x92b,0x92f, -0x937,0x93f,0x946,0x94e,0x3c7,0x3c7,0x3c7,0x954,0x95c,0x2a8,0x964,0x96c,0x971,0x979,0x981,0x989, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0x991,0x998,0x9a0,0x290,0x3c7,0x3c7,0x3c7,0x9a8,0x9b0,0x9b8,0x9c0,0x9c8,0x9cf,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x979,0x9d7,0x9dd,0x290,0x9e5,0x3c7,0x9ed,0x290, -0x358,0x9f5,0x9f9,0x3c7,0x3fb,0xa01,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xa09,0xa0c,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xa14,0xa1b,0xa23,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x66e,0x86a,0x66e,0xa2b,0x66e,0xa32,0xa3a,0xa40,0xa44,0x290, -0x66e,0x66e,0xa4c,0x290,0x290,0x290,0x290,0x290,0x66e,0x66e,0xa54,0x290,0x290,0x290,0x290,0x290, -0xa5c,0xa63,0xa68,0xa6e,0xa76,0xa7e,0xa86,0xa60,0xa8e,0xa96,0xa9e,0xaa3,0xa75,0xa5c,0xa63,0xa5f, -0xa6e,0xaab,0xa5d,0xaae,0xa60,0xab6,0xabe,0xac6,0xacd,0xab9,0xac1,0xac9,0xad0,0xabc,0xad8,0xae0, -0xbdd,0x3c7,0x3c7,0xb9d,0x3c7,0x3c7,0x3c7,0xba5,0x3c7,0xbbf,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb41,0x3c7,0x3c7,0xc12,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb72,0xb7a,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb5e,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb81,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0xb88,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0xbaa,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x84b,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7,0x3c7, -0x3fb,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xae8,0xaf0,0xaf0,0xaf0,0x290,0x290,0x290,0x290,0x331,0x331,0x331,0x331,0x331,0x331,0x331,0xaf8, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18, -0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb18,0xb19, +static const uint16_t propsTrie_index[13440]={ +0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0x2e8,0x2ea,0x2f0,0x2f3,0x2fb,0x303,0x30b,0x313, +0x2e8,0x319,0x321,0x325,0x328,0x32e,0x336,0x33e,0x346,0x346,0x346,0x34a,0x352,0x35a,0x35f,0x365, +0x36d,0x371,0x325,0x2e8,0x379,0x2e8,0x381,0x2e8,0x385,0x38a,0x38f,0x397,0x39d,0x3a2,0x3aa,0x3b0, +0x3b8,0x3c0,0x3c8,0x3d0,0x3d5,0x3d5,0x3d8,0x3e0,0x3e8,0x3ed,0x3f3,0x3f8,0x3d5,0x400,0x408,0x40e, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x416,0x418,0x420,0x428,0x430,0x436,0x43e,0x446, +0x44e,0x454,0x45c,0x464,0x46c,0x472,0x47a,0x482,0x430,0x48a,0x492,0x49a,0x4a2,0x4aa,0x4b2,0x4b9, +0x4c1,0x4c7,0x4cf,0x4d7,0x4df,0x4e5,0x4ed,0x4f5,0x4df,0x4fd,0x505,0x4d7,0x50d,0x514,0x51c,0x524, +0x52c,0x530,0x538,0x2a0,0x540,0x548,0x550,0x2a0,0x558,0x560,0x568,0x56e,0x576,0x57d,0x585,0x2a0, +0x3d5,0x58d,0x595,0x2a0,0x2a0,0x36d,0x59d,0x5a1,0x3d5,0x3d5,0x5a9,0x3d5,0x3d5,0x5b1,0x3d5,0x5b3, +0x3d5,0x3d5,0x5bb,0x3d5,0x5c3,0x5c7,0x5cf,0x3d5,0x5d5,0x3d5,0x5db,0x5e3,0x5eb,0x3d5,0x3d5,0x5f3, +0x52c,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x5fb,0x603,0x3d5,0x3d5,0x60b,0x613,0x61b,0x623,0x62b,0x3d5,0x633,0x63b,0x643, +0x64b,0x3d5,0x653,0x655,0x3d5,0x65d,0x2a0,0x2a0,0x665,0x66d,0x675,0x67a,0x3d5,0x682,0x68a,0x692, +0x69a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x6a2,0x6a5,0x6ad,0x6b5,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x325,0x6bd,0x6c0,0x6c8,0x6cf,0x6c0,0x6d7,0x6da, +0x2e8,0x2e8,0x2e8,0x2e8,0x6e2,0x2e8,0x2e8,0x6ea,0x6f2,0x6fa,0x702,0x70a,0x712,0x716,0x71e,0x726, +0x72e,0x736,0x73e,0x746,0x74e,0x756,0x75c,0x764,0x76c,0x774,0x77c,0x784,0x78c,0x794,0x799,0x79f, +0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7ac,0x7b4,0x692,0x7b7,0x7bf,0x7c6,0x7cb,0x7d3, +0x692,0x7db,0x7e3,0x7eb,0x7ee,0x692,0x692,0x7f5,0x692,0x692,0x692,0x692,0x692,0x7fd,0x805,0x807, +0x692,0x692,0x692,0x80f,0x813,0x81b,0x2a0,0x2a0,0x823,0x829,0x82e,0x836,0x83e,0x844,0x84c,0x853, +0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x7a4,0x7a4,0x7a4,0x7a4,0x85b,0x7a4,0x862,0x869, +0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x871,0x879,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x36d,0x881,0x885,0x88d,0x2e8,0x2e8,0x2e8,0x895,0x325,0x89d,0x3d5,0x8a4,0x8ac,0x8b4,0x8b4,0x2a0, +0x8bc,0x2a0,0x2a0,0x2a0,0x8c4,0x692,0x692,0x8cb,0x692,0x692,0x692,0x692,0x692,0x692,0x8d3,0x8d9, +0x8e1,0x8e9,0x52c,0x3d5,0x8f1,0x8f9,0x3d5,0x8fb,0x52b,0x903,0x3d5,0x3d5,0x908,0x655,0x90e,0x661, +0x916,0x91e,0x925,0x692,0x91e,0x92d,0x692,0x916,0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x692, +0xc64,0x3d5,0x3d5,0x3d5,0xbfc,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0xc6a,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc84,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbb3,0x692,0x692, +0xbdc,0x3d5,0xc99,0x3d5,0xc01,0xcde,0xcb1,0xc17,0xc62,0x3d5,0x3d5,0xccd,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xce6,0x3d5,0xced,0xc07,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcb9,0x3d5,0x3d5,0x3d5,0xc1f,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc42,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbe0,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0xbe7,0x3d5,0x3d5,0x3d5,0xca1,0xbee,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xcbd,0x3d5,0x3d5,0xc95,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc88,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xca9,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0xcd2,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0xc49,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0xcda,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc0c,0x3d5,0x3d5,0x3d5,0xc11,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0xc79,0xc7d,0x3d5,0x3d5,0x3d5,0xbd4,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x654,0x2a0,0x2a0, +0x935,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x93b,0x692,0x7db,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x943,0x94b,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x953,0x95b,0x3d5,0x963,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbbb,0x2a0,0x2a0, +0xcf5,0xcf8,0xd00,0xd07,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xd0f,0x2a0,0xd17,0xd18,0xd17,0xd18, +0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3, +0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x96b,0x3d5,0x971,0x3d5,0x3d5,0x5b3,0x2a0,0x979,0x981,0x989,0x3d5,0x3d5,0x3f7,0x991,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x996,0x661,0x3d5,0x99e,0x3d5,0x9a4,0x9a8, +0x9b0,0x9b8,0x9bf,0x9c7,0x3d5,0x3d5,0x3d5,0x9cd,0x9d5,0x2b8,0x9dd,0x9e5,0x9ea,0x9f2,0x9fa,0xa02, +0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3, +0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3,0xbc3, +0xa0a,0xa11,0xa19,0x2a0,0x3d5,0x3d5,0x3d5,0xa21,0xa29,0xa31,0xa39,0xa41,0xa48,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x9f2,0xa50,0xa58,0x2a0,0xa60,0x3d5,0xa68,0x2a0, +0x36d,0xa70,0xa74,0x3d5,0x417,0xa7c,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0xa84,0xa87,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xa8f,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0xa97,0xa9e,0xaa6,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xaae,0x2a0,0x2a0,0x2a0,0x2a0, +0xab6,0xabe,0xac6,0xace,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x692,0x692,0x692,0x692,0x692,0x692,0x692,0x8d3,0x692,0xad6,0x692,0xadd,0xae5,0xaeb,0xaef,0x2a0, +0x692,0x692,0xaf7,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x692,0x692,0xaff,0xb07,0x2a0,0x2a0,0x2a0,0x2a0, +0xb0f,0xb16,0xb1b,0xb21,0xb29,0xb31,0xb39,0xb13,0xb41,0xb49,0xb51,0xb56,0xb28,0xb0f,0xb16,0xb12, +0xb21,0xb5e,0xb10,0xb61,0xb13,0xb69,0xb71,0xb79,0xb80,0xb6c,0xb74,0xb7c,0xb83,0xb6f,0xb8b,0xb93, +0xc90,0x3d5,0x3d5,0xc50,0x3d5,0x3d5,0x3d5,0xc58,0x3d5,0xc72,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xbf4,0x3d5,0x3d5,0xcc5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc25,0xc2d,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc11,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc34,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0xc3b,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0xc5d,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x8ac,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x417,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0xb9b,0xba3,0xba3,0xba3,0x2a0,0x2a0,0x2a0,0x2a0,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xbab, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb, +0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcb,0xbcc, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, @@ -208,71 +212,74 @@ static const uint16_t propsTrie_index[12724]={ 1,2,1,2,1,2,1,2,1,2,1,2,2,1,3,2, 1,2,1,1,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,2,2,2,2,2,2,1,1, -2,1,1,2,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, +2,1,1,2,2,1,2,1,1,1,1,2,1,2,1,2, +1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,4, -4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,6,6,6,6,6,6,6,6,6,6,6,6, +2,2,2,2,5,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,4,4, +4,4,4,4,4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,0,0,0,0,0x1a,0x1a,0,0,0,0,4,0, -0,0,0x17,0,0,0,0,0,0x1a,0x1a,1,0x17,1,1,1,0, -1,0,1,1,2,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,0,2,2,1,1,1,2,2,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -2,2,2,2,1,2,0x18,1,2,1,1,2,2,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +6,6,6,6,6,6,6,6,0,0,0,0,0x1a,0x1a,0,0, +0,0,4,2,2,2,0x17,0,0,0,0,0,0x1a,0x1a,1,0x17, +1,1,1,0,1,0,1,1,2,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1, +1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0,2,2,1,1, +1,2,2,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,2,2,2,2,1,2,0x18,1,2,1,1,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,2,0x1b,6,6,6,6,0,7,7,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0, +1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,2,0x1b,6,6,6,6,0,7,7,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,0,0,0,0,0,0, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0,0,4,0x17,0x17, -0x17,0x17,0x17,0x17,0,2,2,2,2,2,2,2,2,2,2,2, +1,2,1,2,1,1,2,1,2,1,2,1,2,1,2,1, +2,1,2,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0,0,4,0x17,0x17,0x17,0x17,0x17,0x17,0,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,0,0x17,0x13,0,0,0,0,0,0,6,6,6, +2,2,2,2,2,2,2,2,2,2,2,2,0,0x17,0x13,0, +0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,0,6,6,6,0x17,6, -0x17,6,6,0x17,6,6,0x17,6,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,5,5,5,0x17,0x17,0,0,0, -0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x10,0,0,0,0, -0,0,0,0x19,0x17,0x17,0x1b,0x1b,6,6,6,6,6,6,0,0, -0,0,0,0x17,0,0,0x17,0x17,0,5,5,5,5,5,5,5, +6,6,6,6,6,6,0x17,6,0x17,6,6,0x17,6,6,0x17,6, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +5,5,5,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, +0x10,0x10,0x10,0x10,0,0,0,0,0,0,0,0x19,0x17,0x17,0x1b,0x1b, +6,6,6,6,6,6,0,0,0,0,0,0x17,0,0,0x17,0x17, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +4,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, +0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,0x17,0x17,5,5, +6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,4,5,5,5,5,5,5,5, -5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729, -0x829,0x929,0x17,0x17,0x17,0x17,5,5,6,5,5,5,5,5,5,5, +5,5,5,5,0x17,5,6,6,6,6,6,6,6,0x10,7,6, +6,6,6,6,6,4,4,6,6,0x1b,6,6,6,6,5,5, +0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,5,5,5,0x1b,0x1b,5, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0x10, +5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,0,0,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x17,5,6,6, -6,6,6,6,6,0x10,7,6,6,6,6,6,6,4,4,6, -6,0x1b,6,6,6,6,5,5,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729, -0x829,0x929,5,5,5,0x1b,0x1b,5,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0,0x10,5,6,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,6,6, -6,6,6,6,6,6,6,6,6,5,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,6,6,8,5,5,5,5, +5,5,5,6,6,6,6,6,6,6,6,6,4,4,0x1b,0x17, +0x17,0x17,4,0,0,0,0,0,0,6,6,8,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,0,0,6,5,8,8, 8,6,6,6,6,6,6,6,6,8,8,8,8,6,0,0, 5,6,6,6,6,0,0,0,5,5,5,5,5,5,5,5, 5,5,6,6,0x17,0x17,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0, +0x17,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5, 0,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, 5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,0,5,5,5,5,5,5,5,0,5,0,0,0,5,5, @@ -322,7 +329,9 @@ static const uint16_t propsTrie_index[12724]={ 5,5,5,5,5,5,5,5,0,5,5,5,5,5,0,0, 6,5,8,6,8,8,8,8,8,0,6,8,8,0,8,8, 6,6,0,0,0,0,0,0,0,8,8,0,0,0,0,0, -0,0,5,0,5,5,5,5,5,5,5,5,5,0,5,5, +0,0,5,0,5,5,6,6,0,0,0x29,0x129,0x229,0x329,0x429,0x529, +0x629,0x729,0x829,0x929,0,0x1b,0x1b,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,0,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, 0,0,8,8,8,6,6,6,0,0,8,8,8,0,8,8, 8,6,0,0,0,0,0,0,0,0,0,8,0,0,0,0, @@ -427,1635 +436,1720 @@ static const uint16_t propsTrie_index[12724]={ 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, -6,8,8,8,0,0,0x17,0x17,2,2,2,2,2,2,2,2, -2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4, +6,8,8,8,0,0,0x17,0x17,6,6,6,6,8,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,6,8,6,6,6,6,6,8, +6,8,8,8,8,8,6,8,8,5,5,5,5,5,5,5, +0,0,0,0,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6, +6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2, +4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4, -6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,4,4,4,4,4,6,6,6,6, +6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,6,6,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,2,2, +2,2,2,2,0,0,0,0,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,2,2,2,2,2,2,0,0,0,0, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,0,0,1,1,1,1,1,1,0,0, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,0,0,1,1,1,1,1,1,0,0, -2,2,2,2,2,2,2,2,0,1,0,1,0,1,0,1, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, -2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, -2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, -2,2,2,2,2,0,2,2,1,1,1,1,3,0x1a,2,0x1a, -0x1a,0x1a,2,2,2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a, -2,2,2,2,0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a, -2,2,2,2,2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a, -0,0,2,2,2,0,2,2,1,1,1,1,3,0x1a,0x1a,0, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10, -0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16, -0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc, -0x10,0x10,0x10,0x10,0,0,0,0,0,0,0x10,0x10,0x10,0x10,0x10,0x10, -0x4b,2,0,0,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0x18,0x18,0x18,0x14,0x15,2, -0x4b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0x18,0x18,0x18,0x14,0x15,0, -4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, -0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, -0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,7,7,7,7,6,7,7,7,6,6,6, -6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1, -0x1b,0x1b,2,1,1,1,2,2,1,1,1,2,0x1b,1,0x1b,0x1b, -0x1b,1,1,1,1,1,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b, -1,0x1b,1,1,1,1,0x1b,2,1,1,0x1b,1,2,5,5,5, -5,2,0x1b,0x1b,2,2,1,1,0x18,0x18,0x18,0x18,0x18,1,2,2, -2,2,0x1b,0x18,0x1b,0,0,0,0,0,0,0x98b,0x118b,0xb8b,0x138b,0x1b8b, -0x238b,0xc8b,0x2c8b,0xe8b,0x1e8b,0x2e8b,0x3e8b,0x16b,0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a, -0x96a,0xa6a,0xb6a,0xc6a,0x326a,0x646a,0x50aa,0x11aa,0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a, -0x96a,0xa6a,0xb6a,0xc6a,0x326a,0x646a,0x50aa,0x11aa,0x11aa,0x51aa,0x12aa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b, -0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b, -0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +1,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,0,0, +1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,0,0, +1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2, +0,1,0,1,0,1,0,1,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2, +3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2, +3,3,3,3,3,3,3,3,2,2,2,2,2,0,2,2, +1,1,1,1,3,0x1a,2,0x1a,0x1a,0x1a,2,2,2,0,2,2, +1,1,1,1,3,0x1a,0x1a,0x1a,2,2,2,2,0,0,2,2, +1,1,1,1,0,0x1a,0x1a,0x1a,2,2,2,2,2,2,2,2, +1,1,1,1,1,0x1a,0x1a,0x1a,0,0,2,2,2,0,2,2, +1,1,1,1,3,0x1a,0x1a,0,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17, +0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10,0,0,0,0, +0,0,0x10,0x10,0x10,0x10,0x10,0x10,0x4b,2,0,0,0x44b,0x54b,0x64b,0x74b, +0x84b,0x94b,0x18,0x18,0x18,0x14,0x15,2,0x4b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b, +0x84b,0x94b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4,4,0,0,0, +0,0,0,0,0,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7, +7,6,7,7,7,6,6,6,6,6,6,6,6,6,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2, +1,1,1,2,0x1b,1,0x1b,0x1b,0x1b,1,1,1,1,1,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2, +1,1,1,1,2,5,5,5,5,2,0x1b,0x1b,2,2,1,1, +0x18,0x18,0x18,0x18,0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0, +0,0,0,0x98b,0x118b,0xb8b,0x138b,0x1b8b,0x238b,0xc8b,0x2c8b,0xe8b,0x1e8b,0x2e8b,0x3e8b,0x16b, +0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0xa6a,0xb6a,0xc6a,0x326a,0x646a,0x50aa,0x11aa, +0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0xa6a,0xb6a,0xc6a,0x326a,0x646a,0x50aa,0x11aa, +0x11aa,0x51aa,0x12aa,1,2,0,0,0,0,0,0,0,0,0,0,0, +0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x14,0x15,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b, -0x94b,0xa6b,0xb6b,0xc6b,0xd6b,0xe6b,0xf6b,0x106b,0x116b,0x126b,0x136b,0x146b,0x14b,0x24b,0x34b,0x44b, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x14b,0x24b,0x34b,0x44b, 0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0xb6b,0xc6b,0xd6b,0xe6b,0xf6b,0x106b,0x116b,0x126b,0x136b,0x146b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x4b,0xb6b,0xc6b,0xd6b,0xe6b,0xf6b, -0x106b,0x116b,0x126b,0x136b,0x146b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x4b, +0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0xb6b,0xc6b,0xd6b,0xe6b,0xf6b,0x106b, +0x116b,0x126b,0x136b,0x146b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x4b,0xb6b, +0xc6b,0xd6b,0xe6b,0xf6b,0x106b,0x116b,0x126b,0x136b,0x146b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b, +0x84b,0x94b,0xa6b,0x4b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b, +0x1b,0,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b, -0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0x1b,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14b,0x24b, +0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b, +0x94b,0xa6b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x1b,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0x1b,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b, -0x74b,0x84b,0x94b,0xa6b,0x14b,0x24b,0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x14b,0x24b, -0x34b,0x44b,0x54b,0x64b,0x74b,0x84b,0x94b,0xa6b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x18,0x18,0x18,0x18, -0x18,0x14,0x15,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15, -0x14,0x15,0x14,0x15,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14, +0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x18,0x18,0,0,0,0,0, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0,0,0,0,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14, 0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15, +0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, -1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x88b,0x17,0x17, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,0,0x17,0x17,0x1c,0x1d, -0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x13,0,0,0,0,0x1c,0x1d,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +2,2,2,0,1,2,1,1,1,2,2,1,2,1,2,1, +2,0,0,0,0,0,0,0,2,1,2,2,0,0,0,0, +0,0,0,0,1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x17,0x17,0x17, +0x17,0x88b,0x17,0x17,2,2,2,2,2,2,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, -0xc,0x17,0x17,0x17,0x1b,4,5,0x6a,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15, -0x1b,0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,6,6,6,6,6,6, -0x13,4,4,4,4,4,0x1b,0x1b,0xa6a,0x146a,0x1e6a,4,5,0x17,0x1b,0x1b, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,0,6,6,0x1a,0x1a,4,4,5, -0x13,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0x17,4,4,4,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0x1b,0x1b,0x16b,0x26b, -0x36b,0x46b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, +0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0,0,0,0,0x1c,0x1d,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0x16b,0x26b,0x36b,0x46b,0x56b,0x66b,0x76b,0x86b,0x96b,0xa6b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x156b,0x166b,0x176b,0x186b,0x196b,0x1a6b,0x1b6b,0x1c6b,0x1d6b,0x1e6b,0x1f6b,0x206b,0x216b,0x226b,0x236b, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x246b,0x256b,0x266b,0x276b,0x286b,0x296b,0x2a6b,0x2b6b,0x2c6b,0x2d6b,0x2e6b,0x2f6b,0x306b,0x316b,0x326b, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,4,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0, -0,0,0,0,0,0,0,0,5,5,8,5,5,5,6,5, -5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,8, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,2,2,2,0,0,0,0,0,5,6,5, -5,5,5,5,5,5,5,5,5,0x18,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,5,5,5,5,5,0,5,0, -5,5,0,5,5,0,5,5,5,5,5,5,5,5,5,5, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0xc,0x17,0x17,0x17,0x1b,4,5,0x6a,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, +0x13,0x14,0x15,0x15,0x1b,0x16a,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,6,6, +6,6,6,6,0x13,4,4,4,4,4,0x1b,0x1b,0xa6a,0x146a,0x1e6a,4, +5,0x17,0x1b,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,6,6,0x1a, +0x1a,4,4,5,0x13,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x17,4,4,4,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0x1b,0x1b,0x16b,0x26b,0x36b,0x46b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x16b,0x26b,0x36b,0x46b,0x56b,0x66b,0x76b,0x86b, +0x96b,0xa6b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x156b,0x166b,0x176b,0x186b,0x196b,0x1a6b,0x1b6b,0x1c6b,0x1d6b,0x1e6b,0x1f6b, +0x206b,0x216b,0x226b,0x236b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x246b,0x256b,0x266b,0x276b,0x286b,0x296b,0x2a6b,0x2b6b,0x2c6b,0x2d6b,0x2e6b, +0x2f6b,0x306b,0x316b,0x326b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,4,4,4,4,0,0,0,0,0,0x1a,0x1a,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,8,5, +5,5,6,5,5,5,5,6,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, +8,6,6,8,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,2,2,2,2,2,2,2,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0, +0,5,6,5,5,5,5,5,5,5,5,5,5,0x18,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, +5,0,5,0,5,5,0,5,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x14,0x15,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,0x19,0x1b,0,0,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0,6,6,6,6, -0,0,0,0,0,0,0,0,0,0,0,0,0x17,0x13,0x13,0x16, -0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x14, -0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0,0x17,0x17,0x17,0x17, -0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13,0x18,0x18,0x18,0, -0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5,5,0,5,5, +0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0x10, -0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, -0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17,0x18,0x18,0x18,0x17, -0x1a,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,0x14,0x18,0x15,0x18,0x14, -0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5,5,5,5,5, -4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x14,0x15,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0,0, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0, +6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, +0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, +0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0, +0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13, +0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,4,4,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0x10,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, +0x17,0x13,0x17,0x17,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x17,0x17, +0x18,0x18,0x18,0x17,0x1a,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x14, +0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5, +5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,5,5,5,5,5,5,0,0,5,5, -5,5,5,5,0,0,5,5,5,5,5,5,0,0,5,5, -5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18, -0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10, -0x1b,0x1b,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +5,5,5,5,5,5,4,4,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, -0x17,0x17,0x1b,0,0,0,0,0x16b,0x26b,0x36b,0x46b,0x56b,0x66b,0x76b,0x86b,0x96b, -0xa6b,0x146b,0x1e6b,0x286b,0x326b,0x3c6b,0x466b,0x506b,0x5a6b,0x646b,0xc86b,0x30ab,0x40ab,0x50ab,0x60ab,0x70ab, -0x80ab,0x90ab,0x11ab,0x21ab,0x31ab,0x41ab,0x51ab,0x61ab,0x71ab,0x81ab,0x91ab,0x12ab,0x22ab,0x32ab,0x42ab,0x52ab, -0x62ab,0x72ab,0x82ab,0x92ab,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0xa8a,0x88a,0x16a,0x56a,0x326a,0x50aa,0x51aa,0x52aa,0x56a,0xa6a,0x326a,0x646a,0x50aa,0x11aa,0x51aa,0x56a, -0xa6a,0x326a,0x646a,0x50aa,0x11aa,0x12aa,0x52aa,0xa6a,0x16a,0x16a,0x16a,0x26a,0x26a,0x26a,0x26a,0x56a, -0xa6a,0xa6a,0xa6a,0xa6a,0xa6a,0x1e6a,0x326a,0x326a,0x326a,0x326a,0x646a,0x30aa,0x50aa,0x50aa,0x50aa,0x50aa, -0x50aa,0x11aa,0x51aa,0x56a,0x326a,0x88b,0x88b,0x118b,0x1a8b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x6b,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x16b,0x56b,0xa6b,0x326b, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x90aa,0, +5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5, +0,0,5,5,5,5,5,5,0,0,5,5,5,5,5,5, +0,0,5,5,5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0, +0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0, +0,0x10,0x10,0x10,0x1b,0x1b,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,0x17,0x17,0x1b,0,0,0,0,0x16b,0x26b,0x36b,0x46b,0x56b, +0x66b,0x76b,0x86b,0x96b,0xa6b,0x146b,0x1e6b,0x286b,0x326b,0x3c6b,0x466b,0x506b,0x5a6b,0x646b,0xc86b,0x30ab, +0x40ab,0x50ab,0x60ab,0x70ab,0x80ab,0x90ab,0x11ab,0x21ab,0x31ab,0x41ab,0x51ab,0x61ab,0x71ab,0x81ab,0x91ab,0x12ab, +0x22ab,0x32ab,0x42ab,0x52ab,0x62ab,0x72ab,0x82ab,0x92ab,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0xa8a,0x88a,0x16a,0x56a,0x326a,0x50aa,0x51aa,0x52aa,0x56a,0xa6a,0x326a,0x646a, +0x50aa,0x11aa,0x51aa,0x56a,0xa6a,0x326a,0x646a,0x50aa,0x11aa,0x12aa,0x52aa,0xa6a,0x16a,0x16a,0x16a,0x26a, +0x26a,0x26a,0x26a,0x56a,0xa6a,0xa6a,0xa6a,0xa6a,0xa6a,0x1e6a,0x326a,0x326a,0x326a,0x326a,0x646a,0x30aa, +0x50aa,0x50aa,0x50aa,0x50aa,0x50aa,0x11aa,0x51aa,0x56a,0x326a,0x88b,0x88b,0x118b,0x1a8b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x6b,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +0x16b,0x56b,0xa6b,0x326b,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0x17,5,5,5,5,0,0,0,0,5,5,5,5, -5,5,5,5,0x1b,0x16a,0x26a,0xa6a,0x146a,0x646a,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2, +5,0x5a6a,5,5,5,5,5,5,5,5,0x90aa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, +5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5, +0x17,0x16a,0x26a,0xa6a,0x146a,0x646a,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,0,0,5,0,5,5, +5,5,5,5,5,5,0,0,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,5,5,0,0,0,5,0,0,5, -5,6,6,6,0,6,6,0,0,0,0,0,6,6,6,6, -5,5,5,5,0,5,5,5,0,5,5,5,5,5,5,5, +5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,6,6,6,0,0,0,0,6,0x14b,0x24b,0x34b,0x44b, -0xa6b,0x146b,0x646b,0x11ab,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6, -6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b,0x1b,6,6,6, -6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b, +5,5,0x16b,0xa6b,0x146b,0x646b,0,0,0,0,0,0x17,5,6,6,6, +0,6,6,0,0,0,0,0,6,6,6,6,5,5,5,5, +0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +6,6,6,0,0,0,0,6,0x14b,0x24b,0x34b,0x44b,0xa6b,0x146b,0x646b,0x11ab, +0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x26a,0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a, +0x36a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0x16a,0x26a,0x36a, +0x46a,0x56a,0x66a,0x76a,0x86a,0x96a,0x16a,0x26a,0x36a,0x46a,0x56a,0x26a,0x36a,0x36a,0x46a,0x56a, +0x66a,0x76a,0x86a,0x96a,0x16a,0x26a,0x36a,0x36a,0x46a,0x56a,0xa,0xa,0x16a,0x26a,0x36a,0x36a, +0x46a,0x56a,0x36a,0x36a,0x46a,0x46a,0x46a,0x46a,0x66a,0x76a,0x76a,0x76a,0x86a,0x86a,0x96a,0x96a, +0x96a,0x96a,0x26a,0x36a,0x46a,0x56a,0x66a,0x16a,0x26a,0x36a,0x46a,0x46a,0x56a,0x56a,0xa,0xa, +0x16a,0x26a,0x98a,0x118a,0x2c8a,0x98a,0x118a,0xe8a,0xa8a,0xc8a,0xa8a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6,6,6,0x1b,0x1b, +0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6, +6,6,6,6,6,6,6,0x1b,0x1b,6,6,6,6,6,6,6, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, -0x1b,0x1b,6,6,6,0x1b,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,6,6, +6,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0x16b,0x26b,0x36b,0x46b, +0x56b,0x66b,0x76b,0x86b,0x96b,0xa6b,0x146b,0x1e6b,0x286b,0x326b,0x3c6b,0x466b,0x506b,0x5a6b,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, -2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2, +2,0,2,2,2,2,2,2,2,2,2,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, +1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,1,0,1,1,0,0,1,0,0,1,1,0, -0,1,1,1,1,0,1,1,1,1,1,1,1,1,2,2, -2,2,0,2,0,2,2,2,2,2,2,2,0,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,1,1,0,1, -1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1, +1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1, +1,0,1,1,1,1,1,1,1,1,2,2,2,2,0,2, +0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,0, +0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, +1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1, +1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1, 1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,0,1,1,1,1,0,1,1,1,1,1,0,1,0, -0,0,1,1,1,1,1,1,1,0,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,2,2,0,0, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0x18,2,2,2,2,2,2, +1,1,1,1,1,0x18,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18, +2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0x18,2,2,2,2,2,2,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x18,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,0x18,2,2,2,2,2,2, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,0x18,2,2,2,2,2,2,0,0,0,0,0x29,0x129, +2,2,2,2,2,0x18,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0x18, +2,2,2,2,2,2,1,2,0,0,0x29,0x129,0x229,0x329,0x429,0x529, +0x629,0x729,0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x29,0x129, 0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729, -0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0x29,0x129,0x229,0x329, -0x429,0x529,0x629,0x729,0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929, -0,0x10,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x829,0x929,0x29,0x129,0x229,0x329,0x429,0x529,0x629,0x729,0x829,0x929,0,0x10,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,0,0,0,0,0,0,0,0,0,0,5,5,5,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x65,5,5,5,5,5, -5,5,5,5,0x165,5,5,0x765,5,5,5,0x12a5,5,0x365,5,5, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x165,5,5,5,5,5,5,5,0x165,5,5, +5,5,5,5,5,5,0x65,5,5,5,5,5,5,5,5,5, +0x165,5,5,0x765,5,5,5,0x12a5,5,0x365,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x165,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x165,0x265,0x365,5,0x265,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x165,5, +5,0x165,5,5,5,5,5,5,5,0x165,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x265,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x165,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x165,0x265,0x365,5,0x265,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x165,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x265,5,5,5,5,5,5,5,0x565,5,0x465,5, -5,5,5,5,5,5,5,5,5,0x265,5,0x865,5,0x665,5,5, +5,5,5,0x265,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x265,5,5,5,5,0x265,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x265,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x365,5,5,5,5,5,5,5, +0x265,5,5,5,5,5,5,5,0x565,5,0x465,5,5,5,5,5, +5,5,5,5,5,0x265,5,0x865,5,0x665,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x265,5, +5,5,5,0x265,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x265,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x365,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x365,0x365,0x365, +0x365,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x665,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x365,0x365,0x365,0x365,5,5,5,5,5,5,5,5,5,5,5, +5,0x365,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x365,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x665,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x365,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x365,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x365,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x365,5,5,5, +5,5,5,5,5,5,5,0x365,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x365,5,5,5,5, +5,5,5,0x465,5,5,5,5,5,5,0x465,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x465,5,5,5,5,5,5,0x465,5, +5,5,5,5,0x465,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x465,5,5,5,5,5,5,5, +5,5,0x465,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x465,5,5,5,5,5,5,5,5,5, +5,0x465,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x565,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x465,5,5,5,5,5,5,5,5,5,5, +5,5,0x565,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0x565,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x565,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x565,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x665,5, -5,5,5,5,0x6465,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x665,5,5,5,5,5, +0x6465,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x665,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x765,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x665,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0x765,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,0x765,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x765,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x765,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x865,5,5,5,5,5,5,5,5,5,5,5, +0x865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x965,5,5,5,5,5,5,5,5,5,5, +5,0x965,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x965,0x1465,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x965,5, -5,5,5,5,5,5,5,5,0xa65,5,5,5,5,5,5,5, +5,5,0x965,0x1465,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x965,5,5,5,5,5, +5,5,5,5,0xa65,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x11a5,5,0xa65,5,0x11a5,0x1465,0x1e65,5,5, -5,5,5,5,0x2865,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0x11a5,5,0xa65,5,0x11a5,0x1465,0x1e65,5,5,5,5,5,5, +0x2865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0xa65,5,5,5,5,0x1e65,5,5,5,5, -5,5,5,5,0x2865,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x2865,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x6465,5,5,5,5,5,5,5, +5,5,0xa65,5,5,5,5,0x1e65,5,5,5,5,5,5,5,5, +0x2865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x2865,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x6465,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x6465,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x12a5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x6465,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x12a5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x16a5,5,5,5,5,0x16a5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x16a5,5,5,5,5, -0x16a5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1aa5,5, +5,5,5,5,5,5,5,5,5,5,0x1aa5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x820,0x840,0x860,0,0,0,0,0, +5,5,5,5,0x820,0x840,0x860,0,0,0,0,0,0x880,0x8a0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x880,0x8a0,0,0,0,0,0,0, -0,0,0,0,0x8c0,0x8e0,0x900,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x920,0x8e0,0x940,0x8e0, -0x8e0,0x8e0,0x960,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x980,0x8e0,0x8e0,0x8e0, -0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x9a0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9c0,0, -0x9e0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x8c0,0x8e0,0,0,0,0,0,0,0,0,0,0, +0x900,0x920,0x940,0x920,0x920,0x920,0x920,0x920,0x960,0x920,0x980,0x920,0x920,0x920,0x9a0,0x920, +0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x9c0,0x920,0x920,0x920,0x920,0x920,0x920,0x920, +0x920,0x920,0x920,0x920,0x920,0x9e0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xa00,0,0xa20,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00, -0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00, -0xa00,0xa00,0xa00,0xa20 +0,0,0,0,0,0,0,0,0,0,0,0,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa60 }; static const UTrie propsTrie={ propsTrie_index, NULL, utrie_defaultGetFoldingOffset, - 2624, - 10100, + 2688, + 10752, 0, TRUE }; -static const uint16_t propsVectorsTrie_index[16324]={ -0x298,0x2a0,0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0xad5,0xadc,0xae4,0xaeb,0xaf3,0xafb,0xb03,0xb0b, -0xb12,0xd81,0x330,0xb1a,0xb1b,0xb21,0xa0c,0xb29,0xc7a,0xc7a,0xc82,0x338,0x340,0x348,0x350,0xb31, -0xb4f,0xc4d,0xb39,0xb41,0x358,0xb47,0x360,0x366,0x875,0x36e,0x373,0x37b,0x382,0x38a,0x392,0x398, -0x3a0,0x3a8,0x3b0,0xb5f,0xb6f,0xb71,0xb57,0xb67,0x3b8,0xd89,0x3c0,0x92b,0xd91,0x3c8,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x3d0,0x3d6,0x3de,0x3e6,0x3ee,0x3f4,0x3fc,0x404, -0x40c,0x412,0x41a,0x422,0x42a,0x430,0x438,0x440,0x448,0x44e,0x456,0x45e,0x466,0x46e,0x476,0x47d, -0x485,0x48b,0x493,0x49b,0x4a3,0x4a9,0x4b1,0x4b9,0x4c1,0x4c7,0x4cf,0x4d7,0x4df,0x4e6,0x4ee,0x4f6, -0x4fe,0x502,0x50a,0x511,0x519,0x521,0x529,0x531,0xd4b,0xd53,0x539,0x541,0x549,0x551,0x559,0x55e, -0xe16,0x566,0x56e,0x575,0x575,0xb79,0x57d,0x581,0xd12,0xd12,0x589,0xd22,0xd23,0x591,0xd1a,0x593, -0xd99,0xd9b,0x59b,0xd9b,0x5a3,0x5a8,0x5b0,0xda0,0x5b6,0xd9b,0x5bc,0x5c4,0x968,0xda8,0xda8,0x5cc, -0x5d4,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0, -0xdb0,0xdb0,0xdb0,0x5d9,0x5e1,0xdb8,0xdb8,0x5e9,0x87d,0x885,0x88d,0x895,0xe1e,0xde0,0x5f1,0x5f9, -0x601,0xdc0,0xdc8,0x609,0xdc0,0x2d8,0x290,0x290,0x8ac,0x8b4,0x8bc,0x8c1,0xf76,0x9a3,0x9ab,0xef6, -0x933,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0xf16,0xefe,0xf0e,0xf06,0xf86,0xf8d,0x947,0x948, -0xb81,0xb81,0xb81,0xb81,0x611,0xb81,0xb81,0x619,0x621,0xb89,0x625,0x62d,0xb89,0x635,0x63d,0x645, -0xa1c,0xa14,0xb91,0x64d,0x655,0x65d,0x663,0x66b,0xa24,0xa2c,0x673,0xa34,0x67b,0xb99,0xa3c,0xba0, -0xa44,0xa4c,0xa54,0xa5c,0xa64,0xa6b,0xba8,0xbb0,0xa73,0xbb8,0xbbb,0xbbd,0xdd0,0xeb1,0x683,0x68a, -0xbc5,0x692,0x69a,0xa7b,0xa80,0xa83,0xa89,0x9fc,0xa91,0xa91,0xa96,0xa04,0xa9e,0xaa6,0xaae,0xab6, -0xabe,0xbcd,0xac5,0xacd,0x6a2,0x6aa,0x6af,0x6af,0x6b7,0x6bd,0x6c5,0x6cd,0x6d5,0x6db,0x89d,0x8a4, -0xdd8,0xdd8,0xdd8,0xdd8,0xdd8,0xdd8,0xdd8,0xdd8,0xeb9,0xeb9,0xeb9,0xeb9,0xec1,0xec8,0xeca,0xed1, -0xed9,0xedd,0xedd,0xee0,0xedd,0xedd,0xee6,0xedd,0x8c9,0x8ce,0x8ce,0x8ce,0x8ce,0x8ce,0x8ce,0x8ce, -0xf6e,0x978,0x97c,0x290,0xf5e,0xf5e,0xf5e,0x950,0xf66,0x970,0xf9d,0x9cb,0x958,0x960,0x960,0x290, -0x9bb,0x9c3,0x9c3,0x9c3,0x6e3,0xde8,0xde8,0x6eb,0xdf0,0xdf0,0xdf0,0xdf0,0xdf0,0xdf0,0x6f3,0x2dc, -0xc72,0xc8a,0x6fb,0xc92,0x703,0xc9a,0xca2,0xcaa,0x70b,0x710,0xcb2,0xcb9,0x715,0x71d,0x93b,0x93f, -0x725,0xcc9,0x72d,0xcc1,0xcd2,0xcd6,0xcce,0x735,0xcf4,0xcf4,0xcde,0xce4,0xcf4,0xcf4,0xcf5,0xcec, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0x73d,0xf1e,0xf1e, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd, -0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0xcfd,0x745,0x74c,0x74c, -0xe00,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06, -0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06,0xe06, -0xe06,0xe06,0xe06,0xe06,0x754,0xe0e,0x2e4,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x99b,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xf95,0x2ec,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74, -0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76, -0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78, -0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73, -0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75, -0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77, -0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79, -0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74, -0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76, -0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78, -0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73, -0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75, -0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77, -0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79, -0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74, -0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76, -0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78, -0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73, -0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75, -0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77, -0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79, -0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0xd79,0xd73,0xd74,0xd75,0xd76,0xd77,0xd78,0x2f4,0x290,0x290, -0xfad,0xfb0,0xfb8,0xfbe,0xfc6,0xfc7,0x290,0xfcf,0x290,0xfcf,0x290,0xfcf,0x290,0xfcf,0x290,0xfcf, -0x290,0xfcf,0x290,0xfcf,0x290,0xfcf,0x290,0xfcf,0x290,0xfcf,0xfd7,0xfcf,0xfdf,0xfe0,0xfe8,0xfe9, -0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4, -0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0x9f4,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05, -0xd0a,0x75c,0xeee,0x762,0xfa5,0xfa5,0x766,0x76d,0x775,0x77d,0x785,0xbe5,0xbec,0x78d,0x792,0xbf4, -0xc2a,0xc2a,0xbd5,0xbdd,0xbfc,0xc21,0xc22,0xc32,0xc04,0xc09,0x79a,0xc11,0x7a2,0xc19,0x7aa,0x7ae, -0x9d3,0x7b6,0x7be,0x7c6,0xc3a,0xc40,0xc45,0x7ce,0x7de,0xc62,0xc6a,0xc55,0xc5a,0x7e6,0x7ee,0x7d6, -0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b, -0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd5b,0xd63,0xd63,0xd63,0xd63, -0x8d6,0x8dd,0x8e5,0x8ed,0xf26,0xf26,0xf26,0x8f5,0x8fd,0x900,0xf56,0xf4e,0x2fc,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x7f6,0x7fe,0x304,0x290,0x908,0xf7e,0x9b3,0x290, -0xe33,0xe26,0xe2b,0xf2e,0x910,0x30c,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x918,0x91b,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x984,0x98b,0x993,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0xe3b,0xe3b,0xe3b,0xe3b,0xe3b,0xe3b,0xe3b,0x806,0xe43,0x80e,0xe44,0xe4c,0xe54,0xe5a,0x816,0x81e, -0xf46,0xf46,0x314,0x290,0x290,0x290,0x290,0x290,0xf36,0xf36,0x923,0x290,0x290,0x290,0x290,0x290, -0xe83,0xe7e,0x826,0xe81,0x82e,0x836,0x83e,0xe87,0x846,0x84e,0x856,0xe80,0xe88,0xe83,0xe7e,0xe86, -0xe81,0xe89,0xe84,0xe7f,0xe87,0x85d,0xe62,0xe6a,0xe71,0xe78,0xe65,0xe6d,0xe74,0xe7b,0x865,0xea9, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290, -0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x290,0x318, -0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99, -0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99, -0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0xe99, -0xe99,0xe99,0xe99,0xe99,0xe99,0xe99,0x9e4,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db, -0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db, -0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db, -0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1,0xea1, -0x9ec,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db, -0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db, -0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9dc, -0x86d,0xe91,0xe91,0xe91,0x320,0x320,0x320,0x320,0xf3e,0xf3e,0xf3e,0xf3e,0xf3e,0xf3e,0xf3e,0x328, -0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320, -0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320, -0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320,0x320, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd2b, -0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43, -0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43, -0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43, -0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd43,0xd33, +static const uint16_t propsVectorsTrie_index[16924]={ +0x2a8,0x2b0,0x2b8,0x2c0,0x2c8,0x2d0,0x2d8,0x2e0,0xb1b,0xb22,0xb2a,0xb31,0xb39,0xb41,0xb49,0xb51, +0xb58,0xde3,0xb60,0xb64,0xb67,0xb6d,0xa52,0xb75,0xcdc,0xcdc,0xce4,0x340,0x348,0x350,0x358,0xb7d, +0xba9,0xca7,0xb85,0xb8d,0x360,0xb93,0xb9b,0xba1,0x860,0x368,0x36d,0x375,0x37c,0xcbc,0x384,0x38a, +0x392,0x39a,0x3a2,0xbb9,0xbc9,0xbcb,0xbb1,0xbc1,0x3aa,0xdeb,0x3b2,0x91a,0xdf3,0x3ba,0x1016,0x9cc, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x3c2,0x3c8,0x3d0,0x3d8,0x3e0,0x3e6,0x3ee,0x3f6, +0x3fe,0x404,0x40c,0x414,0x41c,0x422,0x42a,0x432,0x43a,0x440,0x448,0x450,0x458,0x460,0x468,0x46f, +0x477,0x47d,0x485,0x48d,0x495,0x49b,0x4a3,0x4ab,0x4b3,0x4b9,0x4c1,0x4c9,0x4d1,0x4d8,0x4e0,0x4e8, +0x4f0,0x4f4,0x4fc,0x503,0x50b,0x513,0x51b,0x523,0xdad,0xdb5,0x52b,0x533,0x53b,0x543,0x54b,0x550, +0xe70,0x558,0x560,0x567,0x567,0xbd3,0x56f,0x573,0xd74,0xd74,0x57b,0xd84,0xd85,0x583,0xd7c,0x585, +0xdfb,0xdfd,0x58d,0xdfd,0x595,0x59a,0x5a2,0xe02,0x5a8,0xdfd,0x5ae,0x5b6,0x959,0xe0a,0xe0a,0x5be, +0x5c6,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12,0xe12, +0xe12,0xe12,0xe12,0x5cb,0x5d3,0xe1a,0xe1a,0x5db,0x868,0x870,0x878,0x880,0xe80,0xe78,0x5e3,0x5eb, +0x5f3,0xe22,0xe2a,0x5fb,0xe22,0x2e8,0x2a0,0x2a0,0x897,0x89f,0x8a7,0x8ac,0x100e,0x994,0x99c,0xf5e, +0x922,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x101e,0x1023,0x9d4,0x9dc,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xf7e,0xf66,0xf76,0xf6e,0xfee,0xfe6,0x936,0x939, +0xbdb,0xbdb,0xbdb,0xbdb,0x603,0xbdb,0xbdb,0x60b,0x613,0xbe3,0x617,0x61f,0xbe3,0x627,0x62f,0x637, +0xa62,0xa5a,0xbeb,0x63f,0x647,0x64f,0x655,0x65d,0xa6a,0xa72,0x665,0xa7a,0x66d,0xbf3,0xa82,0xbfa, +0xa8a,0xa92,0xa9a,0xaa2,0xaaa,0xab1,0xc02,0xc0a,0xab9,0xc12,0xc15,0xc17,0xe32,0xf13,0xf19,0x675, +0xc1f,0x67d,0x685,0xac1,0xac6,0xac9,0xacf,0xa42,0xad7,0xad7,0xadc,0xa4a,0xae4,0xaec,0xaf4,0xafc, +0xb04,0xc27,0xb0b,0xb13,0x68d,0x695,0x69a,0x69a,0x6a2,0x6a8,0x6b0,0x6b8,0x6c0,0x6c6,0x888,0x88f, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xf21,0xf21,0xf21,0xf21,0xf29,0xf30,0xf32,0xf39, +0xf41,0xf45,0xf45,0xf48,0xf45,0xf45,0xf4e,0xf45,0x8b4,0x8bc,0x8bd,0x8bd,0x8bd,0x8bd,0x8bd,0x8bd, +0xfd6,0x969,0x96d,0x9e4,0xfc6,0xfc6,0xfc6,0x941,0xfce,0x961,0xffe,0x9bc,0x949,0x951,0x951,0x2a0, +0x9ac,0x9b4,0x9b4,0x9b4,0x6ce,0xe42,0xe42,0x6d6,0xe4a,0xe4a,0xe4a,0xe4a,0xe4a,0xe4a,0x6de,0x2ec, +0xcd4,0xcec,0x6e6,0xcf4,0x6ee,0xcfc,0xd04,0xd0c,0x6f6,0x6fb,0xd14,0xd1b,0x700,0x708,0x92a,0x92e, +0x710,0xd2b,0x718,0xd23,0xd34,0xd38,0xd30,0x720,0xd56,0xd56,0xd40,0xd46,0xd56,0xd56,0xd57,0xd4e, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0x728,0xf86,0xf86, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0x730,0x737,0x737, +0xe5a,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60, +0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60,0xe60, +0xe60,0xe60,0xe60,0xe60,0x73f,0xe68,0x2f4,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x98c,0x9ec,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed, +0xff6,0x2fc,0x102b,0x9f5,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6, +0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8, +0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda, +0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5, +0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7, +0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9, +0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb, +0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6, +0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8, +0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda, +0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5, +0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7, +0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9, +0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb, +0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6, +0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8, +0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda, +0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5, +0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7, +0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9, +0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb, +0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0xddb,0xdd5,0xdd6,0xdd7,0xdd8,0xdd9,0xdda,0x304,0x2a0,0x2a0, +0x1043,0x1046,0x104e,0x1054,0x105c,0x105d,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065, +0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x2a0,0x1065,0x106d,0x1065,0x1075,0x1076,0x107e,0x107f, +0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd, +0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd,0xdcd, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a, +0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xa3a,0xd67,0xd67,0xd67,0xd67,0xd67,0xd67,0xd67,0xd67, +0xd6c,0x747,0xf56,0x74d,0x1006,0x1006,0x751,0x758,0x760,0x768,0x770,0xc3f,0xc46,0x778,0x77d,0xc4e, +0xc84,0xc84,0xc2f,0xc37,0xc56,0xc7b,0xc7c,0xc8c,0xc5e,0xc63,0x785,0xc6b,0x78d,0xc73,0x795,0x799, +0x9c4,0x7a1,0x7a9,0x7b1,0xc94,0xc9a,0xc9f,0x7b9,0x7c9,0xcc4,0xccc,0xcaf,0xcb4,0x7d1,0x7d9,0x7c1, +0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd, +0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdbd,0xdc5,0xdc5,0xdc5,0xdc5, +0x8c5,0x8cc,0x8d4,0x8dc,0xf8e,0xf8e,0xf8e,0x8e4,0x8ec,0x8ef,0xfbe,0xfb6,0x30c,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x7e1,0x7e9,0x314,0x2a0,0x8f7,0xfde,0x9a4,0x2a0, +0xe95,0xe88,0xe8d,0xf96,0x8ff,0x31c,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x907,0x90a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x9fd,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x975,0x97c,0x984,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033, +0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0x1033,0xa05,0xa09,0xa09,0xa09,0xa09, +0x103b,0x103b,0x103b,0xa11,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0x7f1,0xea5,0x7f9,0xea6,0xeae,0xeb6,0xebc,0x801,0x809, +0xfae,0xfae,0x324,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0xf9e,0xf9e,0x912,0xa19,0x2a0,0x2a0,0x2a0,0x2a0, +0xee5,0xee0,0x811,0xee3,0x819,0x821,0x829,0xee9,0x831,0x839,0x841,0xee2,0xeea,0xee5,0xee0,0xee8, +0xee3,0xeeb,0xee6,0xee1,0xee9,0x848,0xec4,0xecc,0xed3,0xeda,0xec7,0xecf,0xed6,0xedd,0x850,0xf0b, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x328, +0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb, +0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb, +0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xefb, +0xefb,0xefb,0xefb,0xefb,0xefb,0xefb,0xa2a,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21, +0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21, +0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21, +0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03, +0xa32,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21, +0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21, +0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa21,0xa22, +0x858,0xef3,0xef3,0xef3,0x330,0x330,0x330,0x330,0xfa6,0xfa6,0xfa6,0xfa6,0xfa6,0xfa6,0xfa6,0x338, +0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330, +0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330, +0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330, +0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d, +0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d, +0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d, +0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd9d,0xd8d, +0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5, +0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5, +0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5, +0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xda5,0xd95, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x40b,0x615,0x477,0x432,0x540,0x47a,0x47a, -0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a, -0x729,0x555,0x708,0x3e4,0x6ed,0x6c3,0x3e4,0x70b,0x690,0x456,0x3e4,0x6f0,0x60f,0x567,0x612,0x72c, -0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x60c,0x60f,0x3e7,0x3e7,0x3e7,0x555, -0x3e4,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x690,0x6ed,0x456,0x3ed,0x3f0, -0x3ea,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3, -0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x690,0x429,0x456,0x3e7,0x47a, -0x47d,0x47d,0x47d,0x47d,0x47d,0x732,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x55b,0x165,0x6c6,0x6f3,0x6de,0x6f3,0x3ff,0x165,0x16b,0x1da,0x171,0x6f9,0x402,0x41d,0x38d,0x405, -0x6b1,0x6e1,0x162,0x162,0x42f,0x1dd,0x165,0x16e,0x16b,0x162,0x171,0x6f9,0x15f,0x15f,0x15f,0x165, -0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x396,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, -0x396,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x168,0x396,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x396,0x390, -0x393,0x393,0x1e0,0x1e0,0x1e0,0x1e0,0x390,0x1e0,0x393,0x393,0x393,0x1e0,0x393,0x393,0x1e0,0x1e0, -0x390,0x1e0,0x393,0x393,0x1e0,0x1e0,0x1e0,0x168,0x390,0x393,0x393,0x1e0,0x393,0x1e0,0x390,0x1e0, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x8af,0x60,0x60,0x60,0x60,0x60,0x60, +0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x426,0x621,0x450,0x450,0x54c,0x495,0x495, +0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495, +0x747,0x561,0x717,0x3ff,0x6fc,0x6d2,0x3ff,0x71a,0x69f,0x474,0x3ff,0x6ff,0x61b,0x573,0x61e,0x74a, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x618,0x61b,0x402,0x402,0x402,0x561, +0x3ff,0x417,0x417,0x417,0x417,0x417,0x417,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411, +0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x69f,0x6fc,0x474,0x408,0x40b, +0x405,0x414,0x414,0x414,0x414,0x414,0x414,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e, +0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x69f,0x447,0x474,0x402,0x495, +0x498,0x498,0x498,0x498,0x498,0x750,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498, +0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498,0x498, +0x567,0x17d,0x6d5,0x702,0x6ed,0x702,0x41a,0x17d,0x183,0x1f2,0x189,0x708,0x41d,0x43b,0x3a8,0x420, +0x6c0,0x6f0,0x17a,0x17a,0x44d,0x1f5,0x17d,0x186,0x183,0x17a,0x189,0x708,0x177,0x177,0x177,0x17d, +0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x3b1,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb, +0x3b1,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x180,0x3b1,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x3b1,0x3ab, +0x3ae,0x3ae,0x1f8,0x1f8,0x1f8,0x1f8,0x3ab,0x1f8,0x3ae,0x3ae,0x3ae,0x1f8,0x3ae,0x3ae,0x1f8,0x1f8, +0x3ab,0x1f8,0x3ae,0x3ae,0x1f8,0x1f8,0x1f8,0x180,0x3ab,0x3ae,0x3ae,0x1f8,0x3ae,0x1f8,0x3ab,0x1f8, +0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x8b8,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x8d0,0x8d0,0x8d3,0x8d3,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x90,0x90,0x90,0x90, -0x8e5,0xa26,0x8e5,0x8e5,0x8e5,0xa26,0x8e5,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab, +0x8d9,0x8d9,0x8dc,0x8dc,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d,0x8d,0x8d,0x8d, +0x8ee,0xa41,0x8ee,0x8ee,0x8ee,0xa41,0x8ee,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xbdf,0xbdf,0xbdf,0xc39,0xc39,0xc30,0xc30,0xc39,0xbdc,0xbdc,0xbdc,0xbdc,0x13b,0x13b,0x13b,0x13b, +0xbf1,0xbf1,0xbf1,0xc4b,0xc4b,0xc42,0xc42,0xc4b,0xbee,0xbee,0xbee,0xbee,0x138,0x138,0x138,0x138, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x7a4,0x7a4,0x7a4,0x7a4,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0x7c5,0x7c5,0x7c5,0x7c5,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0x10e,0x10e,0x10e,0x10e,0x10e, +0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x10b,0x10b,0x10b,0x10b,0x10b, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xcc,0xcc,0xcc,0xcc,0xcc, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0xc9,0xc9,0xc9,0xc9,0xc9, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0x102,0x102,0x102,0x102,0x102,0x102, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xff,0xff,0xff,0xff,0xff,0xff, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb91,0xb91,0xc15,0xc15,0xc15,0xb91,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b, +0xba9,0xba9,0xc2a,0xc2a,0xc2a,0xba9,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x747,0x747, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x765,0x765, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, +0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -0xb49,0xb4c,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x207,0x3ab,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, -0x564,0x564,0x8c4,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11, -9,9,9,9,0x228,0x225,9,9,9,9,0x22e,9,9,9,0x603,9, -9,9,9,9,0x22b,0x228,0x23d,0x21c,0x23d,0x23d,0x23d,9,0x23d,9,0x23d,0x23d, -0x234,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, -0x3b4,0x3b4,9,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x23d,0x23d,0x234,0x234,0x234,0x234, -0x234,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1, -0x3b1,0x3b1,0x231,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x234,0x234,0x234,0x234,0x234,9, -0x240,0x240,0x243,0x23d,0x23d,0x240,0x237,0x7c2,0x96c,0x969,0x23a,0x7c2,0x23a,0x7c2,0x23a,0x7c2, -0x24f,0x249,0x246,0x480,0x480,0x480,0x480,0xc,0x870,0x870,0x972,0x96f,0x7cb,0x7c5,0x7cb,0x7c5, -0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249, -0x24f,0x252,0x24c,0x24f,0x249,0x972,0x96f,0x24f,0x249,0x972,0x96f,0x24f,0x249,0x972,0x96f,0xc, -0x252,0x24c,0x252,0x24c,0x24f,0x249,0x252,0x24c,0x24f,0x249,0x252,0x24c,0x252,0x24c,0x252,0x24c, -0x24f,0x249,0x252,0x24c,0x7ce,0x7c8,0x252,0x24c,0x252,0x24c,0x252,0x24c,0x252,0x24c,0xb58,0xb55, -0x252,0x24c,0xc,0xc,0xc,0xc,0xc,0xc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xf,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0xf,0xf,0x264,0x255,0x255,0x258,0x255,0x258,0x255,0xf,0x25b,0x25b,0x25b, -0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, -0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25e, -0xf,0x606,0x84c,0xf,0xf,0xf,0xf,0xf,0x12,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, -0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0xc06,0x76e,0x76e,0x76e,0x76e,0x76e, -0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483, -0x483,0x483,0x12,0x483,0x483,0x483,0x267,0x483,0x267,0x483,0x483,0x270,0x771,0xc09,0xc3f,0xc09, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x12,0x12,0x12,0x12,0x12, -0x273,0x273,0x273,0x26d,0x26a,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0xa71,0xa71,0xa71,0xa71,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0xc66,0x543,0xb37,0xa74,0xa74, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0x15,0x15,0x15,0x15,0x15,0x543,0x15,0x15,0xc42,0x546, -0x15,0x27f,0x282,0x282,0x282,0x282,0x282,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, -0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x15,0x15,0x15,0x15,0x15, -0x279,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x873,0x873,0x873,0xafe,0xb04,0xb01,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0x15, -0x7e0,0x7e0,0x7e0,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7da,0x7dd,0x7da,0x18,0x7d7, -0x7e3,0x876,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x18,0x18,0xa7a,0xa7a,0xa7a, -0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a, -0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f, -0x87f,0x978,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1e,0x495,0x495,0x49e,0xa7d,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, +0x570,0x570,0x8cd,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, +6,6,6,6,0x243,0x240,6,6,6,6,0x249,0xc93,0xc93,0xc93,0x60f,6, +6,6,6,6,0x246,0x243,0x258,0x237,0x258,0x258,0x258,6,0x258,6,0x258,0x258, +0x24f,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, +0x3cf,0x3cf,6,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x258,0x258,0x24f,0x24f,0x24f,0x24f, +0x24f,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc, +0x3cc,0x3cc,0x24c,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x24f,0x24f,0x24f,0x24f,0x24f,6, +0x25b,0x25b,0x25e,0x258,0x258,0x25b,0x252,0x7e3,0x98d,0x98a,0x255,0x7e3,0x255,0x7e3,0x255,0x7e3, +0x26a,0x264,0x261,0x49b,0x49b,0x49b,0x49b,9,0x894,0x894,0x993,0x990,0x7ec,0x7e6,0x7ec,0x7e6, +0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264, +0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0xc,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c, +0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0xc,0xc,0x27f,0x270,0x270, +0x273,0x270,0x273,0x270,0xc,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x279,0xc,0x612,0x86a,0xc,0xc,0xc,0xc,0xc, +0xf,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c, +0x282,0x49e,0x49e,0x28b,0x78f,0xc1e,0xc51,0xc1e,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, -0x28e,0x291,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x291,0x28e,0x28e,0x291,0x28e,0x28e,0x28e, -0x28e,0x28e,0x1e,0x1e,0x498,0x28e,0x49e,0x49e,0x49e,0x495,0x495,0x495,0x495,0x495,0x495,0x495, -0x495,0x49e,0x49e,0x49e,0x49e,0x49b,0x1e,0x1e,0x28e,0x498,0x498,0x498,0x498,0x1e,0x1e,0x1e, -0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x28e,0x28e,0x495,0x495,0x40e,0x40e,0x657,0x657, -0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x28b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0xb5b,0x1e,0x1e,0x21,0x4a1,0x4aa,0x4aa,0x21,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x297,0x21,0x21,0x297,0x297,0x21,0x21,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x21,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x21,0x297,0x21,0x21,0x21,0x297,0x297,0x297,0x297,0x21,0x21,0x4a4,0xa80,0x4a1,0x4aa, -0x4aa,0x4a1,0x4a1,0x4a1,0x4a1,0x21,0x21,0x4aa,0x4aa,0x21,0x21,0x4ad,0x4ad,0x4a7,0xb5e,0x21, -0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x4a1,0x21,0x21,0x21,0x21,0x29a,0x29a,0x21,0x29a, -0x297,0x297,0x4a1,0x4a1,0x21,0x21,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x297,0x297,0x6cc,0x6cc,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x21,0x21,0x21,0x21,0x21, -0x24,0xb07,0x4b0,0xb0a,0x24,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x24,0x24,0x24,0x24,0x29d, -0x29d,0x24,0x24,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, -0x29d,0x24,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x24,0x29d,0x2a0,0x24,0x29d,0x2a0,0x24, -0x29d,0x29d,0x24,0x24,0x4b3,0x24,0x4b9,0x4b9,0x4b9,0x4b0,0x4b0,0x24,0x24,0x24,0x24,0x4b0, -0x4b0,0x24,0x24,0x4b0,0x4b0,0x4b6,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, -0x24,0x2a0,0x2a0,0x2a0,0x29d,0x24,0x2a0,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x65d,0x65d, -0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x4b0,0x4b0,0x29d,0x29d,0x29d,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x4bc,0x4bc,0x4c5,0x27,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0xa83,0x2a3,0x27,0x2a3,0x2a3,0x2a3,0x27,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x27,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x27,0x2a3,0x2a3,0x27,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x27,0x27,0x4bf,0x2a3,0x4c5,0x4c5, -0x4c5,0x4bc,0x4bc,0x4bc,0x4bc,0x4bc,0x27,0x4bc,0x4bc,0x4c5,0x27,0x4c5,0x4c5,0x4c2,0x27,0x27, -0x2a3,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, -0x2a3,0xa83,0xb0d,0xb0d,0x27,0x27,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, -0x27,0xb43,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, -0x2a,0x4c8,0x4d1,0x4d1,0x2a,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a,0x2a,0x2a9, -0x2a9,0x2a,0x2a,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, -0x2a9,0x2a,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a,0x2a9,0x2a9,0x2a,0xa86,0x2a9,0x2a9, -0x2a9,0x2a9,0x2a,0x2a,0x4cb,0x2a9,0x4c8,0x4c8,0x4d1,0x4c8,0x4c8,0x4c8,0x2a,0x2a,0x2a,0x4d1, -0x4d4,0x2a,0x2a,0x4d4,0x4d4,0x4ce,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x4c8,0x4c8, -0x2a,0x2a,0x2a,0x2a,0x2ac,0x2ac,0x2a,0x2a9,0x2a9,0x2a9,0x2a,0x2a,0x2a,0x2a,0x663,0x663, -0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x2a6,0xa86,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, -0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2d,0x2d,0x4d7,0x2b2,0x2d,0x2b2,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2d,0x2d,0x2d,0x2b2,0x2b2,0x2b2,0x2d,0x2b2,0x2b2,0x2b5,0x2b2,0x2d,0x2d, -0x2d,0x2b2,0x2b2,0x2d,0x2b2,0x2d,0x2b2,0x2b2,0x2d,0x2d,0x2d,0x2b2,0x2b2,0x2d,0x2d,0x2d, -0x2b2,0x2b2,0x2b2,0x2d,0x2d,0x2d,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0xb61,0x2b2, -0x2b2,0x2b2,0x2d,0x2d,0x2d,0x2d,0x4d7,0x4dd,0x4d7,0x4dd,0x4dd,0x2d,0x2d,0x2d,0x4dd,0x4dd, -0x4dd,0x2d,0x4e0,0x4e0,0x4e0,0x4da,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x4d7, -0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xc5a,0x666,0x666,0x666,0x666,0x666, -0x666,0x666,0x666,0x666,0x2af,0x2af,0x2af,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xb46,0xa89,0x2d, -0x2d,0x2d,0x2d,0x2d,0x30,0x4ec,0x4ec,0x4ec,0x30,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x2b8,0x30,0x2b8,0x2b8,0x2b8,0x30,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x30,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x30,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x30,0x30,0x30,0x30,0x4e3,0x4e3,0x4e3,0x4ec,0x4ec,0x4ec, -0x4ec,0x30,0x4e3,0x4e3,0x4e6,0x30,0x4e3,0x4e3,0x4e3,0x4e9,0x30,0x30,0x30,0x30,0x30,0x30, -0x30,0x4e3,0x4e3,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x2b8,0x2b8,0x30,0x30, -0x30,0x30,0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x30,0x30,0x30,0x30, -0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x33,0x33,0x4f5,0x4f5, -0x33,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x33,0x2bb,0x2bb,0x2bb,0x33,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x33,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x33,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x33,0x33, -0xb10,0xa8c,0x4f5,0x4ef,0x4f8,0x4f5,0x4ef,0x4f5,0x4f5,0x33,0x4ef,0x4f8,0x4f8,0x33,0x4f8,0x4f8, -0x4ef,0x4f2,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x4ef,0x4ef,0x33,0x33,0x33,0x33,0x33, -0x33,0x33,0x2bb,0x33,0x2bb,0x2bb,0x33,0x33,0x33,0x33,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x33,0x33,0x33,0x33,0x36,0x36,0x501,0x501,0x36,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be, -0x2be,0x36,0x2be,0x2be,0x2be,0x36,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be, -0x2be,0x2be,0x2be,0x2be,0x2be,0x36,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be, -0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x36,0x36,0x36,0x36,0x4fb,0x501,0x501,0x4fb,0x4fb,0x4fb, -0x36,0x36,0x501,0x501,0x501,0x36,0x504,0x504,0x504,0x4fe,0x36,0x36,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x4fb,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x2be,0x2be,0x36,0x36, -0x36,0x36,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x39,0x888,0x888, -0x39,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec, -0x7ec,0x7ec,0x7ec,0x39,0x39,0x39,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec, -0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x39,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec, -0x7ec,0x7ec,0x7ec,0x7ec,0x39,0x7ec,0x39,0x39,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x39, -0x39,0x39,0x885,0x39,0x39,0x39,0x39,0x882,0x888,0x888,0x882,0x882,0x882,0x39,0x882,0x39, -0x888,0x888,0x88b,0x888,0x88b,0x88b,0x88b,0x882,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x888,0x888,0x7e9,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3c,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x507,0x711,0x70e,0x507,0x507,0x507,0x507, -0x507,0x507,0x50d,0x3c,0x3c,0x3c,0x3c,0x6cf,0x717,0x717,0x717,0x717,0x717,0x711,0x714,0x50a, -0x50a,0x50a,0x50a,0x50a,0x50a,0x507,0x50a,0x2c1,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672, -0x672,0x672,0x411,0x411,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x28e,0x28e,0x28e,0xf,0xf,0xf,0xf,0xf,0x28e,0x28e,0x28e,0x288,0x285,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xa89,0xa89,0xa89,0xa89,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0xc7b,0x54f,0xb49,0xa8c,0xa8c,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0x12,0x12, +0x12,0x12,0x12,0x54f,0x12,0x12,0xc54,0x552,0x12,0x29a,0x29d,0x29d,0x29d,0x29d,0x29d,0x29a, +0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, +0x29a,0x29a,0x29a,0x12,0x12,0x12,0x12,0x12,0x294,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, +0x29a,0x29a,0x29a,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x897,0x897,0x897,0xb13,0xb19, +0xb16,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0x12,0x801,0x801,0x801,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe, +0x7fe,0x7fe,0x7fe,0x7fb,0x7fe,0x7fb,0x15,0x7f8,0x804,0x89a,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d,0x89d, +0x89d,0x89d,0x89d,0x15,0x15,0xa92,0xa92,0xa92,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x807,0x807,0x807,0x807,0x807,0x807,0x8a3,0x8a3, +0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x999,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x4b0,0x4b0,0x4b9,0xa95,0x2a9,0x2a9,0x2a9, +0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, +0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2ac,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, +0x2a9,0x2ac,0x2a9,0x2a9,0x2ac,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x1b,0x1b,0x4b3,0x2a9,0x4b9,0x4b9, +0x4b9,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b9,0x4b9,0x4b9,0x4b9,0x4b6,0x1b,0x1b, +0x2a9,0x4b3,0x4b3,0x4b3,0x4b3,0x1b,0x1b,0x1b,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, +0x2a9,0x2a9,0x4b0,0x4b0,0x42c,0x42c,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666, +0x2a6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xc9c,0xc9c,0xb73,0xc9c,0xc9c, +0x1e,0x4bc,0x4c5,0x4c5,0x1e,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x1e,0x1e,0x2b2, +0x2b2,0x1e,0x1e,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, +0x2b2,0x1e,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x1e,0x2b2,0x1e,0x1e,0x1e,0x2b2,0x2b2, +0x2b2,0x2b2,0x1e,0x1e,0x4bf,0xa98,0x4bc,0x4c5,0x4c5,0x4bc,0x4bc,0x4bc,0x4bc,0x1e,0x1e,0x4c5, +0x4c5,0x1e,0x1e,0x4c8,0x4c8,0x4c2,0xb76,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x4bc, +0x1e,0x1e,0x1e,0x1e,0x2b5,0x2b5,0x1e,0x2b5,0x2b2,0x2b2,0x4bc,0x4bc,0x1e,0x1e,0x669,0x669, +0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x669,0x2b2,0x2b2,0x6db,0x6db,0x2af,0x2af,0x2af,0x2af, +0x2af,0x2af,0x2af,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0xb1c,0x4cb,0xb1f,0x21,0x2b8,0x2b8,0x2b8, +0x2b8,0x2b8,0x2b8,0x21,0x21,0x21,0x21,0x2b8,0x2b8,0x21,0x21,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, +0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x21,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, +0x2b8,0x21,0x2b8,0x2bb,0x21,0x2b8,0x2bb,0x21,0x2b8,0x2b8,0x21,0x21,0x4ce,0x21,0x4d4,0x4d4, +0x4d4,0x4cb,0x4cb,0x21,0x21,0x21,0x21,0x4cb,0x4cb,0x21,0x21,0x4cb,0x4cb,0x4d1,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x2bb,0x2bb,0x2bb,0x2b8,0x21,0x2bb,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, +0x4cb,0x4cb,0x2b8,0x2b8,0x2b8,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x24,0x4d7,0x4d7,0x4e0,0x24,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0xa9b,0x2be,0x24,0x2be, +0x2be,0x2be,0x24,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be, +0x2be,0x24,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x24,0x2be,0x2be,0x24,0x2be,0x2be,0x2be, +0x2be,0x2be,0x24,0x24,0x4da,0x2be,0x4e0,0x4e0,0x4e0,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x24,0x4d7, +0x4d7,0x4e0,0x24,0x4e0,0x4e0,0x4dd,0x24,0x24,0x2be,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x2be,0xa9b,0xb22,0xb22,0x24,0x24,0x66f,0x66f, +0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x66f,0x24,0xb55,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x4e3,0x4ec,0x4ec,0x27,0x2c4,0x2c4,0x2c4, +0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x27,0x27,0x2c4,0x2c4,0x27,0x27,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, +0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x27,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, +0x2c4,0x27,0x2c4,0x2c4,0x27,0xa9e,0x2c4,0x2c4,0x2c4,0x2c4,0x27,0x27,0x4e6,0x2c4,0x4e3,0x4e3, +0x4ec,0x4e3,0x4e3,0x4e3,0x27,0x27,0x27,0x4ec,0x4ef,0x27,0x27,0x4ef,0x4ef,0x4e9,0x27,0x27, +0x27,0x27,0x27,0x27,0x27,0x27,0x4e3,0x4e3,0x27,0x27,0x27,0x27,0x2c7,0x2c7,0x27,0x2c4, +0x2c4,0x2c4,0x27,0x27,0x27,0x27,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672,0x672, +0x2c1,0xa9e,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, +0x2a,0x2a,0x4f2,0x2cd,0x2a,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd, +0x2cd,0x2a,0x2cd,0x2cd,0x2d0,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd,0x2a,0x2cd,0x2a,0x2cd,0x2cd, +0x2a,0x2a,0x2a,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2cd,0x2cd, +0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0xb79,0x2cd,0x2cd,0x2cd,0x2a,0x2a,0x2a,0x2a,0x4f2,0x4f8, +0x4f2,0x4f8,0x4f8,0x2a,0x2a,0x2a,0x4f8,0x4f8,0x4f8,0x2a,0x4fb,0x4fb,0x4fb,0x4f5,0x2a,0x2a, +0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x4f2,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, +0x2a,0x2a,0xc6f,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x2ca,0x2ca,0x2ca,0xaa1, +0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xb58,0xaa1,0x2a,0x2a,0x2a,0x2a,0x2a,0x2d,0x507,0x507,0x507, +0x2d,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3, +0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3, +0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d,0x2d, +0x2d,0x2d,0x4fe,0x4fe,0x4fe,0x507,0x507,0x507,0x507,0x2d,0x4fe,0x4fe,0x501,0x2d,0x4fe,0x4fe, +0x4fe,0x504,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x4fe,0x4fe,0x2d,0x2d,0x2d,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d3,0x2d3,0x2d,0x2d,0x2d,0x2d,0x678,0x678,0x678,0x678,0x678,0x678, +0x678,0x678,0x678,0x678,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x30,0x30,0x510,0x510,0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x2d6,0x30,0x2d6,0x2d6,0x2d6,0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x30,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x30,0x30,0xb25,0xaa4,0x510,0x50a,0x513,0x510,0x50a,0x510, +0x510,0x30,0x50a,0x513,0x513,0x30,0x513,0x513,0x50a,0x50d,0x30,0x30,0x30,0x30,0x30,0x30, +0x30,0x50a,0x50a,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x2d6,0x30,0x2d6,0x2d6,0xd0e,0xd0e, +0x30,0x30,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x30,0xc9f,0xc9f,0x30, +0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x33,0x33,0x51c,0x51c, +0x33,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x33,0x2d9,0x2d9,0x2d9,0x33,0x2d9,0x2d9, +0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x33,0x2d9,0x2d9, +0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x33,0x33, +0x33,0x33,0x516,0x51c,0x51c,0x516,0x516,0x516,0x33,0x33,0x51c,0x51c,0x51c,0x33,0x51f,0x51f, +0x51f,0x519,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x516,0x33,0x33,0x33,0x33, +0x33,0x33,0x33,0x33,0x2d9,0x2d9,0x33,0x33,0x33,0x33,0x67e,0x67e,0x67e,0x67e,0x67e,0x67e, +0x67e,0x67e,0x67e,0x67e,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, +0x33,0x33,0x33,0x33,0x36,0x36,0x8ac,0x8ac,0x36,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x36,0x36,0x36,0x80d,0x80d, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, +0x80d,0x80d,0x36,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x36,0x80d,0x36,0x36, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x36,0x36,0x36,0x8a9,0x36,0x36,0x36,0x36,0x8a6, +0x8ac,0x8ac,0x8a6,0x8a6,0x8a6,0x36,0x8a6,0x36,0x8ac,0x8ac,0x8af,0x8ac,0x8af,0x8af,0x8af,0x8a6, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x8ac,0x8ac,0x80a,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x39,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729, +0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729, +0x729,0x71d,0x729,0x726,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x723,0x39,0x39,0x39,0x39,0x6de, +0x72f,0x72f,0x72f,0x72f,0x72f,0x729,0x72c,0x720,0x720,0x720,0x720,0x720,0x720,0x71d,0x720,0x2dc, +0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x42f,0x42f,0x39,0x39,0x39,0x39, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3c,0x73b,0x73b,0x3c, +0x73b,0x3c,0x3c,0x73b,0x73b,0x3c,0x73b,0x3c,0x3c,0x73b,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x73b,0x73b,0x73b,0x73b,0x3c,0x73b,0x73b,0x73b,0x73b,0x73b,0x73b,0x73b,0x3c,0x73b,0x73b,0x73b, +0x3c,0x73b,0x3c,0x73b,0x3c,0x3c,0x73b,0x73b,0x3c,0x73b,0x73b,0x73b,0x73b,0x732,0x73b,0x738, +0x732,0x732,0x732,0x732,0x732,0x732,0x3c,0x732,0x732,0x73b,0x3c,0x3c,0x744,0x744,0x744,0x744, +0x744,0x3c,0x741,0x3c,0x735,0x735,0x735,0x735,0x735,0x732,0x3c,0x3c,0x684,0x684,0x684,0x684, +0x684,0x684,0x684,0x684,0x684,0x684,0x3c,0x3c,0x73e,0x73e,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, 0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3f,0x71d,0x71d,0x3f,0x71d,0x3f,0x3f,0x71d,0x71d,0x3f,0x71d,0x3f, -0x3f,0x71d,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x71d,0x71d,0x71d,0x71d,0x3f,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x3f,0x71d,0x71d,0x71d,0x3f,0x71d,0x3f,0x71d,0x3f,0x3f,0x71d,0x71d, -0x3f,0x71d,0x71d,0x71d,0x71d,0x510,0x71d,0x71a,0x510,0x510,0x510,0x510,0x510,0x510,0x3f,0x510, -0x510,0x71d,0x3f,0x3f,0x726,0x726,0x726,0x726,0x726,0x3f,0x723,0x3f,0x513,0x513,0x513,0x513, -0x513,0x510,0x3f,0x3f,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x3f,0x3f, -0x720,0x720,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x777,0x777,0x777,0x77a, +0x777,0x777,0x777,0x777,0x3f,0x777,0x777,0x777,0x777,0x77a,0x777,0x777,0x777,0x777,0x77a,0x777, +0x777,0x777,0x777,0x77a,0x777,0x777,0x777,0x777,0x77a,0x777,0x777,0x777,0x777,0x777,0x777,0x777, +0x777,0x777,0x777,0x777,0x777,0x77a,0x813,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x792,0x792,0x795, +0x792,0x795,0x795,0x798,0x795,0x798,0x792,0x792,0x792,0x792,0x792,0x783,0x792,0x795,0x79b,0x79b, +0x79e,0x780,0x79b,0x79b,0x777,0x777,0x777,0x777,0x3f,0x3f,0x3f,0x3f,0x792,0x792,0x792,0x795, +0x792,0x792,0x8b2,0x792,0x3f,0x792,0x792,0x792,0x792,0x795,0x792,0x792,0x792,0x792,0x795,0x792, +0x792,0x792,0x792,0x795,0x792,0x792,0x792,0x792,0x795,0x792,0x8b2,0x8b2,0x8b2,0x792,0x792,0x792, +0x792,0x792,0x792,0x792,0x8b2,0x795,0x8b2,0x8b2,0x8b2,0x3f,0x86d,0x86d,0x810,0x810,0x810,0x810, +0x810,0x810,0x8b5,0x810,0x810,0x810,0x810,0x810,0x810,0x3f,0x3f,0x810,0xc0f,0xc0f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, -0x3f,0x3f,0x3f,0x3f,0x759,0x759,0x759,0x75c,0x759,0x759,0x759,0x759,0x42,0x759,0x759,0x759, -0x759,0x75c,0x759,0x759,0x759,0x759,0x75c,0x759,0x759,0x759,0x759,0x75c,0x759,0x759,0x759,0x759, -0x75c,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x75c,0x7f2,0x42, -0x42,0x42,0x42,0x42,0x42,0x774,0x774,0x777,0x774,0x777,0x777,0x77a,0x777,0x77a,0x774,0x774, -0x774,0x774,0x774,0x765,0x774,0x777,0x77d,0x77d,0x77d,0x762,0x77d,0x77d,0x759,0x759,0x759,0x759, -0x42,0x42,0x42,0x42,0x774,0x774,0x774,0x777,0x774,0x774,0x88e,0x774,0x42,0x774,0x774,0x774, -0x774,0x777,0x774,0x774,0x774,0x774,0x777,0x774,0x774,0x774,0x774,0x777,0x774,0x774,0x774,0x774, -0x777,0x774,0x88e,0x88e,0x88e,0x774,0x774,0x774,0x774,0x774,0x774,0x774,0x88e,0x777,0x88e,0x88e, -0x88e,0x42,0x84f,0x84f,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x891,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef, -0x7ef,0x42,0x42,0x7ef,0xbfa,0xbfa,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, +0x918,0x918,0x42,0x918,0x918,0x918,0x91b,0x918,0x42,0x918,0x918,0x42,0x915,0x90c,0x90c,0x90c, +0x90c,0x915,0x90c,0x42,0x42,0x42,0x90c,0x90f,0x915,0x912,0x42,0x42,0x42,0x42,0x42,0x42, +0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x870,0x870,0x816,0x816,0x816,0x816, +0x918,0x918,0x918,0x918,0x918,0x918,0x915,0x915,0x90c,0x90c,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, -0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x906,0x906,0x45,0x906,0x906,0x906,0x909,0x906, -0x45,0x906,0x906,0x45,0x89d,0x894,0x894,0x894,0x894,0x89d,0x894,0x45,0x45,0x45,0x894,0x897, -0x89d,0x89a,0x45,0x45,0x45,0x45,0x45,0x45,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4, -0x8f4,0x8f4,0x852,0x852,0x7f5,0x7f5,0x7f5,0x7f5,0x906,0x906,0x906,0x906,0x906,0x906,0x89d,0x89d, -0x894,0x894,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, -0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, -0x45,0x45,0x45,0x45,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x48,0x48,0x48,0x48,0x48,0x48, -0x48,0x48,0x48,0x48,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x97b,0x97b,0xb64,0xb64,0x2c4, -0xb67,0x48,0x48,0x48,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x4b,0x4b, -0x4b,0x4b,0x4b,0x73b,0x741,0x741,0x741,0x4b,0x4b,0x4b,0x4b,0x4b,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0xb6d,0x804,0x4e,0x804,0x804,0x804,0x804,0x4e,0x4e,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x4e,0x804,0x4e,0x804,0x804,0x804,0x804,0x4e,0x4e,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0xb6d,0x804,0x4e,0x804,0x804,0x804,0x804,0x4e,0x4e,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xb6d, -0x804,0x4e,0x804,0x804,0x804,0x804,0x4e,0x4e,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x4e, -0x804,0x4e,0x804,0x804,0x804,0x804,0x4e,0x4e,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xb6d, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x4e,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xb6d,0x804,0x4e,0x804,0x804,0x804,0x804,0x4e,0x4e, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xb6d,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x4e,0x4e,0x4e,0x4e,0xc0f, -0xb6a,0x855,0x7fe,0x7fb,0x7fb,0x7fb,0x7fb,0x7fe,0x7fe,0x801,0x801,0x801,0x801,0x801,0x801,0x801, -0x801,0x801,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x4e,0x4e,0x4e, -0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, -0x807,0x807,0x807,0x807,0x807,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51, -0x54,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, -0x810,0x80a,0x80d,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x54,0x54,0x54,0x54,0x54, -0x54,0x54,0x54,0x54,0x858,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x8fd, -0x86d,0x57,0x57,0x57,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x85b, -0x85b,0x85b,0x816,0x816,0x816,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a, -0x5a,0x5a,0x5a,0x5a,0x8ac,0x8ac,0x8ac,0x8ac,0x8ac,0x8ac,0x8a0,0x8ac,0x8ac,0x8a3,0x8a3,0x8a3, -0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a3,0x8a6,0x8a9,0x861,0x861,0x8eb,0x8ee,0x85e,0x8e8,0x861,0x900, -0x819,0xb13,0x5d,0x5d,0x8f7,0x8f7,0x8f7,0x8f7,0x8f7,0x8f7,0x8f7,0x8f7,0x8f7,0x8f7,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x81c,0x81c,0x864,0x867,0x864,0x864,0x86a,0x81c,0x864,0x867,0x81c,0x8b2, -0x8b2,0x8b2,0x8be,0x60,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x8fa,0x60,0x60, -0x60,0x60,0x60,0x60,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x60,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd, -0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2d0,0x75f, -0x63,0x63,0x63,0x63,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd, -0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x63,0x63, -0x63,0x63,0x63,0x63,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2df,0x2df,0x2df,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x66,0x66,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2df,0x66,0x66,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x66,0x2df,0x66,0x2df, -0x66,0x2df,0x66,0x2df,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2df,0x2df,0x2df,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, -0x2dc,0x2dc,0x66,0x66,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2df,0x2df,0x2df,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x66,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2d9,0x2dc,0x2d9,0x2d9,0x2d6,0x2dc,0x2dc,0x2dc,0x66,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2d6,0x2d6,0x2d6,0x2dc,0x2dc,0x2dc,0x2dc,0x66,0x66,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x66,0x2d6,0x2d6,0x2d6,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2d6,0x2d6,0x2d6,0x66,0x66,0x2dc,0x2dc,0x2dc,0x66,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2d6,0x2d9,0x66,0xa59,0x97e,0x97e,0x97e,0x69,0x69,0x69,0x69,0x69,0x69,0x51c,0x51c, -0x51c,0x51c,0x51c,0x51c,0x2f4,0x98d,0x6c,0x6c,0x189,0x2f4,0x2f4,0x2f4,0x2f4,0x2f4,0x2fa,0x300, -0x2fa,0x684,0x43e,0x18c,0x2f1,0x186,0x186,0x186,0x186,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f7,0x2fd, -0x2f7,0x681,0x43b,0x6c,0xb73,0xb73,0xb73,0xb73,0xb73,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, -0x6c,0x6c,0x6c,0x6c,0x6d2,0x6d2,0x6d2,0x6d2,0x6d2,0x6d2,0x6d2,0x6ae,0x6d5,0x6e7,0x6d2,0x795, -0x7aa,0x903,0x903,0x903,0xa53,0xa53,0xc69,0xc69,0xc69,0xc69,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f, -0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x525,0x525,0x525,0x525, -0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x522,0x522,0x525,0x8b5,0x8b5, -0x9f6,0x9fc,0x9fc,0x9f9,0x9f9,0x9f9,0x9f9,0xc12,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72, -0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x996,0x993,0x993,0x993, -0x993,0x99c,0x999,0x999,0x999,0x999,0x990,0x993,0xb76,0x75,0x75,0x75,0x78,0x78,0x78,0x3cc, -0x19b,0x153,0x321,0x321,0x321,0x321,0x321,0x19b,0x3cc,0x3cc,0x19b,0x321,0x327,0x327,0x327,0x831, -0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x336,0x336,0x32d,0x32d,0x32d,0x32d,0x9a5,0x9a5,0x9a5,0x9a5, -0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0xa9b,0xa9e,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, +0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x2e5,0x2e5,0x2e5,0x2e5, +0x2e5,0x2e5,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x2e2,0x2e2,0x2e2,0x2e2, +0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2, +0x2e2,0x2e2,0x2e2,0x99c,0x99c,0xb7c,0xb7c,0x2df,0xb7f,0x45,0x45,0x45,0x756,0x756,0x756,0x756, +0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756, +0x756,0x756,0x756,0x756,0x756,0x756,0x48,0x48,0x48,0x48,0x48,0x759,0x75f,0x75f,0x75f,0x48, +0x48,0x48,0x48,0x48,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c, +0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x48,0x48, +0x48,0x48,0x48,0x48,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x4b,0x825,0x825, +0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x4b,0x825,0x4b,0x825,0x825, +0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x4b,0x825,0x825, +0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x4b,0x825,0x825,0x825,0x825,0x4b,0x4b, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x4b,0x825,0x4b,0x825,0x825,0x825,0x825,0x4b,0x4b, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x4b, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85, +0x825,0x4b,0x825,0x825,0x825,0x825,0x4b,0x4b,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x4b,0x4b,0x4b,0x4b,0xc24,0xb82,0x873,0x81f,0x81c,0x81c,0x81c,0x81c,0x81f, +0x81f,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x819,0x819,0x819,0x819,0x819,0x819, +0x819,0x819,0x819,0x819,0x819,0x4b,0x4b,0x4b,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828, +0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x4e,0x4e,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x51,0x831,0x831,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x82b,0x82e,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x876,0x834,0x834,0x834, +0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834, +0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x903,0x891,0x54,0x54,0x54,0x837,0x837,0x837,0x837, +0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x879,0x879,0x879,0x837,0x837,0x837,0x57,0x57,0x57, +0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x921,0x92d,0x92d,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x927,0x92a, +0x87f,0x87f,0x8f1,0x930,0x87c,0x83a,0x87f,0x906,0x930,0xb5b,0x5a,0x5a,0x8fd,0x8fd,0x8fd,0x8fd, +0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x83d,0x83d,0x882,0x885, +0x888,0x882,0x88e,0x83d,0x888,0x88b,0x83d,0x8bb,0x8bb,0x8bb,0x8c7,0x5d,0x900,0x900,0x900,0x900, +0x900,0x900,0x900,0x900,0x900,0x900,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x840,0x840,0x840,0x840, +0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, +0x840,0x840,0x840,0x840,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2ee,0x2e8,0x2ee,0x2e8, +0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8, +0x2ee,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2eb,0x77d,0x60,0x60,0x60,0x60,0x2ee,0x2e8,0x2ee,0x2e8, +0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8, +0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x60,0x60,0x60,0x60,0x60,0x60,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x63,0x63,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x63,0x63,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x63,0x2fa,0x63,0x2fa,0x63,0x2fa,0x63,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x63,0x63,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f4,0x2f7,0x2f4,0x2f4,0x2f1,0x2f7,0x2f7, +0x2f7,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f1,0x2f1,0x2f1,0x2f7,0x2f7,0x2f7,0x2f7, +0x63,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x63,0x2f1,0x2f1,0x2f1,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f1,0x2f1,0x2f1,0x63,0x63,0x2f7,0x2f7, +0x2f7,0x63,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f1,0x2f4,0x63,0xa71,0x99f,0x99f,0x99f, +0x66,0x66,0x66,0x66,0x66,0x66,0x528,0x528,0x528,0x528,0x528,0x528,0x30c,0x9ab,0x69,0x69, +0x1a1,0x30c,0x30c,0x30c,0x30c,0x30c,0x312,0x318,0x312,0x693,0x45c,0x1a4,0x309,0x19e,0x19e,0x19e, +0x19e,0x309,0x309,0x309,0x309,0x309,0x30f,0x315,0x30f,0x690,0x459,0x69,0xb8b,0xb8b,0xb8b,0xb8b, +0xb8b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x6e1,0x6e1,0x6e1,0x6e1, +0x6e1,0x6e1,0x6e1,0x6bd,0x6e4,0x6f6,0x6e1,0x7b6,0x7cb,0x909,0x909,0x909,0xa6e,0xa6e,0xc7e,0xc7e, +0xc7e,0xc7e,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6c,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531, +0x531,0x52e,0x52e,0x52e,0x52e,0x531,0x8be,0x8be,0xa11,0xa17,0xa17,0xa14,0xa14,0xa14,0xa14,0xc27, +0xd11,0xd11,0xd11,0xd11,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f, +0x6f,0x6f,0x6f,0x6f,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9ba,0x9b7,0x9b7,0x9b7,0x9b7,0x9ae,0x9b1, +0xb8e,0xca2,0xca5,0x72,0x75,0x75,0x75,0x3e7,0x1b3,0x16b,0x33c,0x33c,0x33c,0x33c,0x33c,0x1b3, +0x3e7,0x3e7,0x1b3,0x33c,0x342,0x342,0x342,0x84f,0xca8,0x75,0x75,0x75,0x75,0x75,0x75,0x75, +0x75,0x75,0x75,0x75,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x351,0x351, +0x348,0x348,0x348,0x348,0xcae,0xcae,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x78,0x363,0x363,0x363,0x363,0x363,0x858,0x858,0x7b,0x7b,0x7b,0x7b,0x7b, 0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, -0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x348,0x348,0x348,0x348,0x348,0x83a,0x83a,0x7e, +0x7b,0x7b,0x7b,0x7b,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x7e, 0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e, -0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81, -0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1, -0x9b1,0x9b1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0x84,0x84,0x84,0xaa1,0xaa1,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0x84,0x84,0x84,0x84,0x84,0x84, -0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84, -0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x87,0x35a,0x35a,0x35a, -0x35a,0x87,0x35a,0x35a,0x35a,0x35a,0x87,0x87,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x87,0x35a,0x35a,0x35a, -0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x35a,0x3d2,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x87,0x35a,0x87,0x35a,0x35a,0x35a,0x35a,0x87,0x87,0x87,0x35a,0x87,0x35a,0x35a,0x35a,0x6ff, -0x6ff,0x6ff,0x6ff,0x87,0x87,0x35a,0x54f,0x54f,0x35a,0x35a,0x35a,0x35a,0xa41,0x9e7,0xa41,0x9e7, -0xa41,0x9e7,0xa41,0x9e7,0xa41,0x9e7,0xa41,0x9e7,0xa41,0x9e7,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1d4,0x1d4,0x1d4,0x1d4,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c, -0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x35a,0x87,0x87,0x87,0x35a,0x35a,0x35a,0x35a, -0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x87,0x35a,0x35a,0x35a, -0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x87,0x8c7,0x8c7,0x8c7,0x8c7, -0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7, -0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8a,0x8c7,0x8c7,0x8c7,0x8c7,0x8ca,0x8c7,0x8c7,0x8c7,0x8c7, -0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8ca, -0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8cd,0x8cd,0x8cd,0x8cd, -0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd, -0x8cd,0x8cd,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x93,0x633,0x5a9,0x633, -0x5a9,0x633,0x5a9,0x633,0x5a9,0x633,0x5a9,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9, -0x5ac,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9,0x5ac,0x5a9,0x5a9,0x5a9,0x5a9,0x633, -0x5a9,0x633,0x5a9,0x633,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x633,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, -0x5ac,0xa35,0xa35,0x93,0x93,0x53d,0x53d,0x630,0x630,0x636,0x639,0xa1d,0x96,0x96,0x96,0x96, -0x96,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x96,0x96,0x96, -0x99,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x99,0x5be,0x5be,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x9c,0x9c,0x9c,0x9c, -0x9c,0x9c,0x9c,0x9c,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, -0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, -0x5cd,0xb2e,0xb2e,0x9f,0x5c7,0x5c7,0x5c7,0x5c7,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, -0x9f,0x9f,0x9f,0x9f,0xb2b,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5ca,0x5ca,0x9f,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2, -0xa2,0xa2,0xa2,0xa2,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0xa8,0xa8,0xa8, +0x7e,0x7e,0x7e,0x7e,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0x81,0x81,0x81,0xab9,0xab9,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xcb1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81, +0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81, +0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x84,0x375,0x375,0x375,0x375,0x84,0x375,0x375, +0x375,0x375,0x84,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x3ed,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x375,0x84,0x375, +0x375,0x375,0x375,0x84,0x84,0x84,0x375,0x84,0x375,0x375,0x375,0x70e,0x70e,0x70e,0x70e,0x84, +0x84,0x375,0x55b,0x55b,0x375,0x375,0x375,0x375,0xa5c,0xa02,0xa5c,0xa02,0xa5c,0xa02,0xa5c,0xa02, +0xa5c,0xa02,0xa5c,0xa02,0xa5c,0xa02,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, +0x174,0x174,0x174,0x174,0x375,0x84,0x84,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x375,0x375,0x375,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x84,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0, +0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0, +0x8d0,0x8d0,0x87,0x8d0,0x8d0,0x8d0,0x8d0,0x8d3,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0, +0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d3,0x87,0x87,0x87,0x87, +0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6, +0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8a,0x8a, +0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x90,0x642,0x5b5,0x642,0x5b5,0x642,0x5b5,0x642, +0x5b5,0x642,0x5b5,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5, +0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b5,0x5b5,0x5b5,0x642,0x5b5,0x642,0x5b5,0x642, +0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x642,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0xa53,0xa53,0x90, +0x90,0x549,0x549,0x63f,0x63f,0x645,0x648,0xa38,0x93,0x93,0x93,0x93,0x93,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x93,0x93,0x93,0x96,0x5c4,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x96, +0x5ca,0x5ca,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, 0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, -0x5dc,0x5df,0x5dc,0x5df,0x5df,0x5dc,0x5dc,0x5df,0x5df,0x5df,0x5dc,0x5dc,0x5dc,0x5dc,0xb1,0xb1, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xb1,0xb1,0xb1,0xb1,0xb1,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, -0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, -0xc4e,0xc4e,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0xb4,0xb4,0xb4,0xb4,0xb4, -0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x35d,0x35d,0x35d,0x35d,0x35d,0xb4,0xb4,0xb4,0xb4, -0xb4,0x846,0x528,0x363,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x360,0x363,0x363, -0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0xb4,0x363,0x363,0x363,0x363, -0x363,0xb4,0x363,0xb4,0x363,0x363,0xb4,0x363,0x363,0xb4,0x363,0x363,0x363,0x363,0x363,0x363, -0x363,0x363,0x363,0x366,0x378,0x372,0x378,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372, -0x375,0x37b,0x378,0x372,0x378,0x372,0x375,0x37b,0x378,0x372,0x378,0x372,0x375,0x37b,0x378,0x372, -0x375,0x37b,0x378,0x372,0x378,0x372,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0x378,0x372,0x375,0x37b,0x378, -0x372,0x378,0x372,0x378,0x372,0x378,0x378,0x372,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0x375,0x372,0x375,0x375,0x375,0x375,0x375,0x375, -0x372,0x375,0x372,0x372,0x375,0x375,0x372,0x372,0x372,0x372,0x372,0x375,0x372,0x372,0x375,0x372, -0x375,0x375,0x375,0x372,0x375,0x375,0x375,0x375,0xb7,0xb7,0x375,0x375,0x375,0x375,0x372,0x372, -0x375,0x372,0x372,0x372,0x372,0x375,0x372,0x372,0x372,0x372,0x372,0x375,0x375,0x375,0x372,0x372, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0x915,0x915,0x915,0x915,0x915,0x915,0x915,0x915, -0x915,0x915,0x915,0x915,0x915,0x915,0x915,0x915,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x36f,0x36f,0xa50,0xaa4,0xb7,0xb7,0x52b,0x52b,0x52b,0x52b,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0x5e5,0x5e8,0x5e8,0x5ee,0x5ee,0x69c,0x468,0x69c, -0x468,0x69c,0x468,0x69c,0x468,0x69c,0x468,0x69c,0x468,0x69f,0x46b,0x69f,0x46b,0xa2c,0xa2c,0xb40, -0xafb,0x5e2,0x5e2,0x5e2,0x5e2,0x5eb,0x5eb,0x5eb,0x471,0x5f7,0x474,0xbd,0x64b,0x64b,0x558,0x558, -0x5f4,0x6a2,0x46e,0x6a2,0x46e,0x6a2,0x46e,0x5f1,0x5f1,0x5fa,0x5fa,0x5fd,0x5fa,0x5fa,0x5fa,0xbd, -0x5fa,0x6f6,0x6c9,0x5f1,0xbd,0xbd,0xbd,0xbd,0x37e,0x38a,0x37e,0x9b4,0x37e,0xc0,0x37e,0x38a, -0x37e,0x38a,0x37e,0x38a,0x37e,0x38a,0x37e,0x38a,0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384, -0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x387,0x381,0x387,0x381,0x384,0x38a,0x387,0x381,0x387, -0x381,0x387,0x381,0x387,0x381,0xc0,0xc0,0x735,0x6c0,0x6ea,0x579,0x57c,0x570,0x6ea,0x6ea,0xc6, -0x3d5,0x3d8,0x3d8,0x3d8,0x3d8,0x3d5,0x3d5,0xc6,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3, -0xc3,0x8b8,0x8b8,0x8b8,0x7a7,0x1d7,0x14d,0x14d,0xc6,0x552,0x576,0x570,0x6ea,0x6c0,0x570,0x576, -0x68d,0x44d,0x570,0x579,0x450,0x573,0x453,0x570,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x627,0x627,0x579,0x579,0x579,0x552,0x3de,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db, -0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db, -0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0xc6,0xc6,0xc6,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db, -0xc6,0xc6,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0xc6,0xc6,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db, -0xc6,0xc6,0x3db,0x3db,0x3db,0xc6,0xc6,0xc6,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921, -0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921, -0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xc9,0x91e,0x91e,0x91e,0x91e,0xc9,0xc9,0xc9,0xc9, -0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0xcf,0xcf, -0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0xd2, -0xd2,0xd2,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, -0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x933,0x930,0x930,0x930,0x930,0x930,0x930,0x930, -0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, -0x930,0x930,0x930,0x930,0x930,0x930,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, -0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, -0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0xd5,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x93c,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x93c,0xd5,0x93c,0x93c,0xd5,0xd5,0x93c,0xd5,0xd5,0x93c,0x93c,0xd5, -0xd5,0x93c,0x93c,0x93c,0x93c,0xd5,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x939,0x939, -0x939,0x939,0xd5,0x939,0xd5,0x939,0x939,0x939,0x939,0xaad,0x939,0x939,0xd5,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x939,0x939,0x939,0x939,0x93c,0x93c,0xd5,0x93c, -0x93c,0x93c,0x93c,0xd5,0xd5,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0xd5,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0xd5,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x93c,0x93c,0xd5,0x93c,0x93c,0x93c,0x93c,0xd5,0x93c,0x93c,0x93c,0x93c,0x93c,0xd5,0x93c,0xd5, -0xd5,0xd5,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0xd5,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0xb82,0xb82,0xd5,0xd5,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x939,0x939,0x939,0x936,0x939,0x939,0x939,0x939,0x939,0x939,0xd5,0xd5, -0xd5,0xd5,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, -0x95a,0x95a,0x95a,0x95a,0xd8,0x951,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, -0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, -0xd8,0xd8,0xd8,0xd8,0x9ba,0x9b7,0x9ba,0x9b7,0x9ba,0x9b7,0x9ba,0x9b7,0x9ba,0x9b7,0x9ba,0x9b7, -0x9ba,0x9b7,0x9ba,0x9b7,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, -0x9bd,0xde,0x9bd,0x9bd,0x9bd,0x9bd,0xa02,0xa02,0x9ff,0xde,0xde,0xde,0xde,0xde,0xde,0xde, -0xde,0xde,0xde,0xde,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0xa08,0xa08,0xa05,0x9c0,0x9c0,0xe1,0xe1,0xe1,0xe1,0xe1, -0xe1,0xe1,0xe1,0xe1,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6, -0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0xa0b,0xa0b,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe4,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9, -0x9c9,0xe7,0x9c9,0x9c9,0x9c9,0xe7,0xa0e,0xa0e,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, -0xe7,0xe7,0xe7,0xe7,0xb85,0xb85,0xb85,0xb85,0xb85,0xc60,0xbfd,0xea,0xea,0xea,0xea,0xea, -0xea,0xea,0xea,0xea,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0xa4a,0x9f0,0xa4a,0x9f0,0xa4a,0x9f0,0xea,0xea,0xea,0xea, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3, -0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xed,0xed,0xed, -0xb16,0xb16,0xb16,0xb1c,0xb1c,0xb1c,0xb1c,0xb16,0xb16,0xb1c,0xb1c,0xb1c,0xed,0xed,0xed,0xed, -0xb1c,0xb1c,0xb16,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb19,0xb19,0xb19,0xed,0xed,0xed,0xed, -0xab0,0xed,0xed,0xed,0xb25,0xb25,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6, -0xab6,0xab6,0xf0,0xf0,0xab6,0xab6,0xab6,0xab6,0xab6,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4,0xad4, -0xad4,0xad4,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0xb40,0xb40,0x9c, +0x5d3,0x5d3,0x5d3,0x5d3,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, +0xb3d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x9c, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, +0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60, +0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xa2,0xa2,0xa2,0xa2, +0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2, +0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0xa5,0xa5,0xa5,0x8ee,0x8ee,0x8ee,0x8ee, +0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x5e8,0x5eb,0x5e8,0x5eb, +0x5eb,0x5e8,0x5e8,0x5eb,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0xae,0xae,0xa44,0xa44,0xa44,0xa44, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xae, +0xae,0xae,0xae,0xae,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63, +0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xae,0xae, +0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0x387,0x387,0x387,0x387,0x387,0x387,0x387,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0x378,0x378,0x378,0x378,0x378,0xb1,0xb1,0xb1,0xb1,0xb1,0x864,0x534,0x37e, +0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x37b,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e, +0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0xb1,0x37e,0x37e,0x37e,0x37e,0x37e,0xb1,0x37e,0xb1, +0x37e,0x37e,0xb1,0x37e,0x37e,0xb1,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x37e,0x381, +0x393,0x38d,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d, +0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d, +0x393,0x38d,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x393, +0x38d,0x393,0x393,0x38d,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0x390,0x38d,0x390,0x390,0x390,0x390,0x390,0x390,0x38d,0x390,0x38d,0x38d, +0x390,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x390,0x390,0x38d, +0x390,0x390,0x390,0x390,0xb4,0xb4,0x390,0x390,0x390,0x390,0x38d,0x38d,0x390,0x38d,0x38d,0x38d, +0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x390,0x390,0x38d,0x38d,0xb4,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x38a,0x38a, +0xa6b,0xabc,0xb4,0xb4,0x537,0x537,0x537,0x537,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, +0xb7,0xb7,0xb7,0xb7,0x5f1,0x5f4,0x5f4,0x5fa,0x5fa,0x6ab,0x486,0x6ab,0x486,0x6ab,0x486,0x6ab, +0x486,0x6ab,0x486,0x6ab,0x486,0x6ae,0x489,0x6ae,0x489,0xa47,0xa47,0xb52,0xb10,0x5ee,0x5ee,0x5ee, +0x5ee,0x5f7,0x5f7,0x5f7,0x48f,0x603,0x492,0xba,0x65a,0x65a,0x564,0x564,0x600,0x6b1,0x48c,0x6b1, +0x48c,0x6b1,0x48c,0x5fd,0x5fd,0x606,0x606,0x609,0x606,0x606,0x606,0xba,0x606,0x705,0x6d8,0x5fd, +0xba,0xba,0xba,0xba,0x399,0x3a5,0x399,0x9d2,0x399,0xbd,0x399,0x3a5,0x399,0x3a5,0x399,0x3a5, +0x399,0x3a5,0x399,0x3a5,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f, +0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2, +0x39c,0xbd,0xbd,0x753,0x6cf,0x6f9,0x585,0x588,0x57c,0x6f9,0x6f9,0xc3,0x3f0,0x3f3,0x3f3,0x3f3, +0x3f3,0x3f0,0x3f0,0xc3,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x8c1,0x8c1,0x8c1, +0x7c8,0x1ef,0x165,0x165,0xc3,0x55e,0x582,0x57c,0x6f9,0x6cf,0x57c,0x582,0x69c,0x46b,0x57c,0x585, +0x46e,0x57f,0x471,0x57c,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x636,0x636, +0x585,0x585,0x585,0x55e,0x3f9,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0xc3,0xc3,0xc3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0xc3,0xc3,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0x3f6,0xc3,0xc3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0xc3,0xc3,0x3f6,0x3f6, +0x3f6,0xc3,0xc3,0xc3,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, +0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, +0x942,0x942,0x942,0xc6,0x93f,0x93f,0x93f,0x93f,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e, +0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc, +0xcc,0xcc,0xcc,0xcc,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0xcf,0xcf,0xcf,0x951,0x951, +0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, +0x951,0x951,0x951,0x951,0x954,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, +0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, +0x951,0x951,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95d,0xd2,0x95d,0x95d,0xd2,0xd2,0x95d,0xd2,0xd2,0x95d,0x95d,0xd2,0xd2,0x95d,0x95d,0x95d, +0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0xd2,0x95a, +0xd2,0x95a,0x95a,0x95a,0x95a,0xac5,0x95a,0x95a,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0xd2, +0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0xd2,0x95d, +0x95d,0x95d,0x95d,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0xd2,0x95d,0xd2,0xd2,0xd2,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0xd2,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0xb9a,0xb9a,0xd2,0xd2,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95a,0x95a,0x95a,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0xcb7,0xcb4,0xd2,0xd2,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0xd5,0x972,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5, +0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5, +0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5,0x9d8,0x9d5, +0xcbd,0xcba,0xcbd,0xcba,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0xdb,0x9db,0x9db, +0x9db,0x9db,0xa1a,0xa1a,0xa1d,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0xa20,0xa20,0xa23,0x9ff,0x9ff,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde, +0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1,0x9e1, +0x9e1,0x9e1,0xa26,0xa26,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1, +0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0x9e4,0xe4,0x9e4,0x9e4, +0x9e4,0xe4,0xa29,0xa29,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, +0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xc75,0xc12,0xcc0,0xcc0,0xcc0,0xcc0,0xe7,0xe7,0xe7,0xe7,0xe7, +0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0x9e7,0xa65,0xa0b,0xa65,0xa0b,0xa65,0xa0b,0xe7,0xe7,0xe7,0xe7,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0xacb,0xacb,0xacb,0xacb, +0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, +0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xea,0xea,0xea,0xb28,0xb28,0xb28,0xb2e, +0xb2e,0xb2e,0xb2e,0xb28,0xb28,0xb2e,0xb2e,0xb2e,0xea,0xea,0xea,0xea,0xb2e,0xb2e,0xb28,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2b,0xb2b,0xb2b,0xea,0xea,0xea,0xea,0xac8,0xea,0xea,0xea, +0xb37,0xb37,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xed,0xed, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed, +0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xba6,0xba6, +0xba6,0xba6,0xba6,0xba6,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xf0,0xf0,0xf0,0xf0,0xf0, +0xcc3,0xcc3,0xcc3,0xcc3,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0xf0,0xf0,0xf0,0xf0,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, +0xf3,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, +0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, +0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xaef,0xaef,0xf3,0xaef, +0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xf3, +0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xf3,0xf3, 0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, -0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, -0xada,0xada,0xada,0xada,0xf6,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, -0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xf6,0xada,0xada,0xada,0xada, -0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xf6, -0xada,0xada,0xf6,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, -0xada,0xada,0xf6,0xf6,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, -0xada,0xada,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0xf6,0xf6,0xf6,0xf6,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xf9, -0xf9,0xf9,0xf9,0xf9,0xaf5,0xaf5,0xaf5,0xfc,0xfc,0xfc,0xfc,0xae0,0xae0,0xae0,0xae0,0xae0, -0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0, -0xae0,0xae0,0xae0,0xae0,0xfc,0xfc,0xfc,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0, -0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, -0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xff,0xaf8, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0x102,0x102, -0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0x105,0x105,0xaec,0x105,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, -0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, -0xaec,0xaec,0x105,0xaec,0xaec,0x105,0x105,0x105,0xaec,0x105,0x105,0xaec,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0xb9a,0xb9a,0xb9a,0xb9a, -0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0x111,0x111,0x111,0x111,0x111,0x111, -0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xc18,0xc18,0xc1b,0xc1b,0xc1b,0x114,0x114,0xbeb,0xb9d,0xc51,0xc51,0xc51,0xc51, -0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0xa3b,0xa3b,0xa3b,0xa3b, -0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xc1e,0xc1e,0xc1e,0xc1e, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a, -0xba9,0xba6,0xba9,0xba6,0xba6,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0x11d,0x11d,0x11d,0x11d,0x11d, -0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0xbee,0xbee,0xbee,0xbee,0xba3,0xbee,0xbee, -0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac, -0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x120,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x120, -0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x120,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x120, -0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2, -0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0x123,0x123,0x123,0x123,0x123,0x123, -0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, -0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0x129, -0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8, -0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0x129, -0xbc1,0xc24,0xc24,0xc24,0x12c,0xc24,0xc24,0x12c,0x12c,0x12c,0x12c,0x12c,0xc24,0xc24,0xc24,0xc24, -0xbc1,0xbc1,0xbc1,0xbc1,0x12c,0xbc1,0xbc1,0xbc1,0x12c,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1, -0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1, -0x12c,0x12c,0x12c,0x12c,0xc21,0xc21,0xc21,0x12c,0x12c,0x12c,0x12c,0xc27,0xbbe,0xbbe,0xbbe,0xbbe, -0xbbe,0xbbe,0xbbe,0xbbe,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0xbf1,0xbf1,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbbe,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0xbc4,0xbc4,0xbc4,0xbc4, -0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, -0xbc4,0xbc4,0xbc4,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0x132,0x132,0x132,0x132,0x132,0x132,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xc2a,0xc2a,0x132,0x132,0x132,0x132,0x132,0x132,0xc5d,0xc5d,0xc5d,0xc5d, -0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0xc5d,0x132,0x132,0x132,0x132,0xbc7,0xbc7,0xbd0,0xbd0,0xbd0,0xbd0, -0x135,0x135,0x135,0x135,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbcd,0xbd0,0xbd0,0xbd0, -0xbd0,0xbd0,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0xc6c,0xc6c,0xc6c,0xc6c, -0xc6c,0xc6c,0xc6c,0xc6c,0xc6c,0xc6c,0xc6c,0xc6c,0xc6c,0xc6c,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, -0xbf4,0xbf4,0xbd9,0xbf7,0x138,0x138,0x138,0x138,0xc6c,0xc6c,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0xbe5,0x13e,0x13e,0x13e,0x13e, -0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0xa14,0xa14,0xa14,0xa14, -0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xc57,0xc00,0xc00,0xc57, -0xc57,0xc45,0xc45,0xc63,0xc03,0xc54,0x141,0x141,0x141,0x141,0x141,0x141,0x144,0x144,0x144,0x144, -0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144, -0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x747,0x747, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x14a,0x14a, -0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, -0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, -0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x156,0x960,0x960,0x960,0x960,0x960, -0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0xaf2, -0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1c2,0x159,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e, -0x210,0x210,0x20a,0x20a,0x3ae,0x20a,0x213,0x177,0x42c,0x177,0x177,0x177,0x42c,0x177,0x213,0x213, -0x17a,0x216,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x174,0x174,0x174,0x174,0x20d,0x174,0x20a,0x849, -0x17d,0x17d,0x3c3,0x2e2,0x600,0x600,0x600,0x420,0x435,0x435,0x516,0x516,0x516,0x516,0x516,0x8c1, -0x6b4,0x6a5,0x6b7,0x6ba,0x6ab,0x6b4,0x6a8,0x6a8,0x2e2,0x6fc,0x6fc,0x17d,0x618,0x2e8,0x3c6,0x2eb, -0x414,0x414,0x417,0x417,0x417,0x417,0x417,0x55e,0x417,0x417,0x417,0x72f,0x51f,0x51f,0x519,0x519, -0x426,0x561,0x41a,0x423,0x408,0x180,0x183,0x2e5,0x702,0x705,0x67e,0x6fc,0x702,0x702,0x67e,0x6fc, -0x306,0x306,0x31b,0x6bd,0x303,0x18f,0x306,0x312,0x303,0x6bd,0x315,0x31b,0x31b,0x31b,0x315,0x315, -0x31b,0x31b,0x31b,0x195,0x303,0x31b,0x6e4,0x303,0x30f,0x31b,0x31b,0x31b,0x31b,0x31b,0x303,0x303, -0x309,0x18f,0x192,0x303,0x31b,0x303,0x3c9,0x303,0x31b,0x30c,0x31e,0x198,0x31b,0x31b,0x30f,0x315, -0x31b,0x31b,0x303,0x31b,0x315,0x318,0x318,0x318,0x318,0x82e,0x82b,0xa98,0xb79,0x999,0x99c,0x99c, -0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x32a,0x32a,0x32a,0x32a, -0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x324,0x324,0x324,0x324,0x324,0x324, -0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x330,0x336,0x336, -0x32d,0x32d,0x1a7,0x32d,0x1a7,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, -0x1aa,0x339,0x1aa,0x1aa,0x33c,0x339,0x339,0x1aa,0x1aa,0x33c,0x339,0x1aa,0x33c,0x339,0x339,0x1aa, -0x339,0x1aa,0x6db,0x6d8,0x339,0x1aa,0x339,0x339,0x339,0x339,0x1aa,0x339,0x339,0x1aa,0x1aa,0x1aa, -0x1aa,0x339,0x339,0x1aa,0x33c,0x1aa,0x33c,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1b0,0x33f,0x1aa,0x33f, -0x33f,0x339,0x339,0x339,0x1aa,0x1aa,0x1aa,0x1aa,0x339,0x339,0x339,0x339,0x1aa,0x1aa,0x339,0x339, -0x339,0x33c,0x339,0x339,0x33c,0x339,0x339,0x33c,0x1aa,0x33c,0x339,0x339,0x1aa,0x339,0x339,0x339, -0x339,0x339,0x1aa,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x1ad,0x1aa,0x33c,0x339,0x1aa,0x1aa,0x1aa,0x1aa,0x339,0x339,0x1aa,0x1aa,0x339,0x33c,0x1ad,0x1ad, -0x33c,0x33c,0x339,0x339,0x33c,0x33c,0x339,0x339,0x33c,0x33c,0x339,0x339,0x339,0x339,0x339,0x339, -0x33c,0x33c,0x1aa,0x1aa,0x33c,0x33c,0x1aa,0x1aa,0x33c,0x33c,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x1aa,0x339,0x339,0x339,0x1aa,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x1aa,0x339,0x339,0x339,0x339,0x339,0x339,0x33c,0x33c,0x33c,0x33c,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x1aa,0x342,0x837,0x342,0x342, -0x342,0x342,0x342,0x342,0x345,0x345,0x345,0x345,0x342,0x342,0x342,0x342,0x342,0x342,0x1b3,0x342, -0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x1b9,0x1b9,0x1b9,0x1b9, -0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, -0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, -0x1b6,0x1b6,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc, -0x1bc,0x1bc,0x1bc,0x1bc,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1c2,0x34e,0x34e,0x34e,0x34e,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x351,0x351,0x1c5,0x1c5,0x1c5,0x1c5,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x1c8,0x1c8,0x354,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c8,0x1c8,0x354,0x354,0x1c8,0x1cb, -0x354,0x354,0x354,0x354,0x1c8,0x1c8,0x354,0x354,0x1c8,0x1cb,0x354,0x354,0x354,0x354,0x1c8,0x1c8, -0x1c8,0x354,0x354,0x1c8,0x354,0x354,0x1c8,0x1c8,0x1c8,0x1c8,0x354,0x354,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c8,0x1c8,0x1c8,0x1c8,0x354,0x354, -0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c8,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x357,0x357,0x357,0x357,0x357,0x1ce,0x1ce,0x357, -0x357,0x1ce,0x357,0x357,0x357,0x357,0x1ce,0x1ce,0x357,0x357,0x357,0x357,0xa5c,0xa5c,0x95d,0x95d, -0xb7f,0x840,0x357,0x357,0x1ce,0x357,0x1ce,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x1ce,0x1ce,0x357,0x1ce,0x1ce,0x1ce,0x357,0x1ce,0x1ce,0x1ce,0x1ce,0x357, -0x1ce,0x1ce,0x357,0x1d1,0x840,0x840,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1, -0x9b1,0x9b1,0xb7f,0xb7f,0x1ef,0x39c,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6, -0x1ef,0x1e6,0x1ef,0x1e6,0x1ec,0x399,0x1ef,0x39c,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x39c, -0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x3a2,0x399,0x1ef,0x1e6,0x1ef,0x39c,0x1ef,0x1e6,0x1ef,0x1e6, -0x1ef,0x399,0x3a5,0x39f,0x1ef,0x1e6,0x1ef,0x1e6,0x399,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x3a5, -0x39f,0x3a2,0x399,0x1ef,0x39c,0x1ef,0x1e6,0x1ef,0x39c,0x39f,0x3a2,0x399,0x1ef,0x39c,0x1ef,0x1e6, -0x1ef,0x1e6,0x3a2,0x399,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6, -0x1ef,0x1e6,0x3a2,0x399,0x1ef,0x1e6,0x1ef,0x39c,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6, -0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1ef,0x1e6,0x1ef,0x1e6,0x1ef,0x1e6,0x1e9,0x1f2,0x1fe,0x1fe,0x1f2, -0x1fe,0x1f2,0x1fe,0x1fe,0x1f2,0x1fe,0x1fe,0x1fe,0x1f2,0x1f2,0x1fe,0x1fe,0x1fe,0x1fe,0x1f2,0x1fe, -0x1fe,0x1f2,0x1fe,0x1fe,0x1fe,0x1f2,0x1f2,0x1f2,0x1fe,0x1fe,0x1f2,0x1fe,0x201,0x1f5,0x1fe,0x1f2, -0x1fe,0x1f2,0x1fe,0x1fe,0x1f2,0x1fe,0x1f2,0x1f2,0x1fe,0x1f2,0x1fe,0x201,0x1f5,0x1fe,0x1fe,0x1fe, -0x1f2,0x1fe,0x1f2,0x1fe,0x1fe,0x1f2,0x1f2,0x1fb,0x1fe,0x1f2,0x1f2,0x1f2,0x1fb,0x1fb,0x1fb,0x1fb, -0x204,0x204,0x1f8,0x204,0x204,0x1f8,0x204,0x204,0x1f8,0x201,0x3a8,0x201,0x3a8,0x201,0x3a8,0x201, -0x3a8,0x201,0x3a8,0x201,0x3a8,0x201,0x3a8,0x201,0x3a8,0x1f2,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5, -0x1fe,0x1f2,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x1f5,0x204,0x204,0x1f8, -0x201,0x1f5,0x7b3,0x7b3,0x7b6,0x7b0,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5, -0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5,0x201,0x1f5, -0x7b6,0x7b0,0x7b6,0x7b0,0x7b3,0x7ad,0x7b6,0x7b0,0x207,0x3ab,0x207,0x207,0x207,0x207,0x207,0x207, -0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, -0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x7b9,0x7b9,0x7b9, -0x7b9,0x7b9,0xa62,0xa62,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x213,0x213,0x213, -0x213,0x213,0x213,0x213,0x219,0x219,0x219,0x219,0x219,0x20a,0x20a,0x20a,0x20a,0x20a,0x7bc,0x7bc, -0x7bc,0x7bc,0x7bf,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65,0xa65, -0xa65,0xa65,0xa65,0xa65,0x23a,0x7c2,0x222,0x21f,0x222,0x21f,0x222,0x21f,0x222,0x21f,0x222,0x21f, -0x222,0x21f,0x222,0x21f,0x240,0x240,0x237,0x231,0x91b,0x918,0x966,0xa6b,0xa68,0xa6e,0xa6b,0xa68, -0xb4f,0xb52,0xb52,0xb52,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7, -0x3b7,0x3b7,0x3b7,0x3b7,0x7c8,0x3ba,0x249,0x24c,0x249,0x249,0x249,0x24c,0x249,0x249,0x249,0x249, -0x24c,0x7c8,0x24c,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249, -0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x252,0x24c,0x24f,0x249,0x24f,0x249, -0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249, -0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x24f,0x249,0x7ce,0x3c0,0x24f,0x252, -0x24f,0x24f,0x24f,0x252,0x24f,0x24f,0x24f,0x24f,0x252,0x7ce,0x252,0x24f,0x3bd,0x3bd,0x3bd,0x3bd, -0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3c0,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x282,0x27f,0x282,0x27f, -0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x7d4,0x27f,0x27f,0x27f,0x282, -0x54c,0x27f,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x276,0x48c,0x492,0x64e,0x64e,0x64e,0x64e, -0x64e,0x64e,0x64e,0x64e,0x64e,0x64e,0x549,0x651,0x651,0x27c,0x975,0x975,0x486,0x27f,0x27f,0x27f, -0x27f,0x285,0x285,0x285,0x285,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x492,0x48f,0x48f,0x48f, -0x48f,0x288,0x288,0x48f,0x48f,0x27c,0x492,0x492,0x492,0x48f,0xa77,0xa77,0x654,0x654,0x654,0x654, -0x654,0x654,0x654,0x654,0x654,0x654,0x7d4,0x7d4,0x7d4,0x7d1,0x7d1,0xa77,0x27f,0x27f,0x27f,0x27f, -0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, -0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x7d4,0x7d4,0x27f,0x27f, -0x27f,0x27f,0x27f,0x7d4,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, -0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, -0x2ca,0x2ca,0x2ca,0x2ca,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd, -0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd,0x2d3,0x2cd, -0x2d3,0x2cd,0x2d3,0x2cd,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2df,0x2df,0x2df,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2df,0x2df,0x2df,0x2df, -0x2df,0x2df,0x2df,0x2df,0x2ee,0x2e2,0x2e2,0x2e2,0x609,0x67b,0x438,0x987,0x828,0x828,0x825,0x825, -0x825,0x825,0x981,0x981,0x981,0x981,0x98a,0xa92,0xa95,0xb70,0xbe8,0x984,0xbe8,0xbe8,0xbe8,0xbe8, -0xb70,0xbe8,0xbe8,0x9e1,0x333,0x32d,0x32d,0x333,0x32d,0x32d,0x333,0x32d,0x32d,0x32d,0x32d,0x32d, -0x32d,0x32d,0x336,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x3cf,0x3cf,0x32d,0x32d, -0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x3cf,0x32d,0x32d,0x32d,0x834,0x834,0x834,0x834,0x834, -0x834,0x834,0x834,0x834,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x33c,0x33c,0x33c,0x33c,0x339,0x339,0x339,0x339,0x339,0x339,0x33c,0x33c,0x33c,0x33c,0x339,0x339, -0x339,0x339,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2, -0x345,0x345,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x693,0x459,0x342,0x342,0x342,0x342,0x342, -0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342, -0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x837, -0x9a8,0x837,0x837,0x837,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348, -0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348, -0x348,0x348,0x348,0x348,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372, +0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, +0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2, +0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xf6,0xf6,0xf6,0xf6,0xf6, +0xb0a,0xb0a,0xb0a,0xf9,0xf9,0xf9,0xf9,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xf9,0xf9,0xf9,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xfc,0xb0d,0xafe,0xafe,0xafe,0xafe, +0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe, +0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xff,0xff,0xb01,0xb01,0xb01,0xb01, +0xb01,0xb01,0x102,0x102,0xb01,0x102,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0x102,0xb01, +0xb01,0x102,0x102,0x102,0xb01,0x102,0x102,0xb01,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0x105, +0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e, +0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xc2d, +0xc2d,0xc30,0xc30,0xc30,0x111,0x111,0xbfd,0xbb5,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66, +0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59, +0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xc33,0xc33,0xc33,0xc33,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, +0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, +0x117,0x117,0xd14,0xd14,0xbc1,0xbbe,0xbc1,0xbbe,0xbbe,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0x11a, +0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xc00,0xc00,0xc00, +0xc00,0xbbb,0xc00,0xc00,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, +0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0x11d,0xbc4,0xbc4,0xbc4,0xbc4, +0xbc4,0xbc4,0xbc4,0x11d,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0x11d,0xbc4,0xbc4,0xbc4,0xbc4, +0xbc4,0xbc4,0xbc4,0x11d,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, +0xbca,0xbca,0xbca,0xbca,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0x120,0x120, +0x120,0x120,0x120,0x120,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0x123,0x123,0x123,0x123,0x123,0x123, +0x123,0x123,0x123,0x123,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xbd3,0xbd3,0xbd3,0x126,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbd0,0x126,0xbd9,0xc39,0xc39,0xc39,0x129,0xc39,0xc39,0x129,0x129,0x129,0x129,0x129, +0xc39,0xc39,0xc39,0xc39,0xbd9,0xbd9,0xbd9,0xbd9,0x129,0xbd9,0xbd9,0xbd9,0x129,0xbd9,0xbd9,0xbd9, +0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, +0xbd9,0xbd9,0xbd9,0xbd9,0x129,0x129,0x129,0x129,0xc36,0xc36,0xc36,0x129,0x129,0x129,0x129,0xc3c, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xbd6,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc, +0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xcc6,0xcc6,0xcc6,0xcc6,0x12c,0x12c,0x12c,0x12c,0x12c, +0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, +0xc87,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc87,0xc87,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x12f,0x12f,0x12f,0x12f,0xc84,0xc84, +0xbdf,0xbdf,0xbdf,0xbdf,0x132,0x132,0x132,0x132,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, +0xc06,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc81,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xbeb,0xc0c,0x135,0x135,0x135,0x135,0xc81,0xc81,0x135,0x135, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0xbf7, +0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, +0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, +0xc6c,0xc15,0xc15,0xc6c,0xc6c,0xc57,0xc57,0xc78,0xc18,0xc69,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, +0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xd17,0xd17,0xd17,0xd17,0xd17, +0xd17,0xd17,0xd17,0xd17,0xccf,0xccf,0xcc9,0xcc9,0xd2f,0xd29,0xcd2,0x141,0x141,0x141,0x141,0x141, +0xd23,0xd23,0xd1a,0xd23,0xd26,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0x144,0x144,0x144,0x144, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xcff,0xcff,0xcf9,0xcfc,0xcff,0xcff, +0xcf9,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0x144,0x144,0x144, +0xce1,0xcde,0xce1,0xce1,0xce1,0xcde,0xcde,0xce1,0xcde,0xce1,0xcde,0xce1,0xcde,0x147,0x147,0x147, +0x147,0x147,0x147,0x147,0xcde,0xce1,0xcde,0xcde,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, +0xce4,0xce4,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a, +0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a, +0x14a,0x14a,0x14a,0x14a,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7, +0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xd08,0xd08,0xd2c,0xd2c,0x14d,0x14d,0x14d,0x14d, +0x14d,0x14d,0x14d,0x14d,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xcea,0xcea,0xcea,0xcea,0x150,0x150, +0x150,0x150,0x150,0xd02,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0, +0xcf0,0xcf0,0xcf0,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0x153,0x153,0x153,0x153,0xcf3,0xcf3,0xcf3,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156, +0x156,0x156,0x156,0x156,0xd05,0xd05,0xd05,0xd05,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156, +0x156,0x156,0x156,0x156,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6, +0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159, +0x159,0x159,0x159,0x159,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c, +0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c, +0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x765,0x765,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x15f, +0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x162,0x162,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168, +0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168, +0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x16e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0xb07,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x171,0x369,0x369,0x369, +0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x22b,0x22b,0x225,0x225,0x3c9,0x225,0x22e,0x18f, +0x44a,0x18f,0x18f,0x18f,0x44a,0x18f,0x22e,0x22e,0x192,0x231,0x225,0x225,0x225,0x225,0x225,0x225, +0x18c,0x18c,0x18c,0x18c,0x228,0x18c,0x225,0x867,0x195,0x195,0x3de,0x2fd,0x60c,0x60c,0x60c,0x43e, +0x453,0x453,0x522,0x522,0x522,0x522,0x522,0x8ca,0x6c3,0x6b4,0x6c6,0x6c9,0x6ba,0x6c3,0x6b7,0x6b7, +0x2fd,0x70b,0x70b,0x195,0x627,0x624,0x3e1,0x303,0x432,0x432,0x435,0x435,0x435,0x435,0x435,0x56a, +0x435,0x435,0x435,0x74d,0x52b,0x52b,0x525,0x525,0x444,0x56d,0x438,0x441,0x423,0x198,0x19b,0x300, +0x711,0x714,0x68d,0x70b,0x711,0x711,0x68d,0x70b,0x31e,0x31e,0x333,0x6cc,0x31b,0x1a7,0x31e,0x32a, +0x31b,0x6cc,0x32d,0x333,0x333,0x333,0x32d,0x32d,0x333,0x333,0x333,0x1ad,0x31b,0x333,0x6f3,0x31b, +0x327,0x333,0x333,0x333,0x333,0x333,0x31b,0x31b,0x321,0x1a7,0x1aa,0x31b,0x333,0x31b,0x3e4,0x31b, +0x333,0x324,0x339,0x1b0,0x333,0x333,0x327,0x32d,0x333,0x333,0x336,0x333,0x32d,0x330,0x330,0x330, +0x330,0x84c,0x849,0xab0,0xb91,0x9b7,0x9ba,0x9ba,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x345,0x345,0x345,0x345,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, +0x1b6,0x1b6,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348, +0x348,0x348,0x348,0x348,0x348,0x34b,0x351,0x351,0x348,0x348,0x1bf,0x348,0x1bf,0x348,0x348,0x348, +0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x1c2,0x354,0x1c2,0x1c2,0x357,0x354,0x354,0x1c2, +0x1c2,0x357,0x354,0x1c2,0x357,0x354,0x354,0x1c2,0x354,0x1c2,0x6ea,0x6e7,0x354,0x1c2,0x354,0x354, +0x354,0x354,0x1c2,0x354,0x354,0x1c2,0x1c2,0x1c2,0x1c2,0x354,0x354,0x1c2,0x357,0x1c2,0x357,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x1c8,0x35a,0x1c2,0x35a,0x35a,0x354,0x354,0x354,0x1c2,0x1c2,0x1c2,0x1c2, +0x354,0x354,0x354,0x354,0x1c2,0x1c2,0x354,0x354,0x354,0x357,0x354,0x354,0x357,0x354,0x354,0x357, +0x1c2,0x357,0x354,0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,0x1c2,0x354,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c5,0x1c2,0x357,0x354,0x1c2,0x1c2,0x1c2,0x1c2, +0x354,0x354,0x1c2,0x1c2,0x354,0x357,0x1c5,0x1c5,0x357,0x357,0x354,0x354,0x357,0x357,0x354,0x354, +0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x357,0x357,0x1c2,0x1c2,0x357,0x357,0x1c2,0x1c2, +0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c2,0x354,0x354, +0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x1c2,0x354,0x354,0x354,0x354,0x354,0x354, +0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x1c2,0x35d,0x855,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x360,0x360,0x360,0x360, +0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x1cb,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d, +0x35d,0x35d,0x35d,0x35d,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, +0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1da,0x1da,0x1da,0x1da, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x369,0x369,0x369,0x369, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd, +0x36c,0x36c,0x1dd,0x1dd,0x1dd,0x1dd,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9, +0x1e0,0x1e0,0x36f,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, +0x36f,0x36f,0x1e0,0x1e0,0x36f,0x36f,0x1e0,0x1e3,0x36f,0x36f,0x36f,0x36f,0x1e0,0x1e0,0x36f,0x36f, +0x1e0,0x1e3,0x36f,0x36f,0x36f,0x36f,0x1e0,0x1e0,0x1e0,0x36f,0x36f,0x1e0,0x36f,0x36f,0x1e0,0x1e0, +0x1e0,0x1e0,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, +0x36f,0x36f,0x1e0,0x1e0,0x1e0,0x1e0,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x1e0, +0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, +0x372,0x372,0x372,0x372,0x372,0x1e6,0x1e6,0x372,0x372,0x1e6,0x372,0x372,0x372,0x372,0x1e6,0x1e6, +0x372,0x372,0x372,0x372,0xa74,0xa74,0x97e,0x97e,0xb97,0x85e,0x372,0x372,0x1e6,0x372,0x1e6,0x372, 0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372, -0x372,0x372,0x372,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372, -0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372, -0x375,0x37b,0x378,0x372,0x378,0x372,0x378,0x372,0x378,0x372,0x378,0x372,0x378,0x372,0x378,0x372, -0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372,0x375,0x37b,0x378,0x372, -0x378,0x372,0x378,0x372,0x378,0x372,0x375,0x37b,0x375,0x37b,0x378,0x372,0x378,0x372,0x378,0x372, -0x378,0x372,0x378,0x372,0x378,0x372,0x378,0x372,0x375,0x378,0x372,0x375,0x378,0x372,0x375,0x37b, +0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x1e6,0x1e6,0x372,0x1e6, +0x1e6,0x1e6,0x372,0x1e6,0x1e6,0x1e6,0x1e6,0x372,0x1e6,0x1e6,0x372,0x1e9,0x85e,0x85e,0x9cf,0x9cf, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xb97,0xb97,0x207,0x3b7,0x207,0x1fe, +0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x204,0x3b4,0x207,0x3b7, +0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x3b7,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x3bd,0x3b4, +0x207,0x1fe,0x207,0x3b7,0x207,0x1fe,0x207,0x1fe,0x207,0x3b4,0x3c0,0x3ba,0x207,0x1fe,0x207,0x1fe, +0x3b4,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x3c0,0x3ba,0x3bd,0x3b4,0x207,0x3b7,0x207,0x1fe,0x207, +0x3b7,0x3ba,0x3bd,0x3b4,0x207,0x3b7,0x207,0x1fe,0x207,0x1fe,0x3bd,0x3b4,0x207,0x1fe,0x207,0x1fe, +0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x3bd,0x3b4,0x207,0x1fe,0x207,0x3b7, +0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x1fe,0x207,0x207,0x1fe,0x207, +0x1fe,0x207,0x1fe,0x201,0x20a,0x216,0x216,0x20a,0x216,0x20a,0x216,0x216,0x20a,0x216,0x216,0x216, +0x20a,0x20a,0x216,0x216,0x216,0x216,0x20a,0x216,0x216,0x20a,0x216,0x216,0x216,0x20a,0x20a,0x20a, +0x216,0x216,0x20a,0x216,0x219,0x20d,0x216,0x20a,0x216,0x20a,0x216,0x216,0x20a,0x216,0x20a,0x20a, +0x216,0x20a,0x216,0x219,0x20d,0x216,0x216,0x216,0x20a,0x216,0x20a,0x216,0x216,0x20a,0x20a,0x213, +0x216,0x20a,0x20a,0x20a,0x213,0x213,0x213,0x213,0x21c,0x21c,0x210,0x21c,0x21c,0x210,0x21c,0x21c, +0x210,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219,0x3c3,0x219, +0x3c3,0x20a,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x216,0x20a,0x219,0x20d,0x219,0x20d,0x219,0x20d, +0x219,0x20d,0x219,0x20d,0x20d,0x21c,0x21c,0x210,0x219,0x20d,0x7d4,0x7d4,0x7d7,0x7d1,0x219,0x20d, +0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d, +0x219,0x20d,0x219,0x20d,0x219,0x20d,0x219,0x20d,0x7d7,0x7d1,0x7d7,0x7d1,0x7d4,0x7ce,0x7d7,0x7d1, +0xb61,0xb64,0xc8d,0xc90,0xc90,0xc90,0xc90,0xc8d,0xc90,0xc8d,0xc90,0xc8d,0xc90,0xc8d,0xc90,0xc8d, +0x21f,0x3c6,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, +0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, +0x222,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x7da,0x7da,0x7da, +0x7da,0x7da,0xa7a,0xa7a,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x22e,0x22e,0x22e, +0x22e,0x22e,0x22e,0x22e,0x234,0x234,0x234,0x234,0x234,0x225,0x225,0x225,0x225,0x225,0x7dd,0x7dd, +0x7dd,0x7dd,0x7e0,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa7d,0xa7d,0x255,0x7e3,0x23d,0x23a,0x23d,0x23a,0x23d,0x23a,0x23d,0x23a,0x23d,0x23a, +0x23d,0x23a,0x23d,0x23a,0x25b,0x25b,0x252,0x24c,0x93c,0x939,0x987,0xa83,0xa80,0xa86,0xa83,0xa80, +0xb67,0xb6a,0xb6a,0xb6a,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2, +0x3d2,0x3d2,0x3d2,0x3d2,0x7e9,0x3d5,0x264,0x267,0x264,0x264,0x264,0x267,0x264,0x264,0x264,0x264, +0x267,0x7e9,0x267,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264, +0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26d,0x267,0x26a,0x264,0x26a,0x264, +0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264, +0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x264,0x26a,0x26d,0x267,0x26a, +0x264,0x993,0x990,0x26a,0x264,0x993,0x990,0x26a,0x264,0x993,0x990,0xc96,0x26d,0x267,0x26d,0x267, +0x26a,0x264,0x26d,0x267,0x26a,0x264,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26a,0x264,0x26d,0x267, +0x7ef,0x7e9,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0xb70,0xb6d,0x26d,0x267,0xc99,0xc96, +0xc99,0xc96,0xc99,0xc96,0x7ef,0x3db,0x26a,0x26d,0x26a,0x26a,0x26a,0x26d,0x26a,0x26a,0x26a,0x26a, +0x26d,0x7ef,0x26d,0x26a,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3db,0x3d8,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x29d,0x29a,0x29d,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, +0x29a,0x29a,0x29a,0x7f5,0x29a,0x29a,0x29a,0x29d,0x558,0x29a,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, +0x4aa,0x291,0x4a7,0x4ad,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x65d,0x555,0x660, +0x660,0x297,0x996,0x996,0x4a1,0x29a,0x29a,0x29a,0x29a,0x2a0,0x2a0,0x2a0,0x2a0,0x29a,0x29a,0x29a, +0x29a,0x29a,0x29a,0x29a,0x4ad,0x4aa,0x4aa,0x4aa,0x4aa,0x2a3,0x2a3,0x4aa,0x4aa,0x297,0x4ad,0x4ad, +0x4ad,0x4aa,0xa8f,0xa8f,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x663,0x7f5,0x7f5, +0x7f5,0x7f2,0x7f2,0xa8f,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, +0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, +0x29a,0x29a,0x29a,0x29a,0x7f5,0x7f5,0x29a,0x29a,0x29a,0x29a,0x29a,0x7f5,0x2e5,0x2e5,0x2e5,0x2e5, +0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5, +0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2ee,0x2e8,0x2ee,0x2e8, +0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8, +0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2ee,0x2e8,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0x2f7,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x306,0x2fd,0x2fd,0x2fd, +0x615,0x68a,0x456,0xa4a,0x8f4,0x8f4,0x846,0x846,0x846,0x846,0x9a2,0x9a2,0x9a2,0x9a2,0x9a8,0xaaa, +0xaad,0xb88,0xbfa,0x9a5,0xbfa,0xbfa,0xbfa,0xbfa,0xb88,0xbfa,0xbfa,0x9fc,0x34e,0x348,0x348,0x34e, +0x348,0x348,0x34e,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x351,0x348,0x348,0x348,0x348,0x348, +0x348,0x348,0x348,0x348,0x3ea,0x3ea,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x348,0x3ea, +0x348,0x348,0x348,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x9bd,0x9bd,0x9bd,0x9bd, +0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354, +0x354,0x354,0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, +0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x360,0x360,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d, +0x35d,0x6a2,0x477,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d, +0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d, +0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x855,0x9c6,0x855,0x855,0x855,0x363,0x363,0x363,0x363, +0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363, +0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x372,0x372,0x372,0x372, 0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372, -0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372, -0x372,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b, -0x372,0x378,0x687,0x441,0x375,0x375,0x372,0x375,0x372,0x375,0x372,0x372,0x375,0x372,0x372,0x375, -0x372,0x375,0x372,0x372,0x375,0x372,0x375,0x375,0x372,0x372,0x372,0x375,0x372,0x372,0x372,0x372, -0x372,0x375,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372, -0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x375,0x375,0x372,0x372,0x375,0x372,0x375,0x372, -0x372,0x372,0x372,0x372,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, -0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, -0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x37b,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b, -0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x387,0x387,0x381,0x387,0x381,0x387,0x381,0x387, -0x381,0x387,0x381,0x384,0x38a,0x387,0x381,0x387,0x381,0x384,0x38a,0x387,0x381,0x387,0x381,0x384, -0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x387,0x381,0x387,0x381,0x387, -0x381,0x387,0x381,0x384,0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384, -0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384,0x38a,0x387,0x381,0x384, -0x38a,0x387,0x381,0x384,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd, -0x3bd,0x3bd,0x3bd,0x3bd,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3ba,0x3b7,0x3b7, -0x3b7,0x3b7,0x3b7,0x3b7,0x9ed,0x44a,0x68a,0x444,0x447,0x61b,0x3e1,0x624,0x624,0x624,0x624,0x624, -0x624,0x624,0x624,0x624,0x621,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1, -0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1, -0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x61e,0x61e,0x570,0x591,0x591,0x591,0x591,0x591,0x591,0x58b, -0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b,0x58b, -0x58b,0x58b,0x58b,0x68d,0x579,0x44d,0x57f,0x582,0x57c,0x58e,0x58e,0x58e,0x58e,0x58e,0x58e,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x68d,0x579,0x44d,0x579,0xa47,0x56d,0x462,0x465,0x59a,0x594,0x62d,0x5a0,0x5a6, -0x696,0x45c,0x696,0x45c,0x699,0x45f,0x699,0x45f,0x696,0x45c,0x59a,0x59a,0x696,0x45c,0x696,0x45c, -0x696,0x45c,0x696,0x45c,0x62a,0x699,0x45f,0x45f,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e, -0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e, -0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x537,0x537,0x52e,0x531,0x531,0x534,0x8bb,0x8bb, -0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0xa17,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xb28,0xb28,0xb28,0x59a,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x59d,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x597,0x594, -0x8d9,0x8d9,0x8d9,0xa32,0xa2f,0xa1a,0x8d6,0x56a,0x5ac,0x5a9,0x5ac,0x633,0x5a9,0x5ac,0x5a9,0x5ac, -0x5a9,0x5ac,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5ac,0x5ac,0x5a9,0x5ac,0x5ac,0x5a9,0x5ac,0x5ac, -0x5a9,0x5ac,0x5ac,0x5a9,0x5ac,0x5ac,0x5a9,0x5a9,0xa38,0x642,0x5af,0x642,0x5af,0x642,0x5af,0x642, -0x5af,0x642,0x5af,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af, -0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x5af,0x5b2,0x642,0x5af,0x5b2,0x5af,0x5b2, -0x5af,0x5b2,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5b2,0x5b2,0x5af,0x5b2,0x5b2,0x5af,0x5b2,0x5b2, -0x5af,0x5b2,0x5b2,0x5af,0x5b2,0x5b2,0x5af,0x5af,0x5af,0x5af,0x5af,0x642,0x5af,0x642,0x5af,0x642, -0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x642,0x5af,0x5af,0x5af,0x5af,0x5af,0x5b2,0x642,0x642,0x5b2, -0x5b2,0x5b2,0x5b2,0x63c,0x63f,0x645,0x648,0xa20,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5bb,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, -0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, -0xb31,0xb31,0xc48,0x5c4,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0xb2b,0xb2b,0xb2b,0xb2b,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, -0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, -0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, -0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0xb34,0xb34,0xb34,0xb34,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x372,0x393,0x393,0x393,0x393, +0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, +0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x396,0x393,0x38d, +0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d, +0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,0x38d, +0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d, +0x390,0x396,0x393,0x38d,0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x390,0x396, +0x390,0x396,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d,0x393,0x38d, +0x390,0x393,0x38d,0x390,0x393,0x38d,0x390,0x396,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x390, +0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, +0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x390,0x390,0x390,0x390,0x390,0x390, +0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x38d,0x393,0x696,0x45f,0x390,0x390,0x38d,0x390, +0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x390, +0x38d,0x38d,0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, +0x390,0x390,0x38d,0x38d,0x390,0x38d,0x390,0x38d,0x38d,0x38d,0x38d,0x38d,0x390,0x390,0x390,0x390, +0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390, +0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x390,0x396, +0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, +0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, +0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396, +0x396,0x396,0x396,0x396,0x396,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, +0x3a2,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x3a2, +0x39c,0x39f,0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f, +0x3a5,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f, +0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f, +0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3a5,0x3a2,0x39c,0x39f,0x3d8,0x3d8,0x3d8,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d2,0x3d2,0x3d2,0x3d2, +0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d5,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0xa08,0x468,0x699,0x462, +0x465,0x62a,0x3fc,0x633,0x633,0x633,0x633,0x633,0x633,0x633,0x633,0x633,0x630,0x3fc,0x3fc,0x3fc, +0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc, +0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x62d,0x62d, +0x78c,0x78c,0xc1b,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0xd0b,0x49e,0x49e,0x49e,0x429,0x49e, +0x57c,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x69c,0x585,0x46b,0x58b,0x58e, +0x588,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, +0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x69c,0x585,0x46b,0x585,0xa62, +0x579,0x480,0x483,0x5a6,0x5a0,0x63c,0x5ac,0x5b2,0x6a5,0x47a,0x6a5,0x47a,0x6a8,0x47d,0x6a8,0x47d, +0x6a5,0x47a,0x5a6,0x5a6,0x6a5,0x47a,0x6a5,0x47a,0x6a5,0x47a,0x6a5,0x47a,0x639,0x6a8,0x47d,0x47d, +0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a, +0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a, +0x543,0x543,0x53a,0x53d,0x53d,0x540,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0x8c4,0xa32, +0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xc4e,0xc4e,0xc4e,0xc4e,0xc5a,0xb3a,0xb3a,0xb3a, +0x5a6,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x546,0x546,0x546,0x546,0x546,0x546, +0x5a9,0x5af,0x5af,0x5af,0x5af,0x5af,0x5a3,0x5a0,0x8e2,0x8e2,0x8e2,0xa50,0xa4d,0xa35,0x8df,0x576, +0x5b8,0x5b5,0x5b8,0x642,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, +0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b8,0x5b8,0x5b5,0x5b5, +0xa56,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x5bb,0x5be,0x5bb,0x5be,0x5bb, +0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb, +0x5be,0x5bb,0x5be,0x651,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5be,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb, +0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5be,0x5be,0x5bb,0x5bb, +0x5bb,0x5bb,0x5bb,0x651,0x5bb,0x651,0x5bb,0x651,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x651,0x5bb, +0x5bb,0x5bb,0x5bb,0x5bb,0x5be,0x651,0x651,0x5be,0x5be,0x5be,0x5be,0x64b,0x64e,0x654,0x657,0xa3b, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, +0x5c7,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5dc,0x5dc,0x5dc,0x5dc, +0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc, +0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0xb43,0xb43,0xc5d,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3, 0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, -0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0xb34, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0xb3d,0xb3d,0xb3d,0xb3d, 0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, 0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, -0x5d6,0x5d6,0xb34,0xb34,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5df,0x5df,0x5dc,0x5df,0x5dc,0x5df,0x5df,0x5dc,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5df,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x744,0x741,0x741,0x741,0x741,0x741,0x741,0x741, -0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741, -0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x741,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x74a,0x74a,0x753,0x753,0x753,0x753, -0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753, -0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x74d,0x74d,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x753,0x753,0x753,0x753, -0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753, -0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x759,0x768,0x768,0x768, -0x768,0x756,0x768,0x768,0x78c,0x768,0x768,0x762,0x789,0x786,0x786,0x786,0x786,0x786,0x78c,0x756, -0x783,0x756,0x756,0x756,0x77d,0x77d,0x756,0x756,0x756,0x756,0x756,0x756,0x78f,0x78f,0x78f,0x78f, -0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756, -0x762,0x77d,0x756,0x77d,0x756,0x77d,0x792,0x76b,0x792,0x76b,0x780,0x780,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x79b,0x79b,0x79b,0x79b, -0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, -0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x7a1,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a1,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x963,0xa5f,0x7b3,0x7ad,0x7b3,0x7ad,0x7b6,0x7b0,0x7b6,0x7b0,0x7b6,0x7b0, -0x7b6,0x7b0,0x7b6,0x7b0,0x7b6,0x7b0,0x7b6,0x7b0,0xa5f,0xa5f,0xa5f,0xb49,0xb49,0xb49,0xb4c,0xb4c, -0xb49,0xb4c,0xb4c,0xb49,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e3,0xa7a,0xa7a,0xa7a,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c, -0x87c,0x87c,0x87c,0x87c,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6, -0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6, -0x7e6,0x7e6,0x7e6,0x7e6,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xb6d,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xb6d, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, +0x5d6,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, +0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2, +0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df, +0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0xb46, +0xb46,0xb46,0xb46,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df, +0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df, +0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0xb46,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2, +0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2, +0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0xb46,0xb46,0x5e5,0x5e5,0x5e5,0x5e5, +0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5, +0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e8,0x5e8,0x5e8,0x5e8, +0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, +0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5eb,0x5eb, +0x5e8,0x5eb,0x5e8,0x5eb,0x5eb,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5eb, +0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756, +0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756, +0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c, +0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c,0x75c, +0x762,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x768,0x768,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x76b,0x76b,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x76e,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x777,0x786,0x786,0x786,0x786,0x774,0x786,0x786,0x7ad,0x786,0x786,0x780, +0x7aa,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7ad,0x774,0x7a4,0x774,0x774,0x774,0x79b,0x79b,0x774,0x774, +0x774,0x774,0x774,0x774,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x7b0,0x774,0x774, +0x774,0x774,0x774,0x774,0x774,0x774,0x774,0x774,0x780,0x79b,0x774,0x79b,0x774,0x79b,0x7b3,0x789, +0x7b3,0x789,0x7a1,0x7a1,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9, +0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9, +0x7b9,0x7b9,0x7b9,0x7b9,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc, +0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc, +0x7bc,0x7bc,0x7bc,0x7bc,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7c2,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5, +0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5, +0x7c2,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5, +0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x7c5,0x984,0xa77,0x7d4,0x7ce, +0x7d4,0x7ce,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1, +0xa77,0xa77,0xa77,0xb61,0xb61,0xb61,0xb64,0xb64,0xb61,0xb64,0xb64,0xb61,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0xa92,0xa92,0xa92,0x8a0,0x8a0,0x8a0,0x8a0, +0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x807,0x807,0x807,0x807, 0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, -0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, -0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x822,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, +0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0xb85,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0xb85,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828, +0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828, +0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x828,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831, +0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x831,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, 0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8, -0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843, -0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843, -0x90f,0x90f,0x90f,0x912,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90c,0x90c,0x8ac,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8ac,0x8ac, -0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7, -0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7, -0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd, -0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd,0x8cd, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, -0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8f1,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, -0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, -0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e5,0x8e5,0xa26,0xa26,0x8e5,0x8e5,0x8e5,0x8e5, -0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0xa26,0x8e5,0x8e5,0x8e5, -0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906, -0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906, -0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0xaaa,0xaaa, -0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, -0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xaa7,0xaa7,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0x92a,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92d,0x92d,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x930,0x930,0x930,0x930, +0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, +0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, +0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x843,0x840,0x840,0x840,0x840, +0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, +0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x855,0x855,0x855,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0, +0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0, +0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d0,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6, +0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6, +0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8f7,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8ee,0x8ee,0xa41,0xa41,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee, +0x8ee,0x8ee,0x8ee,0x8ee,0xa41,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x930,0x930,0x930,0x933,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, +0x930,0x930,0x930,0x930,0x91e,0x91e,0x92d,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x92d,0x92d, 0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, -0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x942,0x948,0x94e,0x94e,0x94e,0x930,0x930,0x930,0x94b,0x945,0x945, -0x945,0x945,0x945,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x94e,0x94e,0x94e,0x94e,0x94e, -0x94e,0x94e,0x94e,0x930,0x930,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x930,0x930,0x930,0x930, 0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, -0x930,0x930,0x94e,0x94e,0x94e,0x94e,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, -0x930,0x930,0x930,0x933,0x933,0x933,0x933,0x933,0x93c,0x936,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x936,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x936,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x936,0x939,0x939,0x939,0x939,0x939,0x939, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x936,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x93c,0x93c,0x93c,0x93c,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0xac2,0xac2,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948, +0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948, +0x948,0x948,0xabf,0xabf,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e, +0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e, +0x94e,0x94e,0x94e,0x94e,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, 0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, -0x951,0x951,0x951,0x951,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954, -0x954,0x954,0x954,0x954,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x951,0x951,0x951,0x951,0x951,0x951,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x963,0x969,0x96f, +0x96f,0x96f,0x951,0x951,0x951,0x96c,0x966,0x966,0x966,0x966,0x966,0x960,0x960,0x960,0x960,0x960, +0x960,0x960,0x960,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x951,0x951,0x96f,0x96f,0x96f, +0x96f,0x96f,0x96f,0x96f,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, +0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x96f,0x96f,0x96f,0x96f,0x951,0x951, +0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x954,0x954,0x954,0x954,0x954, +0x95d,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x957,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x957,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x957,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, +0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95a,0x95a, 0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, -0x95a,0x95a,0x95a,0x95a,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0xa3e,0x9e4,0xa56,0x9a8,0x9a5,0x9a5,0x9a5,0x9a5, -0x9a5,0x9a5,0x9a5,0x9a5,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, -0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, -0x9d2,0x9d2,0x9d2,0x9d2,0x9d5,0x9d5,0x9d5,0xa44,0x9ea,0xa4d,0x9f3,0xa44,0x9ea,0xa44,0x9ea,0xa44, -0x9ea,0xa44,0x9ea,0xa44,0x9ea,0xa44,0x9ea,0xa44,0x9ea,0xa44,0x9ea,0xa44,0x9ea,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0xa44,0x9ea,0xa44,0x9ea,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0xa44,0x9ea,0x9d5,0x9d5,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9de,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9de,0x9de,0x9de,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9db,0x9d8,0x9d8,0x9d8,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabc,0xad1,0xad1,0xad1,0xacb,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xacb,0xad1,0xad1,0xad1,0xad1,0xac5,0xac5,0xace,0xace,0xace,0xace,0xac2,0xac2, -0xac2,0xac2,0xac2,0xac8,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, -0xb88,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xacb,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xac5,0xac5,0xac5,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95d,0x95d,0x95d,0x95d,0x972,0x972,0x972,0x972, +0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972, +0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x972,0x975,0x975,0x975,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x9c6,0x9c6,0x9c6,0x9c6, +0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6, +0x9c3,0x9c3,0x9c3,0x9c6,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, +0x9c3,0x9c3,0x9c3,0xab3,0xab6,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xcae,0xcae,0xcae,0xcae,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed, +0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed,0x9ed, +0x9ed,0x9ed,0x9ed,0x9ed,0x9f0,0x9f0,0x9f0,0xa5f,0xa05,0xa68,0xa0e,0xa5f,0xa05,0xa5f,0xa05,0xa5f, +0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0xa5f,0xa05,0x9f0,0x9f0,0x9f0, +0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0, +0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0, +0xa5f,0xa05,0xa5f,0xa05,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0, +0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0, +0xa5f,0xa05,0x9f0,0x9f0,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3, +0x9f9,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3, +0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3, +0x9f3,0x9f3,0x9f3,0x9f3,0x9f9,0x9f9,0x9f9,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3, +0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3, +0x9f3,0x9f3,0x9f3,0x9f3,0x9f6,0x9f3,0x9f3,0x9f3,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace, +0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace, +0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xace,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xad4,0xad4, +0xad4,0xad4,0xad4,0xad1,0xae6,0xae6,0xae6,0xae0,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, +0xae6,0xae6,0xae6,0xae0,0xae6,0xae6,0xae6,0xae6,0xada,0xada,0xae3,0xae3,0xae3,0xae3,0xad7,0xad7, +0xad7,0xad7,0xad7,0xadd,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba0,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, +0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae0,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, +0xae6,0xae6,0xae6,0xae6,0xae6,0xada,0xada,0xada,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, 0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, -0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, -0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, -0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6, -0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6, -0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xba9,0xba6,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5, -0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5, -0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, -0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, -0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, -0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, -0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, +0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, +0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2, +0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2, +0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34, +0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34, +0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbac,0xbac,0xbac, +0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe, +0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe, +0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbc1,0xbbe,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd, +0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd, +0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, 0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, -0xbd3,0xbd3,0xbd3,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, -0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, -0xbd6,0xbd6,0xbd6,0xbd6,0xbdf,0xbdf,0xc36,0xbdf,0xbdf,0xbdf,0xc33,0xbdf,0xbdf,0xbdf,0xbdf,0xc2d, +0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, 0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdf,0xbdf,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0xbe2,0xbe2,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, -0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, -0xc4e,0xc4e,0xc4e,0xc4e,0x820,0x840,0x860,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x880,0x8a0,0,0,0,0,0,0,0,0,0,0x8c0, -0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0, -0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0,0x8e0, -0x8e0,0x900,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920, -0x920,0x920,0x920,0x920,0x920,0x920,0x940,0x960,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920, +0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, +0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, +0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe2,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xbe5,0xbe5,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbf1,0xbf1,0xc48,0xbf1,0xbf1,0xbf1,0xc45,0xbf1, +0xbf1,0xbf1,0xbf1,0xc3f,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1, +0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63, +0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63, +0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a, +0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a, +0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, +0xd32,0xd32,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc, +0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xd1a,0xd1a,0xd1a,0xd1a,0xd20,0xcd8,0xcdb,0xcd8, +0xcdb,0xcd8,0xcdb,0xcd8,0xcdb,0xcd8,0xcdb,0xcd8,0xcd8,0xcd8,0xcdb,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, +0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, +0xd1d,0xd20,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd23,0xd1a,0xd23,0xd20,0xd20,0xce7,0xce7,0xce7,0xce7, +0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7, +0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xcf0,0xcf0,0xcf0,0xcf0, +0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0, +0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf3,0xcf3,0xcf3,0xcf3, +0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, +0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0x820,0x840,0x860,0, +0,0,0,0,0x880,0x8a0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x8c0,0x8e0,0,0, +0,0,0,0,0,0,0,0x900,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920, 0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920, -0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x960,0,0,0,0, +0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x920,0x940,0x960,0x960,0x960,0x960,0x960,0x960, +0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x980,0x9a0, +0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960, +0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960, +0x960,0x960,0x960,0x9a0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x8c0,0x980,0x9a0,0x9a0,0x9a0, +0,0,0,0x900,0x9c0,0x9e0,0x9e0,0x9e0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9e0, -0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00, +0,0,0,0,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00, 0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00, -0xa00,0xa00,0xa00,0xa20 +0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa00,0xa20,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa60 }; static const UTrie propsVectorsTrie={ propsVectorsTrie_index, NULL, utrie_defaultGetFoldingOffset, - 2624, - 13700, + 2688, + 14236, 0, TRUE }; -static const uint32_t propsVectors[3183]={ -0,0,0,0,0x800000,0,0x200,0,0,0x400,0,0,0x480,0,0,0x500, -0,0,0x580,0,0,0x600,0,0,0x680,0,0,0x700,0,0,0x780,0, -0,0x800,0,0,0x880,0,0,0x900,0,0,0x980,0,0,0xa00,0,0, -0xa80,0,0,0xb00,0,0,0xb80,0,0,0xc00,0,0,0xc80,0,0,0xd00, -0,0,0xd80,0,0,0xe00,0,0,0xe80,0,0,0xf00,0,0,0xf80,0, -0,0x1000,0,0,0x1080,0,0,0x1100,0,0,0x1180,0,0,0x1200,0,0, -0x1280,0,0,0x1300,0,0,0x1380,0,0,0x1400,0x800000,0,0x1480,0,0,0x1500, -0,0,0x1580,0,0,0x1600,0,0,0x1680,0,0,0x1800,0,0x4000000,0x1880,0, -0x4000000,0x1900,0,0x4000000,0x1b80,0,0x4000000,0x1c00,0,0x4000000,0x1d00,0,0,0x1d80,0,0, -0x1e00,0,0,0x1f00,0,0,0x2000,0,0,0x2080,0,0,0x2180,0,0,0x2200, -0,0,0x2300,0,0,0x2380,0,0,0x2400,0,0,0x2480,0,0,0x2500,0, -0,0x2780,0,0,0x2800,0,0,0x2880,0,0,0x2900,0,0,0x2a00,0,0, -0x2a80,0,0,0x2b00,0x800000,0,0x2b80,0,0,0x2c00,0,0,0x2c80,0,0,0x2d80, -0,0,0x2e00,0,0,0x2e80,0,0,0x3000,0x800000,0,0x3080,0,0,0x3100,0, -0,0x3180,0,0,0x3200,0,0,0x3280,0,0,0x3300,0,0x4000000,0x3780,0,0, -0x3800,0,0,0x3980,0,0x4000000,0x3a80,0,0,0x3b00,0,0,0x3b80,0,0,0x3c00, -0,0,0x3d00,0,0,0x3d80,0,0,0x3e00,0,0,0x3f00,0,0,0x3f80,0, -0,0x4000,0,0,0x4080,0,0,0x4100,0,0,0x4180,0,0,0x4200,0,0, -0x4280,0,0,0x4300,0,0,0x4380,0,0,0x4400,0,0,0x4480,0,0,0x4500, -0,0,0x4580,0,0,0x4600,0,0,0x4700,0,0x4000000,0x4780,0,0,0x4800,0, -0,0x4880,0,0,0x28000,0,0,0x2af00,0,0,0x2af80,0,0,0x11002b00,0x810000,0, -0x1100a700,0,0,0x11041680,0x80000000,6,0x11041980,0x80000000,3,0x11041a00,0x80000000,0x4000000,0x11041c00,0x80000000,0,0x11048100, -0x80000000,6,0x11048100,0x80000000,0xf,0x11048100,0x80000000,0x4000000,0x11048100,0x80000080,0x4000000,0x11048100,0x80001000,2,0x11048100,0x90003000, -0x1000,0x11048119,0xf8000400,0x1040f,0x11048300,0x80001000,2,0x11048300,0xf8001400,0x18400,0x11048300,0xf8003400,0x18400,0x11049400,0x80000000,0x4000000, -0x11049400,0x80000008,0x4000000,0x11049400,0x80000080,0x4000000,0x11049480,0x80000000,0xe,0x11049480,0x80000000,0xf,0x11049499,0xf8000400,0x1040f,0x11049600, -0x80000000,2,0x11049600,0x80000000,0xf,0x11049600,0xf8000480,0x10405,0x11049619,0xf8000400,0x28401,0x11049680,0x80000000,6,0x11049680,0xf8000400, -0x10402,0x11049680,0xf8000400,0x28402,0x11049700,0x80000000,0x4000000,0x11049700,0x80000080,0x4000000,0x11049780,0x80000080,0x4000000,0x11049780,0x80000080,0x4000001, -0x11049780,0x80000080,0x4000002,0x11049800,0x80000000,0x4000000,0x11049980,0x80000000,2,0x11049980,0x80000000,3,0x11049980,0x80000400,0x10403,0x11049980, -0x80000400,0x28403,0x11049a00,0x80000000,0x4000000,0x11049a80,0x80000000,0x4000000,0x11049b00,0x80000000,0x4000000,0x11049b00,0x80000080,0x4000000,0x11049b80,0x80000000, -0x4000000,0x11049b80,0x80000080,0x4000000,0x11049c00,0x80000000,0,0x1104ab00,0x80000000,0,0x11080100,0x80000000,0x4000000,0x11080100,0xf8000400,0x10402, -0x11080119,0xf8000400,0x10401,0x11080119,0xf8000400,0x28401,0x11080199,0xf8000400,0x10401,0x11080199,0xf8000400,0x10402,0x11080199,0xf8000400,0x28400,0x11080199, -0xf8000400,0x28401,0x11080219,0xf8000400,0x10400,0x11080219,0xf8000400,0x10401,0x11080219,0xf8000400,0x10402,0x11080219,0xf8000400,0x18400,0x11080219,0xf8000400, -0x28400,0x11080219,0xf8000400,0x28401,0x11080219,0xf8000400,0x28402,0x11080299,0xf8000400,0x10400,0x11080300,0x80001000,0,0x11080300,0x80001000,2, -0x11080300,0xf8001400,0x10400,0x11080300,0xf8001400,0x18400,0x11080300,0xf8003400,0x18400,0x11080319,0xf8001400,0x1040f,0x11080400,0x80000040,1,0x11080407, -0xf8000400,0x10400,0x11080407,0xf8000400,0x28400,0x1108040e,0x80001000,0,0x1108040e,0x80001000,1,0x1108040e,0x80001000,2,0x1108040e,0xe0001400, -0x10402,0x1108040e,0xf8000400,0x10400,0x1108040e,0xf8000400,0x10401,0x1108040e,0xf8000400,0x10402,0x1108040e,0xf8000400,0x28400,0x1108040e,0xf8000400,0x28401, -0x1108040e,0xf8000480,0x10402,0x1108040e,0xf8000480,0x28402,0x11080488,0x80000000,0,0x11080488,0xf8000400,0x10400,0x11080488,0xf8000400,0x10401,0x11080488, -0xf8000400,0x28400,0x11080488,0xf8000400,0x28401,0x11080503,0x80000000,0,0x11080503,0x80000000,0x1024000,0x11080503,0xf8000400,0x10400,0x11080503,0xf8000400, -0x10402,0x11080503,0xf8000400,0x28400,0x11080503,0xf8001400,0x18400,0x11080593,0x80000000,0,0x11080593,0x80000000,0x1000,0x11080593,0x80000000,0x18400, -0x11080593,0x80000040,0,0x11080593,0xf8000400,0x18400,0x11080600,0x800000,0xc820,0x11080600,0xf8002400,0x18400,0x11080602,0x80000000,0,0x11080602, -0xf8000400,0x18400,0x11080602,0xf8000400,0x18401,0x11080602,0xf8000400,0x18402,0x11080602,0xf8001400,0x18400,0x11080780,0x80000000,0,0x1108078a,0xf8000400, -0x18400,0x1108078a,0xf8000400,0x18401,0x11080804,0x80000000,0,0x11080804,0xf8000400,0x18400,0x11080804,0xf8000400,0x18401,0x11080890,0xf8000400,0x18400, -0x11080890,0xf8000400,0x18401,0x1108090f,0xf8000400,0x18400,0x1108099f,0x80000000,0,0x1108099f,0xf8000400,0x18400,0x1108099f,0xf8000400,0x18401,0x11080a23, -0x80000000,0,0x11080a23,0xf8000400,0x18400,0x11080a23,0xf8000400,0x18401,0x11080aa4,0xf8000400,0x18400,0x11080b15,0xf8000400,0x18400,0x11080b9a,0xf8000400, -0x18400,0x11080ca6,0x80000000,0,0x11080e80,0x80000000,0,0x11080e8c,0xf8000400,0x18400,0x11080e8c,0xf8000400,0x28400,0x11081319,0xf8000400,0x10401, -0x11081319,0xf8000400,0x10402,0x11081319,0xf8000400,0x28401,0x1108138e,0x80001000,1,0x1108138e,0x80001000,2,0x1108138e,0xf8000400,0x10401,0x1108138e, -0xf8000400,0x28401,0x11081400,0x80000000,0x4000000,0x11081400,0x80000000,0x4000002,0x11081400,0x80000040,0x5024000,0x11081400,0xd0000000,0x1c00,0x11081400,0xd0000080, -0x1c00,0x11081480,0x80000000,0xe,0x11081480,0x80000000,0xf,0x11081480,0x80000080,0xe,0x11081480,0x80000080,0xf,0x11081480,0x80000088,0xe, -0x11081480,0x80000088,0xf,0x11081600,0x80000000,0,0x11081600,0x80000000,2,0x11081600,0x80000000,0xf,0x11081600,0x80000080,0,0x11081600, -0xf8000000,0,0x11081600,0xf8000400,0x28402,0x11081600,0xf8000480,0x10405,0x11081600,0xf8000480,0x18402,0x11081600,0xf8000480,0x28405,0x11081619,0xf8000400, -0x28401,0x11081680,0x80000000,6,0x11081680,0xf8000400,0x10402,0x11081680,0xf8000400,0x18400,0x11081680,0xf8000400,0x28402,0x11081700,0x80000000,0x4000000, -0x11081700,0x80000000,0x4000001,0x11081700,0x80000080,0x4000000,0x11081700,0x80000080,0x4000001,0x11081780,0x80000080,0x4000000,0x11081780,0x80000080,0x4000001,0x11081780, -0x80000080,0x4000002,0x11081800,0x80000000,0x4000000,0x11081800,0x80000080,0x4000000,0x11081880,0x80000000,0x4000000,0x11081900,0x80000000,0x4000000,0x11081a00,0x80000000, -0x4000000,0x11081a80,0x80000000,0x4000000,0x11081b00,0x80000000,0x4000000,0x11081b80,0x80000000,0x4000000,0x11081c00,0x80000000,0x4000000,0x11082803,0xf8000400,0x10402, -0x11082813,0x80000080,5,0x11082813,0xf8000400,0x18401,0x11082813,0xf8000400,0x18402,0x11082813,0xf8000400,0x18405,0x11082819,0xf8000400,0x10402,0x11082882, -0xe0000400,0x18408,0x11082882,0xf8000400,0x18404,0x11082882,0xf8000400,0x18407,0x11082882,0xf8000400,0x18408,0x11082882,0xf8000400,0x18409,0x11082a82,0xe0000400, -0x18408,0x11082a82,0xf8000400,0x18404,0x11082a82,0xf8000400,0x18407,0x11082a82,0xf8000400,0x18408,0x11082a82,0xf8000400,0x18409,0x11088100,0x80000000,0x4000000, -0x11088119,0xf8000400,0x10400,0x11088119,0xf8000400,0x10401,0x11088119,0xf8000400,0x28400,0x11088199,0xf8000400,0x10400,0x11088199,0xf8000400,0x10401,0x11088199, -0xf8000400,0x10402,0x11088199,0xf8000400,0x28400,0x11088199,0xf8000400,0x28402,0x11088219,0xf8000400,0x10401,0x11088299,0xf8000400,0x10400,0x11088300,0x80001000, -0,0x1108840e,0xf8000400,0x10400,0x1108840e,0xf8000400,0x28400,0x11088488,0xf8000400,0x10400,0x11088488,0xf8000400,0x10401,0x11088488,0xf8000400,0x28400, -0x11088488,0xf8000400,0x28401,0x11089400,0x80000000,0x4000000,0x11089400,0x80000000,0x4000002,0x1108960e,0xf8000400,0x28401,0x11089680,0x80000000,6,0x11089700, -0x80000000,0x4000000,0x11089c00,0x80000000,0x4000000,0x11092b80,0x80000000,0xa,0x11092b80,0x80000080,0xa,0x11092b92,0xf8000400,0x1840a,0x11092b92,0xf8800400, -0x1840a,0x11092b96,0xf8000400,0x18c0a,0x110a0080,0x80000000,0x4000000,0x110a0080,0x80000080,0x4000000,0x110a0080,0x80001000,0x4000000,0x110a0080,0x80001080,0x4000000, -0x110a0080,0xd0000000,0x1c00,0x110a0099,0xf8000400,0x10400,0x110a0099,0xf8000400,0x28400,0x110a0099,0xf8000700,0x10400,0x110a0099,0xf8000700,0x28400,0x110a0100, -0x80000000,0x4000000,0x110a0100,0x80000080,0x4000000,0x110a0100,0x80001000,2,0x110c9400,0x80000008,0x4000000,0x11100080,1,0x8020020,0x11100780,0x80000040, -0x1024000,0x11100ca6,0x80000040,0,0x11101400,0x80000001,0x20001,0x11101400,0x80000001,0x20002,0x11101400,0x80000008,0x4000000,0x11108100,0x800010,0xc820, -0x11109400,0x80000000,0x4001000,0x11109400,0x80000008,0x4000000,0x11109400,0x80000018,0x4000000,0x11120080,0x80000080,0x4000000,0x11140300,0xf8001400,0x18400,0x11148100, -0x80001000,2,0x11180080,1,0x8020020,0x11181400,1,0x801c020,0x11201400,0x80000000,0x4008000,0x11201480,0x80000080,0x800e,0x11201480,0x80000080, -0x800f,0x11202880,0x80000000,0x4008000,0x11212b80,0x80000020,0x800a,0x11212b80,0x80000040,0xa,0x11212b80,0x80000040,0x102400a,0x1121ab80,0x80000000,0x8011, -0x1121ab80,0x80000040,0x11,0x1121ab80,0x80000040,0x1024011,0x11220080,0x80000000,0x4008000,0x11229800,0x80000000,0x4008001,0x11229e80,0x80000000,0x4008000,0x11229e80, -0x80000020,0x4008000,0x11229e80,0x80000040,0x4000000,0x11229e80,0x80000040,0x5024000,0x1122a980,0x80000000,0x8010,0x1122a980,0x80000020,0x8010,0x1122aa00,0x80000000, -0x800c,0x1122aa00,0x80000040,0xc,0x1122aa00,0x80000040,0x102400c,0x11240080,1,0x8020020,0x11240080,0x800000,0x20,0x11240100,0x800000,0x20, -0x11240488,0x50021000,0x60,0x11240593,0x50021400,0x60,0x11240601,0x50020400,0x60,0x11240601,0x50021400,0x60,0x11240602,0x20000,0x60,0x11240602, -0x50020400,0x60,0x11240602,0x50021000,0x60,0x1124078a,0x50020400,0x60,0x1124078a,0x50021000,0x60,0x1124078a,0x50061000,0x60,0x1124078a,0xd0000400, -0x18400,0x11240804,0x50020400,0x60,0x11240804,0x50021000,0x60,0x11240804,0x50061000,0x60,0x11240804,0xd0000400,0x18400,0x11240804,0xd0000400,0x18401, -0x11240890,0x50020400,0x60,0x11240890,0x50021000,0x60,0x11240890,0x50061000,0x60,0x11240890,0xd0000400,0x18400,0x1124090f,0x50020400,0x60,0x1124090f, -0x50021000,0x60,0x1124090f,0x50061000,0x60,0x1124090f,0xd0000400,0x18400,0x1124099f,0x50020400,0x60,0x1124099f,0x50021000,0x60,0x1124099f,0x50061000, -0x60,0x1124099f,0xd0000400,0x18400,0x1124099f,0xd0000400,0x18401,0x11240a23,0x50020400,0x60,0x11240a23,0x50061000,0x60,0x11240a23,0xd0000400,0x18400, -0x11240a23,0xd0000400,0x18401,0x11240aa4,0x50020400,0x60,0x11240aa4,0x50020400,0x61,0x11240aa4,0x50061000,0x60,0x11240aa4,0xd0000400,0x18400,0x11240b15, -0x50020400,0x60,0x11240b15,0x50061000,0x60,0x11240b15,0xd0000400,0x18400,0x11240b15,0xd0000400,0x18401,0x11240b9a,0x50020400,0x60,0x11240b9a,0x50061000, -0x60,0x11240b9a,0xd0000400,0x18400,0x11240b9a,0xd0000400,0x18401,0x11240ca6,0x50020400,0x60,0x11240ca6,0x50021000,0x60,0x11240ca6,0x50060400,0x60, -0x11240d18,0x50020400,0x60,0x11240d18,0x50021000,0x60,0x11241400,0x800000,0xc820,0x11241400,0x800000,0x800c820,0x11241400,0x1800000,0xc820,0x11241401, -0x820000,0x60,0x11241581,0x20000,0x60,0x11241581,0x50020080,0x60,0x11242813,0x50021400,0x60,0x11242901,0x50021000,0x60,0x11248381,0x50021000, -0x60,0x11248381,0x50021000,0x61,0x11248381,0x50021400,0x60,0x11248381,0x51021000,0x61,0x11269e81,0x50021000,0x60,0x11269f01,0x50021000,0x60, -0x11280080,1,0x801c040,0x112c0600,0x80000040,0,0x112c0600,0x80000040,0x1024000,0x112c0602,0x80000000,0,0x112c0602,0x80000040,0x1024000,0x112c1c00, -0x80000000,0x4000000,0x112dab80,0x80000040,0x1024011,0x112e0080,0x80000040,0x5024000,0x112eaa00,0x80000040,0x102400c,0x11300100,0x80000001,0x1840b,0x11301400,0x80000001, -0x2000b,0x11301400,0x80000018,0x400000b,0x11308381,0x50021000,0x60,0x11360080,0x80000018,0x4000000,0x11381e80,0x80000000,0,0x11399e80,0x80000001,0x20011, -0x1139ab80,0x80000000,0x11,0x1139ab80,0x80000018,0x11,0x1139ab80,0x80000020,0x11,0x1139ab80,0x80000080,0x11,0x1139ab80,0x80001000,0x11,0x1139ab80, -0x80001080,0x11,0x1139ab80,0xd0000000,0x1c11,0x1139ab80,0xd0000100,0x11,0x1139ab99,0xf8000400,0x10411,0x1139ab99,0xf8000400,0x28411,0x1139ab99,0xf8000500, -0x10411,0x1139ab99,0xf8000500,0x28411,0x113a9e80,0x80000000,0,0x113a9e80,0x80000000,2,0x113a9e80,0x80000000,0x4000000,0x113a9e80,0x80000008,0x4000000, -0x113a9e80,0xf8000c00,0x18000,0x113a9e80,0xf8002400,0x18c00,0x113a9e91,0xf8000c00,0x18000,0x113a9f14,0xf8000400,0x18000,0x113a9f14,0xf8000400,0x18001,0x113a9f96, -0xf8000400,0x18c00,0x113a9f96,0xf8000400,0x18c01,0x113aa005,0xf8000400,0x18400,0x113aa092,0xf8000400,0x18402,0x113aa092,0xf8800400,0x18402,0x113aa100,0x80000000, -0,0x113aa100,0x80000000,0xf,0x113aa200,0x80000000,0,0x113aa200,0x80000000,2,0x113aa200,0x80000000,3,0x113aa212,0x80000000,2, -0x113aa212,0x80000000,3,0x113aa280,0x80000000,2,0x113aa280,0x80000000,0xd,0x113aa391,0xf8400c00,0x18000,0x113aa791,0xf8000c00,0x18001,0x113aa791, -0xf8400c00,0x18000,0x113aa980,0x80000000,2,0x113aa980,0x80000000,0x10,0x113aa980,0x80000008,0x10,0x113aa980,0xd0000000,0x1c02,0x113aa980,0xd0000000, -0x1c10,0x113aaa00,0x80000000,0xc,0x113aaa00,0x80000008,0xc,0x113aaa00,0x80000040,0xc,0x113aaa00,0x80000080,0xc,0x113aaa00,0x80000098,0xc, -0x113c9400,0x80000000,0x4000002,0x11400400,0x80000040,0x1401,0x11400500,0x80000040,0x1025400,0x11401400,0x80000080,0x4001400,0x11420080,0x80000040,0x4001000,0x11420080, -0x80000040,0x4001400,0x11420080,0x80000040,0x5005400,0x11440080,1,0x801c0a0,0x11481400,0x80000040,0x5024002,0x11492b80,0x80000010,0xa,0x11492b80,0xf0001400, -0x18c0a,0x11492b80,0xf8003400,0x18c0a,0x11492b96,0xf8000400,0x18c0a,0x1149ab80,0x80000040,0x11,0x114a9e80,0x80000008,0x4000000,0x114a9e91,0xf8002400,0x18400, -0x114a9f00,0xe0001000,0xc02,0x114a9f14,0xf8000400,0x18000,0x114a9f14,0xf8002400,0x18000,0x114a9f14,0xf8002400,0x18001,0x114a9f80,0x80000010,0,0x114a9f80, -0xf8003400,0x18c00,0x114a9f96,0xf8000400,0x18c00,0x114a9f96,0xf8002400,0x18c00,0x114a9f96,0xf8002400,0x18c01,0x114aaa00,0x80000040,0xc,0x114c0600,0xd0000000, -0x15800,0x114c0602,0x80000000,0x15800,0x114c0602,0xd0000000,0x15800,0x114c078a,0xd0000000,0x15800,0x114c0804,0xd0000000,0x15800,0x114c0890,0xd0000000,0x15800, -0x114c090f,0xd0000000,0x15800,0x114c099f,0xd0000000,0x15800,0x114c0a23,0xd0000000,0x15800,0x114c0aa4,0xd0000000,0x15800,0x114c0b15,0xd0000000,0x15800,0x114c0b9a, -0xd0000000,0x15800,0x114c0ca6,0xd0000000,0x15800,0x114c0d18,0xd0000000,0x15800,0x114e0080,0xd0000300,0x15800,0x11501400,0x80000000,0x4008000,0x11501400,0x80000020, -0x4008000,0x11501480,0x80000080,0x800e,0x11501480,0x80000080,0x800f,0x11502880,0x80000000,0x4008000,0x11512b80,0x80000020,0x800a,0x1151ab80,0x80000000,0x8011, -0x11520080,0x80000000,0x4008000,0x11529800,0x80000000,0x4008001,0x11529e80,0x80000000,0x4008000,0x11529e80,0x80000020,0x4008000,0x1152a980,0x80000000,0x8010,0x1152a980, -0x80000020,0x8010,0x1152aa00,0x80000000,0x800c,0x11541400,0x80000000,0x4000000,0x11541400,0x80000000,0x4000002,0x11541400,0x80000080,0x4000002,0x11541500,0x80000000, -0,0x11548100,0x80000000,0x4000000,0x11549400,0x80000000,0x4000000,0x11549400,0x80000080,0x4000000,0x11549400,0x80000080,0x4000002,0x11549600,0x80000000,2, -0x1155ab80,0x80000000,0x11,0x11560080,0x80000000,0x4000000,0x11560100,0x80000000,0x4000000,0x1156aa00,0x80000000,0xc,0x11580804,0x80000000,0,0x11580c80, -0x80000000,0,0x11581500,0x80000000,0,0x11581500,0x80000000,2,0x11581780,0x80000080,0x4000000,0x11581780,0x80000088,0x4000000,0x11588100,0x80000000, -0x4000000,0x11588100,0x80000080,0x4000000,0x11589600,0x80000000,2,0x11591500,0x80000000,0,0x1159ab80,0x80000000,0x11,0x115a0080,0x80000000,0x4000000, -0x115a0080,0x80000080,0x4000000,0x115a0100,0x80000000,0x4000000,0x115aaa00,0x80000000,0xc,0x115c0100,0x80000020,0x4008000,0x115c1400,0x80000020,0x4008000,0x115c1c00, -0x80000000,0x4008000,0x115c9400,0x80000020,0x4008000,0x115c9400,0x80000020,0x4009000,0x115e0080,0x80000020,0x4008000,0x115e0080,0x80000020,0x4009000,0x11600ca6,0xf0000400, -0x18002,0x11600ca6,0xf8000400,0x18000,0x11600ca6,0xf8002400,0x18000,0x11600ca6,0xfc000400,0x18000,0x11600d18,0xf0000400,0x18002,0x11600d18,0xf8000400,0x18000, -0x11600d18,0xf8000400,0x18002,0x11600d18,0xf8002400,0x18000,0x11600d18,0xfc000400,0x18000,0x116a0080,0x80000001,0x8020000,0x116e0080,0x80000000,0x4000000,0x11701400, -0x800000,0xc820,0x11740100,1,0x801c020,0x11782a80,0x800000,0xc820,0x11868f12,0xf8000400,0x18480,0x11868f12,0xf8800400,0x18480,0x11880f12,0xf8000400, -0x18500,0x118c0f12,0xf8000400,0x18520,0x118c0f12,0xf8800400,0x18520,0x20000000,0x810000,0,0x20003680,0x810000,0,0x20003700,0x810000,0, -0x2000b680,0,0,0x2000b700,0,0,0x20080da7,0x80000000,0,0x20080da7,0xf8000400,0x18400,0x20080da7,0xf8000400,0x18401,0x20081319, -0xf8000400,0x10401,0x20100da7,0x80000000,0,0x20100da7,0xd0000400,0x18400,0x20140da7,0x80000000,0,0x20200da7,0x80000000,0x8000,0x20240593,0x50021000, -0x60,0x20240593,0x50021400,0x60,0x20240da7,0x50020400,0x60,0x20240da7,0x50020400,0x61,0x20240da7,0x50020400,0x62,0x20240da7,0x50021000,0x60, -0x20240da7,0xd0001000,0,0x202c0da7,0x80000000,0,0x202c0da7,0x80000040,0,0x20300da7,0x80000000,0xb,0x20300da7,0x80000040,0,0x204c0da7, -0xd0000000,0x15800,0x20500da7,0x80000000,0x8000,0x20581500,0x80000000,0,0x20642580,0x800000,0,0x20642600,0x800000,0,0x20642680,0x800000, -0,0x207ea512,0xf8000400,0x184c1,0x2082a512,0xf8000400,0x184e1,0x211c2b00,0x80000000,0,0x21589500,0x80000000,0,0x30080219,0xf8000400,0x10400, -0x30080219,0xf8000400,0x10401,0x30080219,0xf8000400,0x28400,0x30080219,0xf8000400,0x28401,0x30080299,0xf8000400,0x10400,0x30080300,0x80001000,0,0x30080300, -0xf8001400,0x18400,0x3008040e,0xf8000400,0x10400,0x30080488,0xf8000400,0x10400,0x30080488,0xf8000400,0x10401,0x30080488,0xf8000400,0x28400,0x30080488,0xf8000400, -0x28401,0x30080602,0x80000000,0,0x30080602,0xf8000400,0x18400,0x300806a2,0x800000,0xc820,0x300806a2,0x80000000,0,0x300806a2,0x80000040,0, -0x300806a2,0x80000040,0x1024000,0x300806a2,0xf8000400,0x18400,0x30080725,0xf8000400,0x18400,0x30080c21,0x80000000,0,0x30080c21,0xf8000400,0x18400,0x30080da7, -0x80000000,0,0x30080da7,0xf8000400,0x18400,0x30080e1c,0x80000000,0,0x30080f8b,0x80000000,0,0x30080f8b,0x80000040,0,0x30080f8b,0x80000040, -0x1024000,0x30080f8b,0xd0000000,0,0x30080f8b,0xf8000400,0x18400,0x30081006,0xf8000400,0x18400,0x300810a8,0x80000040,0,0x300810a8,0x80000040,0x1024000, -0x300810a8,0xf8000400,0x18400,0x3008111d,0xf8000400,0x18400,0x300811a0,0xf8000400,0x18400,0x30081217,0xf8000400,0x18400,0x3008129b,0x80000000,0,0x3008129b, -0xf8000400,0x18400,0x3008129b,0xf8002400,0x18400,0x30081400,0x80000000,0x4000000,0x30081400,0x80000040,0x5024002,0x30081600,0x80000000,0,0x30081600,0xf8000400, -0x10405,0x30081680,0xf8000400,0x18400,0x30081700,0x80000000,0x4000000,0x30081800,0x80000000,0x4000000,0x30081880,0x80000000,0x4000000,0x30081b00,0x80000000,0x4000000, -0x30081b80,0x80000000,0x4000000,0x30081cae,0x80000000,0x4000000,0x30082813,0xf8000400,0x18401,0x30088300,0x80001000,0,0x30100503,0x80000018,0,0x30100da7, -0x80000000,0,0x30100e1c,0x80000040,0x1024000,0x30100f8b,0x80000040,0,0x3010111d,0x80000001,0x20000,0x30101180,0x80000040,0,0x30101217,0x80000000, -0,0x30101217,0x80000040,0,0x3010129b,0x80000040,0,0x3010129b,0x80000040,0x1024000,0x3014129b,0x80000018,0,0x3020111d,0x80000000,0x8000, -0x30240488,0x20000,0x60,0x30240601,0x50020400,0x60,0x302406a2,0x50020400,0x60,0x302406a2,0x50021000,0x60,0x302406a2,0x50021400,0x60,0x30240725, -0x50021400,0x60,0x30240c21,0x50020400,0x60,0x30240c21,0x50061000,0x60,0x30240c21,0xd0000400,0x18400,0x30240c21,0xd0000400,0x18401,0x30240da7,0x50020400, -0x60,0x30240da7,0x50021000,0x60,0x30240e1c,0x50020400,0x60,0x30240e1c,0x50021000,0x60,0x30240e1c,0x50061000,0x60,0x30240e1c,0xd0000400,0x18400, -0x30241217,0x50020400,0x60,0x30241217,0x50021000,0x60,0x30241217,0x50061000,0x60,0x30241217,0x51021000,0x60,0x30241217,0xd0000400,0x18400,0x3024129b, -0x50020400,0x60,0x3024129b,0x50820000,0x2000060,0x30241581,0x20000,0x60,0x30242b00,0,0xc820,0x30248381,0x50021000,0x60,0x3030129b,0x80000001, -0x20000,0x30301400,0x80000001,0x2000b,0x30308381,0x50021000,0x60,0x303a9d11,0x80200000,0,0x303a9d11,0x80200000,2,0x303a9d91,0x80200000,2, -0x303a9e00,0x80080000,0,0x303a9e00,0x80100000,0,0x303a9e80,0x80000000,0,0x303a9e91,0xf8000c00,0x18002,0x303aa185,0xf8000400,0x18400,0x303aa311, -0xf8400c00,0x18000,0x303aa429,0xf8000400,0x18400,0x303aa4a9,0x80000000,0,0x30481217,0x80000000,0,0x30481217,0x80000040,0,0x30481217,0xf8000400, -0x18400,0x304aa429,0xf8002400,0x18400,0x304c0e1c,0xd0000000,0x15800,0x304c1217,0xd0000000,0x15800,0x304c129b,0xd0000000,0x15800,0x3050111d,0x80000000,0x8000, -0x30581217,0x80000000,0,0x30581500,0x80000000,0,0x30600e1c,0xf8000400,0x18400,0x30600e1c,0xf8000400,0x18401,0x30601217,0x800000,0xc820,0x30601217, -0xf8000400,0x18400,0x30601217,0xf9000400,0x18400,0x31002880,0x810000,0,0x3108040e,0xf8000480,0x10402,0x3108040e,0xf8000480,0x28402,0x31082c1e,0x80000000, -0,0x31082c1e,0xf8000400,0x18400,0x31082c8d,0xf8000400,0x18400,0x31082d09,0xf8000400,0x10400,0x31082d09,0xf8000400,0x28400,0x31082d80,0x80000000,0, -0x31082e00,0x80000000,0,0x31082e00,0x80000000,1,0x31082e80,0x80000080,5,0x31082e80,0xf8000480,0x10405,0x31082e80,0xf8000480,0x28405,0x31242e00, -0x800000,0xc820,0x31242e00,0x50020000,0x60,0x31242e00,0x50021000,0x60,0x31242e00,0xd0000000,0,0x31242e00,0xd0001000,0,0x31242e01,0x50021000, -0x60,0x31243000,0x800000,0xc820,0x313aaf11,0xf8400c00,0x18000,0x313aaf91,0xf8000c00,0x18001,0x314c2e80,0xd0000080,0x15805,0x32041b80,0x80000000,0x4000000, -0x32049980,0x80000000,0,0x32080219,0xf8000400,0x28400,0x3208040e,0x80000080,0,0x3208040e,0xf8000400,0x10400,0x3208040e,0xf8000400,0x28400,0x32080488, -0xf8000400,0x10400,0x32080488,0xf8000400,0x28400,0x32080602,0xf8000400,0x18400,0x32080725,0xf8000400,0x18400,0x32080e8c,0xf8000400,0x18400,0x32081400,0x800080, -0xc820,0x32081400,0x80000000,0x4000000,0x32081400,0x80000000,0x4000002,0x32081400,0x80000040,0x5024002,0x32081400,0x80000080,0x4000000,0x32081499,0xf8000400,0x1040f, -0x32081600,0x80000000,0,0x32081600,0x80000080,0,0x32081600,0x80000080,5,0x32081600,0xf8000480,0x10405,0x32081600,0xf8000480,0x28405,0x32081700, -0x80000080,0x4000000,0x32081780,0x80000080,0x4000000,0x32081800,0x80000000,0x4000000,0x32081800,0x80000080,0x4000000,0x32081a80,0x80000000,0x4000000,0x32081b00,0x80000080, -0x4000000,0x32081b80,0x80000000,0x4000000,0x32082a82,0xf8000400,0x18400,0x32083088,0xf8000400,0x10400,0x32083088,0xf8000400,0x28400,0x3208312a,0xf8000400,0x18400, -0x32083180,0x80000000,0,0x320831ab,0xf8000400,0x18400,0x3208322c,0xf8000400,0x18400,0x320832ad,0xf8000400,0x18400,0x32083300,0x80000080,0x4000000,0x32083380, -0x80000080,0x4000000,0x32083400,0x80000080,0x4000000,0x32083480,0x80000080,0x4000000,0x32083500,0x80000080,0x4000000,0x32083500,0x80000080,0x4000001,0x32083500,0x80000080, -0x4000002,0x32101400,0x80000001,0x20002,0x32201800,0x80000000,0x4008000,0x32201c00,0x80000000,0x4008000,0x32203480,0x80000080,0x4008000,0x3221ab80,0x80000000,0x8011, -0x32223300,0x80000080,0x4008000,0x32223480,0x80000080,0x4008000,0x32241581,0x20000,0x60,0x32241581,0x50020000,0x60,0x32241581,0x50020080,0x60,0x3224312a, -0x50020000,0x60,0x3224312a,0x50020400,0x60,0x322431ab,0x50020000,0x60,0x322431ab,0x50020400,0x60,0x3224322c,0x50020400,0x60,0x322432ad,0x50020400, -0x60,0x32248381,0x50020000,0x60,0x3224b601,0x50820000,0x2000060,0x32308381,0x50860000,0x60,0x323a9e80,0x80000000,0,0x323a9f14,0xf8000400,0x18010, -0x323a9f96,0xf8000400,0x18c10,0x323aa200,0x80000000,3,0x323aa4a9,0x80000000,0,0x323aa791,0xf8000400,0x18401,0x323aa980,0x80000000,0x4000000,0x324a9e80, -0xf8000400,0x18400,0x324a9e91,0xf8000400,0x18400,0x324a9f14,0xf8000400,0x18000,0x324a9f80,0x80000008,0xc00,0x324ab596,0xf8000400,0x18c00,0x32501800,0x80000000, -0x4008000,0x32501c00,0x80000000,0x4008000,0x32503480,0x80000080,0x4008000,0x3251ab80,0x80000000,0x8011,0x32523300,0x80000080,0x4008000,0x32523480,0x80000080,0x4008000, -0x32542882,0x80000000,8,0x32581500,0x80000000,0,0x325c1800,0x80000000,0x4008000,0x32781400,0x800000,0xc820,0x40049b80,0x80000000,0x4000000,0x40080219, -0xf8000400,0x10400,0x40080299,0xf8000400,0x10400,0x40080300,0x80001000,0,0x4008040e,0xf8000400,0x10400,0x4008040e,0xf8000400,0x28400,0x4008040e,0xf8000400, -0x28402,0x40080600,0x800000,0xc820,0x40080602,0x80000000,0,0x40080602,0xf8000400,0x18400,0x400806a2,0xf8000400,0x18400,0x4008078a,0xf8000400,0x18400, -0x40080804,0xf8000400,0x18400,0x4008090f,0xf8000400,0x18400,0x4008099f,0xf8000400,0x18400,0x40080a23,0x80000000,0,0x40080b15,0xf8000400,0x18400,0x40081217, -0x80000000,0,0x40081400,0x80000008,0x4000000,0x40081400,0xd0000000,0x1c00,0x40081600,0x80000000,2,0x40081800,0x80000000,0x4000000,0x40081800,0x80000080, -0x4000000,0x40081b80,0x80000000,0x4000000,0x40082880,0x80000000,0,0x40082d09,0xf8000400,0x10400,0x40082d09,0xf8000400,0x28400,0x40082e80,0xf8000480,0x10405, -0x400837b0,0x80000000,0,0x400837b0,0xf8000400,0x18400,0x40083834,0xf8000400,0x18400,0x40083897,0x80000000,0,0x40083908,0xf8000400,0x10400,0x4008390e, -0xf8000400,0x10400,0x4008390e,0xf8001400,0x1040e,0x4008390e,0xf8001400,0x1040f,0x40083919,0xf8000400,0x10400,0x40083919,0xf8001400,0x10400,0x40083919,0xf8001400, -0x1040e,0x40083919,0xf8001400,0x1040f,0x40083980,0x80000000,0x4000000,0x40083a00,0x80000000,0,0x40083ab1,0xf8000400,0x18400,0x40083b31,0xf8000400,0x18400, -0x40083b80,0x80000000,0,0x40083c35,0xf8000400,0x18400,0x40083cb3,0xf8000400,0x18400,0x40083d32,0xf8000400,0x18400,0x40083daf,0xf8000400,0x18400,0x40083e00, -0x80000000,0,0x40089980,0x80000000,0,0x40103b80,0x80000000,0,0x40103c35,0x80000000,0,0x4022a980,0x80000000,0x8010,0x40240602,0x50020400, -0x60,0x40240602,0x50021000,0x60,0x40240602,0x50021400,0x60,0x40240890,0x50020400,0x60,0x40240890,0xd0000400,0x18400,0x4024090f,0x50020400,0x60, -0x40240b15,0x50021000,0x60,0x40241217,0x50021000,0x60,0x402437b0,0x50020400,0x60,0x402437b0,0x50021000,0x60,0x402437b0,0xd0000400,0x18400,0x40248381, -0x50021000,0x60,0x4024be81,0x50820000,0x2000060,0x402c37b0,0x80000040,0x1024000,0x40308381,0x50021000,0x60,0x403aa200,0x80000000,0xd,0x403aa212,0x80000000, -2,0x403aa212,0x80000000,3,0x403aa280,0x80000000,0xd,0x40400602,0x80000000,0x1400,0x404c37b0,0xd0000000,0x15800,0x404c3d32,0xd0000000,0x15800, -0x4052a980,0x80000000,0x8010,0x4058090f,0x80000000,0,0x40580a23,0x80000000,0,0x41080219,0xf8000400,0x10400,0x41080219,0xf8000400,0x28400,0x4108040e, -0xf8000400,0x10400,0x4108040e,0xf8000400,0x28400,0x41080488,0xf8000400,0x10400,0x41080488,0xf8000400,0x28400,0x4108078a,0xf8000400,0x18400,0x41080804,0xf8000400, -0x18400,0x41080a23,0xf8000400,0x18400,0x41080e8c,0xf8000400,0x18400,0x41080e8c,0xf8000400,0x1840f,0x41080f8b,0x80000000,0,0x41080f8b,0xf8000400,0x18400, -0x41081400,0x80000000,0x4000000,0x41081499,0xf8000400,0x1040e,0x41081600,0x80000000,0,0x41081600,0xf8000480,0x10405,0x41081800,0x80000000,0x4000000,0x41081b80, -0x80000000,0x4000000,0x41082e80,0xf8000400,0x10405,0x41083300,0x80000080,0x4000000,0x41083908,0xf8000400,0x1040f,0x41083919,0xf8000400,0x10400,0x41083980,0x80000000, -0x4000000,0x41083f0e,0x80000000,0,0x41083f8e,0x80000000,0,0x41083f8e,0xf8000400,0x18400,0x41084002,0xf8000400,0x18400,0x410840b7,0x80000000,0, -0x410840b7,0xf8000400,0x18400,0x41084207,0x80000000,0,0x41084207,0xf8000400,0x10400,0x41084207,0xf8000400,0x28400,0x4108428b,0xf8000400,0x18400,0x4108430b, -0x80000000,0,0x4108430b,0xf8000400,0x18400,0x4108438c,0xf8000400,0x10400,0x41084438,0xf8000400,0x10400,0x41084438,0xf8000400,0x28400,0x410844b9,0x80000000, -0,0x410844b9,0xf8000400,0x18400,0x41084500,0x80000000,0,0x410845bb,0x80000000,0,0x410845bb,0xf8000400,0x18400,0x4108463d,0x80000000,0, -0x4108463d,0xf8000400,0x18400,0x41084699,0xf8000400,0x10400,0x41084699,0xf8000400,0x1040f,0x41084700,0x80000000,0x4000000,0x410847ba,0x80000000,0,0x410847ba, -0xf8000400,0x18400,0x4108483c,0xf8000400,0x18400,0x4108483c,0xf8000400,0x1840f,0x41101400,0x80000000,0x4000000,0x411040b7,0x80000000,0,0x41104207,0x80000000, -0,0x411044b9,0x80000000,0,0x41104700,0x80000000,0x4000000,0x41104700,0x80000018,0x4000000,0x41140da7,0x80000000,0,0x41203300,0x80000080,0x4008000, -0x4122c880,0x80000000,0x10,0x4122c880,0x80000000,0x8010,0x41240593,0x50020000,0x60,0x41240593,0x50020400,0x60,0x41240602,0x50020400,0x60,0x41240f8b, -0x50020400,0x60,0x41241581,0x50020000,0x60,0x41243f0e,0x50020000,0x60,0x412440b7,0x50020400,0x60,0x412440b7,0xd0000400,0x18400,0x41244181,0x50020000, -0x60,0x412444b9,0x50020000,0x60,0x412444b9,0x50020400,0x60,0x412444b9,0x50060000,0x60,0x412445bb,0xd0000400,0x18400,0x412447ba,0x50020000,0x60, -0x412447ba,0x50020400,0x60,0x412447ba,0x50060000,0x60,0x412447ba,0xd0000000,0,0x412447ba,0xd0000400,0x18400,0x41248381,0x50020000,0x60,0x412c0593, -0x80000000,0,0x412c0602,0x80000000,0,0x412ec880,0x80000000,0x10,0x413aa200,0x80000000,3,0x413aa391,0xf8400c00,0x18000,0x413aa791,0xf8000c00, -0x18001,0x413ac100,0x80000000,0,0x413ec880,0x80000000,0x10,0x4142c880,0x80000000,0x1410,0x414c0a23,0xd0000000,0x15800,0x414c45bb,0xd0000000,0x15800, -0x41503300,0x80000080,0x4008000,0x4152c880,0x80000000,0x8010,0x41540602,0x80000000,0,0x41581500,0x80000000,0,0x415c4700,0x80000000,0x4008000}; +static const uint32_t propsVectors[3384]={ +0x67,0,0,0x67,0x800000,0,0x467,0,0,0x4e7,0,0,0x567,0,0,0x5e7, +0,0,0x667,0,0,0x6e7,0,0,0x767,0,0,0x7e7,0,0,0x867,0, +0,0x8e7,0,0,0x967,0,0,0x9e7,0,0,0xa67,0,0,0xae7,0,0, +0xb67,0,0,0xbe7,0,0,0xc67,0,0,0xce7,0,0,0xd67,0,0,0xde7, +0,0,0xe67,0,0,0xee7,0,0,0xf67,0,0,0xfe7,0,0,0x1067,0, +0,0x10e7,0,0,0x1167,0,0,0x11e7,0,0,0x1267,0,0,0x12e7,0,0, +0x1367,0,0,0x13e7,0,0,0x1467,0x800000,0,0x14e7,0,0,0x1567,0,0,0x15e7, +0,0,0x1667,0,0,0x16e7,0,0,0x1867,0,0x4000000,0x18e7,0,0x4000000,0x1967,0, +0x4000000,0x1be7,0,0x4000000,0x1c67,0,0x4000000,0x1d67,0,0,0x1de7,0,0,0x1e67,0,0, +0x1f67,0,0,0x2067,0,0,0x20e7,0,0,0x21e7,0,0,0x2267,0,0,0x2367, +0,0,0x23e7,0,0,0x2467,0,0,0x24e7,0,0,0x2567,0,0,0x27e7,0, +0,0x2867,0,0,0x28e7,0,0,0x2967,0,0,0x2a67,0,0,0x2ae7,0,0, +0x2b67,0x800000,0,0x2be7,0,0,0x2c67,0,0,0x2ce7,0,0,0x2de7,0,0,0x2e67, +0,0,0x2ee7,0,0,0x3067,0x800000,0,0x30e7,0,0,0x3167,0,0,0x31e7,0, +0,0x3267,0,0,0x32e7,0,0,0x3367,0,0x4000000,0x37e7,0,0,0x3867,0,0, +0x39e7,0,0x4000000,0x3ae7,0,0,0x3b67,0,0,0x3be7,0,0,0x3c67,0,0,0x3d67, +0,0,0x3de7,0,0,0x3e67,0,0,0x3f67,0,0,0x3fe7,0,0,0x4067,0, +0,0x40e7,0,0,0x4167,0,0,0x41e7,0,0,0x4267,0,0,0x42e7,0,0, +0x4367,0,0,0x43e7,0,0,0x4467,0,0,0x44e7,0,0,0x4567,0,0,0x45e7, +0,0,0x4667,0,0,0x4767,0,0x4000000,0x47e7,0,0,0x4867,0,0,0x48e7,0, +0,0x4967,0,0,0x49e7,0,0,0x4a67,0,0,0x4ae7,0,0,0x4b67,0,0, +0x4be7,0,0,0x4c67,0,0,0x4ce7,0,0,0x4d67,0,0,0x28067,0,0,0x2af67, +0,0,0x2afe7,0,0,0x11002b67,0x810000,0,0x1100a767,0,0,0x11041680,0x80000000,6,0x11041980,0x80000000, +3,0x11041a00,0x80000000,0x4000000,0x11041c00,0x80000000,0,0x11048100,0x80000000,6,0x11048100,0x80000000,0xf,0x11048100,0x80000000,0x4000000, +0x11048100,0x80000080,0x4000000,0x11048100,0x80001000,2,0x11048100,0x90003000,0x1000,0x11048119,0xf8000400,0x1040f,0x11048300,0x80001000,2,0x11048300, +0xf8001400,0x18400,0x11048300,0xf8003400,0x18400,0x11049400,0x80000000,0x4000000,0x11049400,0x80000008,0x4000000,0x11049400,0x80000080,0x4000000,0x11049480,0x80000000, +0xe,0x11049480,0x80000000,0xf,0x11049499,0xf8000400,0x1040f,0x11049600,0x80000000,2,0x11049600,0x80000000,0xf,0x11049600,0xf8000480,0x10405, +0x11049619,0xf8000400,0x28401,0x11049680,0x80000000,6,0x11049680,0xf8000400,0x10402,0x11049680,0xf8000400,0x28402,0x11049700,0x80000000,0x4000000,0x11049700, +0x80000080,0x4000000,0x11049780,0x80000080,0x4000000,0x11049780,0x80000080,0x4000001,0x11049780,0x80000080,0x4000002,0x11049800,0x80000000,0x4000000,0x11049980,0x80000000, +2,0x11049980,0x80000000,3,0x11049980,0x80000400,0x10403,0x11049980,0x80000400,0x28403,0x11049a00,0x80000000,0x4000000,0x11049a80,0x80000000,0x4000000, +0x11049b00,0x80000000,0x4000000,0x11049b00,0x80000080,0x4000000,0x11049b80,0x80000000,0x4000000,0x11049b80,0x80000080,0x4000000,0x11049c00,0x80000000,0,0x1104ab00, +0x80000000,0,0x11080100,0x80000000,0x4000000,0x11080100,0xf8000400,0x10402,0x11080119,0xf8000400,0x10401,0x11080119,0xf8000400,0x28401,0x11080199,0xf8000400, +0x10401,0x11080199,0xf8000400,0x10402,0x11080199,0xf8000400,0x28400,0x11080199,0xf8000400,0x28401,0x11080219,0xf8000400,0x10400,0x11080219,0xf8000400,0x10401, +0x11080219,0xf8000400,0x10402,0x11080219,0xf8000400,0x18400,0x11080219,0xf8000400,0x28400,0x11080219,0xf8000400,0x28401,0x11080219,0xf8000400,0x28402,0x11080299, +0xf8000400,0x10400,0x11080299,0xf8000400,0x18400,0x11080300,0x80001000,0,0x11080300,0x80001000,2,0x11080300,0xf8001400,0x10400,0x11080300,0xf8001400, +0x18400,0x11080300,0xf8003400,0x18400,0x11080319,0xf8001400,0x1040f,0x11080400,0x80000040,1,0x11080407,0xf8000400,0x10400,0x11080407,0xf8000400,0x28400, +0x1108040e,0x80001000,0,0x1108040e,0x80001000,1,0x1108040e,0x80001000,2,0x1108040e,0xe0001400,0x10402,0x1108040e,0xf8000400,0x10400,0x1108040e, +0xf8000400,0x10401,0x1108040e,0xf8000400,0x10402,0x1108040e,0xf8000400,0x28400,0x1108040e,0xf8000400,0x28401,0x1108040e,0xf8000480,0x10402,0x1108040e,0xf8000480, +0x28402,0x11080488,0x80000000,0,0x11080488,0xf8000400,0x10400,0x11080488,0xf8000400,0x10401,0x11080488,0xf8000400,0x28400,0x11080488,0xf8000400,0x28401, +0x11080503,0x80000000,0,0x11080503,0x80000000,0x1024000,0x11080503,0xf8000400,0x10400,0x11080503,0xf8000400,0x10402,0x11080503,0xf8000400,0x28400,0x11080503, +0xf8001400,0x18400,0x11080593,0x80000000,0,0x11080593,0x80000000,0x1000,0x11080593,0x80000000,0x18400,0x11080593,0x80000040,0,0x11080593,0xf8000400, +0x18400,0x11080600,0x800000,0xc820,0x11080600,0xf8002400,0x18400,0x11080602,0x80000000,0,0x11080602,0xf8000400,0x18400,0x11080602,0xf8000400,0x18401, +0x11080602,0xf8000400,0x18402,0x11080602,0xf8001400,0x18400,0x11080780,0x80000000,0,0x1108078a,0xf8000400,0x18400,0x1108078a,0xf8000400,0x18401,0x11080804, +0x80000000,0,0x11080804,0xf8000400,0x18400,0x11080804,0xf8000400,0x18401,0x11080890,0xf8000400,0x18400,0x11080890,0xf8000400,0x18401,0x1108090f,0xf8000400, +0x18400,0x1108099f,0x80000000,0,0x1108099f,0xf8000400,0x18400,0x1108099f,0xf8000400,0x18401,0x11080a23,0x80000000,0,0x11080a23,0xf8000400,0x18400, +0x11080a23,0xf8000400,0x18401,0x11080aa4,0xf8000400,0x18400,0x11080b15,0xf8000400,0x18400,0x11080b9a,0xf8000400,0x18400,0x11080ca6,0x80000000,0,0x11080e80, +0x80000000,0,0x11080e8c,0xf8000400,0x18400,0x11080e8c,0xf8000400,0x28400,0x11081319,0xf8000400,0x10401,0x11081319,0xf8000400,0x10402,0x11081319,0xf8000400, +0x28401,0x1108138e,0x80001000,1,0x1108138e,0x80001000,2,0x1108138e,0xf8000400,0x10401,0x1108138e,0xf8000400,0x28401,0x11081400,0x80000000,0x4000000, +0x11081400,0x80000000,0x4000002,0x11081400,0xd0000000,0x1c00,0x11081400,0xd0000080,0x1c00,0x11081480,0x80000000,0xe,0x11081480,0x80000000,0xf,0x11081480, +0x80000080,0xe,0x11081480,0x80000080,0xf,0x11081480,0x80000088,0xe,0x11081480,0x80000088,0xf,0x11081600,0x80000000,0,0x11081600,0x80000000, +2,0x11081600,0x80000000,0xf,0x11081600,0x80000080,0,0x11081600,0xf8000000,0,0x11081600,0xf8000400,0x28402,0x11081600,0xf8000480,0x10405, +0x11081600,0xf8000480,0x18402,0x11081600,0xf8000480,0x28405,0x11081619,0xf8000400,0x28400,0x11081619,0xf8000400,0x28401,0x11081680,0x80000000,6,0x11081680, +0xf8000400,0x10402,0x11081680,0xf8000400,0x18400,0x11081680,0xf8000400,0x28402,0x11081700,0x80000000,0x4000000,0x11081700,0x80000000,0x4000001,0x11081700,0x80000080, +0x4000000,0x11081700,0x80000080,0x4000001,0x11081780,0x80000080,0x4000000,0x11081780,0x80000080,0x4000001,0x11081780,0x80000080,0x4000002,0x11081800,0x80000000,0x4000000, +0x11081800,0x80000080,0x4000000,0x11081880,0x80000000,0x4000000,0x11081900,0x80000000,0x4000000,0x11081a00,0x80000000,0x4000000,0x11081a80,0x80000000,0x4000000,0x11081b00, +0x80000000,0x4000000,0x11081b80,0x80000000,0x4000000,0x11081c00,0x80000000,0x4000000,0x11082803,0xf8000400,0x10402,0x11082813,0x80000080,5,0x11082813,0xf8000400, +0x18401,0x11082813,0xf8000400,0x18402,0x11082813,0xf8000400,0x18405,0x11082819,0xf8000400,0x10402,0x11082882,0xe0000400,0x18408,0x11082882,0xf8000400,0x18404, +0x11082882,0xf8000400,0x18407,0x11082882,0xf8000400,0x18408,0x11082882,0xf8000400,0x18409,0x11082a82,0xe0000400,0x18408,0x11082a82,0xf8000400,0x18404,0x11082a82, +0xf8000400,0x18407,0x11082a82,0xf8000400,0x18408,0x11082a82,0xf8000400,0x18409,0x11088100,0x80000000,0x4000000,0x11088119,0xf8000400,0x10400,0x11088119,0xf8000400, +0x10401,0x11088119,0xf8000400,0x28400,0x11088199,0xf8000400,0x10400,0x11088199,0xf8000400,0x10401,0x11088199,0xf8000400,0x10402,0x11088199,0xf8000400,0x28400, +0x11088199,0xf8000400,0x28402,0x11088219,0xf8000400,0x10401,0x11088299,0xf8000400,0x10400,0x11088300,0x80001000,0,0x1108840e,0xf8000400,0x10400,0x1108840e, +0xf8000400,0x28400,0x11088488,0xf8000400,0x10400,0x11088488,0xf8000400,0x10401,0x11088488,0xf8000400,0x28400,0x11088488,0xf8000400,0x28401,0x11089400,0x80000000, +0x4000000,0x11089400,0x80000000,0x4000002,0x1108960e,0xf8000400,0x28401,0x11089680,0x80000000,6,0x11089700,0x80000000,0x4000000,0x11089c00,0x80000000,0x4000000, +0x11092b80,0x80000000,0xa,0x11092b80,0x80000080,0xa,0x11092b92,0xf8000400,0x1840a,0x11092b92,0xf8800400,0x1840a,0x11092b96,0xf8000400,0x18c0a,0x110a0080, +0x80000000,0x4000000,0x110a0080,0x80000080,0x4000000,0x110a0080,0x80001000,0x4000000,0x110a0080,0x80001080,0x4000000,0x110a0080,0xd0000000,0x1c00,0x110a0099,0xf8000400, +0x10400,0x110a0099,0xf8000400,0x28400,0x110a0099,0xf8000700,0x10400,0x110a0099,0xf8000700,0x28400,0x110a0100,0x80000000,0x4000000,0x110a0100,0x80000080,0x4000000, +0x110a0100,0x80001000,2,0x110c9400,0x80000008,0x4000000,0x11100080,1,0x8020020,0x11100593,0x80000008,0,0x11100780,0x80000040,0x1024000,0x11100ca6, +0x80000040,0,0x11101400,0x80000001,0x20001,0x11101400,0x80000001,0x20002,0x11101400,0x80000008,0x4000000,0x11108100,0x800010,0xc820,0x11109400,0x80000000, +0x4001000,0x11109400,0x80000008,0x4000000,0x11109400,0x80000018,0x4000000,0x11120080,0x80000080,0x4000000,0x11140300,0xf8001400,0x18400,0x11148100,0x80001000,2, +0x11180080,1,0x8020020,0x11181400,1,0x801c020,0x11201400,0x80000000,0x4008000,0x11201480,0x80000080,0x800e,0x11201480,0x80000080,0x800f,0x11202880, +0x80000000,0x4008000,0x11212b80,0x80000020,0x800a,0x11212b80,0x80000040,0xa,0x11212b80,0x80000040,0x102400a,0x1121ab80,0x80000000,0x8011,0x1121ab80,0x80000040, +0x11,0x1121ab80,0x80000040,0x1024011,0x11220080,0x80000000,0x4008000,0x11229800,0x80000000,0x4008001,0x11229e80,0x80000000,0x4008000,0x11229e80,0x80000020,0x4008000, +0x11229e80,0x80000040,0x4000000,0x11229e80,0x80000040,0x5024000,0x1122a980,0x80000000,0x8010,0x1122a980,0x80000020,0x8010,0x1122aa00,0x80000000,0x800c,0x1122aa00, +0x80000040,0xc,0x1122aa00,0x80000040,0x102400c,0x11240080,0x800000,0x20,0x11240100,0x800000,0x20,0x11240488,0x50021000,0x60,0x11240593,0x50021400, +0x60,0x11240601,0x50020400,0x60,0x11240601,0x50021400,0x60,0x11240602,0x20000,0x60,0x11240602,0x50020400,0x60,0x11240602,0x50021000,0x60, +0x1124078a,0x50020400,0x60,0x1124078a,0x50021000,0x60,0x1124078a,0x50061000,0x60,0x1124078a,0xd0000400,0x18400,0x11240804,0x50020400,0x60,0x11240804, +0x50021000,0x60,0x11240804,0x50061000,0x60,0x11240804,0xd0000400,0x18400,0x11240804,0xd0000400,0x18401,0x11240890,0x50020400,0x60,0x11240890,0x50021000, +0x60,0x11240890,0x50061000,0x60,0x11240890,0xd0000400,0x18400,0x1124090f,0x50020400,0x60,0x1124090f,0x50021000,0x60,0x1124090f,0x50061000,0x60, +0x1124090f,0xd0000400,0x18400,0x1124099f,0x50020400,0x60,0x1124099f,0x50021000,0x60,0x1124099f,0x50061000,0x60,0x1124099f,0xd0000400,0x18400,0x1124099f, +0xd0000400,0x18401,0x11240a23,0x50020400,0x60,0x11240a23,0x50061000,0x60,0x11240a23,0xd0000400,0x18400,0x11240a23,0xd0000400,0x18401,0x11240aa4,0x50020400, +0x60,0x11240aa4,0x50020400,0x61,0x11240aa4,0x50061000,0x60,0x11240aa4,0xd0000400,0x18400,0x11240b15,0x50020400,0x60,0x11240b15,0x50061000,0x60, +0x11240b15,0xd0000400,0x18400,0x11240b15,0xd0000400,0x18401,0x11240b9a,0x50020400,0x60,0x11240b9a,0x50061000,0x60,0x11240b9a,0xd0000400,0x18400,0x11240b9a, +0xd0000400,0x18401,0x11241400,0x800000,0xc820,0x11241400,0x800000,0x800c820,0x11241400,0x1800000,0xc820,0x11241401,0x820000,0x60,0x11241581,0x20000, +0x60,0x11241581,0x50020080,0x60,0x11242813,0x50021400,0x60,0x11242901,0x50021000,0x60,0x11248381,0x50021000,0x60,0x11248381,0x50021000,0x61, +0x11248381,0x50021400,0x60,0x11248381,0x51021000,0x61,0x11269e81,0x50021000,0x60,0x11269f01,0x50021000,0x60,0x11280080,1,0x801c040,0x112c0600, +0x80000040,0,0x112c0600,0x80000040,0x1024000,0x112c0602,0x80000000,0,0x112c0602,0x80000040,0x1024000,0x112c1c00,0x80000000,0x4000000,0x112dab80,0x80000040, +0x1024011,0x112e0080,0x80000040,0x5024000,0x112eaa00,0x80000040,0x102400c,0x11300100,0x80000001,0x1800b,0x11301400,0x80000001,0x2000b,0x11301400,0x80000018,0x400000b, +0x11308381,0x50021000,0x60,0x11360080,0x80000018,0x4000000,0x11381e80,0x80000000,0,0x11399e80,0x80000001,0x20011,0x1139ab80,0x80000000,0x11,0x1139ab80, +0x80000018,0x11,0x1139ab80,0x80000020,0x11,0x1139ab80,0x80000080,0x11,0x1139ab80,0x80001000,0x11,0x1139ab80,0x80001080,0x11,0x1139ab80,0xd0000000, +0x1c11,0x1139ab80,0xd0000100,0x11,0x1139ab99,0xf8000400,0x10411,0x1139ab99,0xf8000400,0x28411,0x1139ab99,0xf8000500,0x10411,0x1139ab99,0xf8000500,0x28411, +0x113a9e80,0x80000000,0,0x113a9e80,0x80000000,2,0x113a9e80,0x80000000,0x4000000,0x113a9e80,0x80000008,0x4000000,0x113a9e80,0xf8000c00,0x18000,0x113a9e80, +0xf8002400,0x18c00,0x113a9e91,0xf8000c00,0x18000,0x113a9f14,0xf8000400,0x18000,0x113a9f14,0xf8000400,0x18001,0x113a9f96,0xf8000400,0x18c00,0x113a9f96,0xf8000400, +0x18c01,0x113aa005,0xf8000400,0x18400,0x113aa092,0xf8000400,0x18402,0x113aa092,0xf8800400,0x18402,0x113aa100,0x80000000,0,0x113aa100,0x80000000,0xf, +0x113aa200,0x80000000,0,0x113aa200,0x80000000,2,0x113aa200,0x80000000,3,0x113aa212,0x80000000,2,0x113aa212,0x80000000,3,0x113aa280, +0x80000000,2,0x113aa280,0x80000000,0xd,0x113aa391,0xf8400c00,0x18000,0x113aa791,0xf8000c00,0x18001,0x113aa791,0xf8400c00,0x18000,0x113aa980,0x80000000, +2,0x113aa980,0x80000000,0x10,0x113aa980,0x80000008,0x10,0x113aa980,0xd0000000,0x1c02,0x113aa980,0xd0000000,0x1c10,0x113aaa00,0x80000000,0xc, +0x113aaa00,0x80000008,0xc,0x113aaa00,0x80000040,0xc,0x113aaa00,0x80000080,0xc,0x113aaa00,0x80000098,0xc,0x113c9400,0x80000000,0x4000002,0x11400400, +0x80000040,0x1401,0x11400500,0x80000040,0x1025400,0x11401400,0x80000080,0x4001400,0x11420080,0x80000040,0x4001000,0x11420080,0x80000040,0x4001400,0x11420080,0x80000040, +0x5005400,0x11440080,1,0x801c0a0,0x11481400,0x80000040,0x5024000,0x11481400,0x80000040,0x5024002,0x11492b80,0x80000010,0xa,0x11492b80,0xf0001400,0x18c0a, +0x11492b80,0xf8003400,0x18c0a,0x11492b96,0xf8000400,0x18c0a,0x1149ab80,0x80000040,0x11,0x114a9e80,0x80000008,0x4000000,0x114a9e91,0xf8002400,0x18400,0x114a9f00, +0xe0001000,0xc02,0x114a9f14,0xf8000400,0x18000,0x114a9f14,0xf8002400,0x18000,0x114a9f14,0xf8002400,0x18001,0x114a9f80,0x80000010,0,0x114a9f80,0xf8003400, +0x18c00,0x114a9f96,0xf8000400,0x18c00,0x114a9f96,0xf8002400,0x18c00,0x114a9f96,0xf8002400,0x18c01,0x114aaa00,0x80000040,0xc,0x114c0600,0xd0000000,0x15800, +0x114c0602,0x80000000,0x15800,0x114c0602,0xd0000000,0x15800,0x114c078a,0xd0000000,0x15800,0x114c0804,0xd0000000,0x15800,0x114c0890,0xd0000000,0x15800,0x114c090f, +0xd0000000,0x15800,0x114c099f,0xd0000000,0x15800,0x114c0a23,0xd0000000,0x15800,0x114c0aa4,0xd0000000,0x15800,0x114c0b15,0xd0000000,0x15800,0x114c0b9a,0xd0000000, +0x15800,0x114c0ca6,0xd0000000,0x15800,0x114c0d18,0xd0000000,0x15800,0x114e0080,0xd0000300,0x15800,0x11501400,0x80000000,0x4008000,0x11501400,0x80000020,0x4008000, +0x11501480,0x80000080,0x800e,0x11501480,0x80000080,0x800f,0x11502880,0x80000000,0x4008000,0x11512b80,0x80000020,0x800a,0x1151ab80,0x80000000,0x8011,0x11520080, +0x80000000,0x4008000,0x11529800,0x80000000,0x4008001,0x11529e80,0x80000000,0x4008000,0x11529e80,0x80000020,0x4008000,0x1152a980,0x80000000,0x8010,0x1152a980,0x80000020, +0x8010,0x1152aa00,0x80000000,0x800c,0x11541400,0x80000000,0x4000000,0x11541400,0x80000000,0x4000002,0x11541400,0x80000080,0x4000002,0x11541500,0x80000000,0, +0x11548100,0x80000000,0x4000000,0x11549400,0x80000000,0x4000000,0x11549400,0x80000080,0x4000000,0x11549400,0x80000080,0x4000002,0x11549600,0x80000000,2,0x1155ab80, +0x80000000,0x11,0x11560080,0x80000000,0x4000000,0x11560100,0x80000000,0x4000000,0x1156aa00,0x80000000,0xc,0x11580804,0x80000000,0,0x11580c80,0x80000000, +0,0x11581500,0x80000000,0,0x11581500,0x80000000,2,0x11581780,0x80000080,0x4000000,0x11581780,0x80000088,0x4000000,0x11588100,0x80000000,0x4000000, +0x11588100,0x80000080,0x4000000,0x11589600,0x80000000,2,0x11591500,0x80000000,0,0x1159ab80,0x80000000,0x11,0x115a0080,0x80000000,0x4000000,0x115a0080, +0x80000080,0x4000000,0x115a0100,0x80000000,0x4000000,0x115aaa00,0x80000000,0xc,0x115c0100,0x80000020,0x4008000,0x115c1400,0x80000020,0x4008000,0x115c1c00,0x80000000, +0x4008000,0x115c9400,0x80000020,0x4008000,0x115c9400,0x80000020,0x4009000,0x115e0080,0x80000020,0x4008000,0x115e0080,0x80000020,0x4009000,0x11600ca6,0x50020400,0x60, +0x11600ca6,0x50021000,0x60,0x11600ca6,0x50060400,0x60,0x11600ca6,0xf0000400,0x18002,0x11600ca6,0xf8000400,0x18000,0x11600ca6,0xf8002400,0x18000,0x11600ca6, +0xfc000400,0x18000,0x11600d18,0x50020400,0x60,0x11600d18,0x50021000,0x60,0x11600d18,0xf0000400,0x18002,0x11600d18,0xf8000400,0x18000,0x11600d18,0xf8000400, +0x18002,0x11600d18,0xf8002400,0x18000,0x11600d18,0xfc000400,0x18000,0x116a0080,0x80000001,0x8020000,0x116e0080,0x80000000,0x4000000,0x11701400,0x800000,0xc820, +0x11740100,1,0x801c020,0x11782a80,0x800000,0xc820,0x11868f12,0xf8000400,0x18480,0x11868f12,0xf8800400,0x18480,0x11880f12,0xf8000400,0x18500,0x118c0f12, +0xf8000400,0x18520,0x118c0f12,0xf8800400,0x18520,0x20000067,0x810000,0,0x200036e7,0x810000,0,0x20003767,0x810000,0,0x2000b6e7,0, +0,0x2000b767,0,0,0x20080da7,0x80000000,0,0x20080da7,0xf8000400,0x18400,0x20080da7,0xf8000400,0x18401,0x20081319,0xf8000400,0x10401, +0x20100da7,0x80000000,0,0x20100da7,0xd0000400,0x18400,0x20140da7,0x80000000,0,0x20200da7,0x80000000,0x8000,0x20240593,0x50021000,0x60,0x20240593, +0x50021400,0x60,0x20240da7,0x50020400,0x60,0x20240da7,0x50020400,0x61,0x20240da7,0x50020400,0x62,0x20240da7,0x50021000,0x60,0x20240da7,0x50061000, +0x60,0x20240da7,0xd0001000,0,0x202c0da7,0x80000000,0,0x202c0da7,0x80000040,0,0x20300da7,0x80000000,0xb,0x20300da7,0x80000040,0, +0x204c0da7,0xd0000000,0x15800,0x20500da7,0x80000000,0x8000,0x20581500,0x80000000,0,0x206425e7,0x800000,0,0x20642667,0x800000,0,0x206426e7, +0x800000,0,0x207ea512,0xf8000400,0x184c1,0x2082a512,0xf8000400,0x184e1,0x211c2b00,0x80000000,0,0x21589500,0x80000000,0,0x30080219,0xf8000400, +0x10400,0x30080219,0xf8000400,0x10401,0x30080219,0xf8000400,0x28400,0x30080219,0xf8000400,0x28401,0x30080299,0xf8000400,0x10400,0x30080300,0x80001000,0, +0x30080300,0xf8001400,0x18400,0x3008040e,0xf8000400,0x10400,0x30080488,0xf8000400,0x10400,0x30080488,0xf8000400,0x10401,0x30080488,0xf8000400,0x28400,0x30080488, +0xf8000400,0x28401,0x30080602,0x80000000,0,0x30080602,0xf8000400,0x18400,0x300806a2,0x800000,0xc820,0x300806a2,0x80000000,0,0x300806a2,0x80000040, +0,0x300806a2,0x80000040,0x1024000,0x300806a2,0xf8000400,0x18400,0x30080725,0xf8000400,0x18400,0x30080c21,0x80000000,0,0x30080c21,0xf8000400,0x18400, +0x30080da7,0x80000000,0,0x30080da7,0xf8000400,0x18400,0x30080e1c,0x80000000,0,0x30080f8b,0x80000000,0,0x30080f8b,0x80000040,0,0x30080f8b, +0x80000040,0x1024000,0x30080f8b,0xd0000000,0,0x30080f8b,0xf8000400,0x18400,0x30081006,0xf8000400,0x18400,0x300810a8,0x80000040,0,0x300810a8,0x80000040, +0x1024000,0x300810a8,0xf8000400,0x18400,0x3008111d,0xf8000400,0x18400,0x300811a0,0xf8000400,0x18400,0x30081217,0x80000000,0,0x3008129b,0x80000000,0, +0x3008129b,0xf8000400,0x18400,0x3008129b,0xf8002400,0x18400,0x30081400,0x80000000,0x4000000,0x30081600,0x80000000,0,0x30081600,0xf8000400,0x10405,0x30081680, +0xf8000400,0x28400,0x30081700,0x80000000,0x4000000,0x30081800,0x80000000,0x4000000,0x30081880,0x80000000,0x4000000,0x30081b00,0x80000000,0x4000000,0x30081b80,0x80000000, +0x4000000,0x30081cae,0x80000000,0x4000000,0x30082813,0xf8000400,0x18401,0x30088300,0x80001000,0,0x30100503,0x80000018,0,0x30100da7,0x80000000,0, +0x30100e1c,0x80000040,0x1024000,0x30100f8b,0x80000040,0,0x3010111d,0x80000001,0x20000,0x30101180,0x80000040,0,0x30101217,0x80000000,0,0x30101217, +0x80000040,0,0x30101280,0x80000040,0,0x30101280,0x80000040,0x1024000,0x3010129b,0x80000040,0,0x3010129b,0x80000040,0x1024000,0x3014129b,0x80000018, +0,0x3020111d,0x80000000,0x8000,0x30240488,0x20000,0x60,0x30240601,0x50020400,0x60,0x302406a2,0x50020400,0x60,0x302406a2,0x50021000,0x60, +0x302406a2,0x50021400,0x60,0x30240725,0x50021400,0x60,0x30240c21,0x50020400,0x60,0x30240c21,0x50061000,0x60,0x30240c21,0xd0000400,0x18400,0x30240c21, +0xd0000400,0x18401,0x30240da7,0x50020400,0x60,0x30240da7,0x50021000,0x60,0x3024129b,0x50020400,0x60,0x3024129b,0x50820000,0x2000060,0x30241581,0x20000, +0x60,0x30242b00,0,0xc820,0x30248381,0x50021000,0x60,0x3030129b,0x80000001,0x20000,0x30301400,0x80000001,0x2000b,0x30308381,0x50021000,0x60, +0x303a9d11,0x80200000,0,0x303a9d11,0x80200000,2,0x303a9d91,0x80200000,2,0x303a9e00,0x80080000,0,0x303a9e00,0x80100000,0,0x303a9e80, +0x80000000,0,0x303a9e91,0xf8000c00,0x18002,0x303aa185,0xf8000400,0x18400,0x303aa311,0xf8400c00,0x18000,0x303aa429,0xf8000400,0x18400,0x303aa4a9,0x80000000, +0,0x30481217,0x80000040,0,0x30481400,0x80000040,0x5024002,0x304aa429,0xf8002400,0x18400,0x304c0e1c,0xd0000000,0x15800,0x304c1217,0xd0000000,0x15800, +0x304c129b,0xd0000000,0x15800,0x3050111d,0x80000000,0x8000,0x30581217,0x80000000,0,0x30581500,0x80000000,0,0x30600e1c,0x50020400,0x60,0x30600e1c, +0x50021000,0x60,0x30600e1c,0x50061000,0x60,0x30600e1c,0xd0000400,0x18000,0x30600e1c,0xf8000400,0x18000,0x30600e1c,0xf8000400,0x18001,0x30601217,0x800000, +0xc820,0x30601217,0x50020400,0x60,0x30601217,0x50021000,0x60,0x30601217,0x50061000,0x60,0x30601217,0x51021000,0x60,0x30601217,0xd0000400,0x18000, +0x30601217,0xf8000400,0x18000,0x30601217,0xf9000400,0x18000,0x310028e7,0x810000,0,0x3108040e,0xf8000480,0x10402,0x3108040e,0xf8000480,0x28402,0x31082c1e, +0x80000000,0,0x31082c1e,0xf8000400,0x18400,0x31082c8d,0xf8000400,0x18400,0x31082d09,0xf8000400,0x10400,0x31082d09,0xf8000400,0x28400,0x31082d80,0x80000000, +0,0x31082e00,0x80000000,0,0x31082e00,0x80000000,1,0x31082e80,0x80000080,5,0x31082e80,0xf8000480,0x10405,0x31082e80,0xf8000480,0x28405, +0x31242e00,0x800000,0xc820,0x31242e00,0x50020000,0x60,0x31242e00,0x50021000,0x60,0x31242e00,0xd0000000,0,0x31242e00,0xd0001000,0,0x31242e01, +0x50021000,0x60,0x31243000,0x800000,0xc820,0x313aaf11,0xf8400c00,0x18000,0x313aaf91,0xf8000c00,0x18001,0x314c2e80,0xd0000080,0x15805,0x32041b80,0x80000000, +0x4000000,0x32049980,0x80000000,0,0x32080219,0xf8000400,0x28400,0x3208040e,0x80000080,0,0x3208040e,0xf8000400,0x10400,0x3208040e,0xf8000400,0x28400, +0x32080488,0xf8000400,0x10400,0x32080488,0xf8000400,0x28400,0x32080602,0xf8000400,0x18400,0x32080725,0xf8000400,0x18400,0x32080e8c,0xf8000400,0x18400,0x32081400, +0x800080,0xc820,0x32081400,0x80000000,0x4000000,0x32081400,0x80000000,0x4000002,0x32081400,0x80000080,0x4000000,0x32081499,0xf8000400,0x1040f,0x32081600,0x80000000, +0,0x32081600,0x80000080,0,0x32081600,0x80000080,5,0x32081600,0xf8000480,0x10405,0x32081600,0xf8000480,0x28405,0x32081700,0x80000080,0x4000000, +0x32081780,0x80000080,0x4000000,0x32081800,0x80000000,0x4000000,0x32081800,0x80000080,0x4000000,0x32081a80,0x80000000,0x4000000,0x32081b00,0x80000080,0x4000000,0x32081b80, +0x80000000,0x4000000,0x32082a82,0xf8000400,0x18400,0x32083088,0xf8000400,0x10400,0x32083088,0xf8000400,0x28400,0x3208312a,0xf8000400,0x18400,0x320831ab,0xf8000400, +0x18400,0x3208322c,0xf8000400,0x18400,0x320832ad,0xf8000400,0x18400,0x32083300,0x80000080,0x4000000,0x32083380,0x80000080,0x4000000,0x32083400,0x80000080,0x4000000, +0x32083480,0x80000080,0x4000000,0x32083500,0x80000080,0x4000000,0x32083500,0x80000080,0x4000001,0x32083500,0x80000080,0x4000002,0x32101400,0x80000001,0x20002,0x32103180, +0x80000000,0,0x32201c00,0x80000000,0x4008000,0x32203480,0x80000080,0x4008000,0x3221ab80,0x80000000,0x8011,0x32223300,0x80000080,0x4008000,0x32223480,0x80000080, +0x4008000,0x32241581,0x20000,0x60,0x32241581,0x50020000,0x60,0x32241581,0x50020080,0x60,0x3224312a,0x50020400,0x60,0x3224312a,0x50060000,0x60, +0x322431ab,0x50020400,0x60,0x322431ab,0x50060000,0x60,0x3224322c,0x50020400,0x60,0x322432ad,0x50020400,0x60,0x32248381,0x50020000,0x60,0x3224b601, +0x50820000,0x2000060,0x32308381,0x50820000,0x60,0x323a9e80,0x80000000,0,0x323a9f14,0xf8000400,0x18010,0x323a9f96,0xf8000400,0x18c10,0x323aa200,0x80000000, +3,0x323aa4a9,0x80000000,0,0x323aa791,0xf8000400,0x18401,0x323aa980,0x80000000,0x4000000,0x32481400,0x80000040,0x5024002,0x324a9e80,0xf8000400,0x18400, +0x324a9e91,0xf8000400,0x18400,0x324a9f14,0xf8000400,0x18000,0x324a9f80,0x80000008,0xc00,0x324ab596,0xf8000400,0x18c00,0x32501c00,0x80000000,0x4008000,0x32503480, +0x80000080,0x4008000,0x3251ab80,0x80000000,0x8011,0x32523300,0x80000080,0x4008000,0x32523480,0x80000080,0x4008000,0x32542882,0x80000000,8,0x32581500,0x80000000, +0,0x32781400,0x800000,0xc820,0x40049b80,0x80000000,0x4000000,0x40080219,0xf8000400,0x10400,0x40080299,0xf8000400,0x10400,0x40080300,0x80001000,0, +0x4008040e,0xf8000400,0x10400,0x4008040e,0xf8000400,0x28400,0x4008040e,0xf8000400,0x28402,0x40080600,0x800000,0xc820,0x40080602,0x80000000,0,0x40080602, +0xf8000400,0x18400,0x400806a2,0xf8000400,0x18400,0x4008078a,0xf8000400,0x18400,0x40080804,0xf8000400,0x18400,0x4008090f,0xf8000400,0x18400,0x4008099f,0xf8000400, +0x18400,0x40080a23,0x80000000,0,0x40080b15,0xf8000400,0x18400,0x40081217,0x80000000,0,0x40081400,0x80000008,0x4000000,0x40081400,0xd0000000,0x1c00, +0x40081600,0x80000000,2,0x40081800,0x80000000,0x4000000,0x40081800,0x80000080,0x4000000,0x40081b80,0x80000000,0x4000000,0x40082880,0x80000000,0,0x40082d09, +0xf8000400,0x10400,0x40082d09,0xf8000400,0x28400,0x40082e80,0xf8000480,0x10405,0x400837b0,0x80000000,0,0x400837b0,0xf8000400,0x18400,0x40083897,0x80000000, +0,0x40083908,0xf8000400,0x10400,0x4008390e,0xf8000400,0x10400,0x4008390e,0xf8001400,0x1040e,0x4008390e,0xf8001400,0x1040f,0x40083919,0xf8000400,0x10400, +0x40083919,0xf8001400,0x10400,0x40083919,0xf8001400,0x1040e,0x40083919,0xf8001400,0x1040f,0x40083980,0x80000000,0x4000000,0x40083a00,0x80000000,0,0x40083ab1, +0xf8000400,0x18400,0x40083b31,0xf8000400,0x18400,0x40083b80,0x80000000,0,0x40083c35,0xf8000400,0x18400,0x40083cb3,0xf8000400,0x18400,0x40083d32,0xf8000400, +0x18400,0x40083daf,0xf8000400,0x18400,0x40083e00,0x80000000,0,0x40089980,0x80000000,0,0x40103b80,0x80000000,0,0x40103c35,0x80000040,0, +0x4022a980,0x80000000,0x8010,0x40240602,0x50020400,0x60,0x40240602,0x50021000,0x60,0x40240602,0x50021400,0x60,0x40240890,0x50020400,0x60,0x40240890, +0xd0000400,0x18400,0x4024090f,0x50020400,0x60,0x40240b15,0x50021000,0x60,0x402437b0,0x50020400,0x60,0x402437b0,0x50021000,0x60,0x402437b0,0xd0000400, +0x18400,0x40248381,0x50021000,0x60,0x4024be81,0x50820000,0x2000060,0x402c37b0,0x80000040,0x1024000,0x40308381,0x50021000,0x60,0x403aa200,0x80000000,0xd, +0x403aa212,0x80000000,2,0x403aa212,0x80000000,3,0x403aa280,0x80000000,0xd,0x40400602,0x80000000,0x1400,0x404c37b0,0xd0000000,0x15800,0x404c3d32, +0xd0000000,0x15800,0x4052a980,0x80000000,0x8010,0x4058090f,0x80000000,0,0x40580a23,0x80000000,0,0x40601217,0x50021000,0x60,0x40603834,0xf8000400, +0x18000,0x41080219,0xf8000400,0x10400,0x41080219,0xf8000400,0x28400,0x4108040e,0xf8000400,0x10400,0x4108040e,0xf8000400,0x28400,0x41080488,0xf8000400,0x10400, +0x41080488,0xf8000400,0x28400,0x4108078a,0xf8000400,0x18400,0x41080804,0xf8000400,0x18400,0x41080a23,0xf8000400,0x18400,0x41080e8c,0xf8000400,0x18400,0x41080e8c, +0xf8000400,0x1840f,0x41080f8b,0x80000000,0,0x41080f8b,0xf8000400,0x18400,0x41081400,0x80000000,0x4000000,0x41081499,0xf8000400,0x1040e,0x41081600,0x80000000, +0,0x41081600,0xf8000480,0x10405,0x41081800,0x80000000,0x4000000,0x41081b80,0x80000000,0x4000000,0x41082e80,0xf8000480,0x10405,0x41083300,0x80000080,0x4000000, +0x41083908,0xf8000400,0x1040f,0x41083919,0xf8000400,0x10400,0x41083980,0x80000000,0x4000000,0x41083f0e,0x80000000,0,0x41083f8e,0x80000000,0,0x41083f8e, +0xf8000400,0x18400,0x41084002,0xf8000400,0x18400,0x410840b7,0x80000000,0,0x410840b7,0xf8000400,0x18400,0x41084207,0x80000000,0,0x41084207,0xf8000400, +0x10400,0x41084207,0xf8000400,0x28400,0x4108428b,0xf8000400,0x18400,0x4108430b,0x80000000,0,0x4108430b,0xf8000400,0x18400,0x4108438c,0xf8000400,0x10400, +0x41084438,0xf8000400,0x10400,0x41084438,0xf8000400,0x28400,0x410844b9,0x80000000,0,0x410844b9,0xf8000400,0x18400,0x41084500,0x80000000,0,0x4108463d, +0xf8000400,0x18400,0x4108468e,0xf8000400,0x1040f,0x41084699,0xf8000400,0x10400,0x41084699,0xf8000400,0x1040f,0x41084700,0x80000000,0x4000000,0x410847ba,0x80000000, +0,0x410847ba,0xf8000400,0x18400,0x4108483c,0xf8000400,0x18400,0x4108483c,0xf8000400,0x1840f,0x41101400,0x80000000,0x4000000,0x411040b7,0x80000000,0, +0x41104207,0x80000000,0,0x411044b9,0x80000000,0,0x4110463d,0x80000040,0,0x41104700,0x80000000,0x4000000,0x41104700,0x80000018,0x4000000,0x41140da7, +0x80000000,0,0x41203300,0x80000080,0x4008000,0x4122c880,0x80000000,0x10,0x4122c880,0x80000000,0x8010,0x41240593,0x50020000,0x60,0x41240593,0x50020400, +0x60,0x41240602,0x50020400,0x60,0x41240f8b,0x50020400,0x60,0x41241581,0x50020000,0x60,0x41243f0e,0x50020000,0x60,0x412440b7,0x50020400,0x60, +0x412440b7,0xd0000400,0x18400,0x41244181,0x50020000,0x60,0x412444b9,0x50020000,0x60,0x412444b9,0x50020400,0x60,0x412444b9,0x50060000,0x60,0x412447ba, +0x50020000,0x60,0x412447ba,0x50020400,0x60,0x412447ba,0x50060000,0x60,0x412447ba,0xd0000000,0,0x412447ba,0xd0000400,0x18400,0x41248381,0x50020000, +0x60,0x412c0593,0x80000000,0,0x412c0602,0x80000000,0,0x412ec880,0x80000000,0x10,0x41308381,0x50020000,0x60,0x413aa200,0x80000000,3, +0x413aa391,0xf8400c00,0x18000,0x413aa791,0xf8000c00,0x18001,0x413ac100,0x80000000,0,0x413ec880,0x80000000,0x10,0x4142c880,0x80000000,0x1410,0x414c0a23, +0xd0000000,0x15800,0x414c45bb,0xd0000000,0x15800,0x41503300,0x80000080,0x4008000,0x4152c880,0x80000000,0x8010,0x41540602,0x80000000,0,0x41581500,0x80000000, +0,0x415c4700,0x80000000,0x4008000,0x416045bb,0x80000000,0,0x416045bb,0xd0000400,0x18000,0x416045bb,0xf8000400,0x18000,0x50080219,0xf8000400,0x10400, +0x50080219,0xf8000400,0x28400,0x5008040e,0xf8000400,0x10400,0x50080488,0xf8000400,0x10400,0x50080488,0xf8000400,0x28400,0x5008078a,0xf8000400,0x18400,0x50080b15, +0x80000000,0,0x50081600,0x80000000,0,0x50081619,0xf8000400,0x10400,0x50081699,0xf8000400,0x10400,0x50081800,0x80000000,0x4000000,0x50081800,0x80000080, +0x4000000,0x50081b80,0x80000000,0x4000000,0x50082e80,0xf8000480,0x10405,0x50082e80,0xf8000480,0x28405,0x50083088,0xf8000400,0x10400,0x50083088,0xf8000400,0x28400, +0x50083300,0x80000080,0x4000000,0x50083980,0x80000000,0x4000000,0x50084500,0xf8001400,0x18400,0x50084957,0x80000000,0,0x50084957,0xf8000400,0x18400,0x50084957, +0xf8001400,0x18400,0x50084957,0xf8002400,0x18400,0x500849be,0x80000000,0,0x500849be,0xf8000400,0x18400,0x500849be,0xf8000400,0x18401,0x50084a19,0xf8000400, +0x10400,0x50084a19,0xf8000400,0x28400,0x50084a80,0x80001000,0,0x50084b5a,0xf8000400,0x18400,0x50084bdb,0x80000000,0,0x50084bdb,0xf8000400,0x18400, +0x50084c65,0xf8000400,0x18400,0x50084ce5,0xf8000400,0x18400,0x50084d00,0x80000000,0,0x501049be,0x80000000,0,0x501049be,0x80000040,0,0x501049be, +0x80000040,0x1024000,0x50104bdb,0x80000040,0,0x50104ce5,0x80000040,0,0x50144b5a,0x80000000,0,0x50240593,0x50021400,0x60,0x50240b15,0x50020400, +0x60,0x50241581,0x50020080,0x60,0x50244181,0x50021000,0x60,0x50244957,0x50021000,0x60,0x502449be,0x50020400,0x60,0x502449be,0x50021000,0x60, +0x502449be,0xd0000400,0x18400,0x502449be,0xd0000400,0x18401,0x502449be,0xd0041000,0,0x502c4957,0x80000040,0x1024000,0x502c4b5a,0x80000040,0x1024000,0x50404957, +0x80000040,0x1400,0x504c4957,0xd0000000,0x15800,0x504c49be,0xd0000000,0x15800}; -static const int32_t countPropsVectors=3183; +static const int32_t countPropsVectors=3384; static const int32_t propsVectorsColumns=3; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x18ee,0x18ee,0x18ee,0x18ee,0x38d4,3,0x4543,0,0,0,0x8ec8bd,0x29d31,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x1a54,0x1a54,0x1a54,0x1a54,0x3b66,3,0x489e,0,0,0,0x8ecd67,0x29d31,0,0,0,0}; diff --git a/Build/source/libs/icu-xetex/common/ucln_cmn.c b/Build/source/libs/icu-xetex/common/ucln_cmn.c index c14b3dbc4a0..452e628bb38 100644 --- a/Build/source/libs/icu-xetex/common/ucln_cmn.c +++ b/Build/source/libs/icu-xetex/common/ucln_cmn.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2004, International Business Machines * +* Copyright (C) 2001-2006, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -26,9 +26,11 @@ #include "uassert.h" static cleanupFunc *gCommonCleanupFunctions[UCLN_COMMON_COUNT]; +static cleanupFunc *gLibCleanupFunctions[UCLN_COMMON]; -void ucln_common_registerCleanup(ECleanupCommonType type, - cleanupFunc *func) +U_CFUNC void +ucln_common_registerCleanup(ECleanupCommonType type, + cleanupFunc *func) { U_ASSERT(UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT); if (UCLN_COMMON_START < type && type < UCLN_COMMON_COUNT) @@ -37,10 +39,30 @@ void ucln_common_registerCleanup(ECleanupCommonType type, } } -U_CFUNC UBool ucln_common_lib_cleanup(void) { - ECleanupCommonType commonFunc; +U_CAPI void U_EXPORT2 +ucln_registerCleanup(ECleanupLibraryType type, + cleanupFunc *func) +{ + U_ASSERT(UCLN_START < type && type < UCLN_COMMON); + if (UCLN_START < type && type < UCLN_COMMON) + { + gLibCleanupFunctions[type] = func; + } +} + +U_CFUNC UBool ucln_lib_cleanup(void) { + ECleanupLibraryType libType = UCLN_START; + ECleanupCommonType commonFunc = UCLN_COMMON_START; + + for (libType++; libType<UCLN_COMMON; libType++) { + if (gLibCleanupFunctions[libType]) + { + gLibCleanupFunctions[libType](); + gLibCleanupFunctions[libType] = NULL; + } + } - for (commonFunc = UCLN_COMMON_START+1; commonFunc<UCLN_COMMON_COUNT; commonFunc++) { + for (commonFunc++; commonFunc<UCLN_COMMON_COUNT; commonFunc++) { if (gCommonCleanupFunctions[commonFunc]) { gCommonCleanupFunctions[commonFunc](); diff --git a/Build/source/libs/icu-xetex/common/ucln_cmn.h b/Build/source/libs/icu-xetex/common/ucln_cmn.h index 167f1f3c677..b6f069959cd 100644 --- a/Build/source/libs/icu-xetex/common/ucln_cmn.h +++ b/Build/source/libs/icu-xetex/common/ucln_cmn.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2005, International Business Machines * +* Copyright (C) 2001-2006, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -26,7 +26,7 @@ U_CFUNC UBool umtx_cleanup(void); U_CFUNC UBool utrace_cleanup(void); -U_CFUNC UBool ucln_common_lib_cleanup(void); +U_CFUNC UBool ucln_lib_cleanup(void); /* Please keep the order of enums declared in same order @@ -35,6 +35,7 @@ typedef enum ECleanupCommonType { UCLN_COMMON_START = -1, UCLN_COMMON_USPREP, UCLN_COMMON_BREAKITERATOR, + UCLN_COMMON_BREAKITERATOR_DICT, UCLN_COMMON_SERVICE, UCLN_COMMON_URES, UCLN_COMMON_LOCALE, diff --git a/Build/source/libs/icu-xetex/common/ucmp8.c b/Build/source/libs/icu-xetex/common/ucmp8.c deleted file mode 100644 index f22c2e13667..00000000000 --- a/Build/source/libs/icu-xetex/common/ucmp8.c +++ /dev/null @@ -1,572 +0,0 @@ -/* -******************************************************************** -* COPYRIGHT: -* Copyright (c) 1997-2004, International Business Machines Corporation and -* others. All Rights Reserved. -******************************************************************** -*/ - -#include "ucmp8.h" -#include "cmemory.h" - -/* internal constants*/ - - -U_CAPI int32_t U_EXPORT2 -ucmp8_getkUnicodeCount() { return UCMP8_kUnicodeCount;} - -U_CAPI int32_t U_EXPORT2 -ucmp8_getkBlockCount() { return UCMP8_kBlockCount;} - -U_CAPI void U_EXPORT2 -ucmp8_initBogus(CompactByteArray* array) -{ - CompactByteArray* this_obj = array; - - if (this_obj == NULL) return; - - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = UCMP8_kUnicodeCount; - this_obj->fCompact = FALSE; - this_obj->fBogus = TRUE; - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = TRUE; -} - -/* debug flags*/ -/*=======================================================*/ -U_CAPI void U_EXPORT2 -ucmp8_init(CompactByteArray* array, int8_t defaultValue) -{ -/* set up the index array and the data array. - * the index array always points into particular parts of the data array - * it is initially set up to point at regular block boundaries - * The following example uses blocks of 4 for simplicity - * Example: Expanded - * INDEX# 0 1 2 3 4 - * INDEX 0 4 8 12 16 ... - * ARRAY abcdeababcedzyabcdea... - * | | | | | |... - * whenever you set an element in the array, it unpacks to this state - * After compression, the index will point to various places in the data array - * wherever there is a runs of the same elements as in the original - * Example: Compressed - * INDEX# 0 1 2 3 4 - * INDEX 0 4 1 8 2 ... - * ARRAY abcdeabazyabc... - * If you look at the example, index# 2 in the expanded version points - * to data position number 8, which has elements "bced". In the compressed - * version, index# 2 points to data position 1, which also has "bced" - */ - CompactByteArray* this_obj = array; - int32_t i; - - if (this_obj == NULL) return; - - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = UCMP8_kUnicodeCount; - this_obj->fCompact = FALSE; - this_obj->fBogus = FALSE; - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = TRUE; - - - this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); - if (!this_obj->fArray) - { - this_obj->fBogus = TRUE; - return; - } - this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount); - if (!this_obj->fIndex) - { - uprv_free(this_obj->fArray); - this_obj->fArray = NULL; - this_obj->fBogus = TRUE; - return; - } - for (i = 0; i < UCMP8_kUnicodeCount; ++i) - { - this_obj->fArray[i] = defaultValue; - } - for (i = 0; i < UCMP8_kIndexCount; ++i) - { - this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift); - } -} - -U_CAPI CompactByteArray* U_EXPORT2 -ucmp8_open(int8_t defaultValue) -{ -/* set up the index array and the data array. - * the index array always points into particular parts of the data array - * it is initially set up to point at regular block boundaries - * The following example uses blocks of 4 for simplicity - * Example: Expanded - * INDEX# 0 1 2 3 4 - * INDEX 0 4 8 12 16 ... - * ARRAY abcdeababcedzyabcdea... - * | | | | | |... - * whenever you set an element in the array, it unpacks to this state - * After compression, the index will point to various places in the data array - * wherever there is a runs of the same elements as in the original - * Example: Compressed - * INDEX# 0 1 2 3 4 - * INDEX 0 4 1 8 2 ... - * ARRAY abcdeabazyabc... - * If you look at the example, index# 2 in the expanded version points - * to data position number 8, which has elements "bced". In the compressed - * version, index# 2 points to data position 1, which also has "bced" - */ - CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray)); - int32_t i; - - if (this_obj == NULL) return NULL; - - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = UCMP8_kUnicodeCount; - this_obj->fCompact = FALSE; - this_obj->fBogus = FALSE; - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = FALSE; - - - this_obj->fArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); - if (!this_obj->fArray) - { - this_obj->fBogus = TRUE; - return NULL; - } - this_obj->fIndex = (uint16_t*) uprv_malloc(sizeof(uint16_t) * UCMP8_kIndexCount); - if (!this_obj->fIndex) - { - uprv_free(this_obj->fArray); - this_obj->fArray = NULL; - this_obj->fBogus = TRUE; - return NULL; - } - for (i = 0; i < UCMP8_kUnicodeCount; ++i) - { - this_obj->fArray[i] = defaultValue; - } - for (i = 0; i < UCMP8_kIndexCount; ++i) - { - this_obj->fIndex[i] = (uint16_t)(i << UCMP8_kBlockShift); - } - - return this_obj; -} - -U_CAPI CompactByteArray* U_EXPORT2 -ucmp8_openAdopt(uint16_t *indexArray, - int8_t *newValues, - int32_t count) -{ - CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray)); - /* test for NULL */ - if(this_obj == NULL) - return NULL; - ucmp8_initAdopt(this_obj, indexArray, newValues, count); - this_obj->fIAmOwned = FALSE; - return this_obj; -} - -U_CAPI CompactByteArray* U_EXPORT2 -ucmp8_openAlias(uint16_t *indexArray, - int8_t *newValues, - int32_t count) -{ - CompactByteArray* this_obj = (CompactByteArray*) uprv_malloc(sizeof(CompactByteArray)); - /* test for NULL */ - if(this_obj == NULL) - return NULL; - ucmp8_initAlias(this_obj, indexArray, newValues, count); - this_obj->fIAmOwned = FALSE; - return this_obj; -} - -/*=======================================================*/ - -U_CAPI CompactByteArray* U_EXPORT2 -ucmp8_initAdopt(CompactByteArray *this_obj, - uint16_t *indexArray, - int8_t *newValues, - int32_t count) -{ - if (this_obj) { - this_obj->fCount = count; - this_obj->fBogus = FALSE; - this_obj->fStructSize = sizeof(CompactByteArray); - - this_obj->fArray = newValues; - this_obj->fIndex = indexArray; - this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE); - this_obj->fAlias = FALSE; - this_obj->fIAmOwned = TRUE; - } - - return this_obj; -} - -U_CAPI CompactByteArray* U_EXPORT2 -ucmp8_initAlias(CompactByteArray *this_obj, - uint16_t *indexArray, - int8_t *newValues, - int32_t count) -{ - if (this_obj) { - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fCount = count; - this_obj->fBogus = FALSE; - this_obj->fStructSize = sizeof(CompactByteArray); - - this_obj->fArray = newValues; - this_obj->fIndex = indexArray; - this_obj->fCompact = (UBool)((count < UCMP8_kUnicodeCount) ? TRUE : FALSE); - this_obj->fAlias = TRUE; - this_obj->fIAmOwned = TRUE; - } - - return this_obj; -} - -/*=======================================================*/ - -U_CAPI void U_EXPORT2 -ucmp8_close(CompactByteArray* this_obj) -{ - if(this_obj != NULL) { - if(!this_obj->fAlias) { - if(this_obj->fArray != NULL) { - uprv_free(this_obj->fArray); - } - if(this_obj->fIndex != NULL) { - uprv_free(this_obj->fIndex); - } - } - if(!this_obj->fIAmOwned) /* Called if 'init' was called instead of 'open'. */ - { - uprv_free(this_obj); - } - } -} - - -/*=======================================================*/ - -U_CAPI void U_EXPORT2 -ucmp8_expand(CompactByteArray* this_obj) -{ - /* can optimize later. - * if we have to expand, then walk through the blocks instead of using Get - * this code unpacks the array by copying the blocks to the normalized position. - * Example: Compressed - * INDEX# 0 1 2 3 4 - * INDEX 0 4 1 8 2 ... - * ARRAY abcdeabazyabc... - * turns into - * Example: Expanded - * INDEX# 0 1 2 3 4 - * INDEX 0 4 8 12 16 ... - * ARRAY abcdeababcedzyabcdea... - */ - int32_t i; - if (this_obj->fCompact) - { - int8_t* tempArray; - tempArray = (int8_t*) uprv_malloc(sizeof(int8_t) * UCMP8_kUnicodeCount); - if (!tempArray) - { - this_obj->fBogus = TRUE; - return; - } - for (i = 0; i < UCMP8_kUnicodeCount; ++i) - { - tempArray[i] = ucmp8_get(this_obj,(UChar)i); /* HSYS : How expand?*/ - } - for (i = 0; i < UCMP8_kIndexCount; ++i) - { - this_obj->fIndex[i] = (uint16_t)(i<< UCMP8_kBlockShift); - } - uprv_free(this_obj->fArray); - this_obj->fArray = tempArray; - this_obj->fCompact = FALSE; - this_obj->fAlias = FALSE; - - } -} - - -/*=======================================================*/ -/* this_obj->fArray: an array to be overlapped - * start and count: specify the block to be overlapped - * tempIndex: the overlapped array (actually indices back into inputContents) - * inputHash: an index of hashes for tempIndex, where - * inputHash[i] = XOR of values from i-count+1 to i - */ -static int32_t -findOverlappingPosition(CompactByteArray* this_obj, - uint32_t start, - const UChar* tempIndex, - int32_t tempIndexCount, - uint32_t cycle) -{ - /* this_obj is a utility routine for finding blocks that overlap. - * IMPORTANT: the cycle number is very important. Small cycles take a lot - * longer to work. In some cases, they may be able to get better compaction. - */ - - int32_t i; - int32_t j; - int32_t currentCount; - - for (i = 0; i < tempIndexCount; i += cycle) - { - currentCount = UCMP8_kBlockCount; - if (i + UCMP8_kBlockCount > tempIndexCount) - { - currentCount = tempIndexCount - i; - } - for (j = 0; j < currentCount; ++j) - { - if (this_obj->fArray[start + j] != this_obj->fArray[tempIndex[i + j]]) - break; - } - if (j == currentCount) - break; - } - - return i; -} - -U_CAPI UBool U_EXPORT2 -ucmp8_isBogus(const CompactByteArray* this_obj) -{ - return (UBool)(this_obj == NULL || this_obj->fBogus); -} - -U_CAPI const int8_t* U_EXPORT2 -ucmp8_getArray(const CompactByteArray* this_obj) -{ - return this_obj->fArray; -} - -U_CAPI const uint16_t* U_EXPORT2 -ucmp8_getIndex(const CompactByteArray* this_obj) -{ - return this_obj->fIndex; -} - -U_CAPI int32_t U_EXPORT2 -ucmp8_getCount(const CompactByteArray* this_obj) -{ - return this_obj->fCount; -} - - -U_CAPI void U_EXPORT2 -ucmp8_set(CompactByteArray* this_obj, - UChar c, - int8_t value) -{ - if (this_obj->fCompact == TRUE) - { - ucmp8_expand(this_obj); - if (this_obj->fBogus) return; - } - this_obj->fArray[(int32_t)c] = value; -} - - -U_CAPI void U_EXPORT2 -ucmp8_setRange(CompactByteArray* this_obj, - UChar start, - UChar end, - int8_t value) -{ - int32_t i; - if (this_obj->fCompact == TRUE) - { - ucmp8_expand(this_obj); - if (this_obj->fBogus) - return; - } - for (i = start; i <= end; ++i) - { - this_obj->fArray[i] = value; - } -} - - -/*=======================================================*/ - -U_CAPI void U_EXPORT2 -ucmp8_compact(CompactByteArray* this_obj, - uint32_t cycle) -{ - if (!this_obj->fCompact) - { - /* this_obj actually does the compaction. - * it walks throught the contents of the expanded array, finding the - * first block in the data that matches the contents of the current index. - * As it works, it keeps an updated pointer to the last position, - * so that it knows how big to make the final array - * If the matching succeeds, then the index will point into the data - * at some earlier position. - * If the matching fails, then last position pointer will be bumped, - * and the index will point to that last block of data. - */ - UChar* tempIndex; - int32_t tempIndexCount; - int8_t* tempArray; - int32_t iBlock, iIndex; - - /* fix cycle, must be 0 < cycle <= blockcount*/ - if (cycle <= 0) - cycle = 1; - else if (cycle > (uint32_t)UCMP8_kBlockCount) - cycle = UCMP8_kBlockCount; - - /* make temp storage, larger than we need*/ - tempIndex = (UChar*) uprv_malloc(sizeof(UChar)* UCMP8_kUnicodeCount); - if (!tempIndex) - { - this_obj->fBogus = TRUE; - return; - } - /* set up first block.*/ - tempIndexCount = UCMP8_kBlockCount; - for (iIndex = 0; iIndex < UCMP8_kBlockCount; ++iIndex) - { - tempIndex[iIndex] = (uint16_t)iIndex; - } /* endfor (iIndex = 0; .....)*/ - this_obj->fIndex[0] = 0; - - /* for each successive block, find out its first position in the compacted array*/ - for (iBlock = 1; iBlock < UCMP8_kIndexCount; ++iBlock) - { - int32_t newCount, firstPosition, block; - block = iBlock << UCMP8_kBlockShift; - /* if (debugSmall) if (block > debugSmallLimit) break;*/ - firstPosition = findOverlappingPosition(this_obj, - block, - tempIndex, - tempIndexCount, - cycle); - - /* if not contained in the current list, copy the remainder - * invariant; cumulativeHash[iBlock] = XOR of values from iBlock-kBlockCount+1 to iBlock - * we do this_obj by XORing out cumulativeHash[iBlock-kBlockCount] - */ - newCount = firstPosition + UCMP8_kBlockCount; - if (newCount > tempIndexCount) - { - for (iIndex = tempIndexCount; iIndex < newCount; ++iIndex) - { - tempIndex[iIndex] = (uint16_t)(iIndex - firstPosition + block); - } /* endfor (iIndex = tempIndexCount....)*/ - tempIndexCount = newCount; - } /* endif (newCount > tempIndexCount)*/ - this_obj->fIndex[iBlock] = (uint16_t)firstPosition; - } /* endfor (iBlock = 1.....)*/ - - /* now allocate and copy the items into the array*/ - tempArray = (int8_t*) uprv_malloc(tempIndexCount * sizeof(int8_t)); - if (!tempArray) - { - this_obj->fBogus = TRUE; - uprv_free(tempIndex); - return; - } - for (iIndex = 0; iIndex < tempIndexCount; ++iIndex) - { - tempArray[iIndex] = this_obj->fArray[tempIndex[iIndex]]; - } - uprv_free(this_obj->fArray); - this_obj->fArray = tempArray; - this_obj->fCount = tempIndexCount; - - - /* free up temp storage*/ - uprv_free(tempIndex); - this_obj->fCompact = TRUE; - } /* endif (!this_obj->fCompact)*/ -} - -#define MEMORY_WRITE(destAddr, source, sizeSoFar, len) \ - if (destAddr) {\ - uprv_memcpy(destAddr+sizeSoFar, source, len);\ - }\ - sizeSoFar += (len) - -U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem (const CompactByteArray* array, uint8_t *MS) -{ - int32_t size = 0; - static const int32_t version = ICU_UCMP8_VERSION; - - MEMORY_WRITE(MS, &version, size, 4); - - MEMORY_WRITE(MS, &array->fCount, size, 4); - - MEMORY_WRITE(MS, array->fIndex, size, sizeof(array->fIndex[0])*UCMP8_kIndexCount); - - MEMORY_WRITE(MS, array->fArray, size, sizeof(array->fArray[0])*array->fCount); - - while(size%4) /* end padding */ - { - uint8_t pad = 0; - MEMORY_WRITE(MS, &pad, size, 1); - } - - return size; -} - -/* We use sizeof(*array), etc so that this code can be as portable as - possible between the ucmpX_ family. -*/ - -U_CAPI void U_EXPORT2 ucmp8_initFromData(CompactByteArray *this_obj, const uint8_t **source, UErrorCode *status) -{ - uint32_t i; - const uint8_t *oldSource = *source; - - if(U_FAILURE(*status)) - return; - - this_obj->fArray = NULL; - this_obj->fIndex = NULL; - this_obj->fBogus = FALSE; - this_obj->fStructSize = sizeof(CompactByteArray); - this_obj->fCompact = TRUE; - this_obj->fAlias = TRUE; - this_obj->fIAmOwned = TRUE; - - i = * ((const uint32_t*) *source); - (*source) += 4; - - if(i != ICU_UCMP8_VERSION) - { - *status = U_INVALID_FORMAT_ERROR; - return; - } - - this_obj->fCount = * ((const uint32_t*)*source); - (*source) += 4; - - this_obj->fIndex = (uint16_t*) *source; - (*source) += sizeof(this_obj->fIndex[0])*UCMP8_kIndexCount; - - this_obj->fArray = (int8_t*) *source; - (*source) += sizeof(this_obj->fArray[0])*this_obj->fCount; - - /* eat up padding */ - while((*source-(oldSource))%4) - (*source)++; -} diff --git a/Build/source/libs/icu-xetex/common/ucmp8.h b/Build/source/libs/icu-xetex/common/ucmp8.h deleted file mode 100644 index b4951825ba5..00000000000 --- a/Build/source/libs/icu-xetex/common/ucmp8.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - ******************************************************************** - * COPYRIGHT: - * Copyright (c) 1996-2004, International Business Machines Corporation and - * others. All Rights Reserved. - ******************************************************************** - */ - - - -#ifndef UCMP8_H -#define UCMP8_H - -/* 32-bits. - Bump this whenever the internal structure changes. -*/ -#define ICU_UCMP8_VERSION 0x01260000 - -#include "unicode/utypes.h" - -/*==================================== - * class CompactByteArray - * Provides a compact way to store information that is indexed by Unicode values, - * such as character properties, types, keyboard values, etc. - * The ATypes are used by value, so should be small, integers or pointers. - *==================================== - */ - -U_CAPI int32_t U_EXPORT2 ucmp8_getkUnicodeCount(void); -U_CAPI int32_t U_EXPORT2 ucmp8_getkBlockCount(void); - -typedef struct CompactByteArray { - uint32_t fStructSize; - int8_t* fArray; - uint16_t* fIndex; - int32_t fCount; - UBool fCompact; - UBool fBogus; - UBool fAlias; - UBool fIAmOwned; /* don't free CBA on close */ -} CompactByteArray; - -#define UCMP8_kUnicodeCount 65536 -#define UCMP8_kBlockShift 7 -#define UCMP8_kBlockCount (1<<UCMP8_kBlockShift) -#define UCMP8_kIndexShift (16-UCMP8_kBlockShift) -#define UCMP8_kIndexCount (1<<UCMP8_kIndexShift) -#define UCMP8_kBlockMask (UCMP8_kBlockCount-1) - - -/** - * Construct an empty CompactByteArray with uprv_malloc(). Do not call any of the - * ucmp8_init*() functions after using this function. They will cause a memory - * leak. - * - * @param defaultValue the default value for all characters not explicitly in the array - * @see ucmp8_init - * @see ucmp8_initBogus - * @return The initialized array. - */ -U_CAPI CompactByteArray* U_EXPORT2 ucmp8_open(int8_t defaultValue); - -/** - * Construct a CompactByteArray from a pre-computed index and values array. The values - * will be adopted by the CompactByteArray. Memory is allocated with uprv_malloc. - * Note: for speed, the compact method will only re-use blocks in the values array - * that are on a block boundary. The pre-computed arrays passed in to this constructor - * may re-use blocks at any position in the values array. The indexArray and newValues - * will be uprv_free'd when ucmp16_close() is called. - * - * @param indexArray the index array to be adopted - * @param newValues the value array to be adopted - * @param count the number of entries in the value array - * @return the newly constructed ComapctByteArray - * @see compact - */ -U_CAPI CompactByteArray* U_EXPORT2 ucmp8_openAdopt(uint16_t* indexArray, - int8_t* newValues, - int32_t count); - -/** - * Construct a CompactByteArray from a pre-computed index and values array. The values - * will be aliased by the CompactByteArray. Memory is allocated with uprv_malloc. - * Note: for speed, the compact method will only re-use blocks in the values array - * that are on a block boundary. The pre-computed arrays passed in to this constructor - * may re-use blocks at any position in the values array. - * - * @param indexArray the index array to be adopted - * @param newValues the value array to be adopted - * @param count the number of entries in the value array - * @return the newly constructed CompactByteArray - * @see compact - */ -U_CAPI CompactByteArray* U_EXPORT2 ucmp8_openAlias(uint16_t* indexArray, - int8_t* newValues, - int32_t count); - - -/** - * Initialize an empty CompactByteArray. Do not call this function - * if you created the array with ucmp8_open() because it will cause a memory - * leak. - * - * @param defaultValue the default value for all characters not explicitly in the array - * @param array An uninitialized CompactByteArray - * @see ucmp8_open - */ -U_CAPI void U_EXPORT2 ucmp8_init(CompactByteArray* array, int8_t defaultValue); - -/** - * Initialize an empty CompactByteArray to the bogus value. Do not call this - * function if you created the array with ucmp8_open() because it will cause - * a memory leak. - * - * @param array An uninitialized CompactByteArray - * @see ucmp8_open - * @see ucmp8_isBogus - */ -U_CAPI void U_EXPORT2 ucmp8_initBogus(CompactByteArray* array); - -/** - * Initialize a CompactByteArray from a pre-computed index and values array. The values - * will be adopted by the CompactByteArray. Memory is allocated with uprv_malloc. - * Note: for speed, the compact method will only re-use blocks in the values array - * that are on a block boundary. The pre-computed arrays passed in to this constructor - * may re-use blocks at any position in the values array. The indexArray and newValues - * will be uprv_free'd when ucmp16_close() is called. - * - * @param this_obj An uninitialized CompactByteArray - * @param indexArray the index array to be adopted - * @param newValues the value array to be adopted - * @param count the number of entries in the value array - * @return the pointer refers to the CompactByteArray - * @see compact - */ -U_CAPI CompactByteArray* U_EXPORT2 ucmp8_initAdopt(CompactByteArray *this_obj, - uint16_t* indexArray, - int8_t* newValues, - int32_t count); - -/** - * Initialize a CompactByteArray from a pre-computed index and values array. The values - * will be aliased by the CompactByteArray. Memory is allocated with uprv_malloc. - * Note: for speed, the compact method will only re-use blocks in the values array - * that are on a block boundary. The pre-computed arrays passed in to this constructor - * may re-use blocks at any position in the values array. - * - * @param this_obj An uninitialized CompactByteArray - * @param indexArray the index array to be adopted - * @param newValues the value array to be adopted - * @param count the number of entries in the value array - * @return the pointer refers to the CompactByteArray - * @see compact - */ -U_CAPI CompactByteArray* U_EXPORT2 ucmp8_initAlias(CompactByteArray *this_obj, - uint16_t* indexArray, - int8_t* newValues, - int32_t count); - -/** - * Free up any allocated memory associated with this compact array. - * The memory that is uprv_free'd depends on how the array was initialized - * or opened. - * - * @param array The compact array to close - */ -U_CAPI void U_EXPORT2 ucmp8_close(CompactByteArray* array); - -/** - * Returns TRUE if the creation of the compact array fails. - * @param array The CompactByteArray to be created. - * @return TRUE if the creation of the compact array fails. - */ -U_CAPI UBool U_EXPORT2 ucmp8_isBogus(const CompactByteArray* array); - -/** - * Get the mapped value of a Unicode character. - * - * @param index the character to get the mapped value with - * @return the mapped value of the given character - */ -#define ucmp8_get(array, index) (array->fArray[(array->fIndex[index >> UCMP8_kBlockShift] & 0xFFFF) + (index & UCMP8_kBlockMask)]) - -#define ucmp8_getu(array,index) (uint8_t)ucmp8_get(array,index) - - -/** - * Set a new value for a Unicode character. - * Set automatically expands the array if it is compacted. - * - * @param array the CompactByteArray to be set - * @param character the character to set the mapped value with - * @param value the new mapped value - */ -U_CAPI void U_EXPORT2 ucmp8_set(CompactByteArray* array, - UChar character, - int8_t value); - -/** - * Set new values for a range of Unicode character. - * - * @param array the CompactByteArray to be set - * @param start the starting offset of the range - * @param end the ending offset of the range - * @param value the new mapped value - */ -U_CAPI void U_EXPORT2 ucmp8_setRange(CompactByteArray* array, - UChar start, - UChar end, - int8_t value); - -U_CAPI int32_t U_EXPORT2 ucmp8_getCount(const CompactByteArray* array); -U_CAPI const int8_t* U_EXPORT2 ucmp8_getArray(const CompactByteArray* array); -U_CAPI const uint16_t* U_EXPORT2 ucmp8_getIndex(const CompactByteArray* array); - -/** - * Compact the array. - * The value of cycle determines how large the overlap can be. - * A cycle of 1 is the most compacted, but takes the most time to do. - * If values stored in the array tend to repeat in cycles of, say, 16, - * then using that will be faster than cycle = 1, and get almost the - * same compression. - * @param array The CompactByteArray to be compacted - * @param cycle The value determines how large the overlap can be. - */ -U_CAPI void U_EXPORT2 ucmp8_compact(CompactByteArray* array, - uint32_t cycle); - -/** Expanded takes the array back to a 65536 element array - * @param array The CompactByteArray to be expanded - */ -U_CAPI void U_EXPORT2 ucmp8_expand(CompactByteArray* array); - -/** - * Flatten into a memory structure. Pass in NULL to pre-flight to get the required size. - * @internal - */ -U_CAPI uint32_t U_EXPORT2 ucmp8_flattenMem(const CompactByteArray* array, uint8_t *MS); - -/* initializes an existing CBA from memory. Will cause ucmp8_close() to not deallocate anything. */ -U_CAPI void U_EXPORT2 ucmp8_initFromData(CompactByteArray* array, const uint8_t **source, UErrorCode *status); - -#endif - diff --git a/Build/source/libs/icu-xetex/common/ucnv.c b/Build/source/libs/icu-xetex/common/ucnv.c index 42b9443880a..ff6eebafd1a 100644 --- a/Build/source/libs/icu-xetex/common/ucnv.c +++ b/Build/source/libs/icu-xetex/common/ucnv.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2005, International Business Machines +* Copyright (C) 1998-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -249,6 +249,19 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U uprv_memcpy(localConverter, cnv, sizeof(UConverter)); localConverter->isCopyLocal = localConverter->isExtraLocal = FALSE; + /* copy the substitution string */ + if (cnv->subChars == (uint8_t *)cnv->subUChars) { + localConverter->subChars = (uint8_t *)localConverter->subUChars; + } else { + localConverter->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + if (localConverter->subChars == NULL) { + uprv_free(allocatedConverter); + UTRACE_EXIT_STATUS(*status); + return NULL; + } + uprv_memcpy(localConverter->subChars, cnv->subChars, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + } + /* now either call the safeclone fcn or not */ if (cnv->sharedData->impl->safeClone != NULL) { /* call the custom safeClone function */ @@ -256,6 +269,9 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U } if(localConverter==NULL || U_FAILURE(*status)) { + if (allocatedConverter != NULL && allocatedConverter->subChars != (uint8_t *)allocatedConverter->subUChars) { + uprv_free(allocatedConverter->subChars); + } uprv_free(allocatedConverter); UTRACE_EXIT_STATUS(*status); return NULL; @@ -295,27 +311,6 @@ ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, U U_CAPI void U_EXPORT2 ucnv_close (UConverter * converter) { - /* first, notify the callback functions that the converter is closed */ - UConverterToUnicodeArgs toUArgs = { - sizeof(UConverterToUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - UConverterFromUnicodeArgs fromUArgs = { - sizeof(UConverterFromUnicodeArgs), - TRUE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; UErrorCode errorCode = U_ZERO_ERROR; UTRACE_ENTRY_OC(UTRACE_UCNV_CLOSE); @@ -329,16 +324,50 @@ ucnv_close (UConverter * converter) UTRACE_DATA3(UTRACE_OPEN_CLOSE, "close converter %s at %p, isCopyLocal=%b", ucnv_getName(converter, &errorCode), converter, converter->isCopyLocal); - toUArgs.converter = fromUArgs.converter = converter; + /* In order to speed up the close, only call the callbacks when they have been changed. + This performance check will only work when the callbacks are set within a shared library + or from user code that statically links this code. */ + /* first, notify the callback functions that the converter is closed */ + if (converter->fromCharErrorBehaviour != UCNV_TO_U_DEFAULT_CALLBACK) { + UConverterToUnicodeArgs toUArgs = { + sizeof(UConverterToUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; - converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_CLOSE, &errorCode); - errorCode = U_ZERO_ERROR; - converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode); + toUArgs.converter = converter; + errorCode = U_ZERO_ERROR; + converter->fromCharErrorBehaviour(converter->toUContext, &toUArgs, NULL, 0, UCNV_CLOSE, &errorCode); + } + if (converter->fromUCharErrorBehaviour != UCNV_FROM_U_DEFAULT_CALLBACK) { + UConverterFromUnicodeArgs fromUArgs = { + sizeof(UConverterFromUnicodeArgs), + TRUE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }; + fromUArgs.converter = converter; + errorCode = U_ZERO_ERROR; + converter->fromUCharErrorBehaviour(converter->fromUContext, &fromUArgs, NULL, 0, 0, UCNV_CLOSE, &errorCode); + } if (converter->sharedData->impl->close != NULL) { converter->sharedData->impl->close(converter); } + if (converter->subChars != (uint8_t *)converter->subUChars) { + uprv_free(converter->subChars); + } + /* Checking whether it's an algorithic converter is okay in multithreaded applications because the value never changes. @@ -349,7 +378,7 @@ ucnv_close (UConverter * converter) } if(!converter->isCopyLocal){ - uprv_free (converter); + uprv_free(converter); } UTRACE_EXIT(); @@ -386,15 +415,19 @@ ucnv_getSubstChars (const UConverter * converter, if (U_FAILURE (*err)) return; + if (converter->subCharLen <= 0) { + /* Unicode string or empty string from ucnv_setSubstString(). */ + *len = 0; + return; + } + if (*len < converter->subCharLen) /*not enough space in subChars */ { *err = U_INDEX_OUTOFBOUNDS_ERROR; return; } - uprv_memcpy (mySubChar, converter->subChar, converter->subCharLen); /*fills in the subchars */ - *len = converter->subCharLen; /*store # of bytes copied to buffer */ - uprv_memcpy (mySubChar, converter->subChar, converter->subCharLen); /*fills in the subchars */ + uprv_memcpy (mySubChar, converter->subChars, converter->subCharLen); /*fills in the subchars */ *len = converter->subCharLen; /*store # of bytes copied to buffer */ } @@ -415,7 +448,7 @@ ucnv_setSubstChars (UConverter * converter, return; } - uprv_memcpy (converter->subChar, mySubChar, len); /*copies the subchars */ + uprv_memcpy (converter->subChars, mySubChar, len); /*copies the subchars */ converter->subCharLen = len; /*sets the new len */ /* @@ -428,6 +461,93 @@ ucnv_setSubstChars (UConverter * converter, return; } +U_DRAFT void U_EXPORT2 +ucnv_setSubstString(UConverter *cnv, + const UChar *s, + int32_t length, + UErrorCode *err) { + UAlignedMemory cloneBuffer[U_CNV_SAFECLONE_BUFFERSIZE / sizeof(UAlignedMemory) + 1]; + char chars[UCNV_ERROR_BUFFER_LENGTH]; + + UConverter *clone; + uint8_t *subChars; + int32_t cloneSize, length8; + + /* Let the following functions check all arguments. */ + cloneSize = sizeof(cloneBuffer); + clone = ucnv_safeClone(cnv, cloneBuffer, &cloneSize, err); + ucnv_setFromUCallBack(clone, UCNV_FROM_U_CALLBACK_STOP, NULL, NULL, NULL, err); + length8 = ucnv_fromUChars(clone, chars, (int32_t)sizeof(chars), s, length, err); + ucnv_close(clone); + if (U_FAILURE(*err)) { + return; + } + + if (cnv->sharedData->impl->writeSub == NULL +#if !UCONFIG_NO_LEGACY_CONVERSION + || (cnv->sharedData->staticData->conversionType == UCNV_MBCS && + ucnv_MBCSGetType(cnv) != UCNV_EBCDIC_STATEFUL) +#endif + ) { + /* The converter is not stateful. Store the charset bytes as a fixed string. */ + subChars = (uint8_t *)chars; + } else { + /* + * The converter has a non-default writeSub() function, indicating + * that it is stateful. + * Store the Unicode string for on-the-fly conversion for correct + * state handling. + */ + if (length > UCNV_ERROR_BUFFER_LENGTH) { + /* + * Should not occur. The converter should output at least one byte + * per UChar, which means that ucnv_fromUChars() should catch all + * overflows. + */ + *err = U_BUFFER_OVERFLOW_ERROR; + return; + } + subChars = (uint8_t *)s; + if (length < 0) { + length = u_strlen(s); + } + length8 = length * U_SIZEOF_UCHAR; + } + + /* + * For storing the substitution string, select either the small buffer inside + * UConverter or allocate a subChars buffer. + */ + if (length8 > UCNV_MAX_SUBCHAR_LEN) { + /* Use a separate buffer for the string. Outside UConverter to not make it too large. */ + if (cnv->subChars == (uint8_t *)cnv->subUChars) { + /* Allocate a new buffer for the string. */ + cnv->subChars = (uint8_t *)uprv_malloc(UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + if (cnv->subChars == NULL) { + cnv->subChars = (uint8_t *)cnv->subUChars; + *err = U_MEMORY_ALLOCATION_ERROR; + return; + } + uprv_memset(cnv->subChars, 0, UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR); + } + } + + /* Copy the substitution string into the UConverter or its subChars buffer. */ + if (length8 == 0) { + cnv->subCharLen = 0; + } else { + uprv_memcpy(cnv->subChars, subChars, length8); + if (subChars == (uint8_t *)chars) { + cnv->subCharLen = (int8_t)length8; + } else /* subChars == s */ { + cnv->subCharLen = (int8_t)-length; + } + } + + /* See comment in ucnv_setSubstChars(). */ + cnv->subChar1 = 0; +} + /*resets the internal states of a converter *goal : have the same behaviour than a freshly created converter */ @@ -1839,6 +1959,12 @@ ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, } if(pivotStart==NULL) { + if(!flush) { + /* streaming conversion requires an explicit pivot buffer */ + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return; + } + /* use the stack pivot buffer */ pivotStart=myPivotSource=myPivotTarget=pivotBuffer; pivotSource=&myPivotSource; diff --git a/Build/source/libs/icu-xetex/common/ucnv2022.c b/Build/source/libs/icu-xetex/common/ucnv2022.c index 4c615667a07..9dc1c2838dd 100644 --- a/Build/source/libs/icu-xetex/common/ucnv2022.c +++ b/Build/source/libs/icu-xetex/common/ucnv2022.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2005, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv2022.c @@ -172,17 +172,17 @@ typedef struct ISO2022State { #define UCNV_2022_MAX_CONVERTERS 10 typedef struct{ + UConverterSharedData *myConverterArray[UCNV_2022_MAX_CONVERTERS]; UConverter *currentConverter; -#ifdef U_ENABLE_GENERIC_ISO_2022 - UBool isFirstBuffer; -#endif Cnv2022Type currentType; ISO2022State toU2022State, fromU2022State; - UConverterSharedData *myConverterArray[UCNV_2022_MAX_CONVERTERS]; uint32_t key; uint32_t version; - char locale[3]; +#ifdef U_ENABLE_GENERIC_ISO_2022 + UBool isFirstBuffer; +#endif char name[30]; + char locale[3]; }UConverterDataISO2022; /* Protos */ @@ -378,7 +378,23 @@ static const UConverterSharedData _ISO2022CNData; /*************** Converter implementations ******************/ -static void +/* The purpose of this function is to get around gcc compiler warnings. */ +static U_INLINE void +fromUWriteUInt8(UConverter *cnv, + const char *bytes, int32_t length, + uint8_t **target, const char *targetLimit, + int32_t **offsets, + int32_t sourceIndex, + UErrorCode *pErrorCode) +{ + char *targetChars = (char *)*target; + ucnv_fromUWriteBytes(cnv, bytes, length, &targetChars, targetLimit, + offsets, sourceIndex, pErrorCode); + *target = (uint8_t*)targetChars; + +} + +static U_INLINE void setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConverterData){ if(myConverterData->version == 1) { UConverter *cnv = myConverterData->currentConverter; @@ -389,7 +405,7 @@ setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConve } } -static void +static U_INLINE void setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData){ /* in ISO-2022-KR the designator sequence appears only once * in a file so we append it only once @@ -421,20 +437,16 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti uint32_t version; uprv_memset(myConverterData, 0, sizeof(UConverterDataISO2022)); - myConverterData->currentConverter = NULL; myConverterData->currentType = ASCII1; - myConverterData->key =0; -#ifdef U_ENABLE_GENERIC_ISO_2022 - myConverterData->isFirstBuffer = TRUE; -#endif cnv->fromUnicodeStatus =FALSE; if(locale){ uprv_strncpy(myLocale, locale, sizeof(myLocale)); } - myConverterData->version= 0; version = options & UCNV_OPTIONS_VERSION_MASK; + myConverterData->version = version; if(myLocale[0]=='j' && (myLocale[1]=='a'|| myLocale[1]=='p') && - (myLocale[2]=='_' || myLocale[2]=='\0')){ + (myLocale[2]=='_' || myLocale[2]=='\0')) + { size_t len=0; /* open the required converters and cache them */ if(jpCharsetMasks[version]&CSM(ISO8859_7)) { @@ -456,50 +468,49 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti cnv->sharedData=(UConverterSharedData*)(&_ISO2022JPData); uprv_strcpy(myConverterData->locale,"ja"); - myConverterData->version = version; uprv_strcpy(myConverterData->name,"ISO_2022,locale=ja,version="); len = uprv_strlen(myConverterData->name); myConverterData->name[len]=(char)(myConverterData->version+(int)'0'); myConverterData->name[len+1]='\0'; } else if(myLocale[0]=='k' && (myLocale[1]=='o'|| myLocale[1]=='r') && - (myLocale[2]=='_' || myLocale[2]=='\0')){ - - if ((options & UCNV_OPTIONS_VERSION_MASK)==1){ - myConverterData->version = 1; - myConverterData->currentConverter= - ucnv_open("icu-internal-25546",errorCode); + (myLocale[2]=='_' || myLocale[2]=='\0')) + { + if (version==1){ + myConverterData->currentConverter= + ucnv_open("icu-internal-25546",errorCode); - if (U_FAILURE(*errorCode)) { - _ISO2022Close(cnv); - return; - } + if (U_FAILURE(*errorCode)) { + _ISO2022Close(cnv); + return; + } - uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1"); - uprv_memcpy(cnv->subChar, myConverterData->currentConverter->subChar, 4); - cnv->subCharLen = myConverterData->currentConverter->subCharLen; + uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1"); + uprv_memcpy(cnv->subChars, myConverterData->currentConverter->subChars, 4); + cnv->subCharLen = myConverterData->currentConverter->subCharLen; }else{ - myConverterData->currentConverter=ucnv_open("ibm-949",errorCode); + myConverterData->currentConverter=ucnv_open("ibm-949",errorCode); - if (U_FAILURE(*errorCode)) { - _ISO2022Close(cnv); - return; - } + if (U_FAILURE(*errorCode)) { + _ISO2022Close(cnv); + return; + } - myConverterData->version = 0; - uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0"); + myConverterData->version = 0; + uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0"); } /* initialize the state variables */ setInitialStateToUnicodeKR(cnv, myConverterData); - setInitialStateFromUnicodeKR(cnv,myConverterData); + setInitialStateFromUnicodeKR(cnv, myConverterData); /* set the function pointers to appropriate funtions */ cnv->sharedData=(UConverterSharedData*)&_ISO2022KRData; uprv_strcpy(myConverterData->locale,"ko"); } else if(((myLocale[0]=='z' && myLocale[1]=='h') || (myLocale[0]=='c'&& myLocale[1]=='n'))&& - (myLocale[2]=='_' || myLocale[2]=='\0')){ + (myLocale[2]=='_' || myLocale[2]=='\0')) + { /* open the required converters and cache them */ myConverterData->myConverterArray[GB2312_1] = ucnv_loadSharedData("ibm-5478", NULL, errorCode); @@ -513,16 +524,17 @@ _ISO2022Open(UConverter *cnv, const char *name, const char *locale,uint32_t opti cnv->sharedData=(UConverterSharedData*)&_ISO2022CNData; uprv_strcpy(myConverterData->locale,"cn"); - if ((options & UCNV_OPTIONS_VERSION_MASK)==1){ - myConverterData->version = 1; + if (version==1){ uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=1"); }else{ - uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=0"); myConverterData->version = 0; + uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=0"); } } else{ #ifdef U_ENABLE_GENERIC_ISO_2022 + myConverterData->isFirstBuffer = TRUE; + /* append the UTF-8 escape sequence */ cnv->charErrorBufferLength = 3; cnv->charErrorBuffer[0] = 0x1b; @@ -869,7 +881,9 @@ DONE: *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; break; } + /*fall through*/ case GB2312_1: + /*fall through*/ case CNS_11643_1: myData2022->toU2022State.cs[1]=(int8_t)tempState; break; @@ -1566,10 +1580,10 @@ getTrail: *offsets++ = sourceIndex; } } else { - ucnv_fromUWriteBytes( + fromUWriteUInt8( args->converter, buffer, outLen, - (char **)&target, (const char *)targetLimit, + &target, (const char *)targetLimit, &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)), err); if(U_FAILURE(*err)) { @@ -1634,10 +1648,10 @@ getTrail: sourceIndex=-1; } - ucnv_fromUWriteBytes( + fromUWriteUInt8( args->converter, buffer, outLen, - (char **)&target, (const char *)targetLimit, + &target, (const char *)targetLimit, &offsets, sourceIndex, err); } @@ -2071,10 +2085,10 @@ getTrail: sourceIndex=-1; } - ucnv_fromUWriteBytes( + fromUWriteUInt8( args->converter, SHIFT_IN_STR, 1, - (char **)&target, (const char *)targetLimit, + &target, (const char *)targetLimit, &offsets, sourceIndex, err); } @@ -2638,10 +2652,10 @@ getTrail: *offsets++ = sourceIndex; } } else { - ucnv_fromUWriteBytes( + fromUWriteUInt8( args->converter, buffer, len, - (char **)&target, (const char *)targetLimit, + &target, (const char *)targetLimit, &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)), err); if(U_FAILURE(*err)) { @@ -2695,10 +2709,10 @@ getTrail: sourceIndex=-1; } - ucnv_fromUWriteBytes( + fromUWriteUInt8( args->converter, SHIFT_IN_STR, 1, - (char **)&target, (const char *)targetLimit, + &target, (const char *)targetLimit, &offsets, sourceIndex, err); } @@ -2871,7 +2885,7 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC char buffer[8]; int32_t length; - subchar=(char *)cnv->subChar; + subchar=(char *)cnv->subChars; length=cnv->subCharLen; /* assume length==1 for most variants */ p = buffer; @@ -2926,14 +2940,24 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC } break; } else { - /* let the subconverter write the subchar */ - args->converter = myConverterData->currentConverter; - uprv_memcpy(myConverterData->currentConverter->subChar, subchar, 4); + /* save the subconverter's substitution string */ + uint8_t *currentSubChars = myConverterData->currentConverter->subChars; + int8_t currentSubCharLen = myConverterData->currentConverter->subCharLen; + + /* set our substitution string into the subconverter */ + myConverterData->currentConverter->subChars = (uint8_t *)subchar; myConverterData->currentConverter->subCharLen = (int8_t)length; + /* let the subconverter write the subchar, set/retrieve fromUChar32 state */ + args->converter = myConverterData->currentConverter; myConverterData->currentConverter->fromUChar32 = cnv->fromUChar32; ucnv_cbFromUWriteSub(args, 0, err); cnv->fromUChar32 = myConverterData->currentConverter->fromUChar32; + args->converter = cnv; + + /* restore the subconverter's substitution string */ + myConverterData->currentConverter->subChars = currentSubChars; + myConverterData->currentConverter->subCharLen = currentSubCharLen; if(*err == U_BUFFER_OVERFLOW_ERROR) { if(myConverterData->currentConverter->charErrorBufferLength > 0) { @@ -2945,7 +2969,6 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC cnv->charErrorBufferLength = myConverterData->currentConverter->charErrorBufferLength; myConverterData->currentConverter->charErrorBufferLength = 0; } - args->converter = cnv; return; } default: @@ -2957,12 +2980,23 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC offsetIndex, err); } -/* structure for SafeClone calculations */ +/* + * Structure for cloning an ISO 2022 converter into a single memory block. + * ucnv_safeClone() of the converter will align the entire cloneStruct, + * and then ucnv_safeClone() of the sub-converter may additionally align + * currentConverter inside the cloneStruct, for which we need the deadSpace + * after currentConverter. + * This is because UAlignedMemory may be larger than the actually + * necessary alignment size for the platform. + * The other cloneStruct fields will not be moved around, + * and are aligned properly with cloneStruct's alignment. + */ struct cloneStruct { UConverter cnv; - UConverterDataISO2022 mydata; UConverter currentConverter; + UAlignedMemory deadSpace; + UConverterDataISO2022 mydata; }; @@ -2988,11 +3022,13 @@ _ISO_2022_SafeClone( /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ uprv_memcpy(&localClone->mydata, cnvData, sizeof(UConverterDataISO2022)); + localClone->cnv.extraInfo = &localClone->mydata; /* set pointer to extra data */ + localClone->cnv.isExtraLocal = TRUE; /* share the subconverters */ if(cnvData->currentConverter != NULL) { - size = (int32_t)sizeof(UConverter); + size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */ localClone->mydata.currentConverter = ucnv_safeClone(cnvData->currentConverter, &localClone->currentConverter, @@ -3008,8 +3044,6 @@ _ISO_2022_SafeClone( } } - localClone->cnv.extraInfo = &localClone->mydata; /* set pointer to extra data */ - localClone->cnv.isExtraLocal = TRUE; return &localClone->cnv; } @@ -3286,7 +3320,7 @@ static const UConverterStaticData _ISO2022CNStaticData={ 0, UCNV_IBM, UCNV_ISO_2022, - 2, + 1, 8, /* max 8 bytes per UChar: 4-byte CNS designator + 2 bytes for SS2/SS3 + DBCS */ { 0x1a, 0, 0, 0 }, 1, diff --git a/Build/source/libs/icu-xetex/common/ucnv_bld.c b/Build/source/libs/icu-xetex/common/ucnv_bld.c index b9d64df5589..62e1609f087 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_bld.c +++ b/Build/source/libs/icu-xetex/common/ucnv_bld.c @@ -1,7 +1,7 @@ /* ******************************************************************** * COPYRIGHT: - * Copyright (c) 1996-2005, International Business Machines Corporation and + * Copyright (c) 1996-2006, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** * @@ -160,6 +160,8 @@ static uint16_t gAvailableConverterCount = 0; static char gDefaultConverterNameBuffer[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; /* +1 for NULL */ static const char *gDefaultConverterName = NULL; +static const UConverterSharedData *gDefaultAlgorithmicSharedData = NULL; +static UBool gDefaultConverterContainsOption; static const char DATA_TYPE[] = "cnv"; @@ -182,6 +184,8 @@ static UBool U_CALLCONV ucnv_cleanup(void) { gDefaultConverterName = NULL; gDefaultConverterNameBuffer[0] = 0; + gDefaultConverterContainsOption = FALSE; + gDefaultAlgorithmicSharedData = NULL; umtx_destroy(&cnvCacheMutex); /* Don't worry about destroying the mutex even */ /* if the hash table still exists. The mutex */ @@ -287,7 +291,7 @@ static UConverterSharedData *createConverterFromFile(UConverterLoadArgs *pArgs, UTRACE_ENTRY_OC(UTRACE_UCNV_LOAD); - if (err == NULL || U_FAILURE (*err)) { + if (U_FAILURE (*err)) { UTRACE_EXIT_STATUS(*err); return NULL; } @@ -374,7 +378,7 @@ ucnv_shareConverterData(UConverterSharedData * data) if (SHARED_DATA_HASHTABLE == NULL) { - SHARED_DATA_HASHTABLE = uhash_openSize(uhash_hashChars, uhash_compareChars, + SHARED_DATA_HASHTABLE = uhash_openSize(uhash_hashChars, uhash_compareChars, NULL, ucnv_io_countTotalAliases(&err), &err); ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup); @@ -658,6 +662,8 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr UConverterLookupData stackLookup; UConverterSharedData *mySharedConverterData = NULL; UErrorCode internalErrorCode = U_ZERO_ERROR; + UBool mayContainOption = TRUE; + UBool checkForAlgorithmic = TRUE; if (U_FAILURE (*err)) { return NULL; @@ -672,13 +678,29 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr /* In case "name" is NULL we want to open the default converter. */ if (converterName == NULL) { + /* Call ucnv_getDefaultName first to query the name from the OS. */ lookup->realName = ucnv_getDefaultName(); if (lookup->realName == NULL) { *err = U_MISSING_RESOURCE_ERROR; return NULL; } + mySharedConverterData = (UConverterSharedData *)gDefaultAlgorithmicSharedData; + checkForAlgorithmic = FALSE; + mayContainOption = gDefaultConverterContainsOption; /* the default converter name is already canonical */ - } else { + } + else if((converterName[0] == 'U' ? + ( converterName[1] == 'T' && converterName[2] == 'F') : + (converterName[0] == 'u' && converterName[1] == 't' && converterName[2] == 'f')) + && + (converterName[3] == '-' ? + (converterName[4] == '8' && converterName[5] == 0) : + (converterName[3] == '8' && converterName[4] == 0))) + { + /* fastpath for UTF-8 */ + return (UConverterSharedData *)converterData[UCNV_UTF8]; + } + else { /* separate the converter name from the options */ parseConverterOptions(converterName, lookup->cnvName, lookup->locale, &lookup->options, err); if (U_FAILURE(*err)) { @@ -687,7 +709,7 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr } /* get the canonical converter name */ - lookup->realName = ucnv_io_getConverterName(lookup->cnvName, &internalErrorCode); + lookup->realName = ucnv_io_getConverterName(lookup->cnvName, &mayContainOption, &internalErrorCode); if (U_FAILURE(internalErrorCode) || lookup->realName == NULL) { /* * set the input name in case the converter was added @@ -698,13 +720,15 @@ ucnv_loadSharedData(const char *converterName, UConverterLookupData *lookup, UEr } /* separate the converter name from the options */ - if(lookup->realName != lookup->cnvName) { + if(mayContainOption && lookup->realName != lookup->cnvName) { parseConverterOptions(lookup->realName, lookup->cnvName, lookup->locale, &lookup->options, err); lookup->realName = lookup->cnvName; } /* get the shared data for an algorithmic converter, if it is one */ - mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(lookup->realName); + if (checkForAlgorithmic) { + mySharedConverterData = (UConverterSharedData *)getAlgorithmicTypeFromName(lookup->realName); + } if (mySharedConverterData == NULL) { /* it is a data-based converter, get its shared data. */ @@ -878,20 +902,21 @@ ucnv_createConverterFromSharedData(UConverter *myUConverter, /* initialize the converter */ uprv_memset(myUConverter, 0, sizeof(UConverter)); myUConverter->isCopyLocal = isCopyLocal; - myUConverter->isExtraLocal = FALSE; + /*myUConverter->isExtraLocal = FALSE;*/ /* Set by the memset call */ myUConverter->sharedData = mySharedConverterData; myUConverter->options = options; - myUConverter->fromCharErrorBehaviour = (UConverterToUCallback) UCNV_TO_U_CALLBACK_SUBSTITUTE; - myUConverter->fromUCharErrorBehaviour = (UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE; - myUConverter->toUnicodeStatus = myUConverter->sharedData->toUnicodeStatus; - myUConverter->maxBytesPerUChar = myUConverter->sharedData->staticData->maxBytesPerChar; - myUConverter->subChar1 = myUConverter->sharedData->staticData->subChar1; - myUConverter->subCharLen = myUConverter->sharedData->staticData->subCharLen; - uprv_memcpy (myUConverter->subChar, myUConverter->sharedData->staticData->subChar, myUConverter->subCharLen); myUConverter->preFromUFirstCP = U_SENTINEL; - - if(myUConverter != NULL && myUConverter->sharedData->impl->open != NULL) { - myUConverter->sharedData->impl->open(myUConverter, realName, locale,options, err); + myUConverter->fromCharErrorBehaviour = UCNV_TO_U_DEFAULT_CALLBACK; + myUConverter->fromUCharErrorBehaviour = UCNV_FROM_U_DEFAULT_CALLBACK; + myUConverter->toUnicodeStatus = mySharedConverterData->toUnicodeStatus; + myUConverter->maxBytesPerUChar = mySharedConverterData->staticData->maxBytesPerChar; + myUConverter->subChar1 = mySharedConverterData->staticData->subChar1; + myUConverter->subCharLen = mySharedConverterData->staticData->subCharLen; + myUConverter->subChars = (uint8_t *)myUConverter->subUChars; + uprv_memcpy(myUConverter->subChars, mySharedConverterData->staticData->subChar, myUConverter->subCharLen); + + if(mySharedConverterData->impl->open != NULL) { + mySharedConverterData->impl->open(myUConverter, realName, locale, options, err); if(U_FAILURE(*err)) { ucnv_close(myUConverter); return NULL; @@ -1062,6 +1087,36 @@ ucnv_bld_getAvailableConverter(uint16_t n, UErrorCode *pErrorCode) { /* default converter name --------------------------------------------------- */ +/* Copy the canonical converter name. */ +static U_INLINE void +internalSetName(const char *name, UErrorCode *status) { + UConverterLookupData lookup; + int32_t length=(int32_t)(uprv_strlen(name)); + UBool containsOption = (UBool)(uprv_strchr(name, UCNV_OPTION_SEP_CHAR) != NULL); + const UConverterSharedData *algorithmicSharedData; + + lookup.locale[0] = 0; + lookup.options = 0; + lookup.realName = name; + if(containsOption) { + parseConverterOptions(lookup.realName, lookup.cnvName, lookup.locale, &lookup.options, status); + lookup.realName = lookup.cnvName; + } + algorithmicSharedData = getAlgorithmicTypeFromName(lookup.realName); + + umtx_lock(&cnvCacheMutex); + + uprv_memcpy(gDefaultConverterNameBuffer, name, length); + gDefaultConverterNameBuffer[length]=0; + gDefaultConverterName = gDefaultConverterNameBuffer; + gDefaultConverterContainsOption = containsOption; + gDefaultAlgorithmicSharedData = algorithmicSharedData; + + ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup); + + umtx_unlock(&cnvCacheMutex); +} + /* * In order to be really thread-safe, the get function would have to take * a buffer parameter and copy the current string inside a mutex block. @@ -1079,7 +1134,6 @@ ucnv_getDefaultName() { if(name==NULL) { UErrorCode errorCode = U_ZERO_ERROR; UConverter *cnv = NULL; - int32_t length = 0; name = uprv_getDefaultCodepage(); @@ -1093,7 +1147,7 @@ ucnv_getDefaultName() { if(name == NULL || name[0] == 0 || U_FAILURE(errorCode) || cnv == NULL - || length>=sizeof(gDefaultConverterNameBuffer)) + || uprv_strlen(name)>=sizeof(gDefaultConverterNameBuffer)) { /* Panic time, let's use a fallback. */ #if (U_CHARSET_FAMILY == U_ASCII_FAMILY) @@ -1106,16 +1160,7 @@ ucnv_getDefaultName() { #endif } - length=(int32_t)(uprv_strlen(name)); - - /* Copy the name before we close the converter. */ - umtx_lock(&cnvCacheMutex); - uprv_memcpy(gDefaultConverterNameBuffer, name, length); - gDefaultConverterNameBuffer[length]=0; - gDefaultConverterName = gDefaultConverterNameBuffer; - name = gDefaultConverterName; - ucln_common_registerCleanup(UCLN_COMMON_UCNV, ucnv_cleanup); - umtx_unlock(&cnvCacheMutex); + internalSetName(name, &errorCode); /* The close may make the current name go away. */ ucnv_close(cnv); @@ -1132,24 +1177,23 @@ ucnv_setDefaultName(const char *converterName) { gDefaultConverterName=NULL; umtx_unlock(&cnvCacheMutex); } else { - UErrorCode errorCode=U_ZERO_ERROR; - const char *name=ucnv_io_getConverterName(converterName, &errorCode); + UErrorCode errorCode = U_ZERO_ERROR; + UConverter *cnv = NULL; + const char *name = NULL; - umtx_lock(&cnvCacheMutex); + /* if the name is there, test it out and get the canonical name with options */ + cnv = ucnv_open(converterName, &errorCode); + if(U_SUCCESS(errorCode) && cnv != NULL) { + name = ucnv_getName(cnv, &errorCode); + } if(U_SUCCESS(errorCode) && name!=NULL) { - gDefaultConverterName=name; - } else { - /* do not set the name if the alias lookup failed and it is too long */ - int32_t length=(int32_t)(uprv_strlen(converterName)); - if(length<sizeof(gDefaultConverterNameBuffer)) { - /* it was not found as an alias, so copy it - accept an empty name */ - uprv_memcpy(gDefaultConverterNameBuffer, converterName, length); - gDefaultConverterNameBuffer[length]=0; - gDefaultConverterName=gDefaultConverterNameBuffer; - } + internalSetName(name, &errorCode); } - umtx_unlock(&cnvCacheMutex); + /* else this converter is bad to use. Don't change it to a bad value. */ + + /* The close may make the current name go away. */ + ucnv_close(cnv); } } @@ -1259,7 +1303,13 @@ ucnv_swap(const UDataSwapper *ds, inMBCSHeader=(const _MBCSHeader *)inBytes; outMBCSHeader=(_MBCSHeader *)outBytes; - if(!(inMBCSHeader->version[0]==4 || inMBCSHeader->version[1]>=1)) { + if(0<=length && length<sizeof(_MBCSHeader)) { + udata_printError(ds, "ucnv_swap(): too few bytes (%d after headers) for an ICU MBCS .cnv conversion table\n", + length); + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if(!(inMBCSHeader->version[0]==4 && inMBCSHeader->version[1]>=1)) { udata_printError(ds, "ucnv_swap(): unsupported _MBCSHeader.version %d.%d\n", inMBCSHeader->version[0], inMBCSHeader->version[1]); *pErrorCode=U_UNSUPPORTED_ERROR; @@ -1275,7 +1325,7 @@ ucnv_swap(const UDataSwapper *ds, mbcsHeader.flags= ds->readUInt32(inMBCSHeader->flags); mbcsHeader.fromUBytesLength= ds->readUInt32(inMBCSHeader->fromUBytesLength); - extOffset=(int32_t)mbcsHeader.flags>>8; + extOffset=(int32_t)(mbcsHeader.flags>>8); outputType=(uint8_t)mbcsHeader.flags; /* make sure that the output type is known */ diff --git a/Build/source/libs/icu-xetex/common/ucnv_bld.h b/Build/source/libs/icu-xetex/common/ucnv_bld.h index eecb42bbb80..75aa4d183ab 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_bld.h +++ b/Build/source/libs/icu-xetex/common/ucnv_bld.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -157,6 +157,17 @@ struct UConverter { const void *fromUContext; const void *toUContext; + /* + * Pointer to charset bytes for substitution string if subCharLen>0, + * or pointer to Unicode string (UChar *) if subCharLen<0. + * subCharLen==0 is equivalent to using a skip callback. + * If the pointer is !=subUChars then it is allocated with + * UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR bytes. + * The subUChars field is declared as UChar[] not uint8_t[] to + * guarantee alignment for UChars. + */ + uint8_t *subChars; + UConverterSharedData *sharedData; /* Pointer to the shared immutable part of the converter object */ uint32_t options; /* options flags from UConverterOpen, may contain additional bits */ @@ -200,9 +211,9 @@ struct UConverter { uint8_t subChar1; /* single-byte substitution character if different from subChar */ UBool useSubChar1; - uint8_t subChar[UCNV_MAX_SUBCHAR_LEN]; /* codepage specific character sequence */ char invalidCharBuffer[UCNV_MAX_CHAR_LEN]; /* bytes from last error/callback situation */ uint8_t charErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* codepage output from Error functions */ + UChar subUChars[UCNV_MAX_SUBCHAR_LEN/U_SIZEOF_UCHAR]; /* see subChars documentation */ UChar invalidUCharBuffer[U16_MAX_LENGTH]; /* UChars from last error/callback situation */ UChar UCharErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* unicode output from Error functions */ diff --git a/Build/source/libs/icu-xetex/common/ucnv_cb.c b/Build/source/libs/icu-xetex/common/ucnv_cb.c index 5038ab574f3..fa34b658327 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_cb.c +++ b/Build/source/libs/icu-xetex/common/ucnv_cb.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2004, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * ucnv_cb.c: @@ -104,7 +104,7 @@ ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, /* && (*source < sourceLimit && args->target >= args->targetLimit) -- S. Hrcek */ { - /* Overflowed the target. Now, we'll write into the charErrorBuffer. + /* Overflowed the target. Now, we'll write into the charErrorBuffer. It's a fixed size. If we overflow it... Hmm */ char *newTarget; const char *newTargetLimit; @@ -126,49 +126,48 @@ ucnv_cbFromUWriteUChars(UConverterFromUnicodeArgs *args, return; } - /* We're going to tell the converter that the errbuff len is empty. - This prevents the existing errbuff from being 'flushed' out onto - itself. If the errbuff is needed by the converter this time, - we're hosed - we're out of space! */ - - args->converter->charErrorBufferLength = 0; - - ucnv_fromUnicode(args->converter, - &newTarget, - newTargetLimit, - source, - sourceLimit, - NULL, - FALSE, - &err2); - - /* We can go ahead and overwrite the length here. We know just how - to recalculate it. */ - - args->converter->charErrorBufferLength = (int8_t)( - newTarget - (char*)args->converter->charErrorBuffer); - - if((newTarget >= newTargetLimit) || (err2 == U_BUFFER_OVERFLOW_ERROR)) - { - /* now we're REALLY in trouble. - Internal program error - callback shouldn't have written this much - data! - */ - *err = U_INTERNAL_PROGRAM_ERROR; - return; - } - else - { - /* sub errs could be invalid/truncated/illegal chars or w/e. - These might want to be passed on up.. But the problem is, we already - need to pass U_BUFFER_OVERFLOW_ERROR. That has to override these - other errs.. */ - - /* - if(U_FAILURE(err2)) - ?? - */ - } + /* We're going to tell the converter that the errbuff len is empty. + This prevents the existing errbuff from being 'flushed' out onto + itself. If the errbuff is needed by the converter this time, + we're hosed - we're out of space! */ + + args->converter->charErrorBufferLength = 0; + + ucnv_fromUnicode(args->converter, + &newTarget, + newTargetLimit, + source, + sourceLimit, + NULL, + FALSE, + &err2); + + /* We can go ahead and overwrite the length here. We know just how + to recalculate it. */ + + args->converter->charErrorBufferLength = (int8_t)( + newTarget - (char*)args->converter->charErrorBuffer); + + if((newTarget >= newTargetLimit) || (err2 == U_BUFFER_OVERFLOW_ERROR)) + { + /* now we're REALLY in trouble. + Internal program error - callback shouldn't have written this much + data! + */ + *err = U_INTERNAL_PROGRAM_ERROR; + return; + } + /*else {*/ + /* sub errs could be invalid/truncated/illegal chars or w/e. + These might want to be passed on up.. But the problem is, we already + need to pass U_BUFFER_OVERFLOW_ERROR. That has to override these + other errs.. */ + + /* + if(U_FAILURE(err2)) + ?? + */ + /*}*/ } } @@ -177,19 +176,48 @@ ucnv_cbFromUWriteSub (UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode * err) { + UConverter *converter; + int32_t length; + if(U_FAILURE(*err)) { return; } + converter = args->converter; + length = converter->subCharLen; - if(args->converter->sharedData->impl->writeSub!=NULL) { - args->converter->sharedData->impl->writeSub(args, offsetIndex, err); - } else if(args->converter->subChar1!=0 && args->converter->invalidUCharBuffer[0]<=0xff) { + if(length == 0) { + return; + } + + if(length < 0) { + /* + * Write/convert the substitution string. Its real length is -length. + * Unlike the escape callback, we need not change the converter's + * callback function because ucnv_setSubstString() verified that + * the string can be converted, so we will not get a conversion error + * and will not recurse. + * At worst we should get a U_BUFFER_OVERFLOW_ERROR. + */ + const UChar *source = (const UChar *)converter->subChars; + ucnv_cbFromUWriteUChars(args, &source, source - length, offsetIndex, err); + return; + } + + if(converter->sharedData->impl->writeSub!=NULL) { + converter->sharedData->impl->writeSub(args, offsetIndex, err); + } + else if(converter->subChar1!=0 && (uint16_t)converter->invalidUCharBuffer[0]<=(uint16_t)0xffu) { + /* + TODO: Is this untestable because the MBCS converter has a writeSub function to call + and the other converters don't use subChar1? + */ ucnv_cbFromUWriteBytes(args, - (const char *)&args->converter->subChar1, 1, + (const char *)&converter->subChar1, 1, offsetIndex, err); - } else { + } + else { ucnv_cbFromUWriteBytes(args, - (const char *)args->converter->subChar, args->converter->subCharLen, + (const char *)converter->subChars, length, offsetIndex, err); } } diff --git a/Build/source/libs/icu-xetex/common/ucnv_imp.h b/Build/source/libs/icu-xetex/common/ucnv_imp.h index d42b2a4b60f..c1f48c0e186 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_imp.h +++ b/Build/source/libs/icu-xetex/common/ucnv_imp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -87,6 +87,9 @@ ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData); void ucnv_incrementRefCount(UConverterSharedData *sharedData); +#define UCNV_TO_U_DEFAULT_CALLBACK ((UConverterToUCallback) UCNV_TO_U_CALLBACK_SUBSTITUTE) +#define UCNV_FROM_U_DEFAULT_CALLBACK ((UConverterFromUCallback) UCNV_FROM_U_CALLBACK_SUBSTITUTE) + #endif #endif /* _UCNV_IMP */ diff --git a/Build/source/libs/icu-xetex/common/ucnv_io.c b/Build/source/libs/icu-xetex/common/ucnv_io.c index 03ce876b950..4e570e55d9c 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_io.c +++ b/Build/source/libs/icu-xetex/common/ucnv_io.c @@ -1,15 +1,15 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** * * * ucnv_io.c: -* initializes global variables and defines functions pertaining to file -* access, and name resolution aspect of the library. +* initializes global variables and defines functions pertaining to converter +* name resolution aspect of the conversion code. * * new implementation: * @@ -73,6 +73,8 @@ * index of this list is also used by other sections, like the 4th section. * The index for the 3rd and 4th section is used to get the * alias -> converter name mapping. Section 3 and 4 form a two column table. + * Some of the most significant bits of each index may contain other + * information (see findConverter for details). * * 4) This section contains a list of mapped converter names. Consider this * as a table that maps the 3rd section to the 1st section. This list contains @@ -94,8 +96,10 @@ * the third dimension to the section 5. No other section should be referencing * this section. * - * 7) Reserved at this time (There is no information). This _usually_ has a - * size of 0. Future versions may add more information here. + * 7) Starting in ICU 3.6, this can be a UConverterAliasOptions struct. Its + * presence indicates that a section 9 exists. UConverterAliasOptions specifies + * what type of string normalization is used among other potential things in the + * future. * * 8) This is the string table. All strings are indexed on an even address. * There are two reasons for this. First many chip architectures locate strings @@ -103,6 +107,10 @@ * numbers, this string table can be 128KB in size instead of 64KB when we * only have strings starting on an even address. * + * 9) When present this is a set of prenormalized strings from section 8. This + * table contains normalized strings with the dashes and spaces stripped out, + * and all strings lowercased. In the future, the options in section 7 may state + * other types of normalization. * * Here is the concept of section 5 and 6. It's a 3D cube. Each tag * has a unique alias among all converters. That same alias can @@ -173,29 +181,21 @@ enum { untaggedConvArrayIndex=4, taggedAliasArrayIndex=5, taggedAliasListsIndex=6, - reservedIndex1=7, + tableOptionsIndex=7, stringTableIndex=8, - minTocLength=8, /* min. tocLength in the file, does not count the tocLengthIndex! */ - offsetsCount /* length of the swapper's temporary offsets[] */ + normalizedStringTableIndex=9, + offsetsCount, /* length of the swapper's temporary offsets[] */ + minTocLength=8 /* min. tocLength in the file, does not count the tocLengthIndex! */ }; -static const uint16_t *gConverterList = NULL; -static const uint16_t *gTagList = NULL; -static const uint16_t *gAliasList = NULL; -static const uint16_t *gUntaggedConvArray = NULL; -static const uint16_t *gTaggedAliasArray = NULL; -static const uint16_t *gTaggedAliasLists = NULL; -static const uint16_t *gStringTable = NULL; - -static uint32_t gConverterListSize; -static uint32_t gTagListSize; -static uint32_t gAliasListSize; -static uint32_t gUntaggedConvArraySize; -static uint32_t gTaggedAliasArraySize; -static uint32_t gTaggedAliasListsSize; -static uint32_t gStringTableSize; +static const UConverterAliasOptions defaultTableOptions = { + UCNV_IO_UNNORMALIZED, + 0 /* containsCnvOptionInfo */ +}; +static UConverterAlias gMainTable; -#define GET_STRING(idx) (const char *)(gStringTable + (idx)) +#define GET_STRING(idx) (const char *)(gMainTable.stringTable + (idx)) +#define GET_NORMALIZED_STRING(idx) (const char *)(gMainTable.normalizedStringTable + (idx)) static UBool U_CALLCONV isAcceptable(void *context, @@ -219,21 +219,7 @@ static UBool U_CALLCONV ucnv_io_cleanup(void) gAliasData = NULL; } - gConverterListSize = 0; - gTagListSize = 0; - gAliasListSize = 0; - gUntaggedConvArraySize = 0; - gTaggedAliasArraySize = 0; - gTaggedAliasListsSize = 0; - gStringTableSize = 0; - - gConverterList = NULL; - gTagList = NULL; - gAliasList = NULL; - gUntaggedConvArray = NULL; - gTaggedAliasArray = NULL; - gTaggedAliasLists = NULL; - gStringTable = NULL; + uprv_memset(&gMainTable, 0, sizeof(gMainTable)); return TRUE; /* Everything was cleaned up */ } @@ -254,7 +240,6 @@ haveAliasData(UErrorCode *pErrorCode) { const uint16_t *table = NULL; uint32_t tableStart; uint32_t currOffset; - uint32_t reservedSize1; data = udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, pErrorCode); if(U_FAILURE(*pErrorCode)) { @@ -275,39 +260,57 @@ haveAliasData(UErrorCode *pErrorCode) { gAliasData = data; data=NULL; - gConverterListSize = ((const uint32_t *)(table))[1]; - gTagListSize = ((const uint32_t *)(table))[2]; - gAliasListSize = ((const uint32_t *)(table))[3]; - gUntaggedConvArraySize = ((const uint32_t *)(table))[4]; - gTaggedAliasArraySize = ((const uint32_t *)(table))[5]; - gTaggedAliasListsSize = ((const uint32_t *)(table))[6]; - reservedSize1 = ((const uint32_t *)(table))[7]; /* reserved */ - gStringTableSize = ((const uint32_t *)(table))[8]; + gMainTable.converterListSize = ((const uint32_t *)(table))[1]; + gMainTable.tagListSize = ((const uint32_t *)(table))[2]; + gMainTable.aliasListSize = ((const uint32_t *)(table))[3]; + gMainTable.untaggedConvArraySize = ((const uint32_t *)(table))[4]; + gMainTable.taggedAliasArraySize = ((const uint32_t *)(table))[5]; + gMainTable.taggedAliasListsSize = ((const uint32_t *)(table))[6]; + gMainTable.optionTableSize = ((const uint32_t *)(table))[7]; + gMainTable.stringTableSize = ((const uint32_t *)(table))[8]; + + if (((const uint32_t *)(table))[0] > 8) { + gMainTable.normalizedStringTableSize = ((const uint32_t *)(table))[9]; + } currOffset = tableStart * (sizeof(uint32_t)/sizeof(uint16_t)) + (sizeof(uint32_t)/sizeof(uint16_t)); - gConverterList = table + currOffset; + gMainTable.converterList = table + currOffset; - currOffset += gConverterListSize; - gTagList = table + currOffset; + currOffset += gMainTable.converterListSize; + gMainTable.tagList = table + currOffset; - currOffset += gTagListSize; - gAliasList = table + currOffset; + currOffset += gMainTable.tagListSize; + gMainTable.aliasList = table + currOffset; - currOffset += gAliasListSize; - gUntaggedConvArray = table + currOffset; + currOffset += gMainTable.aliasListSize; + gMainTable.untaggedConvArray = table + currOffset; - currOffset += gUntaggedConvArraySize; - gTaggedAliasArray = table + currOffset; + currOffset += gMainTable.untaggedConvArraySize; + gMainTable.taggedAliasArray = table + currOffset; /* aliasLists is a 1's based array, but it has a padding character */ - currOffset += gTaggedAliasArraySize; - gTaggedAliasLists = table + currOffset; + currOffset += gMainTable.taggedAliasArraySize; + gMainTable.taggedAliasLists = table + currOffset; + + currOffset += gMainTable.taggedAliasListsSize; + if (gMainTable.optionTableSize > 0 + && ((const UConverterAliasOptions *)(table + currOffset))->stringNormalizationType < UCNV_IO_NORM_TYPE_COUNT) + { + /* Faster table */ + gMainTable.optionTable = (const UConverterAliasOptions *)(table + currOffset); + } + else { + /* Smaller table, or I can't handle this normalization mode! + Use the original slower table lookup. */ + gMainTable.optionTable = &defaultTableOptions; + } - currOffset += gTaggedAliasListsSize; - /* reserved */ + currOffset += gMainTable.optionTableSize; + gMainTable.stringTable = table + currOffset; - currOffset += reservedSize1; - gStringTable = table + currOffset; + currOffset += gMainTable.stringTableSize; + gMainTable.normalizedStringTable = ((gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED) + ? gMainTable.stringTable : (table + currOffset)); ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup); } @@ -327,18 +330,15 @@ isAlias(const char *alias, UErrorCode *pErrorCode) { if(alias==NULL) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return FALSE; - } else if(*alias==0) { - return FALSE; - } else { - return TRUE; } + return (UBool)(*alias!=0); } static uint32_t getTagNumber(const char *tagname) { - if (gTagList) { + if (gMainTable.tagList) { uint32_t tagNum; - for (tagNum = 0; tagNum < gTagListSize; tagNum++) { - if (!uprv_stricmp(GET_STRING(gTagList[tagNum]), tagname)) { + for (tagNum = 0; tagNum < gMainTable.tagListSize; tagNum++) { + if (!uprv_stricmp(GET_STRING(gMainTable.tagList[tagNum]), tagname)) { return tagNum; } } @@ -347,48 +347,128 @@ static uint32_t getTagNumber(const char *tagname) { return UINT32_MAX; } +/* character types relevant for ucnv_compareNames() */ +enum { + IGNORE, + ZERO, + NONZERO, + MINLETTER /* any values from here on are lowercase letter mappings */ +}; + +/* character types for ASCII 00..7F */ +static const uint8_t asciiTypes[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0 +}; + +#define GET_ASCII_TYPE(c) ((int8_t)(c) >= 0 ? asciiTypes[(uint8_t)c] : (uint8_t)IGNORE) + +/* character types for EBCDIC 80..FF */ +static const uint8_t ebcdicTypes[128] = { + 0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0, 0, 0, 0, 0, 0, + 0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0, 0, 0, 0, 0, 0, + 0, 0, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0, 0, 0, 0, 0, 0, + 0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0, 0, 0, 0, 0, 0, + 0, 0, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0, 0, 0, 0, 0, 0, + ZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, 0, 0, 0, 0, 0, 0 +}; + +#define GET_EBCDIC_TYPE(c) ((int8_t)(c) < 0 ? ebcdicTypes[(c)&0x7f] : (uint8_t)IGNORE) + +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +# define GET_CHAR_TYPE(c) GET_ASCII_TYPE(c) +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +# define GET_CHAR_TYPE(c) GET_EBCDIC_TYPE(c) +#else +# error U_CHARSET_FAMILY is not valid +#endif + /* @see ucnv_compareNames */ U_CFUNC char * U_EXPORT2 ucnv_io_stripASCIIForCompare(char *dst, const char *name) { - char c1 = *name; char *dstItr = dst; - - while (c1) { - /* Ignore delimiters '-', '_', and ' ' */ - while ((c1 = *name) == 0x2d || c1 == 0x5f || c1 == 0x20) { - ++name; + uint8_t type, nextType; + char c1; + UBool afterDigit = FALSE; + + while ((c1 = *name++) != 0) { + type = GET_ASCII_TYPE(c1); + switch (type) { + case IGNORE: + afterDigit = FALSE; + continue; /* ignore all but letters and digits */ + case ZERO: + if (!afterDigit) { + nextType = GET_ASCII_TYPE(*name); + if (nextType == ZERO || nextType == NONZERO) { + continue; /* ignore leading zero before another digit */ + } + } + break; + case NONZERO: + afterDigit = TRUE; + break; + default: + c1 = (char)type; /* lowercased letter */ + afterDigit = FALSE; + break; } - - /* lowercase for case-insensitive comparison */ - *(dstItr++) = uprv_asciitolower(c1); - ++name; + *dstItr++ = c1; } + *dstItr = 0; return dst; } U_CFUNC char * U_EXPORT2 ucnv_io_stripEBCDICForCompare(char *dst, const char *name) { - char c1 = *name; char *dstItr = dst; - - while (c1) { - /* Ignore delimiters '-', '_', and ' ' */ - while ((c1 = *name) == 0x60 || c1 == 0x6d || c1 == 0x40) { - ++name; + uint8_t type, nextType; + char c1; + UBool afterDigit = FALSE; + + while ((c1 = *name++) != 0) { + type = GET_EBCDIC_TYPE(c1); + switch (type) { + case IGNORE: + afterDigit = FALSE; + continue; /* ignore all but letters and digits */ + case ZERO: + if (!afterDigit) { + nextType = GET_EBCDIC_TYPE(*name); + if (nextType == ZERO || nextType == NONZERO) { + continue; /* ignore leading zero before another digit */ + } + } + break; + case NONZERO: + afterDigit = TRUE; + break; + default: + c1 = (char)type; /* lowercased letter */ + afterDigit = FALSE; + break; } - - /* lowercase for case-insensitive comparison */ - *(dstItr++) = uprv_ebcdictolower(c1); - ++name; + *dstItr++ = c1; } + *dstItr = 0; return dst; } /** - * Do a fuzzy compare of a two converter/alias names. The comparison - * is case-insensitive. It also ignores the characters '-', '_', and - * ' ' (dash, underscore, and space). Thus the strings "UTF-8", - * "utf_8", and "Utf 8" are exactly equivalent. + * Do a fuzzy compare of two converter/alias names. + * The comparison is case-insensitive, ignores leading zeroes if they are not + * followed by further digits, and ignores all but letters and digits. + * Thus the strings "UTF-8", "utf_8", "u*T@f08" and "Utf 8" are exactly equivalent. + * See section 1.4, Charset Alias Matching in Unicode Technical Standard #22 + * at http://www.unicode.org/reports/tr22/ * * This is a symmetrical (commutative) operation; order of arguments * is insignificant. This is an important property for sorting the @@ -406,15 +486,58 @@ ucnv_io_stripEBCDICForCompare(char *dst, const char *name) { U_CAPI int U_EXPORT2 ucnv_compareNames(const char *name1, const char *name2) { int rc; + uint8_t type, nextType; char c1, c2; + UBool afterDigit1 = FALSE, afterDigit2 = FALSE; for (;;) { - /* Ignore delimiters '-', '_', and ' ' */ - while ((c1 = *name1) == '-' || c1 == '_' || c1 == ' ') { - ++name1; + while ((c1 = *name1++) != 0) { + type = GET_CHAR_TYPE(c1); + switch (type) { + case IGNORE: + afterDigit1 = FALSE; + continue; /* ignore all but letters and digits */ + case ZERO: + if (!afterDigit1) { + nextType = GET_CHAR_TYPE(*name1); + if (nextType == ZERO || nextType == NONZERO) { + continue; /* ignore leading zero before another digit */ + } + } + break; + case NONZERO: + afterDigit1 = TRUE; + break; + default: + c1 = (char)type; /* lowercased letter */ + afterDigit1 = FALSE; + break; + } + break; /* deliver c1 */ } - while ((c2 = *name2) == '-' || c2 == '_' || c2 == ' ') { - ++name2; + while ((c2 = *name2++) != 0) { + type = GET_CHAR_TYPE(c2); + switch (type) { + case IGNORE: + afterDigit2 = FALSE; + continue; /* ignore all but letters and digits */ + case ZERO: + if (!afterDigit2) { + nextType = GET_CHAR_TYPE(*name2); + if (nextType == ZERO || nextType == NONZERO) { + continue; /* ignore leading zero before another digit */ + } + } + break; + case NONZERO: + afterDigit2 = TRUE; + break; + default: + c2 = (char)type; /* lowercased letter */ + afterDigit2 = FALSE; + break; + } + break; /* deliver c2 */ } /* If we reach the ends of both strings then they match */ @@ -423,13 +546,10 @@ ucnv_compareNames(const char *name1, const char *name2) { } /* Case-insensitive comparison */ - rc = (int)(unsigned char)uprv_tolower(c1) - - (int)(unsigned char)uprv_tolower(c2); + rc = (int)(unsigned char)c1 - (int)(unsigned char)c2; if (rc != 0) { return rc; } - ++name1; - ++name2; } } @@ -438,14 +558,27 @@ ucnv_compareNames(const char *name1, const char *name2) { * return the converter number index for gConverterList */ static U_INLINE uint32_t -findConverter(const char *alias, UErrorCode *pErrorCode) { +findConverter(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) { uint32_t mid, start, limit; uint32_t lastMid; int result; + int isUnnormalized = (gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED); + char strippedName[UCNV_MAX_CONVERTER_NAME_LENGTH]; + + if (!isUnnormalized) { + if (uprv_strlen(alias) >= UCNV_MAX_CONVERTER_NAME_LENGTH) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return UINT32_MAX; + } + + /* Lower case and remove ignoreable characters. */ + ucnv_io_stripForCompare(strippedName, alias); + alias = strippedName; + } /* do a binary search for the alias */ start = 0; - limit = gUntaggedConvArraySize; + limit = gMainTable.untaggedConvArraySize; mid = limit; lastMid = UINT32_MAX; @@ -455,7 +588,12 @@ findConverter(const char *alias, UErrorCode *pErrorCode) { break; /* We haven't moved, and it wasn't found. */ } lastMid = mid; - result = ucnv_compareNames(alias, GET_STRING(gAliasList[mid])); + if (isUnnormalized) { + result = ucnv_compareNames(alias, GET_STRING(gMainTable.aliasList[mid])); + } + else { + result = uprv_strcmp(alias, GET_NORMALIZED_STRING(gMainTable.aliasList[mid])); + } if (result < 0) { limit = mid; @@ -466,10 +604,18 @@ findConverter(const char *alias, UErrorCode *pErrorCode) { * this alias in gAliasList is unique, but different standards * may map an alias to different converters. */ - if (gUntaggedConvArray[mid] & UCNV_AMBIGUOUS_ALIAS_MAP_BIT) { + if (gMainTable.untaggedConvArray[mid] & UCNV_AMBIGUOUS_ALIAS_MAP_BIT) { *pErrorCode = U_AMBIGUOUS_ALIAS_WARNING; } - return gUntaggedConvArray[mid] & UCNV_CONVERTER_INDEX_MASK; + /* State whether the canonical converter name contains an option. + This information is contained in this list in order to maintain backward & forward compatibility. */ + if (containsOption) { + UBool containsCnvOptionInfo = (UBool)gMainTable.optionTable->containsCnvOptionInfo; + *containsOption = (UBool)((containsCnvOptionInfo + && ((gMainTable.untaggedConvArray[mid] & UCNV_CONTAINS_OPTION_BIT) != 0)) + || !containsCnvOptionInfo); + } + return gMainTable.untaggedConvArray[mid] & UCNV_CONVERTER_INDEX_MASK; } } @@ -484,9 +630,9 @@ static U_INLINE UBool isAliasInList(const char *alias, uint32_t listOffset) { if (listOffset) { uint32_t currAlias; - uint32_t listCount = gTaggedAliasLists[listOffset]; + uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; /* +1 to skip listCount */ - const uint16_t *currList = gTaggedAliasLists + listOffset + 1; + const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; for (currAlias = 0; currAlias < listCount; currAlias++) { if (currList[currAlias] && ucnv_compareNames(alias, GET_STRING(currList[currAlias]))==0) @@ -513,14 +659,14 @@ findTaggedAliasListsOffset(const char *alias, const char *standard, UErrorCode * uint32_t tagNum = getTagNumber(standard); /* Make a quick guess. Hopefully they used a TR22 canonical alias. */ - convNum = findConverter(alias, &myErr); + convNum = findConverter(alias, NULL, &myErr); if (myErr != U_ZERO_ERROR) { *pErrorCode = myErr; } - if (tagNum < (gTagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gConverterListSize) { - listOffset = gTaggedAliasArray[tagNum*gConverterListSize + convNum]; - if (listOffset && gTaggedAliasLists[listOffset + 1]) { + if (tagNum < (gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gMainTable.converterListSize) { + listOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + convNum]; + if (listOffset && gMainTable.taggedAliasLists[listOffset + 1]) { return listOffset; } if (myErr == U_AMBIGUOUS_ALIAS_WARNING) { @@ -529,13 +675,13 @@ findTaggedAliasListsOffset(const char *alias, const char *standard, UErrorCode * at the highest standard affinity. This may take a while. */ - for (idx = 0; idx < gTaggedAliasArraySize; idx++) { - listOffset = gTaggedAliasArray[idx]; + for (idx = 0; idx < gMainTable.taggedAliasArraySize; idx++) { + listOffset = gMainTable.taggedAliasArray[idx]; if (listOffset && isAliasInList(alias, listOffset)) { - uint32_t currTagNum = idx/gConverterListSize; - uint32_t currConvNum = (idx - currTagNum*gConverterListSize); - uint32_t tempListOffset = gTaggedAliasArray[tagNum*gConverterListSize + currConvNum]; - if (tempListOffset && gTaggedAliasLists[tempListOffset + 1]) { + uint32_t currTagNum = idx/gMainTable.converterListSize; + uint32_t currConvNum = (idx - currTagNum*gMainTable.converterListSize); + uint32_t tempListOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + currConvNum]; + if (tempListOffset && gMainTable.taggedAliasLists[tempListOffset + 1]) { return tempListOffset; } /* else keep on looking */ @@ -564,13 +710,13 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr uint32_t tagNum = getTagNumber(standard); /* Make a quick guess. Hopefully they used a TR22 canonical alias. */ - convNum = findConverter(alias, &myErr); + convNum = findConverter(alias, NULL, &myErr); if (myErr != U_ZERO_ERROR) { *pErrorCode = myErr; } - if (tagNum < (gTagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gConverterListSize) { - listOffset = gTaggedAliasArray[tagNum*gConverterListSize + convNum]; + if (tagNum < (gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gMainTable.converterListSize) { + listOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + convNum]; if (listOffset && isAliasInList(alias, listOffset)) { return convNum; } @@ -580,10 +726,10 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr We search only in the requested tag, not the whole thing. This may take a while. */ - uint32_t convStart = (tagNum)*gConverterListSize; - uint32_t convLimit = (tagNum+1)*gConverterListSize; + uint32_t convStart = (tagNum)*gMainTable.converterListSize; + uint32_t convLimit = (tagNum+1)*gMainTable.converterListSize; for (idx = convStart; idx < convLimit; idx++) { - listOffset = gTaggedAliasArray[idx]; + listOffset = gMainTable.taggedAliasArray[idx]; if (listOffset && isAliasInList(alias, listOffset)) { return idx-convStart; } @@ -600,11 +746,11 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr U_CFUNC const char * -ucnv_io_getConverterName(const char *alias, UErrorCode *pErrorCode) { +ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) { if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { - uint32_t convNum = findConverter(alias, pErrorCode); - if (convNum < gConverterListSize) { - return GET_STRING(gConverterList[convNum]); + uint32_t convNum = findConverter(alias, containsOption, pErrorCode); + if (convNum < gMainTable.converterListSize) { + return GET_STRING(gMainTable.converterList[convNum]); } /* else converter not found */ } @@ -618,7 +764,7 @@ ucnv_io_countStandardAliases(UEnumeration *enumerator, UErrorCode *pErrorCode) { uint32_t listOffset = myContext->listOffset; if (listOffset) { - value = gTaggedAliasLists[listOffset]; + value = gMainTable.taggedAliasLists[listOffset]; } return value; } @@ -632,8 +778,8 @@ ucnv_io_nextStandardAliases(UEnumeration *enumerator, uint32_t listOffset = myContext->listOffset; if (listOffset) { - uint32_t listCount = gTaggedAliasLists[listOffset]; - const uint16_t *currList = gTaggedAliasLists + listOffset + 1; + uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; + const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; if (myContext->listIdx < listCount) { const char *myStr = GET_STRING(currList[myContext->listIdx++]); @@ -644,7 +790,9 @@ ucnv_io_nextStandardAliases(UEnumeration *enumerator, } } /* Either we accessed a zero length list, or we enumerated too far. */ - *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + if (resultLength) { + *resultLength = 0; + } return NULL; } @@ -682,7 +830,7 @@ ucnv_openStandardNames(const char *convName, /* When listOffset == 0, we want to acknowledge that the converter name and standard are okay, but there is nothing to enumerate. */ - if (listOffset < gTaggedAliasListsSize) { + if (listOffset < gMainTable.taggedAliasListsSize) { UAliasContext *myContext; myEnum = uprv_malloc(sizeof(UEnumeration)); @@ -706,16 +854,16 @@ ucnv_openStandardNames(const char *convName, return myEnum; } -U_CFUNC uint16_t +static uint16_t ucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode) { if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { - uint32_t convNum = findConverter(alias, pErrorCode); - if (convNum < gConverterListSize) { + uint32_t convNum = findConverter(alias, NULL, pErrorCode); + if (convNum < gMainTable.converterListSize) { /* tagListNum - 1 is the ALL tag */ - int32_t listOffset = gTaggedAliasArray[(gTagListSize - 1)*gConverterListSize + convNum]; + int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum]; if (listOffset) { - return gTaggedAliasLists[listOffset]; + return gMainTable.taggedAliasLists[listOffset]; } /* else this shouldn't happen. internal program error */ } @@ -724,19 +872,19 @@ ucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode) { return 0; } -U_CFUNC uint16_t +static uint16_t ucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErrorCode *pErrorCode) { if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { uint32_t currAlias; - uint32_t convNum = findConverter(alias, pErrorCode); - if (convNum < gConverterListSize) { + uint32_t convNum = findConverter(alias, NULL, pErrorCode); + if (convNum < gMainTable.converterListSize) { /* tagListNum - 1 is the ALL tag */ - int32_t listOffset = gTaggedAliasArray[(gTagListSize - 1)*gConverterListSize + convNum]; + int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum]; if (listOffset) { - uint32_t listCount = gTaggedAliasLists[listOffset]; + uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; /* +1 to skip listCount */ - const uint16_t *currList = gTaggedAliasLists + listOffset + 1; + const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; for (currAlias = start; currAlias < listCount; currAlias++) { aliases[currAlias] = GET_STRING(currList[currAlias]); @@ -749,18 +897,18 @@ ucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErr return 0; } -U_CFUNC const char * +static const char * ucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode) { if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { - uint32_t convNum = findConverter(alias, pErrorCode); - if (convNum < gConverterListSize) { + uint32_t convNum = findConverter(alias, NULL, pErrorCode); + if (convNum < gMainTable.converterListSize) { /* tagListNum - 1 is the ALL tag */ - int32_t listOffset = gTaggedAliasArray[(gTagListSize - 1)*gConverterListSize + convNum]; + int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum]; if (listOffset) { - uint32_t listCount = gTaggedAliasLists[listOffset]; + uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; /* +1 to skip listCount */ - const uint16_t *currList = gTaggedAliasLists + listOffset + 1; + const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; if (n < listCount) { return GET_STRING(currList[n]); @@ -774,11 +922,11 @@ ucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode) { return NULL; } -U_CFUNC uint16_t +static uint16_t ucnv_io_countStandards(UErrorCode *pErrorCode) { if (haveAliasData(pErrorCode)) { /* Don't include the empty list */ - return (uint16_t)(gTagListSize - UCNV_NUM_HIDDEN_TAGS); + return (uint16_t)(gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS); } return 0; @@ -787,8 +935,8 @@ ucnv_io_countStandards(UErrorCode *pErrorCode) { U_CAPI const char * U_EXPORT2 ucnv_getStandard(uint16_t n, UErrorCode *pErrorCode) { if (haveAliasData(pErrorCode)) { - if (n < gTagListSize - UCNV_NUM_HIDDEN_TAGS) { - return GET_STRING(gTagList[n]); + if (n < gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) { + return GET_STRING(gMainTable.tagList[n]); } *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; } @@ -801,8 +949,8 @@ ucnv_getStandardName(const char *alias, const char *standard, UErrorCode *pError if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { uint32_t listOffset = findTaggedAliasListsOffset(alias, standard, pErrorCode); - if (0 < listOffset && listOffset < gTaggedAliasListsSize) { - const uint16_t *currList = gTaggedAliasLists + listOffset + 1; + if (0 < listOffset && listOffset < gMainTable.taggedAliasListsSize) { + const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; /* Get the preferred name from this list */ if (currList[0]) { @@ -847,8 +995,8 @@ ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErro if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { uint32_t convNum = findTaggedConverterNum(alias, standard, pErrorCode); - if (convNum < gConverterListSize) { - return GET_STRING(gConverterList[convNum]); + if (convNum < gMainTable.converterListSize) { + return GET_STRING(gMainTable.converterList[convNum]); } } @@ -857,7 +1005,7 @@ ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErro static int32_t U_CALLCONV ucnv_io_countAllConverters(UEnumeration *enumerator, UErrorCode *pErrorCode) { - return gConverterListSize; + return gMainTable.converterListSize; } static const char* U_CALLCONV @@ -867,15 +1015,17 @@ ucnv_io_nextAllConverters(UEnumeration *enumerator, { uint16_t *myContext = (uint16_t *)(enumerator->context); - if (*myContext < gConverterListSize) { - const char *myStr = GET_STRING(gConverterList[(*myContext)++]); + if (*myContext < gMainTable.converterListSize) { + const char *myStr = GET_STRING(gMainTable.converterList[(*myContext)++]); if (resultLength) { *resultLength = (int32_t)uprv_strlen(myStr); } return myStr; } /* Either we accessed a zero length list, or we enumerated too far. */ - *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + if (resultLength) { + *resultLength = 0; + } return NULL; } @@ -921,7 +1071,7 @@ ucnv_openAllNames(UErrorCode *pErrorCode) { U_CFUNC uint16_t ucnv_io_countTotalAliases(UErrorCode *pErrorCode) { if (haveAliasData(pErrorCode)) { - return (uint16_t)gAliasListSize; + return (uint16_t)gMainTable.aliasListSize; } return 0; } @@ -1012,22 +1162,23 @@ ucnv_swapAliases(const UDataSwapper *ds, } inTable=(const uint16_t *)((const char *)inData+headerSize); + uprv_memset(toc, 0, sizeof(toc)); toc[tocLengthIndex]=tocLength=ds->readUInt32(((const uint32_t *)inTable)[tocLengthIndex]); - if(tocLength<minTocLength) { - udata_printError(ds, "ucnv_swapAliases(): table of contents too short (%u sections)\n", tocLength); + if(tocLength<minTocLength || offsetsCount<=tocLength) { + udata_printError(ds, "ucnv_swapAliases(): table of contents contains unsupported number of sections (%u sections)\n", tocLength); *pErrorCode=U_INVALID_FORMAT_ERROR; return 0; } /* read the known part of the table of contents */ - for(i=converterListIndex; i<=minTocLength; ++i) { + for(i=converterListIndex; i<=tocLength; ++i) { toc[i]=ds->readUInt32(((const uint32_t *)inTable)[i]); } /* compute offsets */ - offsets[tocLengthIndex]=0; + uprv_memset(offsets, 0, sizeof(offsets)); offsets[converterListIndex]=2*(1+tocLength); /* count two 16-bit units per toc entry */ - for(i=tagListIndex; i<=stringTableIndex; ++i) { + for(i=tagListIndex; i<=tocLength; ++i) { offsets[i]=offsets[i-1]+toc[i-1]; } @@ -1052,8 +1203,8 @@ ucnv_swapAliases(const UDataSwapper *ds, /* swap the entire table of contents */ ds->swapArray32(ds, inTable, 4*(1+tocLength), outTable, pErrorCode); - /* swap strings */ - ds->swapInvChars(ds, inTable+offsets[stringTableIndex], 2*(int32_t)toc[stringTableIndex], + /* swap unormalized strings & normalized strings */ + ds->swapInvChars(ds, inTable+offsets[stringTableIndex], 2*(int32_t)(toc[stringTableIndex]+toc[normalizedStringTableIndex]), outTable+offsets[stringTableIndex], pErrorCode); if(U_FAILURE(*pErrorCode)) { udata_printError(ds, "ucnv_swapAliases().swapInvChars(charset names) failed\n"); diff --git a/Build/source/libs/icu-xetex/common/ucnv_io.h b/Build/source/libs/icu-xetex/common/ucnv_io.h index da44b0c729f..91bc6e5916a 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_io.h +++ b/Build/source/libs/icu-xetex/common/ucnv_io.h @@ -1,13 +1,13 @@ /* ********************************************************************** - * Copyright (C) 1999-2005, International Business Machines + * Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * * * ucnv_io.h: - * defines variables and functions pertaining to file access, and name resolution - * aspect of the library + * defines variables and functions pertaining to converter name resolution + * aspect of the conversion code */ #ifndef UCNV_IO_H @@ -20,16 +20,51 @@ #include "udataswp.h" #define UCNV_AMBIGUOUS_ALIAS_MAP_BIT 0x8000 +#define UCNV_CONTAINS_OPTION_BIT 0x4000 #define UCNV_CONVERTER_INDEX_MASK 0xFFF #define UCNV_NUM_RESERVED_TAGS 2 #define UCNV_NUM_HIDDEN_TAGS 1 +enum { + UCNV_IO_UNNORMALIZED, + UCNV_IO_STD_NORMALIZED, + UCNV_IO_NORM_TYPE_COUNT +}; + +typedef struct { + uint16_t stringNormalizationType; + uint16_t containsCnvOptionInfo; +} UConverterAliasOptions; + +typedef struct UConverterAlias { + const uint16_t *converterList; + const uint16_t *tagList; + const uint16_t *aliasList; + const uint16_t *untaggedConvArray; + const uint16_t *taggedAliasArray; + const uint16_t *taggedAliasLists; + const UConverterAliasOptions *optionTable; + const uint16_t *stringTable; + const uint16_t *normalizedStringTable; + + uint32_t converterListSize; + uint32_t tagListSize; + uint32_t aliasListSize; + uint32_t untaggedConvArraySize; + uint32_t taggedAliasArraySize; + uint32_t taggedAliasListsSize; + uint32_t optionTableSize; + uint32_t stringTableSize; + uint32_t normalizedStringTableSize; +} UConverterAlias; + /** * \var ucnv_io_stripForCompare * Remove the underscores, dashes and spaces from the name, and convert * the name to lower case. * @param dst The destination buffer, which is <= the buffer of name. * @param dst The destination buffer, which is <= the buffer of name. + * @see ucnv_compareNames * @return the destination buffer. */ #if U_CHARSET_FAMILY==U_ASCII_FAMILY @@ -40,10 +75,10 @@ # error U_CHARSET_FAMILY is not valid #endif -U_CFUNC char * U_EXPORT2 +U_CAPI char * U_EXPORT2 ucnv_io_stripASCIIForCompare(char *dst, const char *name); -U_CFUNC char * U_EXPORT2 +U_CAPI char * U_EXPORT2 ucnv_io_stripEBCDICForCompare(char *dst, const char *name); /** @@ -52,59 +87,16 @@ ucnv_io_stripEBCDICForCompare(char *dst, const char *name); * is returned in mixed-case. * Returns NULL if the alias is not found. * @param alias The alias name to be searched. + * @param containsOption A return value stating whether the returned converter name contains an option (a comma) * @param pErrorCode The error code * @return the converter name in mixed-case, return NULL if the alias is not found. */ U_CFUNC const char * -ucnv_io_getConverterName(const char *alias, UErrorCode *pErrorCode); - -/** - * The count for ucnv_io_getAliases and ucnv_io_getAlias - * @param alias The alias name to be counted - * @param pErrorCode The error code - * @return the alias count - */ -U_CFUNC uint16_t -ucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode); - -/** - * Search case-insensitively for a converter alias and set aliases to - * a pointer to the list of aliases for the actual converter. - * The first "alias" is the canonical converter name. - * The aliases are stored consecutively, in mixed case, each NUL-terminated. - * There are as many strings in this list as the return value specifies. - * Returns the number of aliases including the canonical converter name, - * or 0 if the alias is not found. - * @param alias The canonical converter name - * @param start - * @param aliases A pointer to the list of aliases for the actual converter - * @return the number of aliases including the canonical converter name, or 0 if the alias is not found. - */ -U_CFUNC uint16_t -ucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErrorCode *pErrorCode); - -/** - * Search case-insensitively for a converter alias and return - * the (n)th alias. - * Returns NULL if the alias is not found. - * @param alias The converter alias - * @param n The number specifies which alias to get - * @param pErrorCode The error code - * @return the (n)th alias and return NULL if the alias is not found. - */ -U_CFUNC const char * -ucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode); - -/** - * Return the number of all standard names. - * @param pErrorCode The error code - * @return the number of all standard names - */ -U_CFUNC uint16_t -ucnv_io_countStandards(UErrorCode *pErrorCode); +ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode); /** - * Return the number of all aliases (and converter names). + * Return the number of all aliases and converter names. + * This is helpful if you need a number for creating an alias table. * @param pErrorCode The error code * @return the number of all aliases */ @@ -112,7 +104,7 @@ U_CFUNC uint16_t ucnv_io_countTotalAliases(UErrorCode *pErrorCode); /** - * Swap an ICU converter alias table. See ucnv_io.c. + * Swap an ICU converter alias table. See implementation for details. * @internal */ U_CAPI int32_t U_EXPORT2 diff --git a/Build/source/libs/icu-xetex/common/ucnv_lmb.c b/Build/source/libs/icu-xetex/common/ucnv_lmb.c index 8f4db1cd38a..79606af2894 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_lmb.c +++ b/Build/source/libs/icu-xetex/common/ucnv_lmb.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2004, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_lmb.cpp @@ -1016,9 +1016,8 @@ static UChar32 _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, UErrorCode* err) { - UChar32 uniChar = 0; /* an output UNICODE char */ - ulmbcs_byte_t CurByte; /* A byte from the input stream */ - const char * saveSource; + UChar32 uniChar = 0; /* an output UNICODE char */ + ulmbcs_byte_t CurByte; /* A byte from the input stream */ /* error check */ if (args->source >= args->sourceLimit) @@ -1027,7 +1026,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, return 0xffff; } /* Grab first byte & save address for error recovery */ - CurByte = *((ulmbcs_byte_t *) (saveSource = args->source++)); + CurByte = *((ulmbcs_byte_t *) (args->source++)); /* * at entry of each if clause: @@ -1046,7 +1045,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, || CurByte == ULMBCS_HT || CurByte == ULMBCS_CR || CurByte == ULMBCS_LF || CurByte == ULMBCS_123SYSTEMRANGE) { - uniChar = CurByte; + uniChar = CurByte; } else { diff --git a/Build/source/libs/icu-xetex/common/ucnv_u16.c b/Build/source/libs/icu-xetex/common/ucnv_u16.c index 93123b596cb..6fc9e2a4493 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_u16.c +++ b/Build/source/libs/icu-xetex/common/ucnv_u16.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u16.c @@ -35,15 +35,16 @@ enum { # define _UTF16PEFromUnicodeWithOffsets _UTF16LEFromUnicodeWithOffsets #endif + static void _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; const UChar *source; - uint8_t *target; + char *target; int32_t *offsets; - int32_t targetCapacity, length, sourceIndex; + uint32_t targetCapacity, length, sourceIndex; UChar c, trail; char overflow[4]; @@ -67,13 +68,13 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, cnv->fromUnicodeStatus=0; } - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - if(targetCapacity<=0) { + target=pArgs->target; + if(target >= pArgs->targetLimit) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } - target=(uint8_t *)pArgs->target; + targetCapacity=(uint32_t)(pArgs->targetLimit-target); offsets=pArgs->offsets; sourceIndex=0; @@ -101,7 +102,7 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(c==0) { /* copy an even number of bytes for complete UChars */ - int32_t count=2*length; + uint32_t count=2*length; if(count>targetCapacity) { count=targetCapacity&~1; } @@ -226,7 +227,7 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, (char **)&target, pArgs->targetLimit, &offsets, sourceIndex, pErrorCode); - targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target); + targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); } if(U_SUCCESS(*pErrorCode) && source<pArgs->sourceLimit && targetCapacity==0) { @@ -247,7 +248,7 @@ _UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UChar *target; int32_t *offsets; - int32_t targetCapacity, length, count, sourceIndex; + uint32_t targetCapacity, length, count, sourceIndex; UChar c, trail; cnv=pArgs->converter; @@ -258,13 +259,13 @@ _UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, return; } - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - if(targetCapacity<=0) { + target=pArgs->target; + if(target >= pArgs->targetLimit) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } - target=pArgs->target; + targetCapacity=(uint32_t)(pArgs->targetLimit-target); offsets=pArgs->offsets; sourceIndex=0; c=0; @@ -594,10 +595,10 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; const UChar *source; - uint8_t *target; + char *target; int32_t *offsets; - int32_t targetCapacity, length, sourceIndex; + uint32_t targetCapacity, length, sourceIndex; UChar c, trail; char overflow[4]; @@ -621,13 +622,13 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, cnv->fromUnicodeStatus=0; } - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - if(targetCapacity<=0) { + target=pArgs->target; + if(target >= pArgs->targetLimit) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } - target=(uint8_t *)pArgs->target; + targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target); offsets=pArgs->offsets; sourceIndex=0; @@ -655,7 +656,7 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(c==0) { /* copy an even number of bytes for complete UChars */ - int32_t count=2*length; + uint32_t count=2*length; if(count>targetCapacity) { count=targetCapacity&~1; } @@ -777,10 +778,10 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* output length bytes with overflow (length>targetCapacity>0) */ ucnv_fromUWriteBytes(cnv, overflow, length, - (char **)&target, pArgs->targetLimit, + &target, pArgs->targetLimit, &offsets, sourceIndex, pErrorCode); - targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target); + targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); } if(U_SUCCESS(*pErrorCode) && source<pArgs->sourceLimit && targetCapacity==0) { @@ -789,7 +790,7 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target=target; pArgs->offsets=offsets; } @@ -801,7 +802,7 @@ _UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UChar *target; int32_t *offsets; - int32_t targetCapacity, length, count, sourceIndex; + uint32_t targetCapacity, length, count, sourceIndex; UChar c, trail; cnv=pArgs->converter; @@ -812,13 +813,13 @@ _UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, return; } - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); - if(targetCapacity<=0) { + target=pArgs->target; + if(target >= pArgs->targetLimit) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } - target=pArgs->target; + targetCapacity=(uint32_t)(pArgs->targetLimit-pArgs->target); offsets=pArgs->offsets; sourceIndex=0; c=0; diff --git a/Build/source/libs/icu-xetex/common/ucnv_u32.c b/Build/source/libs/icu-xetex/common/ucnv_u32.c index 223f923fdce..034bf9bbcb9 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_u32.c +++ b/Build/source/libs/icu-xetex/common/ucnv_u32.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u32.c @@ -51,9 +51,10 @@ T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, unsigned char *toUBytes = args->converter->toUBytes; uint32_t ch, i; - /* UTF-8 returns here for only non-offset, this needs to change.*/ + /* Restore state of current sequence */ if (args->converter->toUnicodeStatus && myTarget < targetLimit) { i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ args->converter->toUnicodeStatus = 0; @@ -131,8 +132,10 @@ T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, uint32_t ch, i; int32_t offsetNum = 0; + /* Restore state of current sequence */ if (args->converter->toUnicodeStatus && myTarget < targetLimit) { i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; ch = args->converter->toUnicodeStatus - 1;/*Stores the previously calculated ch from a previous call*/ args->converter->toUnicodeStatus = 0; @@ -510,10 +513,11 @@ T_UConverter_toUnicode_UTF32_LE(UConverterToUnicodeArgs * args, unsigned char *toUBytes = args->converter->toUBytes; uint32_t ch, i; - /* UTF-8 returns here for only non-offset, this needs to change.*/ + /* Restore state of current sequence */ if (args->converter->toUnicodeStatus && myTarget < targetLimit) { i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; /* Stores the previously calculated ch from a previous call*/ ch = args->converter->toUnicodeStatus - 1; @@ -596,10 +600,11 @@ T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, uint32_t ch, i; int32_t offsetNum = 0; - /* UTF-8 returns here for only non-offset, this needs to change.*/ + /* Restore state of current sequence */ if (args->converter->toUnicodeStatus && myTarget < targetLimit) { i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; /* Stores the previously calculated ch from a previous call*/ ch = args->converter->toUnicodeStatus - 1; diff --git a/Build/source/libs/icu-xetex/common/ucnv_u8.c b/Build/source/libs/icu-xetex/common/ucnv_u8.c index 8abcc604b4b..7b977019ce0 100644 --- a/Build/source/libs/icu-xetex/common/ucnv_u8.c +++ b/Build/source/libs/icu-xetex/common/ucnv_u8.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u8.c @@ -101,6 +101,7 @@ static void ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, { inBytes = args->converter->mode; /* restore # of bytes to consume */ i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; ch = args->converter->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/ args->converter->toUnicodeStatus = 0; @@ -165,7 +166,6 @@ morebytes: (isCESU8 ? i <= 3 : !UTF_IS_SURROGATE(ch))) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - args->converter->toULength = 0; if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ @@ -230,6 +230,7 @@ static void ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, { inBytes = args->converter->mode; /* restore # of bytes to consume */ i = args->converter->toULength; /* restore # of bytes consumed */ + args->converter->toULength = 0; ch = args->converter->toUnicodeStatus;/*Stores the previously calculated ch from a previous call*/ args->converter->toUnicodeStatus = 0; @@ -292,7 +293,6 @@ morebytes: (isCESU8 ? i <= 3 : !UTF_IS_SURROGATE(ch))) { /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ - args->converter->toULength = 0; if (ch <= MAXIMUM_UCS2) { /* fits in 16 bits */ @@ -349,7 +349,7 @@ U_CFUNC void ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, const UChar *sourceLimit = args->sourceLimit; const unsigned char *targetLimit = (unsigned char *) args->targetLimit; UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data); - UChar32 ch, ch2; + UChar32 ch; int16_t indexToWrite; char temp[4]; @@ -394,7 +394,6 @@ lowsurrogate: if(UTF_IS_SECOND_SURROGATE(trail)) { ++mySource; ch=UTF16_GET_PAIR_VALUE(ch, trail); - ch2 = 0; /* convert this supplementary code point */ /* exit this condition tree */ } else { @@ -466,7 +465,7 @@ U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * ar const UChar *sourceLimit = args->sourceLimit; const unsigned char *targetLimit = (unsigned char *) args->targetLimit; UBool isCESU8 = (UBool)(args->converter->sharedData == &_CESU8Data); - UChar32 ch, ch2; + UChar32 ch; int32_t offsetNum, nextSourceIndex; int16_t indexToWrite; char temp[4]; @@ -522,7 +521,6 @@ lowsurrogate: ++mySource; ++nextSourceIndex; ch=UTF16_GET_PAIR_VALUE(ch, trail); - ch2 = 0; /* convert this supplementary code point */ /* exit this condition tree */ } else { diff --git a/Build/source/libs/icu-xetex/common/ucnvhz.c b/Build/source/libs/icu-xetex/common/ucnvhz.c index 2b0b3999ece..b94811b8122 100644 --- a/Build/source/libs/icu-xetex/common/ucnvhz.c +++ b/Build/source/libs/icu-xetex/common/ucnvhz.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2004, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvhz.c @@ -53,10 +53,10 @@ typedef struct{ + UConverter* gbConverter; int32_t targetIndex; int32_t sourceIndex; UBool isEscapeAppended; - UConverter* gbConverter; UBool isStateDBCS; UBool isTargetUCharDBCS; }UConverterDataHZ; @@ -69,16 +69,11 @@ _HZOpen(UConverter *cnv, const char *name,const char *locale,uint32_t options, U cnv->fromUnicodeStatus= 0; cnv->mode=0; cnv->fromUChar32=0x0000; - cnv->extraInfo = uprv_malloc (sizeof (UConverterDataHZ)); + cnv->extraInfo = uprv_malloc(sizeof(UConverterDataHZ)); if(cnv->extraInfo != NULL){ + uprv_memset(cnv->extraInfo, 0, sizeof(UConverterDataHZ)); ((UConverterDataHZ*)cnv->extraInfo)->gbConverter = ucnv_open("ibm-1386",errorCode); - ((UConverterDataHZ*)cnv->extraInfo)->isStateDBCS = FALSE; - ((UConverterDataHZ*)cnv->extraInfo)->isEscapeAppended = FALSE; - ((UConverterDataHZ*)cnv->extraInfo)->targetIndex = 0; - ((UConverterDataHZ*)cnv->extraInfo)->sourceIndex = 0; - ((UConverterDataHZ*)cnv->extraInfo)->isTargetUCharDBCS = FALSE; } - /* test for NULL */ else { *errorCode = U_MEMORY_ALLOCATION_ERROR; return; @@ -148,7 +143,8 @@ UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UChar32 targetUniChar = 0x0000; UChar mySourceChar = 0x0000; UConverterDataHZ* myData=(UConverterDataHZ*)(args->converter->extraInfo); - + tempBuf[0]=0; + tempBuf[1]=0; if ((args->converter == NULL) || (args->targetLimit < args->target) || (mySourceLimit < args->source)){ *err = U_ILLEGAL_ARGUMENT_ERROR; return; @@ -261,9 +257,17 @@ SAVE_STATE: *err = U_ILLEGAL_CHAR_FOUND; } if(myData->isStateDBCS){ - args->converter->toUBytes[0] = (uint8_t)(tempBuf[0]-0x80); - args->converter->toUBytes[1] = (uint8_t)(tempBuf[1]-0x80); - args->converter->toULength=2; + /* this should never occur since isStateDBCS is set to true + * only after tempBuf[0] and tempBuf[1] + * are set to the input .. just to please BEAM + */ + if(tempBuf[0]==0 || tempBuf[1]==0){ + *err = U_INTERNAL_PROGRAM_ERROR; + }else{ + args->converter->toUBytes[0] = (uint8_t)(tempBuf[0]-0x80); + args->converter->toUBytes[1] = (uint8_t)(tempBuf[1]-0x80); + args->converter->toULength=2; + } } else{ args->converter->toUBytes[0] = (uint8_t)mySourceChar; @@ -295,11 +299,10 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, int32_t mySourceLength = (int32_t)(args->sourceLimit - args->source); int32_t length=0; uint32_t targetUniChar = 0x0000; - UChar32 mySourceChar = 0x0000,c=0x0000; + UChar32 mySourceChar = 0x0000; UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo; UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS; UBool oldIsTargetUCharDBCS = isTargetUCharDBCS; - UBool isEscapeAppended =FALSE; int len =0; const char* escSeq=NULL; @@ -315,7 +318,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, targetUniChar = missingCharMarker; if (myTargetIndex < targetLength){ - c=mySourceChar = (UChar) mySource[mySourceIndex++]; + mySourceChar = (UChar) mySource[mySourceIndex++]; oldIsTargetUCharDBCS = isTargetUCharDBCS; @@ -344,13 +347,13 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, len =ESC_LEN; escSeq = SB_ESCAPE; CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); - myConverterData->isEscapeAppended =isEscapeAppended =TRUE; + myConverterData->isEscapeAppended = TRUE; } else{ /* Shifting from a single byte to double byte mode*/ len =ESC_LEN; escSeq = DB_ESCAPE; CONCAT_ESCAPE_MACRO(args, myTargetIndex, targetLength, escSeq,err,len,mySourceIndex); - myConverterData->isEscapeAppended =isEscapeAppended =TRUE; + myConverterData->isEscapeAppended = TRUE; } } @@ -457,20 +460,28 @@ _HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *e *p++= UCNV_CLOSE_BRACE; convData->isTargetUCharDBCS=FALSE; } - *p++= cnv->subChar[0]; + *p++= (char)cnv->subChars[0]; ucnv_cbFromUWriteBytes(args, buffer, (int32_t)(p - buffer), offsetIndex, err); } -/* structure for SafeClone calculations */ +/* + * Structure for cloning an HZ converter into a single memory block. + * ucnv_safeClone() of the HZ converter will align the entire cloneHZStruct, + * and then ucnv_safeClone() of the sub-converter may additionally align + * subCnv inside the cloneHZStruct, for which we need the deadSpace after + * subCnv. This is because UAlignedMemory may be larger than the actually + * necessary alignment size for the platform. + * The other cloneHZStruct fields will not be moved around, + * and are aligned properly with cloneHZStruct's alignment. + */ struct cloneHZStruct { UConverter cnv; - UAlignedMemory deadSpace1; UConverter subCnv; - UAlignedMemory deadSpace2; + UAlignedMemory deadSpace; UConverterDataHZ mydata; }; @@ -494,14 +505,14 @@ _HZ_SafeClone(const UConverter *cnv, } localClone = (struct cloneHZStruct *)stackBuffer; - uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter)); + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataHZ)); localClone->cnv.extraInfo = &localClone->mydata; localClone->cnv.isExtraLocal = TRUE; /* deep-clone the sub-converter */ - size = (int32_t)sizeof(UConverter); + size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */ ((UConverterDataHZ*)localClone->cnv.extraInfo)->gbConverter = ucnv_safeClone(((UConverterDataHZ*)cnv->extraInfo)->gbConverter, &localClone->subCnv, &size, status); diff --git a/Build/source/libs/icu-xetex/common/ucnvisci.c b/Build/source/libs/icu-xetex/common/ucnvisci.c index 90b66be3c34..84a2740f605 100644 --- a/Build/source/libs/icu-xetex/common/ucnvisci.c +++ b/Build/source/libs/icu-xetex/common/ucnvisci.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2004, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvisci.c @@ -70,28 +70,28 @@ typedef enum { /** - * Enumeration for switching code pages if <ATX>+<one of below values> + * Enumeration for switching code pages if <ATR>+<one of below values> * is encountered */ typedef enum { - DEF =0x40, - RMN =0x41, - DEV =0x42, - BNG =0x43, - TML =0x44, - TLG =0x45, - ASM =0x46, - ORI =0x47, - KND =0x48, - MLM =0x49, - GJR =0x4A, - PNJ =0x4B, - ARB =0x71, - PES =0x72, - URD =0x73, - SND =0x74, - KSM =0x75, - PST =0x76 + DEF = 0x40, + RMN = 0x41, + DEV = 0x42, + BNG = 0x43, + TML = 0x44, + TLG = 0x45, + ASM = 0x46, + ORI = 0x47, + KND = 0x48, + MLM = 0x49, + GJR = 0x4A, + PNJ = 0x4B, + ARB = 0x71, + PES = 0x72, + URD = 0x73, + SND = 0x74, + KSM = 0x75, + PST = 0x76 }ISCIILang; typedef enum{ @@ -116,10 +116,18 @@ typedef struct{ MaskEnum currentMaskToUnicode; /* mask for current state in toUnicode */ MaskEnum defMaskToUnicode; /* mask for default state in toUnicode */ UBool isFirstBuffer; /* boolean for fromUnicode to see if we need to announce the first script */ + UBool resetToDefaultToUnicode; /* boolean for reseting to default delta and mask when a newline is encountered*/ char name[30]; }UConverterDataISCII; -static const uint16_t lookupInitialData[][3]={ +typedef struct LookupDataStruct +{ + UniLang uniLang; + MaskEnum maskEnum; + ISCIILang isciiLang; +} LookupDataStruct; + +static const LookupDataStruct lookupInitialData[]={ { DEVANAGARI, DEV_MASK, DEV }, { BENGALI, BNG_MASK, BNG }, { GURMUKHI, PNJ_MASK, PNJ }, @@ -141,15 +149,16 @@ _ISCIIOpen(UConverter *cnv, const char *name,const char *locale,uint32_t options converterData->contextCharToUnicode=NO_CHAR_MARKER; cnv->toUnicodeStatus = missingCharMarker; converterData->contextCharFromUnicode=0x0000; + converterData->resetToDefaultToUnicode=FALSE; /* check if the version requested is supported */ if((options & UCNV_OPTIONS_VERSION_MASK) < 9){ /* initialize state variables */ converterData->currentDeltaFromUnicode=converterData->currentDeltaToUnicode= converterData->defDeltaToUnicode= - (uint16_t)(lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK][0] * DELTA); + (uint16_t)(lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK].uniLang * DELTA); converterData->currentMaskFromUnicode = converterData->currentMaskToUnicode = - converterData->defMaskToUnicode=lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK][1]; + converterData->defMaskToUnicode=lookupInitialData[options & UCNV_OPTIONS_VERSION_MASK].maskEnum; converterData->isFirstBuffer=TRUE; uprv_strcpy(converterData->name,"ISCII,version="); @@ -198,9 +207,10 @@ _ISCIIReset(UConverter *cnv, UConverterResetChoice choice){ if(choice!=UCNV_RESET_TO_UNICODE) { cnv->fromUChar32=0x0000; data->contextCharFromUnicode=0x00; - data->currentMaskFromUnicode=data->defDeltaToUnicode; + data->currentMaskFromUnicode=data->defMaskToUnicode; data->currentDeltaFromUnicode=data->defDeltaToUnicode; data->isFirstBuffer=TRUE; + data->resetToDefaultToUnicode=FALSE; } } @@ -809,7 +819,6 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, int32_t* offsets = args->offsets; uint32_t targetByteUnit = 0x0000; UChar32 sourceChar = 0x0000; - UBool useFallback; UConverterDataISCII *converterData; uint16_t newDelta=0; uint16_t range = 0; @@ -821,7 +830,6 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, } /* initialize data */ converterData=(UConverterDataISCII*)args->converter->extraInfo; - useFallback = args->converter->useFallback; newDelta=converterData->currentDeltaFromUnicode; range = (uint16_t)(newDelta/DELTA); @@ -844,7 +852,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, } if(sourceChar == LF){ targetByteUnit = ATR<<8; - targetByteUnit += (uint8_t) lookupInitialData[range][2]; + targetByteUnit += (uint8_t) lookupInitialData[range].isciiLang; args->converter->fromUnicodeStatus=sourceChar; /* now append ATR and language code */ WRITE_TO_TARGET_FROM_U(args,offsets,source,target,targetLimit,targetByteUnit,err); @@ -890,7 +898,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, /* Now are we in the same block as the previous? */ if(newDelta!= converterData->currentDeltaFromUnicode || converterData->isFirstBuffer){ converterData->currentDeltaFromUnicode = newDelta; - converterData->currentMaskFromUnicode = lookupInitialData[range][1]; + converterData->currentMaskFromUnicode = lookupInitialData[range].maskEnum; deltaChanged =TRUE; converterData->isFirstBuffer=FALSE; } @@ -916,7 +924,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, */ uint16_t temp=0; temp =(uint16_t)(ATR<<8); - temp += (uint16_t)((uint8_t) lookupInitialData[range][2]); + temp += (uint16_t)((uint8_t) lookupInitialData[range].isciiLang); /* reset */ deltaChanged=FALSE; /* now append ATR and language code */ @@ -997,8 +1005,10 @@ static const int32_t lookupTable[][2]={ { BENGALI, BNG_MASK }, { ORIYA, ORI_MASK }, { KANNADA, KND_MASK }, + { MALAYALAM, MLM_MASK }, { GUJARATI, GJR_MASK }, - { GURMUKHI, PNJ_MASK }, + { GURMUKHI, PNJ_MASK } + }; #define WRITE_TO_TARGET_TO_U(args,source,target,offsets,offset,targetUniChar,delta, err){\ @@ -1099,7 +1109,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, data->currentDeltaToUnicode = (uint16_t)(lookupTable[sourceChar & 0x0F][0] * DELTA); data->currentMaskToUnicode = - lookupTable[sourceChar & 0x0F][1] ; + (MaskEnum)lookupTable[sourceChar & 0x0F][1] ; } else if(sourceChar==DEF){ /* switch back to default */ @@ -1200,6 +1210,14 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, *contextCharToUnicode = sourceChar; } break; + case 0x0A: + /* fall through */ + case 0x0D: + data->resetToDefaultToUnicode = TRUE; + GET_MAPPING(sourceChar,targetUniChar,data); + *contextCharToUnicode = sourceChar; + break; + case ISCII_NUKTA: /* handle soft halant */ if(*contextCharToUnicode == ISCII_HALANT){ @@ -1221,7 +1239,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(found){ /* find out if the mapping is valid in this state */ if(validityTable[(uint8_t)targetUniChar] & data->currentMaskToUnicode){ - targetUniChar += data->currentDeltaToUnicode ; + /*targetUniChar += data->currentDeltaToUnicode ;*/ *contextCharToUnicode= NO_CHAR_MARKER; *toUnicodeStatus = missingCharMarker; break; @@ -1248,6 +1266,11 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(targetUniChar != missingCharMarker ){ /* now save the targetUniChar for delayed write */ *toUnicodeStatus = (UChar) targetUniChar; + if(data->resetToDefaultToUnicode==TRUE){ + data->currentDeltaToUnicode = data->defDeltaToUnicode; + data->currentMaskToUnicode = data->defMaskToUnicode; + data->resetToDefaultToUnicode=FALSE; + } }else{ /* we reach here only if targetUniChar == missingCharMarker @@ -1321,7 +1344,7 @@ _ISCII_SafeClone(const UConverter *cnv, } localClone = (struct cloneISCIIStruct *)stackBuffer; - uprv_memcpy(&localClone->cnv, cnv, sizeof(UConverter)); + /* ucnv.c/ucnv_safeClone() copied the main UConverter already */ uprv_memcpy(&localClone->mydata, cnv->extraInfo, sizeof(UConverterDataISCII)); localClone->cnv.extraInfo = &localClone->mydata; @@ -1343,7 +1366,7 @@ _ISCIIGetUnicodeSet(const UConverter *cnv, scripts, we add all roundtrippable characters to this set. */ sa->addRange(sa->set, 0, ASCII_END); for (script = DEVANAGARI; script <= MALAYALAM; script++) { - mask = (uint8_t)(lookupInitialData[script][1]); + mask = (uint8_t)(lookupInitialData[script].maskEnum); for (idx = 0; idx < DELTA; idx++) { if (validityTable[idx] & mask) { sa->add(sa->set, idx + (script * DELTA) + INDIC_BLOCK_BEGIN); diff --git a/Build/source/libs/icu-xetex/common/ucnvmbcs.c b/Build/source/libs/icu-xetex/common/ucnvmbcs.c index a220a3bde3c..84bae8a9f25 100644 --- a/Build/source/libs/icu-xetex/common/ucnvmbcs.c +++ b/Build/source/libs/icu-xetex/common/ucnvmbcs.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2004, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -589,7 +589,7 @@ ucnv_MBCSGetUnicodeSet(const UConverter *cnv, * Definition of LINEAR macros and gb18030Ranges see near the beginning of the file. * * In the future, conversion extensions may handle m:n mappings and delta tables, - * see http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/conversion/conversion_extensions.html + * see http://dev.icu-project.org/cgi-bin/viewcvs.cgi/~checkout~/icuhtml/design/conversion/conversion_extensions.html * * If an input character cannot be mapped, then these functions set an error * code. The framework will then call the callback function. @@ -3877,7 +3877,7 @@ ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, length=1; } else { /* select subChar in all other cases */ - subchar=(char *)cnv->subChar; + subchar=(char *)cnv->subChars; length=cnv->subCharLen; } diff --git a/Build/source/libs/icu-xetex/common/ucnvscsu.c b/Build/source/libs/icu-xetex/common/ucnvscsu.c index 191435fee2e..910a4920225 100644 --- a/Build/source/libs/icu-xetex/common/ucnvscsu.c +++ b/Build/source/libs/icu-xetex/common/ucnvscsu.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2005, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -205,6 +205,10 @@ _SCSUOpen(UConverter *cnv, } else { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; } + + /* Set the substitution character U+fffd as a Unicode string. */ + cnv->subUChars[0]=0xfffd; + cnv->subCharLen=-1; } static void @@ -1433,11 +1437,14 @@ outputBytes: * first to the overflow buffer what does not fit into the * regular target. */ - /* we know that 1<=targetCapacity<length<=4 */ + /* we know that 0<=targetCapacity<length<=4 */ + /* targetCapacity==0 when SCU+supplementary where SCU used up targetCapacity==1 */ length-=targetCapacity; p=(uint8_t *)cnv->charErrorBuffer; switch(length) { /* each branch falls through to the next one */ + case 4: + *p++=(uint8_t)(c>>24); case 3: *p++=(uint8_t)(c>>16); case 2: @@ -1470,7 +1477,6 @@ outputBytes: *offsets++=sourceIndex; } default: - /* will never occur */ break; } @@ -1868,11 +1874,14 @@ outputBytes: * first to the overflow buffer what does not fit into the * regular target. */ - /* we know that 1<=targetCapacity<length<=4 */ + /* we know that 0<=targetCapacity<length<=4 */ + /* targetCapacity==0 when SCU+supplementary where SCU used up targetCapacity==1 */ length-=targetCapacity; p=(uint8_t *)cnv->charErrorBuffer; switch(length) { /* each branch falls through to the next one */ + case 4: + *p++=(uint8_t)(c>>24); case 3: *p++=(uint8_t)(c>>16); case 2: @@ -1896,7 +1905,6 @@ outputBytes: case 1: *target++=(uint8_t)c; default: - /* will never occur */ break; } @@ -1922,30 +1930,6 @@ _SCSUGetName(const UConverter *cnv) { } } -static void -_SCSUWriteSub(UConverterFromUnicodeArgs *pArgs, - int32_t offsetIndex, - UErrorCode *pErrorCode) { - static const char squ_fffd[]={ (char)SQU, (char)0xffu, (char)0xfdu }; - - /* - * The substitution character is U+fffd={ ff, fd }. - * If the SCSU converter is in Unicode mode, then these two bytes just need to - * be written. Otherwise, this character is quoted. - */ - if(((SCSUData *)pArgs->converter->extraInfo)->fromUIsSingleByteMode) { - /* single-byte mode: quote Unicode */ - ucnv_cbFromUWriteBytes(pArgs, - squ_fffd, 3, - offsetIndex, pErrorCode); - } else { - /* Unicode mode: just write U+fffd */ - ucnv_cbFromUWriteBytes(pArgs, - squ_fffd+1, 2, - offsetIndex, pErrorCode); - } -} - /* structure for SafeClone calculations */ struct cloneSCSUStruct { @@ -2000,7 +1984,7 @@ static const UConverterImpl _SCSUImpl={ NULL, _SCSUGetName, - _SCSUWriteSub, + NULL, _SCSUSafeClone, ucnv_getCompleteUnicodeSet }; @@ -2012,10 +1996,8 @@ static const UConverterStaticData _SCSUStaticData={ UCNV_IBM, UCNV_SCSU, 1, 3, /* one UChar generates at least 1 byte and at most 3 bytes */ /* - * ### TODO the subchar really must be written by an SCSU function - * however, currently SCSU's fromUnicode() never causes errors, therefore - * no callbacks will be called and no subchars written - * See Jitterbug 2837 - RFE: forbid converting surrogate code points in all charsets + * The subchar here is ignored because _SCSUOpen() sets U+fffd as a Unicode + * substitution string. */ { 0x0e, 0xff, 0xfd, 0 }, 3, FALSE, FALSE, diff --git a/Build/source/libs/icu-xetex/common/ucol_swp.c b/Build/source/libs/icu-xetex/common/ucol_swp.c index 18e2c2cad08..3b8ac14c30f 100644 --- a/Build/source/libs/icu-xetex/common/ucol_swp.c +++ b/Build/source/libs/icu-xetex/common/ucol_swp.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2003, International Business Machines +* Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -16,17 +16,92 @@ * Swap collation binaries. */ -#include "unicode/utypes.h" - -#if !UCONFIG_NO_COLLATION - #include "unicode/udata.h" /* UDataInfo */ -#include "cmemory.h" #include "utrie.h" #include "udataswp.h" +#include "cmemory.h" #include "ucol_imp.h" #include "ucol_swp.h" +/* swapping ----------------------------------------------------------------- */ + +/* + * This performs data swapping for a folded trie (see utrie.c for details). + */ + +U_CAPI int32_t U_EXPORT2 +utrie_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + const UTrieHeader *inTrie; + UTrieHeader trie; + int32_t size; + UBool dataIs32; + + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { + return 0; + } + if(ds==NULL || inData==NULL || (length>=0 && outData==NULL)) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* setup and swapping */ + if(length>=0 && length<sizeof(UTrieHeader)) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + inTrie=(const UTrieHeader *)inData; + trie.signature=ds->readUInt32(inTrie->signature); + trie.options=ds->readUInt32(inTrie->options); + trie.indexLength=udata_readInt32(ds, inTrie->indexLength); + trie.dataLength=udata_readInt32(ds, inTrie->dataLength); + + if( trie.signature!=0x54726965 || + (trie.options&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_SHIFT || + ((trie.options>>UTRIE_OPTIONS_INDEX_SHIFT)&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_INDEX_SHIFT || + trie.indexLength<UTRIE_BMP_INDEX_LENGTH || + (trie.indexLength&(UTRIE_SURROGATE_BLOCK_COUNT-1))!=0 || + trie.dataLength<UTRIE_DATA_BLOCK_LENGTH || + (trie.dataLength&(UTRIE_DATA_GRANULARITY-1))!=0 || + ((trie.options&UTRIE_OPTIONS_LATIN1_IS_LINEAR)!=0 && trie.dataLength<(UTRIE_DATA_BLOCK_LENGTH+0x100)) + ) { + *pErrorCode=U_INVALID_FORMAT_ERROR; /* not a UTrie */ + return 0; + } + + dataIs32=(UBool)((trie.options&UTRIE_OPTIONS_DATA_IS_32_BIT)!=0); + size=sizeof(UTrieHeader)+trie.indexLength*2+trie.dataLength*(dataIs32?4:2); + + if(length>=0) { + UTrieHeader *outTrie; + + if(length<size) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + outTrie=(UTrieHeader *)outData; + + /* swap the header */ + ds->swapArray32(ds, inTrie, sizeof(UTrieHeader), outTrie, pErrorCode); + + /* swap the index and the data */ + if(dataIs32) { + ds->swapArray16(ds, inTrie+1, trie.indexLength*2, outTrie+1, pErrorCode); + ds->swapArray32(ds, (const uint16_t *)(inTrie+1)+trie.indexLength, trie.dataLength*4, + (uint16_t *)(outTrie+1)+trie.indexLength, pErrorCode); + } else { + ds->swapArray16(ds, inTrie+1, (trie.indexLength+trie.dataLength)*2, outTrie+1, pErrorCode); + } + } + + return size; +} + +#if !UCONFIG_NO_COLLATION + /* swap a header-less collation binary, inside a resource bundle or ucadata.icu */ U_CAPI int32_t U_EXPORT2 ucol_swapBinary(const UDataSwapper *ds, diff --git a/Build/source/libs/icu-xetex/common/udata.c b/Build/source/libs/icu-xetex/common/udata.c index dd8e5d5831f..5ffd85079a0 100644 --- a/Build/source/libs/icu-xetex/common/udata.c +++ b/Build/source/libs/icu-xetex/common/udata.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -139,7 +139,6 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca uprv_free(newCommonData); } umtx_unlock(NULL); - return; } static const char * @@ -218,7 +217,7 @@ static UHashtable *udata_getHashTable() { return gCommonDataCache; } - tHT = uhash_open(uhash_hashChars, uhash_compareChars, &err); + tHT = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &err); uhash_setValueDeleter(tHT, DataCacheElement_deleter); umtx_lock(NULL); @@ -284,6 +283,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr } newElement->item = UDataMemory_createNewInstance(pErr); if (U_FAILURE(*pErr)) { + uprv_free(newElement); return NULL; } UDatamemory_assign(newElement->item, item); @@ -293,6 +293,8 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr newElement->name = uprv_malloc(nameLen+1); if (newElement->name == NULL) { *pErr = U_MEMORY_ALLOCATION_ERROR; + uprv_free(newElement->item); + uprv_free(newElement); return NULL; } uprv_strcpy(newElement->name, baseName); @@ -493,11 +495,6 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const iter->basename = findBasename(item); iter->basenameLen = (int32_t)uprv_strlen(iter->basename); - if(iter->basename == NULL) { - iter->nextPath = NULL; - return; - } - /** Item path **/ iter->itemPath = iter->itemPathBuf; if(iter->basename == item) { @@ -576,7 +573,7 @@ static const char *udata_pathiter_next(UDataPathIterator *iter) do { if( iter->nextPath == NULL ) { - return NULL; + break; } path = iter->nextPath; @@ -698,6 +695,10 @@ static void udata_pathiter_dt(UDataPathIterator *iter) { uprv_free(iter->pathBuffer); iter->pathBuffer = NULL; } + if (iter->packageStub != iter->packageStubBuf) { + uprv_free(iter->packageStub); + iter->packageStub = NULL; + } } /* ==================================================================================*/ @@ -1012,118 +1013,72 @@ checkDataItem /** * @return 0 if not loaded, 1 if loaded or err */ -static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, const char *oldIndFileName, - const char *dataPath, const char *tocEntryPathSuffix, const char *inBasename, +static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, + const char *dataPath, const char *tocEntryPathSuffix, /* following arguments are the same as doOpenChoice itself */ const char *path, const char *type, const char *name, UDataMemoryIsAcceptable *isAcceptable, void *context, UErrorCode *subErrorCode, UErrorCode *pErrorCode) { - UDataMemory *retVal = NULL; - const char *pathBuffer; - UDataMemory dataMemory; - UDataMemory *pEntryData; - - UDataPathIterator iter; - /* #1a look in ind. files: package\nam.typ ========================= */ - /* init path iterator for individual files */ - udata_pathiter_init(&iter, dataPath, pkgName, path, tocEntryPathSuffix, FALSE); - - while((pathBuffer = udata_pathiter_next(&iter))) - { -#ifdef UDATA_DEBUG - fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); -#endif - if( uprv_mapFile(&dataMemory, pathBuffer) || - (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename))) - { - pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode); - if (pEntryData != NULL) { - /* Data is good. - * Hand off ownership of the backing memory to the user's UDataMemory. - * and return it. */ - pEntryData->mapAddr = dataMemory.mapAddr; - pEntryData->map = dataMemory.map; - -#ifdef UDATA_DEBUG - fprintf(stderr, "** Mapped file: %s\n", pathBuffer); -#endif - retVal = pEntryData; - goto commonReturn; - } + UDataMemory *retVal = NULL; + const char *pathBuffer; + UDataMemory dataMemory; + UDataMemory *pEntryData; - /* the data is not acceptable, or some error occured. Either way, unmap the memory */ - udata_close(&dataMemory); + UDataPathIterator iter; + /* look in ind. files: package\nam.typ ========================= */ + /* init path iterator for individual files */ + udata_pathiter_init(&iter, dataPath, pkgName, path, tocEntryPathSuffix, FALSE); - /* If we had a nasty error, bail out completely. */ - if (U_FAILURE(*pErrorCode)) { - retVal = NULL; - goto commonReturn; - } - - /* Otherwise remember that we found data but didn't like it for some reason */ - *subErrorCode=U_INVALID_FORMAT_ERROR; - } + while((pathBuffer = udata_pathiter_next(&iter))) + { #ifdef UDATA_DEBUG - fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded"); + fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); #endif - } - udata_pathiter_dt(&iter); - - /* #1b look in ind. files - with old naming (package_nam.typ not package\nam.typ) ==================== */ - /* init path iterator for individual files */ - udata_pathiter_init(&iter, dataPath, "", path, oldIndFileName, FALSE); - - while((pathBuffer = udata_pathiter_next(&iter))) + if(uprv_mapFile(&dataMemory, pathBuffer)) { -#ifdef UDATA_DEBUG - fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); -#endif - if( uprv_mapFile(&dataMemory, pathBuffer) || - (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename))) - { - pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode); - if (pEntryData != NULL) { - /* Data is good. - * Hand off ownership of the backing memory to the user's UDataMemory. - * and return it. */ - pEntryData->mapAddr = dataMemory.mapAddr; - pEntryData->map = dataMemory.map; + pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode); + if (pEntryData != NULL) { + /* Data is good. + * Hand off ownership of the backing memory to the user's UDataMemory. + * and return it. */ + pEntryData->mapAddr = dataMemory.mapAddr; + pEntryData->map = dataMemory.map; #ifdef UDATA_DEBUG - fprintf(stderr, "** Mapped file: %s\n", pathBuffer); + fprintf(stderr, "** Mapped file: %s\n", pathBuffer); #endif - retVal = pEntryData; - goto commonReturn; - } - - /* the data is not acceptable, or some error occured. Either way, unmap the memory */ - udata_close(&dataMemory); + retVal = pEntryData; + goto commonReturn; + } - /* If we had a nasty error, bail out completely. */ - if (U_FAILURE(*pErrorCode)) { - retVal = NULL; - goto commonReturn; - } + /* the data is not acceptable, or some error occured. Either way, unmap the memory */ + udata_close(&dataMemory); - /* Otherwise remember that we found data but didn't like it for some reason */ - *subErrorCode=U_INVALID_FORMAT_ERROR; + /* If we had a nasty error, bail out completely. */ + if (U_FAILURE(*pErrorCode)) { + retVal = NULL; + goto commonReturn; } + + /* Otherwise remember that we found data but didn't like it for some reason */ + *subErrorCode=U_INVALID_FORMAT_ERROR; + } #ifdef UDATA_DEBUG - fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded"); + fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded"); #endif - } + } commonReturn: - udata_pathiter_dt(&iter); - return retVal; + udata_pathiter_dt(&iter); + return retVal; } /** * @return 0 if not loaded, 1 if loaded or err */ -static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName, const char *oldIndFileName, - const char *dataPath, const char *tocEntryPathSuffix, const char *tocEntryName, const char *inBasename, +static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName, + const char *dataPath, const char *tocEntryPathSuffix, const char *tocEntryName, /* following arguments are the same as doOpenChoice itself */ const char *path, const char *type, const char *name, UDataMemoryIsAcceptable *isAcceptable, void *context, @@ -1154,13 +1109,6 @@ static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName, c #ifdef UDATA_DEBUG fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName, pHeader, u_errorName(*subErrorCode)); #endif - if((pHeader == NULL) && !U_FAILURE(*subErrorCode)) { - pHeader=pCommonData->vFuncs->Lookup(pCommonData, oldIndFileName, /* oldIndFileName is preceded by a slash */ - &length, subErrorCode); -#ifdef UDATA_DEBUG - fprintf(stderr, "[OLD name] %s: pHeader=%p - %s\n", oldIndFileName, pHeader, u_errorName(*subErrorCode)); -#endif - } if(pHeader!=NULL) { pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode); @@ -1231,9 +1179,6 @@ doOpenChoice(const char *path, const char *type, const char *name, TinyString tocEntryName; /* entry name in tree format. ex: 'icudt28b/coll/ar.res' */ TinyString tocEntryPath; /* entry name in path format. ex: 'icudt28b\\coll\\ar.res' */ - TinyString oldIndFileName; /* ex: icudt28b_ar.res */ - TinyString oldStylePath; - TinyString oldStylePathBasename; TinyString pkgName; TinyString treeName; @@ -1243,10 +1188,8 @@ doOpenChoice(const char *path, const char *type, const char *name, const char *dataPath; - const char *tocEntrySuffix; int32_t tocEntrySuffixIndex; const char *tocEntryPathSuffix; - const char *inBasename; UErrorCode subErrorCode=U_ZERO_ERROR; const char *treeChar; @@ -1281,11 +1224,8 @@ doOpenChoice(const char *path, const char *type, const char *name, } #endif - TinyString_init(&oldIndFileName); TinyString_init(&tocEntryName); TinyString_init(&tocEntryPath); - TinyString_init(&oldStylePath); - TinyString_init(&oldStylePathBasename); TinyString_init(&pkgName); TinyString_init(&treeName); @@ -1343,7 +1283,6 @@ doOpenChoice(const char *path, const char *type, const char *name, /* prepend the package */ TinyString_append(&tocEntryName, pkgName.s); TinyString_append(&tocEntryPath, pkgName.s); - TinyString_append(&oldIndFileName, pkgName.s); tocEntrySuffixIndex = tocEntryName.length; if(treeName.s[0]) { @@ -1354,10 +1293,8 @@ doOpenChoice(const char *path, const char *type, const char *name, TinyString_append(&tocEntryPath, treeName.s); } - TinyString_append(&oldIndFileName, "_"); TinyString_append(&tocEntryName, U_TREE_ENTRY_SEP_STRING); TinyString_append(&tocEntryPath, U_FILE_SEP_STRING); - TinyString_append(&oldIndFileName, name); TinyString_append(&tocEntryName, name); TinyString_append(&tocEntryPath, name); if(type!=NULL && *type!=0) { @@ -1365,28 +1302,16 @@ doOpenChoice(const char *path, const char *type, const char *name, TinyString_append(&tocEntryName, type); TinyString_append(&tocEntryPath, "."); TinyString_append(&tocEntryPath, type); - TinyString_append(&oldIndFileName, "."); - TinyString_append(&oldIndFileName, type); } - tocEntrySuffix = tocEntryName.s+tocEntrySuffixIndex; /* suffix starts here */ tocEntryPathSuffix = tocEntryPath.s+tocEntrySuffixIndex; /* suffix starts here */ #ifdef UDATA_DEBUG fprintf(stderr, " tocEntryName = %s\n", tocEntryName.s); fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.s); - fprintf(stderr, " oldIndFileName = %s\n", oldIndFileName.s); #endif - /* try to get an individual data file */ if(path == NULL) { path = COMMON_DATA_NAME; /* "icudt26e" */ - inBasename = COMMON_DATA_NAME; - } else { - if(isICUData) { - inBasename=COMMON_DATA_NAME; - } else { - inBasename=findBasename(path); - } } /************************ Begin loop looking for ind. files ***************/ @@ -1394,33 +1319,6 @@ doOpenChoice(const char *path, const char *type, const char *name, fprintf(stderr, "IND: inBasename = %s, pkg=%s\n", inBasename, packageNameFromPath(path)); #endif - /* Deal with a null basename */ - if( (*inBasename==0) && (uprv_strlen(path) > 3) ) { - /* the purpose of this exercise is to turn /tmp/foo/bar/ into - path= /tmp/foo/bar/bar and basename= bar - (i.e. /tmp/foo/bar/bar.dat or /tmp/foo/bar/bar_en_US.res ) - */ - - char *rightSlash; - TinyString_append(&oldStylePath, path); - /* chop off trailing slash */ - oldStylePath.length--; - oldStylePath.s[oldStylePath.length] = 0; - - rightSlash = (char*)uprv_strrchr(oldStylePath.s, U_FILE_SEP_CHAR); - if(rightSlash != NULL) { - rightSlash++; - TinyString_append(&oldStylePathBasename, rightSlash); - inBasename = oldStylePathBasename.s; - TinyString_append(&oldStylePath, U_FILE_SEP_STRING); - TinyString_append(&oldStylePath, inBasename); /* one more time, for the base name */ - path = oldStylePath.s; - } else { - *pErrorCode = U_FILE_ACCESS_ERROR; /* hopelessly bad case */ - retVal = NULL; - goto commonReturn; - } - } /* End of dealing with a null basename */ dataPath = u_getDataDirectory(); @@ -1431,8 +1329,7 @@ doOpenChoice(const char *path, const char *type, const char *name, #endif /* #2 */ retVal = doLoadFromCommonData(isICUData, - pkgName.s, oldIndFileName.s, dataPath, tocEntryPathSuffix, - tocEntryName.s, inBasename, + pkgName.s, dataPath, tocEntryPathSuffix, tocEntryName.s, path, type, name, isAcceptable, context, &subErrorCode, pErrorCode); if((retVal != NULL) || U_FAILURE(*pErrorCode)) { goto commonReturn; @@ -1447,7 +1344,7 @@ doOpenChoice(const char *path, const char *type, const char *name, #endif /* Check to make sure that there is a dataPath to iterate over */ if ((dataPath && *dataPath) || !isICUData) { - retVal = doLoadFromIndividualFiles(pkgName.s, oldIndFileName.s, dataPath, tocEntryPathSuffix, inBasename, + retVal = doLoadFromIndividualFiles(pkgName.s, dataPath, tocEntryPathSuffix, path, type, name, isAcceptable, context, &subErrorCode, pErrorCode); if((retVal != NULL) || U_FAILURE(*pErrorCode)) { goto commonReturn; @@ -1462,8 +1359,7 @@ doOpenChoice(const char *path, const char *type, const char *name, fprintf(stderr, "Trying packages (UDATA_ONLY_PACKAGES || UDATA_FILES_FIRST)\n"); #endif retVal = doLoadFromCommonData(isICUData, - pkgName.s, oldIndFileName.s, dataPath, tocEntryPathSuffix, - tocEntryName.s, inBasename, + pkgName.s, dataPath, tocEntryPathSuffix, tocEntryName.s, path, type, name, isAcceptable, context, &subErrorCode, pErrorCode); if((retVal != NULL) || U_FAILURE(*pErrorCode)) { goto commonReturn; @@ -1478,8 +1374,7 @@ doOpenChoice(const char *path, const char *type, const char *name, fprintf(stderr, "Trying common data (UDATA_NO_FILES)\n"); #endif retVal = doLoadFromCommonData(isICUData, - pkgName.s, oldIndFileName.s, "", tocEntryPathSuffix, - tocEntryName.s, inBasename, + pkgName.s, "", tocEntryPathSuffix, tocEntryName.s, path, type, name, isAcceptable, context, &subErrorCode, pErrorCode); if((retVal != NULL) || U_FAILURE(*pErrorCode)) { goto commonReturn; @@ -1500,9 +1395,6 @@ doOpenChoice(const char *path, const char *type, const char *name, commonReturn: TinyString_dt(&tocEntryName); TinyString_dt(&tocEntryPath); - TinyString_dt(&oldIndFileName); - TinyString_dt(&oldStylePath); - TinyString_dt(&oldStylePathBasename); TinyString_dt(&pkgName); TinyString_dt(&treeName); #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) diff --git a/Build/source/libs/icu-xetex/common/udataswp.h b/Build/source/libs/icu-xetex/common/udataswp.h index f8389d13717..52b99aaa3cf 100644 --- a/Build/source/libs/icu-xetex/common/udataswp.h +++ b/Build/source/libs/icu-xetex/common/udataswp.h @@ -266,7 +266,7 @@ udata_printError(const UDataSwapper *ds, * Swap invariant char * strings ASCII->EBCDIC. * @internal */ -U_CFUNC int32_t +U_CAPI int32_t U_EXPORT2 uprv_ebcdicFromAscii(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, UErrorCode *pErrorCode); diff --git a/Build/source/libs/icu-xetex/common/uenumimp.h b/Build/source/libs/icu-xetex/common/uenumimp.h index 2c5cc3acaf3..664bc686644 100644 --- a/Build/source/libs/icu-xetex/common/uenumimp.h +++ b/Build/source/libs/icu-xetex/common/uenumimp.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -58,13 +58,14 @@ UEnumCount(UEnumeration *en, UErrorCode *status); /** * Function type declaration for uenum_unext(). * - * This function should return the next element - * as a UChar * + * This function returns the next element as a UChar *, + * or NULL after all elements haven been enumerated. * * @param en enumeration * @param resultLength pointer to result length * @param status pointer to UErrorCode variable - * @return next element as UChar * + * @return next element as UChar *, + * or NULL after all elements haven been enumerated */ typedef const UChar* U_CALLCONV UEnumUNext(UEnumeration* en, @@ -74,13 +75,14 @@ UEnumUNext(UEnumeration* en, /** * Function type declaration for uenum_next(). * - * This function should return the next element - * as a char * + * This function returns the next element as a char *, + * or NULL after all elements haven been enumerated. * * @param en enumeration * @param resultLength pointer to result length * @param status pointer to UErrorCode variable - * @return next element as char * + * @return next element as char *, + * or NULL after all elements haven been enumerated */ typedef const char* U_CALLCONV UEnumNext(UEnumeration* en, diff --git a/Build/source/libs/icu-xetex/common/uhash.c b/Build/source/libs/icu-xetex/common/uhash.c index f42593f0006..7907205dbc7 100644 --- a/Build/source/libs/icu-xetex/common/uhash.c +++ b/Build/source/libs/icu-xetex/common/uhash.c @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2004, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * Date Name Description @@ -83,6 +83,7 @@ static const int32_t PRIMES[] = { }; #define PRIMES_LENGTH (sizeof(PRIMES) / sizeof(PRIMES[0])) +#define DEFAULT_PRIME_INDEX 3 /* These ratios are tuned to the PRIMES array such that a resize * places the table back into the zone of non-resizing. That is, @@ -132,56 +133,414 @@ static const float RESIZE_POLICY_RATIO_TABLE[6] = { #define HINT_VALUE_POINTER (2) /******************************************************************** - * Debugging + * PRIVATE Implementation ********************************************************************/ +static UHashTok +_uhash_setElement(UHashtable *hash, UHashElement* e, + int32_t hashcode, + UHashTok key, UHashTok value, int8_t hint) { -/******************************************************************** - * PRIVATE Prototypes - ********************************************************************/ + UHashTok oldValue = e->value; + if (hash->keyDeleter != NULL && e->key.pointer != NULL && + e->key.pointer != key.pointer) { /* Avoid double deletion */ + (*hash->keyDeleter)(e->key.pointer); + } + if (hash->valueDeleter != NULL) { + if (oldValue.pointer != NULL && + oldValue.pointer != value.pointer) { /* Avoid double deletion */ + (*hash->valueDeleter)(oldValue.pointer); + } + oldValue.pointer = NULL; + } + /* Compilers should copy the UHashTok union correctly, but even if + * they do, memory heap tools (e.g. BoundsChecker) can get + * confused when a pointer is cloaked in a union and then copied. + * TO ALLEVIATE THIS, we use hints (based on what API the user is + * calling) to copy pointers when we know the user thinks + * something is a pointer. */ + if (hint & HINT_KEY_POINTER) { + e->key.pointer = key.pointer; + } else { + e->key = key; + } + if (hint & HINT_VALUE_POINTER) { + e->value.pointer = value.pointer; + } else { + e->value = value; + } + e->hashcode = hashcode; + return oldValue; +} + +/** + * Assumes that the given element is not empty or deleted. + */ +static UHashTok +_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) { + UHashTok empty; + U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode)); + --hash->count; + empty.pointer = NULL; empty.integer = 0; + return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0); +} + +static void +_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) { + U_ASSERT(hash != NULL); + U_ASSERT(((int32_t)policy) >= 0); + U_ASSERT(((int32_t)policy) < 3); + hash->lowWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2]; + hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1]; +} + +/** + * Allocate internal data array of a size determined by the given + * prime index. If the index is out of range it is pinned into range. + * If the allocation fails the status is set to + * U_MEMORY_ALLOCATION_ERROR and all array storage is freed. In + * either case the previous array pointer is overwritten. + * + * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1. + */ +static void +_uhash_allocate(UHashtable *hash, + int32_t primeIndex, + UErrorCode *status) { + + UHashElement *p, *limit; + UHashTok emptytok; + + if (U_FAILURE(*status)) return; + + U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH); + + hash->primeIndex = primeIndex; + hash->length = PRIMES[primeIndex]; + + p = hash->elements = (UHashElement*) + uprv_malloc(sizeof(UHashElement) * hash->length); + + if (hash->elements == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + + emptytok.pointer = NULL; /* Only one of these two is needed */ + emptytok.integer = 0; /* but we don't know which one. */ + + limit = p + hash->length; + while (p < limit) { + p->key = emptytok; + p->value = emptytok; + p->hashcode = HASH_EMPTY; + ++p; + } + + hash->count = 0; + hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); + hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); +} + +static UHashtable* +_uhash_init(UHashtable *result, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t primeIndex, + UErrorCode *status) +{ + if (U_FAILURE(*status)) return NULL; + U_ASSERT(keyHash != NULL); + U_ASSERT(keyComp != NULL); + + result->keyHasher = keyHash; + result->keyComparator = keyComp; + result->valueComparator = valueComp; + result->keyDeleter = NULL; + result->valueDeleter = NULL; + result->allocated = FALSE; + _uhash_internalSetResizePolicy(result, U_GROW); + + _uhash_allocate(result, primeIndex, status); + + if (U_FAILURE(*status)) { + return NULL; + } + + return result; +} + +static UHashtable* +_uhash_create(UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t primeIndex, + UErrorCode *status) { + UHashtable *result; + + if (U_FAILURE(*status)) return NULL; + + result = (UHashtable*) uprv_malloc(sizeof(UHashtable)); + if (result == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + _uhash_init(result, keyHash, keyComp, valueComp, primeIndex, status); + result->allocated = TRUE; + + if (U_FAILURE(*status)) { + uprv_free(result); + return NULL; + } + + return result; +} + +/** + * Look for a key in the table, or if no such key exists, the first + * empty slot matching the given hashcode. Keys are compared using + * the keyComparator function. + * + * First find the start position, which is the hashcode modulo + * the length. Test it to see if it is: + * + * a. identical: First check the hash values for a quick check, + * then compare keys for equality using keyComparator. + * b. deleted + * c. empty + * + * Stop if it is identical or empty, otherwise continue by adding a + * "jump" value (moduloing by the length again to keep it within + * range) and retesting. For efficiency, there need enough empty + * values so that the searchs stop within a reasonable amount of time. + * This can be changed by changing the high/low water marks. + * + * In theory, this function can return NULL, if it is full (no empty + * or deleted slots) and if no matching key is found. In practice, we + * prevent this elsewhere (in uhash_put) by making sure the last slot + * in the table is never filled. + * + * The size of the table should be prime for this algorithm to work; + * otherwise we are not guaranteed that the jump value (the secondary + * hash) is relatively prime to the table length. + */ +static UHashElement* +_uhash_find(const UHashtable *hash, UHashTok key, + int32_t hashcode) { + + int32_t firstDeleted = -1; /* assume invalid index */ + int32_t theIndex, startIndex; + int32_t jump = 0; /* lazy evaluate */ + int32_t tableHash; + UHashElement *elements = hash->elements; + + hashcode &= 0x7FFFFFFF; /* must be positive */ + startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length; -static UHashtable* _uhash_create(UHashFunction *keyHash, UKeyComparator *keyComp, - int32_t primeIndex, UErrorCode *status); + do { + tableHash = elements[theIndex].hashcode; + if (tableHash == hashcode) { /* quick check */ + if ((*hash->keyComparator)(key, elements[theIndex].key)) { + return &(elements[theIndex]); + } + } else if (!IS_EMPTY_OR_DELETED(tableHash)) { + /* We have hit a slot which contains a key-value pair, + * but for which the hash code does not match. Keep + * looking. + */ + } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */ + break; + } else if (firstDeleted < 0) { /* remember first deleted */ + firstDeleted = theIndex; + } + if (jump == 0) { /* lazy compute jump */ + /* The jump value must be relatively prime to the table + * length. As long as the length is prime, then any value + * 1..length-1 will be relatively prime to it. + */ + jump = (hashcode % (hash->length - 1)) + 1; + } + theIndex = (theIndex + jump) % hash->length; + } while (theIndex != startIndex); -static void _uhash_allocate(UHashtable *hash, int32_t primeIndex, - UErrorCode *status); + if (firstDeleted >= 0) { + theIndex = firstDeleted; /* reset if had deleted slot */ + } else if (tableHash != HASH_EMPTY) { + /* We get to this point if the hashtable is full (no empty or + * deleted slots), and we've failed to find a match. THIS + * WILL NEVER HAPPEN as long as uhash_put() makes sure that + * count is always < length. + */ + U_ASSERT(FALSE); + return NULL; /* Never happens if uhash_put() behaves */ + } + return &(elements[theIndex]); +} -static void _uhash_rehash(UHashtable *hash); +/** + * Attempt to grow or shrink the data arrays in order to make the + * count fit between the high and low water marks. hash_put() and + * hash_remove() call this method when the count exceeds the high or + * low water marks. This method may do nothing, if memory allocation + * fails, or if the count is already in range, or if the length is + * already at the low or high limit. In any case, upon return the + * arrays will be valid. + */ +static void +_uhash_rehash(UHashtable *hash) { -static UHashElement* _uhash_find(const UHashtable *hash, UHashTok key, - int32_t hashcode); + UHashElement *old = hash->elements; + int32_t oldLength = hash->length; + int32_t newPrimeIndex = hash->primeIndex; + int32_t i; + UErrorCode status = U_ZERO_ERROR; -static UHashTok _uhash_put(UHashtable *hash, - UHashTok key, - UHashTok value, - int8_t hint, - UErrorCode *status); + if (hash->count > hash->highWaterMark) { + if (++newPrimeIndex >= PRIMES_LENGTH) { + return; + } + } else if (hash->count < hash->lowWaterMark) { + if (--newPrimeIndex < 0) { + return; + } + } else { + return; + } -static UHashTok _uhash_remove(UHashtable *hash, - UHashTok key); + _uhash_allocate(hash, newPrimeIndex, &status); -static UHashTok _uhash_internalRemoveElement(UHashtable *hash, UHashElement* e); + if (U_FAILURE(status)) { + hash->elements = old; + hash->length = oldLength; + return; + } -static UHashTok _uhash_setElement(UHashtable* hash, UHashElement* e, - int32_t hashcode, - UHashTok key, UHashTok value, - int8_t hint); + for (i = oldLength - 1; i >= 0; --i) { + if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) { + UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode); + U_ASSERT(e != NULL); + U_ASSERT(e->hashcode == HASH_EMPTY); + e->key = old[i].key; + e->value = old[i].value; + e->hashcode = old[i].hashcode; + ++hash->count; + } + } + + uprv_free(old); +} + +static UHashTok +_uhash_remove(UHashtable *hash, + UHashTok key) { + /* First find the position of the key in the table. If the object + * has not been removed already, remove it. If the user wanted + * keys deleted, then delete it also. We have to put a special + * hashcode in that position that means that something has been + * deleted, since when we do a find, we have to continue PAST any + * deleted values. + */ + UHashTok result; + UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key)); + U_ASSERT(e != NULL); + result.pointer = NULL; result.integer = 0; + if (!IS_EMPTY_OR_DELETED(e->hashcode)) { + result = _uhash_internalRemoveElement(hash, e); + if (hash->count < hash->lowWaterMark) { + _uhash_rehash(hash); + } + } + return result; +} + +static UHashTok +_uhash_put(UHashtable *hash, + UHashTok key, + UHashTok value, + int8_t hint, + UErrorCode *status) { + + /* Put finds the position in the table for the new value. If the + * key is already in the table, it is deleted, if there is a + * non-NULL keyDeleter. Then the key, the hash and the value are + * all put at the position in their respective arrays. + */ + int32_t hashcode; + UHashElement* e; + UHashTok emptytok; + + if (U_FAILURE(*status)) { + goto err; + } + U_ASSERT(hash != NULL); + /* Cannot always check pointer here or iSeries sees NULL every time. */ + if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) { + /* Disallow storage of NULL values, since NULL is returned by + * get() to indicate an absent key. Storing NULL == removing. + */ + return _uhash_remove(hash, key); + } + if (hash->count > hash->highWaterMark) { + _uhash_rehash(hash); + } + + hashcode = (*hash->keyHasher)(key); + e = _uhash_find(hash, key, hashcode); + U_ASSERT(e != NULL); + + if (IS_EMPTY_OR_DELETED(e->hashcode)) { + /* Important: We must never actually fill the table up. If we + * do so, then _uhash_find() will return NULL, and we'll have + * to check for NULL after every call to _uhash_find(). To + * avoid this we make sure there is always at least one empty + * or deleted slot in the table. This only is a problem if we + * are out of memory and rehash isn't working. + */ + ++hash->count; + if (hash->count == hash->length) { + /* Don't allow count to reach length */ + --hash->count; + *status = U_MEMORY_ALLOCATION_ERROR; + goto err; + } + } + + /* We must in all cases handle storage properly. If there was an + * old key, then it must be deleted (if the deleter != NULL). + * Make hashcodes stored in table positive. + */ + return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint); + + err: + /* If the deleters are non-NULL, this method adopts its key and/or + * value arguments, and we must be sure to delete the key and/or + * value in all cases, even upon failure. + */ + HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer); + emptytok.pointer = NULL; emptytok.integer = 0; + return emptytok; +} -static void _uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy); /******************************************************************** * PUBLIC API ********************************************************************/ U_CAPI UHashtable* U_EXPORT2 -uhash_open(UHashFunction *keyHash, UKeyComparator *keyComp, +uhash_open(UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, UErrorCode *status) { - return _uhash_create(keyHash, keyComp, 3, status); + return _uhash_create(keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status); } U_CAPI UHashtable* U_EXPORT2 -uhash_openSize(UHashFunction *keyHash, UKeyComparator *keyComp, +uhash_openSize(UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, int32_t size, UErrorCode *status) { @@ -191,7 +550,17 @@ uhash_openSize(UHashFunction *keyHash, UKeyComparator *keyComp, ++i; } - return _uhash_create(keyHash, keyComp, i, status); + return _uhash_create(keyHash, keyComp, valueComp, i, status); +} + +U_CAPI UHashtable* U_EXPORT2 +uhash_init(UHashtable *fillinResult, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + UErrorCode *status) { + + return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status); } U_CAPI void U_EXPORT2 @@ -208,7 +577,9 @@ uhash_close(UHashtable *hash) { uprv_free(hash->elements); hash->elements = NULL; } - uprv_free(hash); + if (hash->allocated) { + uprv_free(hash); + } } U_CAPI UHashFunction *U_EXPORT2 @@ -224,6 +595,12 @@ uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn) { hash->keyComparator = fn; return result; } +U_CAPI UValueComparator *U_EXPORT2 +uhash_setValueComparator(UHashtable *hash, UValueComparator *fn){ + UValueComparator *result = hash->valueComparator; + hash->valueComparator = fn; + return result; +} U_CAPI UObjectDeleter *U_EXPORT2 uhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn) { @@ -491,6 +868,48 @@ uhash_hashIChars(const UHashTok key) { STRING_HASH(uint8_t, key.pointer, uprv_strlen((char*)p), uprv_tolower(*p)); } +U_CAPI UBool U_EXPORT2 +uhash_equals(const UHashtable* hash1, const UHashtable* hash2){ + + int32_t count1, count2, pos, i; + + if(hash1==hash2){ + return TRUE; + } + + if(hash1==NULL || hash2==NULL){ + return FALSE; + } + /* make sure that we are comparing 2 hashes of the same type */ + if( hash1->keyComparator != hash2->keyComparator || + hash2->valueComparator != hash2->valueComparator){ + return FALSE; + } + + count1 = uhash_count(hash1); + count2 = uhash_count(hash2); + if(count1!=count2){ + return FALSE; + } + + pos=-1; + for(i=0; i<count1; i++){ + const UHashElement* elem1 = uhash_nextElement(hash1, &pos); + const UHashTok key1 = elem1->key; + const UHashTok val1 = elem1->value; + /* here the keys are not compared, instead the key form hash1 is used to fetch + * value from hash2. If the hashes are equal then then both hashes should + * contain equal values for the same key! + */ + const UHashElement* elem2 = _uhash_find(hash2, key1, hash2->keyHasher(key1)); + const UHashTok val2 = elem2->value; + if(hash1->valueComparator(val1, val2)==FALSE){ + return FALSE; + } + } + return TRUE; +} + /******************************************************************** * PUBLIC Comparator Functions ********************************************************************/ @@ -569,368 +988,3 @@ uhash_freeBlock(void *obj) { uprv_free(obj); } -/******************************************************************** - * PRIVATE Implementation - ********************************************************************/ - -static UHashtable* -_uhash_create(UHashFunction *keyHash, UKeyComparator *keyComp, - int32_t primeIndex, - UErrorCode *status) { - UHashtable *result; - - if (U_FAILURE(*status)) return NULL; - U_ASSERT(keyHash != NULL); - U_ASSERT(keyComp != NULL); - - result = (UHashtable*) uprv_malloc(sizeof(UHashtable)); - if (result == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - - result->keyHasher = keyHash; - result->keyComparator = keyComp; - result->keyDeleter = NULL; - result->valueDeleter = NULL; - _uhash_internalSetResizePolicy(result, U_GROW); - - _uhash_allocate(result, primeIndex, status); - - if (U_FAILURE(*status)) { - uprv_free(result); - return NULL; - } - - return result; -} - -/** - * Allocate internal data array of a size determined by the given - * prime index. If the index is out of range it is pinned into range. - * If the allocation fails the status is set to - * U_MEMORY_ALLOCATION_ERROR and all array storage is freed. In - * either case the previous array pointer is overwritten. - * - * Caller must ensure primeIndex is in range 0..PRIME_LENGTH-1. - */ -static void -_uhash_allocate(UHashtable *hash, - int32_t primeIndex, - UErrorCode *status) { - - UHashElement *p, *limit; - UHashTok emptytok; - - if (U_FAILURE(*status)) return; - - U_ASSERT(primeIndex >= 0 && primeIndex < PRIMES_LENGTH); - - hash->primeIndex = primeIndex; - hash->length = PRIMES[primeIndex]; - - p = hash->elements = (UHashElement*) - uprv_malloc(sizeof(UHashElement) * hash->length); - - if (hash->elements == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return; - } - - emptytok.pointer = NULL; /* Only one of these two is needed */ - emptytok.integer = 0; /* but we don't know which one. */ - - limit = p + hash->length; - while (p < limit) { - p->key = emptytok; - p->value = emptytok; - p->hashcode = HASH_EMPTY; - ++p; - } - - hash->count = 0; - hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); - hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); -} - -/** - * Attempt to grow or shrink the data arrays in order to make the - * count fit between the high and low water marks. hash_put() and - * hash_remove() call this method when the count exceeds the high or - * low water marks. This method may do nothing, if memory allocation - * fails, or if the count is already in range, or if the length is - * already at the low or high limit. In any case, upon return the - * arrays will be valid. - */ -static void -_uhash_rehash(UHashtable *hash) { - - UHashElement *old = hash->elements; - int32_t oldLength = hash->length; - int32_t newPrimeIndex = hash->primeIndex; - int32_t i; - UErrorCode status = U_ZERO_ERROR; - - if (hash->count > hash->highWaterMark) { - if (++newPrimeIndex >= PRIMES_LENGTH) { - return; - } - } else if (hash->count < hash->lowWaterMark) { - if (--newPrimeIndex < 0) { - return; - } - } else { - return; - } - - _uhash_allocate(hash, newPrimeIndex, &status); - - if (U_FAILURE(status)) { - hash->elements = old; - hash->length = oldLength; - return; - } - - for (i = oldLength - 1; i >= 0; --i) { - if (!IS_EMPTY_OR_DELETED(old[i].hashcode)) { - UHashElement *e = _uhash_find(hash, old[i].key, old[i].hashcode); - U_ASSERT(e != NULL); - U_ASSERT(e->hashcode == HASH_EMPTY); - e->key = old[i].key; - e->value = old[i].value; - e->hashcode = old[i].hashcode; - ++hash->count; - } - } - - uprv_free(old); -} - -/** - * Look for a key in the table, or if no such key exists, the first - * empty slot matching the given hashcode. Keys are compared using - * the keyComparator function. - * - * First find the start position, which is the hashcode modulo - * the length. Test it to see if it is: - * - * a. identical: First check the hash values for a quick check, - * then compare keys for equality using keyComparator. - * b. deleted - * c. empty - * - * Stop if it is identical or empty, otherwise continue by adding a - * "jump" value (moduloing by the length again to keep it within - * range) and retesting. For efficiency, there need enough empty - * values so that the searchs stop within a reasonable amount of time. - * This can be changed by changing the high/low water marks. - * - * In theory, this function can return NULL, if it is full (no empty - * or deleted slots) and if no matching key is found. In practice, we - * prevent this elsewhere (in uhash_put) by making sure the last slot - * in the table is never filled. - * - * The size of the table should be prime for this algorithm to work; - * otherwise we are not guaranteed that the jump value (the secondary - * hash) is relatively prime to the table length. - */ -static UHashElement* -_uhash_find(const UHashtable *hash, UHashTok key, - int32_t hashcode) { - - int32_t firstDeleted = -1; /* assume invalid index */ - int32_t theIndex, startIndex; - int32_t jump = 0; /* lazy evaluate */ - int32_t tableHash; - - hashcode &= 0x7FFFFFFF; /* must be positive */ - startIndex = theIndex = (hashcode ^ 0x4000000) % hash->length; - - do { - tableHash = hash->elements[theIndex].hashcode; - if (tableHash == hashcode) { /* quick check */ - if ((*hash->keyComparator)(key, hash->elements[theIndex].key)) { - return &(hash->elements[theIndex]); - } - } else if (!IS_EMPTY_OR_DELETED(tableHash)) { - /* We have hit a slot which contains a key-value pair, - * but for which the hash code does not match. Keep - * looking. - */ - } else if (tableHash == HASH_EMPTY) { /* empty, end o' the line */ - break; - } else if (firstDeleted < 0) { /* remember first deleted */ - firstDeleted = theIndex; - } - if (jump == 0) { /* lazy compute jump */ - /* The jump value must be relatively prime to the table - * length. As long as the length is prime, then any value - * 1..length-1 will be relatively prime to it. - */ - jump = (hashcode % (hash->length - 1)) + 1; - } - theIndex = (theIndex + jump) % hash->length; - } while (theIndex != startIndex); - - if (firstDeleted >= 0) { - theIndex = firstDeleted; /* reset if had deleted slot */ - } else if (tableHash != HASH_EMPTY) { - /* We get to this point if the hashtable is full (no empty or - * deleted slots), and we've failed to find a match. THIS - * WILL NEVER HAPPEN as long as uhash_put() makes sure that - * count is always < length. - */ - U_ASSERT(FALSE); - return NULL; /* Never happens if uhash_put() behaves */ - } - return &(hash->elements[theIndex]); -} - -static UHashTok -_uhash_put(UHashtable *hash, - UHashTok key, - UHashTok value, - int8_t hint, - UErrorCode *status) { - - /* Put finds the position in the table for the new value. If the - * key is already in the table, it is deleted, if there is a - * non-NULL keyDeleter. Then the key, the hash and the value are - * all put at the position in their respective arrays. - */ - int32_t hashcode; - UHashElement* e; - UHashTok emptytok; - - if (U_FAILURE(*status)) { - goto err; - } - U_ASSERT(hash != NULL); - /* Cannot always check pointer here or iSeries sees NULL every time. */ - if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) { - /* Disallow storage of NULL values, since NULL is returned by - * get() to indicate an absent key. Storing NULL == removing. - */ - return _uhash_remove(hash, key); - } - if (hash->count > hash->highWaterMark) { - _uhash_rehash(hash); - } - - hashcode = (*hash->keyHasher)(key); - e = _uhash_find(hash, key, hashcode); - U_ASSERT(e != NULL); - - if (IS_EMPTY_OR_DELETED(e->hashcode)) { - /* Important: We must never actually fill the table up. If we - * do so, then _uhash_find() will return NULL, and we'll have - * to check for NULL after every call to _uhash_find(). To - * avoid this we make sure there is always at least one empty - * or deleted slot in the table. This only is a problem if we - * are out of memory and rehash isn't working. - */ - ++hash->count; - if (hash->count == hash->length) { - /* Don't allow count to reach length */ - --hash->count; - *status = U_MEMORY_ALLOCATION_ERROR; - goto err; - } - } - - /* We must in all cases handle storage properly. If there was an - * old key, then it must be deleted (if the deleter != NULL). - * Make hashcodes stored in table positive. - */ - return _uhash_setElement(hash, e, hashcode & 0x7FFFFFFF, key, value, hint); - - err: - /* If the deleters are non-NULL, this method adopts its key and/or - * value arguments, and we must be sure to delete the key and/or - * value in all cases, even upon failure. - */ - HASH_DELETE_KEY_VALUE(hash, key.pointer, value.pointer); - emptytok.pointer = NULL; emptytok.integer = 0; - return emptytok; -} - -static UHashTok -_uhash_remove(UHashtable *hash, - UHashTok key) { - /* First find the position of the key in the table. If the object - * has not been removed already, remove it. If the user wanted - * keys deleted, then delete it also. We have to put a special - * hashcode in that position that means that something has been - * deleted, since when we do a find, we have to continue PAST any - * deleted values. - */ - UHashTok result; - UHashElement* e = _uhash_find(hash, key, hash->keyHasher(key)); - U_ASSERT(e != NULL); - result.pointer = NULL; result.integer = 0; - if (!IS_EMPTY_OR_DELETED(e->hashcode)) { - result = _uhash_internalRemoveElement(hash, e); - if (hash->count < hash->lowWaterMark) { - _uhash_rehash(hash); - } - } - return result; -} - -static UHashTok -_uhash_setElement(UHashtable *hash, UHashElement* e, - int32_t hashcode, - UHashTok key, UHashTok value, int8_t hint) { - - UHashTok oldValue = e->value; - if (hash->keyDeleter != NULL && e->key.pointer != NULL && - e->key.pointer != key.pointer) { /* Avoid double deletion */ - (*hash->keyDeleter)(e->key.pointer); - } - if (hash->valueDeleter != NULL) { - if (oldValue.pointer != NULL && - oldValue.pointer != value.pointer) { /* Avoid double deletion */ - (*hash->valueDeleter)(oldValue.pointer); - } - oldValue.pointer = NULL; - } - /* Compilers should copy the UHashTok union correctly, but even if - * they do, memory heap tools (e.g. BoundsChecker) can get - * confused when a pointer is cloaked in a union and then copied. - * TO ALLEVIATE THIS, we use hints (based on what API the user is - * calling) to copy pointers when we know the user thinks - * something is a pointer. */ - if (hint & HINT_KEY_POINTER) { - e->key.pointer = key.pointer; - } else { - e->key = key; - } - if (hint & HINT_VALUE_POINTER) { - e->value.pointer = value.pointer; - } else { - e->value = value; - } - e->hashcode = hashcode; - return oldValue; -} - -/** - * Assumes that the given element is not empty or deleted. - */ -static UHashTok -_uhash_internalRemoveElement(UHashtable *hash, UHashElement* e) { - UHashTok empty; - U_ASSERT(!IS_EMPTY_OR_DELETED(e->hashcode)); - --hash->count; - empty.pointer = NULL; empty.integer = 0; - return _uhash_setElement(hash, e, HASH_DELETED, empty, empty, 0); -} - -static void -_uhash_internalSetResizePolicy(UHashtable *hash, enum UHashResizePolicy policy) { - U_ASSERT(hash != NULL); - U_ASSERT(((int32_t)policy) >= 0); - U_ASSERT(((int32_t)policy) < 3); - hash->lowWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2]; - hash->highWaterRatio = RESIZE_POLICY_RATIO_TABLE[policy * 2 + 1]; -} diff --git a/Build/source/libs/icu-xetex/common/uhash.h b/Build/source/libs/icu-xetex/common/uhash.h index 9e26978813c..b5f3a67db3f 100644 --- a/Build/source/libs/icu-xetex/common/uhash.h +++ b/Build/source/libs/icu-xetex/common/uhash.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2004, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * Date Name Description @@ -117,7 +117,14 @@ typedef int32_t U_CALLCONV UHashFunction(const UHashTok key); */ typedef UBool U_CALLCONV UKeyComparator(const UHashTok key1, const UHashTok key2); - +/** + * A key comparison function. + * @param val1 A key stored in a hashtable + * @param val2 A key stored in a hashtable + * @return TRUE if the two keys are equal. + */ +typedef UBool U_CALLCONV UValueComparator(const UHashTok val1, + const UHashTok val2); /** * A function called by <TT>uhash_remove</TT>, * <TT>uhash_close</TT>, or <TT>uhash_put</TT> to delete @@ -146,6 +153,19 @@ struct UHashtable { UHashElement *elements; + /* Function pointers */ + + UHashFunction *keyHasher; /* Computes hash from key. + * Never null. */ + UKeyComparator *keyComparator; /* Compares keys for equality. + * Never null. */ + UValueComparator *valueComparator; /* Compares the values for equality */ + + UObjectDeleter *keyDeleter; /* Deletes keys when required. + * If NULL won't do anything */ + UObjectDeleter *valueDeleter; /* Deletes values when required. + * If NULL won't do anything */ + /* Size parameters */ int32_t count; /* The number of key-value pairs in this table. @@ -163,16 +183,7 @@ struct UHashtable { float highWaterRatio; /* 0..1; high water as a fraction of length */ float lowWaterRatio; /* 0..1; low water as a fraction of length */ - /* Function pointers */ - - UHashFunction *keyHasher; /* Computes hash from key. - * Never null. */ - UKeyComparator *keyComparator; /* Compares keys for equality. - * Never null. */ - UObjectDeleter *keyDeleter; /* Deletes keys when required. - * If NULL won't do anything */ - UObjectDeleter *valueDeleter; /* Deletes values when required. - * If NULL won't do anything */ + UBool allocated; /* Was this UHashtable allocated? */ }; typedef struct UHashtable UHashtable; @@ -195,6 +206,7 @@ U_CDECL_END U_CAPI UHashtable* U_EXPORT2 uhash_open(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, UErrorCode *status); /** @@ -211,10 +223,28 @@ uhash_open(UHashFunction *keyHash, U_CAPI UHashtable* U_EXPORT2 uhash_openSize(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, int32_t size, UErrorCode *status); /** + * Initialize an existing UHashtable. + * @param keyHash A pointer to the key hashing function. Must not be + * NULL. + * @param keyComp A pointer to the function that compares keys. Must + * not be NULL. + * @param status A pointer to an UErrorCode to receive any errors. + * @return A pointer to a UHashtable, or 0 if an error occurred. + * @see uhash_openSize + */ +U_CAPI UHashtable* U_EXPORT2 +uhash_init(UHashtable *hash, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + UErrorCode *status); + +/** * Close a UHashtable, releasing the memory used. * @param hash The UHashtable to close. */ @@ -243,6 +273,16 @@ U_CAPI UKeyComparator *U_EXPORT2 uhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn); /** + * Set the function used to compare values. The default comparison is a + * void* pointer comparison. + * @param hash The UHashtable to set + * @param fn the function to be used compare keys; must not be NULL + * @return the previous key comparator; non-NULL + */ +U_CAPI UValueComparator *U_EXPORT2 +uhash_setValueComparator(UHashtable *hash, UValueComparator *fn); + +/** * Set the function used to delete keys. If this function pointer is * NULL, this hashtable does not delete keys. If it is non-NULL, this * hashtable does delete keys. This function should be set once @@ -676,4 +716,13 @@ uhash_deleteUVector(void *obj); U_CAPI void U_EXPORT2 uhash_freeBlock(void *obj); +/** + * Checks if the given hash tables are equal or not. + * @param hash1 + * @param hash2 + * @return true if the hashtables are equal and false if not. + */ +U_CAPI UBool U_EXPORT2 +uhash_equals(const UHashtable* hash1, const UHashtable* hash2); + #endif diff --git a/Build/source/libs/icu-xetex/common/uidna.cpp b/Build/source/libs/icu-xetex/common/uidna.cpp index b5bf9a5107e..4a6b329ce52 100644 --- a/Build/source/libs/icu-xetex/common/uidna.cpp +++ b/Build/source/libs/icu-xetex/common/uidna.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003-2005, International Business Machines + * Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -66,12 +66,6 @@ startsWithPrefix(const UChar* src , int32_t srcLength){ return startsWithPrefix; } -inline static void -toASCIILower(UChar* src, int32_t srcLen){ - for(int32_t i=0; i<srcLen; i++){ - src[i] = toASCIILower(src[i]); - } -} inline static int32_t compareCaseInsensitiveASCII(const UChar* s1, int32_t s1Len, @@ -194,13 +188,6 @@ static inline UBool isLDHChar(UChar ch){ return FALSE; } -// We should add this to utypes.c -#if U_ICU_VERSION_MAJOR_NUM>3 || (U_ICU_VERSION_MAJOR_NUM==3 && U_ICU_VERSION_MINOR_NUM>4) -# error Time bomb: After ICU 3.4 move the definition of utypes.h and fix the TODO in _uIDNAErrorName definition. -#else -# define U_IDNA_ZERO_LENGTH_LABEL_ERROR U_IDNA_ERROR_LIMIT -#endif - static int32_t _internal_toASCII(const UChar* src, int32_t srcLength, UChar* dest, int32_t destCapacity, diff --git a/Build/source/libs/icu-xetex/common/uinit.c b/Build/source/libs/icu-xetex/common/uinit.c index efdeaba8d57..a70e51d0e6f 100644 --- a/Build/source/libs/icu-xetex/common/uinit.c +++ b/Build/source/libs/icu-xetex/common/uinit.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 2001-2005, International Business Machines * +* Copyright (C) 2001-2006, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -30,19 +30,6 @@ static UBool gICUInitialized = FALSE; static UMTX gICUInitMutex = NULL; -static cleanupFunc *gLibCleanupFunctions[UCLN_COMMON]; - -U_CAPI void U_EXPORT2 -ucln_registerCleanup(ECleanupLibraryType type, - cleanupFunc *func) -{ - U_ASSERT(UCLN_START < type && type < UCLN_COMMON); - if (UCLN_START < type && type < UCLN_COMMON) - { - gLibCleanupFunctions[type] = func; - } -} - /************************************************ The cleanup order is important in this function. Please be sure that you have read ucln.h @@ -50,21 +37,11 @@ ucln_registerCleanup(ECleanupLibraryType type, U_CAPI void U_EXPORT2 u_cleanup(void) { - ECleanupLibraryType libType; - UTRACE_ENTRY_OC(UTRACE_U_CLEANUP); umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ umtx_unlock(NULL); /* all state left around by any other threads. */ - for (libType = UCLN_START+1; libType<UCLN_COMMON; libType++) { - if (gLibCleanupFunctions[libType]) - { - gLibCleanupFunctions[libType](); - gLibCleanupFunctions[libType] = NULL; - } - } - - ucln_common_lib_cleanup(); + ucln_lib_cleanup(); umtx_destroy(&gICUInitMutex); umtx_cleanup(); @@ -108,7 +85,7 @@ u_init(UErrorCode *status) { * available. */ #if !UCONFIG_NO_CONVERSION - ucnv_io_countStandards(status); + ucnv_io_countTotalAliases(status); #endif #else /* Do any required init for services that don't have open operations @@ -118,7 +95,7 @@ u_init(UErrorCode *status) { */ /* Char Properties */ - uprv_loadPropsData(status); + uprv_haveProperties(status); /* load the case and bidi properties but don't fail if they are not available */ u_isULowercase(0x61); diff --git a/Build/source/libs/icu-xetex/common/uinvchar.c b/Build/source/libs/icu-xetex/common/uinvchar.c index 263c35fc014..325a09d1d1f 100644 --- a/Build/source/libs/icu-xetex/common/uinvchar.c +++ b/Build/source/libs/icu-xetex/common/uinvchar.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2004, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -145,58 +145,49 @@ static const uint32_t invariantChars[4]={ /* test signed types for invariant characters, adds test for positive values */ #define SCHAR_IS_INVARIANT(c) ((0<=(c)) && UCHAR_IS_INVARIANT(c)) +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +#define CHAR_TO_UCHAR(c) c +#define UCHAR_TO_CHAR(c) c +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +#define CHAR_TO_UCHAR(u) asciiFromEbcdic[u] +#define UCHAR_TO_CHAR(u) ebcdicFromAscii[u] +#else +# error U_CHARSET_FAMILY is not valid +#endif + + U_CAPI void U_EXPORT2 u_charsToUChars(const char *cs, UChar *us, int32_t length) { UChar u; uint8_t c; - UBool onlyInvariantChars; /* * Allow the entire ASCII repertoire to be mapped _to_ Unicode. * For EBCDIC systems, this works for characters with codes from * codepages 37 and 1047 or compatible. */ - onlyInvariantChars=TRUE; while(length>0) { c=(uint8_t)(*cs++); -#if U_CHARSET_FAMILY==U_ASCII_FAMILY - u=(UChar)c; -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY - u=(UChar)asciiFromEbcdic[c]; -#else -# error U_CHARSET_FAMILY is not valid -#endif - if(u==0 && c!=0) { - onlyInvariantChars=FALSE; - } + u=(UChar)CHAR_TO_UCHAR(c); + U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */ *us++=u; --length; } - U_ASSERT(onlyInvariantChars); /* only invariant chars? */ } U_CAPI void U_EXPORT2 u_UCharsToChars(const UChar *us, char *cs, int32_t length) { UChar u; - UBool onlyInvariantChars; - onlyInvariantChars=TRUE; while(length>0) { u=*us++; if(!UCHAR_IS_INVARIANT(u)) { - onlyInvariantChars=FALSE; + U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */ u=0; } -#if U_CHARSET_FAMILY==U_ASCII_FAMILY - *cs++=(char)u; -#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY - *cs++=(char)ebcdicFromAscii[u]; -#else -# error U_CHARSET_FAMILY is not valid -#endif + *cs++=(char)UCHAR_TO_CHAR(u); --length; } - U_ASSERT(onlyInvariantChars); /* only invariant chars? */ } U_CAPI UBool U_EXPORT2 @@ -232,7 +223,7 @@ uprv_isInvariantString(const char *s, int32_t length) { return FALSE; /* found a variant char */ } #elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY - c=asciiFromEbcdic[c]; + c=CHAR_TO_UCHAR(c); if(c==0 || !UCHAR_IS_INVARIANT(c)) { return FALSE; /* found a variant char */ } @@ -277,7 +268,7 @@ uprv_isInvariantUString(const UChar *s, int32_t length) { /* UDataSwapFn implementations used in udataswp.c ------- */ /* convert ASCII to EBCDIC and verify that all characters are invariant */ -U_CFUNC int32_t +U_CAPI int32_t U_EXPORT2 uprv_ebcdicFromAscii(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, UErrorCode *pErrorCode) { diff --git a/Build/source/libs/icu-xetex/common/uiter.cpp b/Build/source/libs/icu-xetex/common/uiter.cpp index 6ca975089b5..bfe92c6c751 100644 --- a/Build/source/libs/icu-xetex/common/uiter.cpp +++ b/Build/source/libs/icu-xetex/common/uiter.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2004, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -50,11 +50,12 @@ noopCurrent(UCharIterator * /*iter*/) { static uint32_t U_CALLCONV noopGetState(const UCharIterator * /*iter*/) { - return 0; + return UITER_NO_STATE; } static void U_CALLCONV -noopSetState(UCharIterator * /*iter*/, uint32_t /*state*/, UErrorCode * /*pErrorCode*/) { +noopSetState(UCharIterator * /*iter*/, uint32_t /*state*/, UErrorCode *pErrorCode) { + *pErrorCode=U_UNSUPPORTED_ERROR; } static const UCharIterator noopIterator={ diff --git a/Build/source/libs/icu-xetex/common/uloc.c b/Build/source/libs/icu-xetex/common/uloc.c index c4981987e52..275497bd4e1 100644 --- a/Build/source/libs/icu-xetex/common/uloc.c +++ b/Build/source/libs/icu-xetex/common/uloc.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -31,6 +31,7 @@ #include "unicode/utypes.h" #include "unicode/ustring.h" #include "unicode/uloc.h" +#include "unicode/ures.h" #include "putilimp.h" #include "ustr_imp.h" @@ -113,14 +114,15 @@ static int32_t _installedLocalesCount = 0; */ static const char * const LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "af", "afa", - "afh", "ak", "akk", "ale", "alg", "alt", "am", "an", "ang", "apa", + "afh", "ain", "ak", "akk", "ale", "alg", "alt", "am", "an", + "ang", "anp", "apa", "ar", "arc", "arn", "arp", "art", "arw", "as", "ast", "ath", "aus", "av", "awa", "ay", "az", "ba", "bad", "bai", "bal", "ban", "bas", "bat", "be", "bej", "bem", "ber", "bg", "bh", "bho", "bi", "bik", "bin", "bla", "bm", "bn", "bnt", "bo", "br", "bra", "bs", "btk", "bua", "bug", "byn", "ca", "cad", "cai", "car", "cau", - "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", + "cch", "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "cmc", "co", "cop", "cpe", "cpf", "cpp", "cr", "crh", "crp", "cs", "csb", "cu", "cus", "cv", "cy", "da", "dak", "dar", "day", "de", "del", "den", @@ -128,17 +130,18 @@ static const char * const LANGUAGES[] = { "dz", "ee", "efi", "egy", "eka", "el", "elx", "en", "enm", "eo", "es", "et", "eu", "ewo", "fa", "fan", "fat", "ff", "fi", "fil", "fiu", "fj", "fo", "fon", - "fr", "frm", "fro", "fur", "fy", "ga", "gaa", "gay", - "gba", "gd", "gem", "gez", "gil", "gl", "gmh", "gn", - "goh", "gon", "gor", "got", "grb", "grc", "gu", "gv", - "gwi", "ha", "hai", "haw", "he", "hi", "hil", "him", + "fr", "frm", "fro", "frr", "frs", "fur", "fy", + "ga", "gaa", "gay", "gba", "gd", "gem", "gez", "gil", + "gl", "gmh", "gn", "goh", "gon", "gor", "got", "grb", + "grc", "gsw", "gu", "gv", "gwi", + "ha", "hai", "haw", "he", "hi", "hil", "him", "hit", "hmn", "ho", "hr", "hsb", "ht", "hu", "hup", "hy", "hz", "ia", "iba", "id", "ie", "ig", "ii", "ijo", "ik", "ilo", "inc", "ine", "inh", "io", "ira", "iro", "is", "it", "iu", "ja", "jbo", "jpr", "jrb", "jv", "ka", "kaa", "kab", - "kac", "kam", "kar", "kaw", "kbd", "kg", "kha", "khi", + "kac", "kaj", "kam", "kar", "kaw", "kbd", "kcg", "kfo", "kg", "kha", "khi", "kho", "ki", "kj", "kk", "kl", "km", "kmb", "kn", - "ko", "kok", "kos", "kpe", "kr", "krc", "kro", "kru", "ks", + "ko", "kok", "kos", "kpe", "kr", "krc", "krl", "kro", "kru", "ks", "ku", "kum", "kut", "kv", "kw", "ky", "la", "lad", "lah", "lam", "lb", "lez", "lg", "li", "ln", "lo", "lol", "loz", "lt", "lu", "lua", "lui", "lun", "luo", "lus", @@ -154,7 +157,7 @@ static const char * const LANGUAGES[] = { "pag", "pal", "pam", "pap", "pau", "peo", "phi", "phn", "pi", "pl", "pon", "pra", "pro", "ps", "pt", "qu", "raj", "rap", "rar", "rm", "rn", "ro", "roa", "rom", - "ru", "rw", "sa", "sad", "sah", "sai", "sal", "sam", + "ru", "rup", "rw", "sa", "sad", "sah", "sai", "sal", "sam", "sas", "sat", "sc", "scn", "sco", "sd", "se", "sel", "sem", "sg", "sga", "sgn", "shn", "si", "sid", "sio", "sit", "sk", "sl", "sla", "sm", "sma", "smi", "smj", "smn", @@ -168,11 +171,17 @@ static const char * const LANGUAGES[] = { "uz", "vai", "ve", "vi", "vo", "vot", "wa", "wak", "wal", "war", "was", "wen", "wo", "xal", "xh", "yao", "yap", "yi", "yo", "ypk", "za", "zap", "zen", "zh", "znd", - "zu", "zun", + "zu", "zun", "zxx", NULL, "in", "iw", "ji", "jw", "sh", /* obsolete language codes */ NULL }; +static const char* const DEPRECATED_LANGUAGES[]={ + "in", "iw", "ji", "jw", NULL, NULL +}; +static const char* const REPLACEMENT_LANGUAGES[]={ + "id", "he", "yi", "jv", NULL, NULL +}; /** * Table of 3-letter language codes. @@ -193,8 +202,8 @@ NULL static const char * const LANGUAGES_3[] = { /* "aa", "ab", "ace", "ach", "ada", "ady", "ae", "af", "afa", */ "aar", "abk", "ace", "ach", "ada", "ady", "ave", "afr", "afa", -/* "afh", "ak", "akk", "ale", "alg", "alt", "am", "an", "ang", "apa", */ - "afh", "aka", "akk", "ale", "alg", "alt", "amh", "arg", "ang", "apa", +/* "afh", "ain", "ak", "akk", "ale", "alg", "alt", "am", "an", "ang", "anp", "apa", */ + "afh", "ain", "aka", "akk", "ale", "alg", "alt", "amh", "arg", "ang", "anp", "apa", /* "ar", "arc", "arn", "arp", "art", "arw", "as", "ast", */ "ara", "arc", "arn", "arp", "art", "arw", "asm", "ast", /* "ath", "aus", "av", "awa", "ay", "az", "ba", "bad", */ @@ -207,8 +216,8 @@ static const char * const LANGUAGES_3[] = { "bla", "bam", "ben", "bnt", "bod", "bre", "bra", "bos", /* "btk", "bua", "bug", "byn", "ca", "cad", "cai", "car", "cau", */ "btk", "bua", "bug", "byn", "cat", "cad", "cai", "car", "cau", -/* "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", */ - "che", "ceb", "cel", "cha", "chb", "chg", "chk", "chm", +/* "cch", "ce", "ceb", "cel", "ch", "chb", "chg", "chk", "chm", */ + "cch", "che", "ceb", "cel", "cha", "chb", "chg", "chk", "chm", /* "chn", "cho", "chp", "chr", "chy", "cmc", "co", "cop", */ "chn", "cho", "chp", "chr", "chy", "cmc", "cos", "cop", /* "cpe", "cpf", "cpp", "cr", "crh", "crp", "cs", "csb", "cu", "cus", */ @@ -223,12 +232,12 @@ static const char * const LANGUAGES_3[] = { "enm", "epo", "spa", "est", "eus", "ewo", "fas", /* "fan", "fat", "ff", "fi", "fil", "fiu", "fj", "fo", "fon", */ "fan", "fat", "ful", "fin", "fil", "fiu", "fij", "fao", "fon", -/* "fr", "frm", "fro", "fur", "fy", "ga", "gaa", "gay", */ - "fra", "frm", "fro", "fur", "fry", "gle", "gaa", "gay", +/* "fr", "frm", "fro", "fur", "frr", "frs", "fy", "ga", "gaa", "gay", */ + "fra", "frm", "fro", "fur", "frr", "frs", "fry", "gle", "gaa", "gay", /* "gba", "gd", "gem", "gez", "gil", "gl", "gmh", "gn", */ "gba", "gla", "gem", "gez", "gil", "glg", "gmh", "grn", -/* "goh", "gon", "gor", "got", "grb", "grc", "gu", "gv", */ - "goh", "gon", "gor", "got", "grb", "grc", "guj", "glv", +/* "goh", "gon", "gor", "got", "grb", "grc", "gsw", "gu", "gv", */ + "goh", "gon", "gor", "got", "grb", "grc", "gsw", "guj", "glv", /* "gwi", "ha", "hai", "haw", "he", "hi", "hil", "him", */ "gwi", "hau", "hai", "haw", "heb", "hin", "hil", "him", /* "hit", "hmn", "ho", "hr", "hsb", "ht", "hu", "hup", "hy", "hz", */ @@ -239,12 +248,12 @@ static const char * const LANGUAGES_3[] = { "ilo", "inc", "ine", "inh", "ido", "ira", "iro", "isl", "ita", /* "iu", "ja", "jbo", "jpr", "jrb", "jv", "ka", "kaa", "kab", */ "iku", "jpn", "jbo", "jpr", "jrb", "jav", "kat", "kaa", "kab", -/* "kac", "kam", "kar", "kaw", "kbd", "kg", "kha", "khi", */ - "kac", "kam", "kar", "kaw", "kbd", "kon", "kha", "khi", +/* "kac", "kaj", "kam", "kar", "kaw", "kbd", "kcg", "kfo", "kg", "kha", "khi",*/ + "kac", "kaj", "kam", "kar", "kaw", "kbd", "kcg", "kfo", "kg", "kha", "khi", /* "kho", "ki", "kj", "kk", "kl", "km", "kmb", "kn", */ "kho", "kik", "kua", "kaz", "kal", "khm", "kmb", "kan", -/* "ko", "kok", "kos", "kpe", "kr", "krc", "kro", "kru", "ks", */ - "kor", "kok", "kos", "kpe", "kau", "krc", "kro", "kru", "kas", +/* "ko", "kok", "kos", "kpe", "kr", "krc", "krl", "kro", "kru", "ks", */ + "kor", "kok", "kos", "kpe", "kau", "krc", "krl", "kro", "kru", "kas", /* "ku", "kum", "kut", "kv", "kw", "ky", "la", "lad", */ "kur", "kum", "kut", "kom", "cor", "kir", "lat", "lad", /* "lah", "lam", "lb", "lez", "lg", "li", "ln", "lo", "lol", */ @@ -275,8 +284,8 @@ static const char * const LANGUAGES_3[] = { "pli", "pol", "pon", "pra", "pro", "pus", "por", "que", /* "raj", "rap", "rar", "rm", "rn", "ro", "roa", "rom", */ "raj", "rap", "rar", "roh", "run", "ron", "roa", "rom", -/* "ru", "rw", "sa", "sad", "sah", "sai", "sal", "sam", */ - "rus", "kin", "san", "sad", "sah", "sai", "sal", "sam", +/* "ru", "rup", "rw", "sa", "sad", "sah", "sai", "sal", "sam", */ + "rus", "rup", "kin", "san", "sad", "sah", "sai", "sal", "sam", /* "sas", "sat", "sc", "scn", "sco", "sd", "se", "sel", "sem", */ "sas", "sat", "srd", "scn", "sco", "snd", "sme", "sel", "sem", /* "sg", "sga", "sgn", "shn", "si", "sid", "sio", "sit", */ @@ -304,7 +313,7 @@ static const char * const LANGUAGES_3[] = { /* "yi", "yo", "ypk", "za", "zap", "zen", "zh", "znd", */ "yid", "yor", "ypk", "zha", "zap", "zen", "zho", "znd", /* "zu", "zun", */ - "zul", "zun", + "zul", "zun", "zxx", NULL, /* "in", "iw", "ji", "jw", "sh", */ "ind", "heb", "yid", "jaw", "srp", @@ -345,11 +354,11 @@ static const char * const COUNTRIES[] = { "CU", "CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", - "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GL", + "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", - "ID", "IE", "IL", "IN", "IO", "IQ", "IR", "IS", - "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", + "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", + "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", @@ -365,12 +374,20 @@ static const char * const COUNTRIES[] = { "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", - "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", + "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", "ZZ", NULL, "FX", "RO", "TP", "ZR", /* obsolete country codes */ NULL }; +static const char* const DEPRECATED_COUNTRIES[] ={ + "BU", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR", NULL, NULL /* deprecated country list */ +}; +static const char* const REPLACEMENT_COUNTRIES[] = { +/* "BU", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR" */ + "MM", "BJ", "FR", "BF", "VU", "ZW", "TL", "CS", "CD", NULL, NULL /* replacement country codes */ +}; + /** * Table of 3-letter country codes. * @@ -403,16 +420,16 @@ static const char * const COUNTRIES_3[] = { "DMA", "DOM", "DZA", "ECU", "EST", "EGY", "ESH", "ERI", /* "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", */ "ESP", "ETH", "FIN", "FJI", "FLK", "FSM", "FRO", "FRA", -/* "GA", "GB", "GD", "GE", "GF", "GH", "GI", "GL", */ - "GAB", "GBR", "GRD", "GEO", "GUF", "GHA", "GIB", "GRL", +/* "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", */ + "GAB", "GBR", "GRD", "GEO", "GUF", "GGY", "GHA", "GIB", "GRL", /* "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", */ "GMB", "GIN", "GLP", "GNQ", "GRC", "SGS", "GTM", "GUM", /* "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", */ "GNB", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN", -/* "ID", "IE", "IL", "IN", "IO", "IQ", "IR", "IS", */ - "IDN", "IRL", "ISR", "IND", "IOT", "IRQ", "IRN", "ISL", -/* "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", */ - "ITA", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR", +/* ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS" */ + "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL", +/* "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", */ + "ITA", "JEY", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR", /* "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", */ "COM", "KNA", "PRK", "KOR", "KWT", "CYM", "KAZ", "LAO", /* "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", */ @@ -443,8 +460,8 @@ static const char * const COUNTRIES_3[] = { "TWN", "TZA", "UKR", "UGA", "UMI", "USA", "URY", "UZB", /* "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", */ "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF", -/* "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", */ - "WSM", "YEM", "MYT", "YUG", "ZAF", "ZMB", "ZWE", +/* "WS", "YE", "YT", "YU", "ZA", "ZM", "ZW", "ZZZ" */ + "WSM", "YEM", "MYT", "YUG", "ZAF", "ZMB", "ZWE", "ZZZ", NULL, /* "FX", "RO", "TP", "ZR", */ "FXX", "ROM", "TMP", "ZAR", @@ -465,6 +482,7 @@ typedef struct CanonicalizationMap { static const CanonicalizationMap CANONICALIZE_MAP[] = { { "", "en_US_POSIX", NULL, NULL }, /* .NET name */ { "C", "en_US_POSIX", NULL, NULL }, /* POSIX name */ + { "posix", "en_US_POSIX", NULL, NULL }, /* POSIX name (alias of C) */ { "art_LOJBAN", "jbo", NULL, NULL }, /* registered name */ { "az_AZ_CYRL", "az_Cyrl_AZ", NULL, NULL }, /* .NET name */ { "az_AZ_LATN", "az_Latn_AZ", NULL, NULL }, /* .NET name */ @@ -498,8 +516,10 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = { { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" }, { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" }, { "sl_ROZAJ", "sl__ROZAJ", NULL, NULL }, /* registered name */ - { "sr_SP_CYRL", "sr_Cyrl_SP", NULL, NULL }, /* .NET name */ - { "sr_SP_LATN", "sr_Latn_SP", NULL, NULL }, /* .NET name */ + { "sr_SP_CYRL", "sr_Cyrl_CS", NULL, NULL }, /* .NET name */ + { "sr_SP_LATN", "sr_Latn_CS", NULL, NULL }, /* .NET name */ + { "sr_YU_CYRILLIC", "sr_Cyrl_CS", NULL, NULL }, /* Linux name */ + { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", NULL, NULL }, /* Linux name */ { "uz_UZ_CYRL", "uz_Cyrl_UZ", NULL, NULL }, /* .NET name */ { "uz_UZ_LATN", "uz_Latn_UZ", NULL, NULL }, /* .NET name */ { "zh_CHS", "zh_Hans", NULL, NULL }, /* .NET name */ @@ -524,14 +544,16 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = { static const char * locale_getKeywordsStart(const char *localeID) { - /* TODO This seems odd. No matter what charset we're on, won't '@' - be '@'? Or are we building on one EBCDIC machine and moving the - library to another? */ const char *result = NULL; - static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 }; if((result = uprv_strchr(localeID, '@')) != NULL) { return result; - } else if(U_CHARSET_FAMILY == U_EBCDIC_FAMILY) { + } +#if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY) + else { + /* We do this because the @ sign is variant, and the @ sign used on one + EBCDIC machine won't be compiled the same way on other EBCDIC based + machines. */ + static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 }; const uint8_t *charToFind = ebcdicSigns; while(*charToFind) { if((result = uprv_strchr(localeID, *charToFind)) != NULL) { @@ -540,6 +562,7 @@ locale_getKeywordsStart(const char *localeID) { charToFind++; } } +#endif return NULL; } @@ -775,7 +798,6 @@ uloc_getKeywordValue(const char* localeID, UErrorCode* status) { const char* nextSeparator = NULL; - int32_t keywordNameLen; char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; int32_t i = 0; @@ -789,7 +811,7 @@ uloc_getKeywordValue(const char* localeID, return 0; } - keywordNameLen = locale_canonKeywordName(keywordNameBuffer, keywordName, status); + locale_canonKeywordName(keywordNameBuffer, keywordName, status); if(U_FAILURE(*status)) { return 0; } @@ -882,6 +904,17 @@ uloc_setKeywordValue(const char* keywordName, if(U_FAILURE(*status)) { return -1; } + if(bufferCapacity>1) { + bufLen = (int32_t)uprv_strlen(buffer); + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + if(bufferCapacity<bufLen) { + /* The capacity is less than the length?! Is this NULL terminated? */ + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } if(keywordValue && !*keywordValue) { keywordValue = NULL; } @@ -895,12 +928,6 @@ uloc_setKeywordValue(const char* keywordName, return 0; } startSearchHere = (char*)locale_getKeywordsStart(buffer); - if(bufferCapacity>1) { - bufLen = (int32_t)uprv_strlen(buffer); - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } if(startSearchHere == NULL || (startSearchHere[1]==0)) { if(!keywordValue) { /* no keywords = nothing to remove */ return bufLen; @@ -1123,6 +1150,22 @@ _copyCount(char *dest, int32_t destCapacity, const char *src) { } } +static const char* +uloc_getCurrentCountryID(const char* oldID){ + int32_t offset = _findIndex(DEPRECATED_COUNTRIES, oldID); + if (offset >= 0) { + return REPLACEMENT_COUNTRIES[offset]; + } + return oldID; +} +static const char* +uloc_getCurrentLanguageID(const char* oldID){ + int32_t offset = _findIndex(DEPRECATED_LANGUAGES, oldID); + if (offset >= 0) { + return REPLACEMENT_LANGUAGES[offset]; + } + return oldID; +} /* * the internal functions _getLanguage(), _getCountry(), _getVariant() * avoid duplicating code to handle the earlier locale ID pieces @@ -1498,6 +1541,9 @@ uloc_openKeywords(const char* localeID, #define OPTION_SET(options, mask) ((options & mask) != 0) +static const char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; +#define I_DEFAULT_LENGTH (sizeof i_default / sizeof i_default[0]) + /** * Canonicalize the given localeID, to level 1 or to level 2, * depending on the options. To specify level 1, pass in options=0. @@ -1513,6 +1559,7 @@ _canonicalize(const char* localeID, UErrorCode* err) { int32_t j, len, fieldCount=0, scriptSize=0, variantSize=0, nameCapacity; char localeBuffer[ULOC_FULLNAME_CAPACITY]; + const char* origLocaleID = localeID; const char* keywordAssign = NULL; const char* separatorIndicator = NULL; const char* addKeyword = NULL; @@ -1542,7 +1589,16 @@ _canonicalize(const char* localeID, /* get all pieces, one after another, and separate with '_' */ len=_getLanguage(localeID, name, nameCapacity, &localeID); - if(_isIDSeparator(*localeID)) { + + if(len == I_DEFAULT_LENGTH && uprv_strncmp(origLocaleID, i_default, len) == 0) { + const char *d = uloc_getDefault(); + + len = uprv_strlen(d); + + if (name != NULL) { + uprv_strncpy(name, d, len); + } + } else if(_isIDSeparator(*localeID)) { const char *scriptID; ++fieldCount; @@ -1733,7 +1789,7 @@ uloc_getParent(const char* localeID, i=0; } - if(i>0) { + if(i>0 && parent != localeID) { uprv_memcpy(parent, localeID, uprv_min(i, parentCapacity)); } return u_terminateChars(parent, parentCapacity, i, err); @@ -1824,7 +1880,6 @@ uloc_getVariant(const char* localeID, UErrorCode* err) { int32_t i=0; - UBool haveVariant=FALSE; if(err==NULL || U_FAILURE(*err)) { return 0; @@ -1848,7 +1903,6 @@ uloc_getVariant(const char* localeID, if (_isIDSeparator(*localeID)) { _getCountry(localeID+1, NULL, 0, &localeID); if(_isIDSeparator(*localeID)) { - haveVariant=TRUE; i=_getVariant(localeID+1, *localeID, variant, variantCapacity); } } @@ -1988,153 +2042,107 @@ _res_getTableStringWithFallback(const char *path, const char *locale, int32_t *pLength, UErrorCode *pErrorCode) { - char localeBuffer[ULOC_FULLNAME_CAPACITY*4]; - UResourceBundle *rb, table; - const UChar *item; +/* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/ + UResourceBundle *rb=NULL, table, subTable; + const UChar *item=NULL; UErrorCode errorCode; char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0}; - int32_t efnLen =0; - const UChar* ef = NULL; - UBool overrideExplicitFallback = FALSE; - for(;;) { - /* - * open the bundle for the current locale - * this falls back through the locale's chain to root - */ - errorCode=U_ZERO_ERROR; - rb=ures_open(path, locale, &errorCode); - if(U_FAILURE(errorCode)) { - /* total failure, not even root could be opened */ - *pErrorCode=errorCode; - return NULL; - } else if(errorCode==U_USING_DEFAULT_WARNING || - (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) - ) { - /* set the "strongest" error code (success->fallback->default->failure) */ - *pErrorCode=errorCode; - } - - /* - * try to open the requested table - * this falls back through the locale's chain to root, but not through the default locale - */ - errorCode=U_ZERO_ERROR; + + /* + * open the bundle for the current locale + * this falls back through the locale's chain to root + */ + errorCode=U_ZERO_ERROR; + rb=ures_open(path, locale, &errorCode); + if(U_FAILURE(errorCode)) { + /* total failure, not even root could be opened */ + *pErrorCode=errorCode; + return NULL; + } else if(errorCode==U_USING_DEFAULT_WARNING || + (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) + ) { + /* set the "strongest" error code (success->fallback->default->failure) */ + *pErrorCode=errorCode; + } + + for(;;){ ures_initStackObject(&table); - ures_getByKey(rb, tableKey, &table, &errorCode); - if(U_FAILURE(errorCode)) { - /* no such table anywhere in this fallback chain */ - ures_close(rb); - *pErrorCode=errorCode; - return NULL; - } else if(errorCode==U_USING_DEFAULT_WARNING || - (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) - ) { - /* set the "strongest" error code (success->fallback->default->failure) */ - *pErrorCode=errorCode; + ures_initStackObject(&subTable); + ures_getByKeyWithFallback(rb, tableKey, &table, &errorCode); + if (subTableKey != NULL) { + /* + ures_getByKeyWithFallback(&table,subTableKey, &subTable, &errorCode); + item = ures_getStringByKeyWithFallback(&subTable, itemKey, pLength, &errorCode); + if(U_FAILURE(errorCode)){ + *pErrorCode = errorCode; + } + + break;*/ + + ures_getByKeyWithFallback(&table,subTableKey, &table, &errorCode); } - - /* check if the fallback token is set */ - ef = ures_getStringByKey(&table, "Fallback", &efnLen, &errorCode); if(U_SUCCESS(errorCode)){ - /* set the fallback chain */ - u_UCharsToChars(ef, explicitFallbackName, efnLen); - /* null terminate the buffer */ - explicitFallbackName[efnLen]=0; - }else if(errorCode==U_USING_DEFAULT_WARNING || - (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) - ) { - /* set the "strongest" error code (success->fallback->default->failure) */ - *pErrorCode=errorCode; - } - - /* try to open the requested item in the table */ - errorCode=U_ZERO_ERROR; - if(subTableKey == NULL){ - item=ures_getStringByKey(&table, itemKey, pLength, &errorCode); - }else{ - UResourceBundle subTable; - ures_initStackObject(&subTable); - ures_getByKey(&table, subTableKey, &subTable, &errorCode); - item = ures_getStringByKey(&subTable, itemKey, pLength, &errorCode); - ures_close(&subTable); - } - if(U_SUCCESS(errorCode)) { - /* if the item for the key is empty ... override the explicit fall back set */ - if(item[0]==0 && efnLen > 0){ - overrideExplicitFallback = TRUE; - }else{ - /* we got the requested item! */ - ures_close(&table); - ures_close(rb); - - if(errorCode==U_USING_DEFAULT_WARNING || - (errorCode==U_USING_FALLBACK_WARNING && *pErrorCode!=U_USING_DEFAULT_WARNING) - ) { - /* set the "strongest" error code (success->fallback->default->failure) */ - *pErrorCode=errorCode; + item = ures_getStringByKeyWithFallback(&table, itemKey, pLength, &errorCode); + if(U_FAILURE(errorCode)){ + const char* replacement = NULL; + *pErrorCode = errorCode; /*save the errorCode*/ + errorCode = U_ZERO_ERROR; + /* may be a deprecated code */ + if(uprv_strcmp(tableKey, "Countries")==0){ + replacement = uloc_getCurrentCountryID(itemKey); + }else if(uprv_strcmp(tableKey, "Languages")==0){ + replacement = uloc_getCurrentLanguageID(itemKey); } - - /* - * It is safe to close the bundle and still return the - * string pointer because resource bundles are - * cached until u_cleanup(). - */ - return item; + /*pointer comparison is ok since uloc_getCurrentCountryID & uloc_getCurrentLanguageID return the key itself is replacement is not found*/ + if(replacement!=NULL && itemKey != replacement){ + item = ures_getStringByKeyWithFallback(&table, replacement, pLength, &errorCode); + if(U_SUCCESS(errorCode)){ + *pErrorCode = errorCode; + break; + } + } + }else{ + break; } } + + if(U_FAILURE(errorCode)){ - /* - * We get here if the item was not found. - * We will follow the chain to the parent locale bundle and look in - * the table there. - */ + /* still can't figure out ?.. try the fallback mechanism */ + int32_t len = 0; + const UChar* fallbackLocale = NULL; + *pErrorCode = errorCode; + errorCode = U_ZERO_ERROR; - /* get the real locale ID for this table */ - errorCode=U_ZERO_ERROR; - locale=ures_getLocale(&table, &errorCode); - /* keep table and rb open until we are done using the locale string owned by the table bundle */ - if(U_FAILURE(errorCode)) { - /* error getting the locale ID for an open RB - should never happen */ - ures_close(&table); - ures_close(rb); - *pErrorCode=U_INTERNAL_PROGRAM_ERROR; - return NULL; - } - - if(*locale==0 || 0==uprv_strcmp(locale, _kRootName) || 0==uprv_strcmp(locale,explicitFallbackName)) { - /* end of fallback; even root does not have the requested item either */ - ures_close(&table); + fallbackLocale = ures_getStringByKeyWithFallback(&table, "Fallback", &len, &errorCode); + if(U_FAILURE(errorCode)){ + *pErrorCode = errorCode; + break; + } + + u_UCharsToChars(fallbackLocale, explicitFallbackName, len); + + /* guard against recursive fallback */ + if(uprv_strcmp(explicitFallbackName, locale)==0){ + *pErrorCode = U_INTERNAL_PROGRAM_ERROR; + break; + } ures_close(rb); - *pErrorCode=U_MISSING_RESOURCE_ERROR; - return NULL; - } - - /* could not find the table, or its item, try to fall back to a different RB and table */ - errorCode=U_ZERO_ERROR; - if(efnLen > 0 && overrideExplicitFallback == FALSE){ - /* continue the fallback lookup with the explicit fallback that is requested */ - locale = explicitFallbackName; - }else{ - uloc_getParent(locale, localeBuffer, sizeof(localeBuffer), &errorCode); - if(U_FAILURE(errorCode) || errorCode==U_STRING_NOT_TERMINATED_WARNING) { - /* error getting the parent locale ID - should never happen */ - *pErrorCode=U_INTERNAL_PROGRAM_ERROR; - return NULL; + rb = ures_open(NULL, explicitFallbackName, &errorCode); + if(U_FAILURE(errorCode)){ + *pErrorCode = errorCode; + break; } - - /* continue the fallback lookup with the parent locale ID */ - locale=localeBuffer; - - /* adjust error code as we fall back */ - if (uprv_strlen(locale) == 0) /* Falling back to root locale? */ - *pErrorCode = U_USING_DEFAULT_WARNING; - else if (*pErrorCode != U_USING_DEFAULT_WARNING) - *pErrorCode = U_USING_FALLBACK_WARNING; + /* succeeded in opening the fallback bundle .. continue and try to fetch the item */ + }else{ + break; } - /* done with the locale string - ready to close table and rb */ - ures_close(&table); - ures_close(rb); } + /* done with the locale string - ready to close table and rb */ + ures_close(&subTable); + ures_close(&table); + ures_close(rb); + return item; } static int32_t @@ -2989,11 +2997,11 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, if(len>0) { uprv_strncpy(result, l, uprv_min(len, resultAvailable)); } - for(i=0;i<acceptListCount;i++) { - uprv_free(fallbackList[i]); + for(j=0;j<acceptListCount;j++) { + uprv_free(fallbackList[j]); } uprv_free(fallbackList); - return u_terminateChars(result, resultAvailable, len, status); + return u_terminateChars(result, resultAvailable, len, status); } } uenum_reset(availableLocales, status); diff --git a/Build/source/libs/icu-xetex/common/umapfile.c b/Build/source/libs/icu-xetex/common/umapfile.c index d956e77211a..356e55ac32b 100644 --- a/Build/source/libs/icu-xetex/common/umapfile.c +++ b/Build/source/libs/icu-xetex/common/umapfile.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ @@ -21,32 +21,6 @@ #include "udatamem.h" #include "umapfile.h" -#if U_ICU_VERSION_MAJOR_NUM>3 || (U_ICU_VERSION_MAJOR_NUM==3 && U_ICU_VERSION_MINOR_NUM>4) -# error Time bomb: After ICU 3.4 move the definition of UCONFIG_NO_FILE_IO to uconfig.h. Use Jitterbug 4614. -#endif - -/** - * \def UCONFIG_NO_FILE_IO - * This switch turns off all file access in the common library - * where file access is only used for data loading. - * ICU data must then be provided in the form of a data DLL (or with an - * equivalent way to link to the data residing in an executable, - * as in building a combined library with both the common library's code and - * the data), or via udata_setCommonData(). - * Application data must be provided via udata_setAppData() or by using - * "open" functions that take pointers to data, for example ucol_openBinary(). - * - * File access is not used at all in the i18n library. - * - * File access cannot be turned off for the icuio library or for the ICU - * test suites and ICU tools. - * - * @draft ICU 3.6 - */ -#ifndef UCONFIG_NO_FILE_IO -# define UCONFIG_NO_FILE_IO 0 -#endif - /* memory-mapping base definitions ------------------------------------------ */ /* MAP_NONE: no memory mapping, no file access at all */ @@ -66,6 +40,7 @@ # define NOIME # define NOMCX # include <windows.h> +# include "cmemory.h" typedef HANDLE MemoryMap; @@ -74,7 +49,7 @@ # define MAP_IMPLEMENTATION MAP_WIN32 /* ### Todo: properly auto detect mmap(). Until then, just add your platform here. */ -#elif U_HAVE_MMAP || defined(U_AIX) || defined(U_HPUX) || defined(OS390) || defined(PTX) +#elif U_HAVE_MMAP || defined(U_AIX) || defined(U_HPUX) || defined(OS390) typedef size_t MemoryMap; # define IS_MAP(map) ((map)!=0) @@ -151,6 +126,9 @@ { HANDLE map; HANDLE file; + SECURITY_ATTRIBUTES mappingAttributes; + SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; + SECURITY_DESCRIPTOR securityDesc; UDataMemory_init(pData); /* Clear the output struct. */ @@ -162,8 +140,24 @@ return FALSE; } + /* Declare and initialize a security descriptor. + This is required for multiuser systems on Windows 2000 SP4 and beyond */ + if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) { + /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ + if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) { + /* Make the security attributes point to the security descriptor */ + uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes)); + mappingAttributes.nLength = sizeof(mappingAttributes); + mappingAttributes.lpSecurityDescriptor = &securityDesc; + mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */ + mappingAttributesPtr = &mappingAttributes; + } + } + /* else creating security descriptors can fail when we are on Windows 98, + and mappingAttributesPtr == NULL for that case. */ + /* create an unnamed Windows file-mapping object for the specified file */ - map=CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); + map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL); CloseHandle(file); if(map==NULL) { return FALSE; diff --git a/Build/source/libs/icu-xetex/common/umath.c b/Build/source/libs/icu-xetex/common/umath.c new file mode 100644 index 00000000000..4a571143168 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/umath.c @@ -0,0 +1,24 @@ +/* +****************************************************************************** +* +* Copyright (C) 1997-2006, International Business Machines +* Corporation and others. All Rights Reserved. +* +****************************************************************************** +* This file contains platform independent math. +*/ + +#include "putilimp.h" + +U_CAPI int32_t U_EXPORT2 +uprv_max(int32_t x, int32_t y) +{ + return (x > y ? x : y); +} + +U_CAPI int32_t U_EXPORT2 +uprv_min(int32_t x, int32_t y) +{ + return (x > y ? y : x); +} + diff --git a/Build/source/libs/icu-xetex/common/umutex.c b/Build/source/libs/icu-xetex/common/umutex.c index 5b72ea48d70..22396f5e1d9 100644 --- a/Build/source/libs/icu-xetex/common/umutex.c +++ b/Build/source/libs/icu-xetex/common/umutex.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -22,6 +22,14 @@ #include "uassert.h" #include "ucln_cmn.h" +#if defined(U_DARWIN) +#include <AvailabilityMacros.h> +#if (ICU_USE_THREADS == 1) && defined(MAC_OS_X_VERSION_10_4) && defined(MAC_OS_X_VERSION_MIN_REQUIRED) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4) +#include <libkern/OSAtomic.h> +#define USE_MAC_OS_ATOMIC_INCREMENT 1 +#endif +#endif + /* Assume POSIX, and modify as necessary below */ #define POSIX @@ -511,6 +519,8 @@ umtx_atomic_inc(int32_t *p) { } else { #if defined (U_WINDOWS) && ICU_USE_THREADS == 1 retVal = InterlockedIncrement((LONG*)p); + #elif defined(USE_MAC_OS_ATOMIC_INCREMENT) + retVal = OSAtomicIncrement32Barrier(p); #elif defined (POSIX) && ICU_USE_THREADS == 1 umtx_lock(&gIncDecMutex); retVal = ++(*p); @@ -531,6 +541,8 @@ umtx_atomic_dec(int32_t *p) { } else { #if defined (U_WINDOWS) && ICU_USE_THREADS == 1 retVal = InterlockedDecrement((LONG*)p); + #elif defined(USE_MAC_OS_ATOMIC_INCREMENT) + retVal = OSAtomicDecrement32Barrier(p); #elif defined (POSIX) && ICU_USE_THREADS == 1 umtx_lock(&gIncDecMutex); retVal = --(*p); @@ -552,7 +564,6 @@ umtx_atomic_dec(int32_t *p) { U_CAPI void U_EXPORT2 u_setAtomicIncDecFunctions(const void *context, UMtxAtomicFn *ip, UMtxAtomicFn *dp, UErrorCode *status) { - int32_t testInt; if (U_FAILURE(*status)) { return; } @@ -571,11 +582,15 @@ u_setAtomicIncDecFunctions(const void *context, UMtxAtomicFn *ip, UMtxAtomicFn * pDecFn = dp; gIncDecContext = context; - testInt = 0; - U_ASSERT(umtx_atomic_inc(&testInt) == 1); /* Sanity Check. Do the functions work at all? */ - U_ASSERT(testInt == 1); - U_ASSERT(umtx_atomic_dec(&testInt) == 0); - U_ASSERT(testInt == 0); +#if !U_RELEASE + { + int32_t testInt = 0; + U_ASSERT(umtx_atomic_inc(&testInt) == 1); /* Sanity Check. Do the functions work at all? */ + U_ASSERT(testInt == 1); + U_ASSERT(umtx_atomic_dec(&testInt) == 0); + U_ASSERT(testInt == 0); + } +#endif } diff --git a/Build/source/libs/icu-xetex/common/unames.c b/Build/source/libs/icu-xetex/common/unames.c index 621d028a829..c8faf8fe871 100644 --- a/Build/source/libs/icu-xetex/common/unames.c +++ b/Build/source/libs/icu-xetex/common/unames.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -65,16 +65,14 @@ static UErrorCode gLoadErrorCode=U_ZERO_ERROR; /* * Maximum length of character names (regular & 1.0). - * Maximum length of ISO comments. */ -static int32_t gMaxNameLength=0, gMaxISOCommentLength=0; +static int32_t gMaxNameLength=0; /* * Set of chars used in character names (regular & 1.0). - * Set of chars used in ISO comments. * Chars are platform-dependent (can be EBCDIC). */ -static uint32_t gNameSet[8]={ 0 }, gISOCommentSet[8]={ 0 }; +static uint32_t gNameSet[8]={ 0 }; #define U_NONCHARACTER_CODE_POINT U_CHAR_CATEGORY_COUNT #define U_LEAD_SURROGATE U_CHAR_CATEGORY_COUNT + 1 @@ -82,8 +80,41 @@ static uint32_t gNameSet[8]={ 0 }, gISOCommentSet[8]={ 0 }; #define U_CHAR_EXTENDED_CATEGORY_COUNT (U_CHAR_CATEGORY_COUNT + 3) -static const char * const -charCatNames[U_CHAR_EXTENDED_CATEGORY_COUNT]; +static const char * const charCatNames[U_CHAR_EXTENDED_CATEGORY_COUNT] = { + "unassigned", + "uppercase letter", + "lowercase letter", + "titlecase letter", + "modifier letter", + "other letter", + "non spacing mark", + "enclosing mark", + "combining spacing mark", + "decimal digit number", + "letter number", + "other number", + "space separator", + "line separator", + "paragraph separator", + "control", + "format", + "private use area", + "surrogate", + "dash punctuation", + "start punctuation", + "end punctuation", + "connector punctuation", + "other punctuation", + "math symbol", + "currency symbol", + "modifier symbol", + "other symbol", + "initial punctuation", + "final punctuation", + "noncharacter", + "lead surrogate", + "trail surrogate" +}; /* implementation ----------------------------------------------------------- */ @@ -372,42 +403,6 @@ compareName(UCharNames *names, return (UBool)(*otherName==0); } -static const char * const charCatNames[U_CHAR_EXTENDED_CATEGORY_COUNT] = { - "unassigned", - "uppercase letter", - "lowercase letter", - "titlecase letter", - "modifier letter", - "other letter", - "non spacing mark", - "enclosing mark", - "combining spacing mark", - "decimal digit number", - "letter number", - "other number", - "space separator", - "line separator", - "paragraph separator", - "control", - "format", - "private use area", - "surrogate", - "dash punctuation", - "start punctuation", - "end punctuation", - "connector punctuation", - "other punctuation", - "math symbol", - "currency symbol", - "modifier symbol", - "other symbol", - "initial punctuation", - "final punctuation", - "noncharacter", - "lead surrogate", - "trail surrogate" -}; - static uint8_t getCharCat(UChar32 cp) { uint8_t cat; @@ -1333,7 +1328,6 @@ calcGroupNameSetsLengths(int32_t maxNameLength) { Group *group; const uint8_t *s, *line, *lineLimit; - int32_t maxISOCommentLength=0; int32_t groupCount, lineNumber, length; tokenLengths=(int8_t *)uprv_malloc(tokenCount); @@ -1380,10 +1374,7 @@ calcGroupNameSetsLengths(int32_t maxNameLength) { } /* read ISO comment */ - length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gISOCommentSet, &line, lineLimit); - if(length>maxISOCommentLength) { - maxISOCommentLength=length; - } + /*length=calcNameSetLength(tokens, tokenCount, tokenStrings, tokenLengths, gISOCommentSet, &line, lineLimit);*/ } ++group; @@ -1395,7 +1386,6 @@ calcGroupNameSetsLengths(int32_t maxNameLength) { } /* set gMax... - name length last for threading */ - gMaxISOCommentLength=maxISOCommentLength; gMaxNameLength=maxNameLength; } @@ -1694,22 +1684,6 @@ uprv_getMaxCharNameLength() { } } -#if 0 -/* -Currently not used but left for future use. Probably by UnicodeSet. -urename.h and uprops.h changed accordingly. -*/ -U_CAPI int32_t U_EXPORT2 -uprv_getMaxISOCommentLength() { - UErrorCode errorCode=U_ZERO_ERROR; - if(calcNameSetsLengths(&errorCode)) { - return gMaxISOCommentLength; - } else { - return 0; - } -} -#endif - /** * Converts the char set cset into a Unicode set uset. * @param cset Set of 256 bit flags corresponding to a set of chars. @@ -1757,21 +1731,6 @@ uprv_getCharNameCharacters(const USetAdder *sa) { charSetToUSet(gNameSet, sa); } -#if 0 -/* -Currently not used but left for future use. Probably by UnicodeSet. -urename.h and uprops.h changed accordingly. -*/ -/** - * Fills set with characters that are used in Unicode character names. - * @param set USetAdder to receive characters. - */ -U_CAPI void U_EXPORT2 -uprv_getISOCommentCharacters(const USetAdder *sa) { - charSetToUSet(gISOCommentSet, sa); -} -#endif - /* data swapping ------------------------------------------------------------ */ /* @@ -2085,23 +2044,11 @@ uchar_swapNames(const UDataSwapper *ds, case 1: { /* swap factors and the prefix and factor strings */ - uint16_t factors[8]; - uint32_t j, factorsCount; + uint32_t factorsCount; factorsCount=inRange->variant; - if(factorsCount==0 || factorsCount>LENGTHOF(factors)) { - udata_printError(ds, "uchar_swapNames(): too many factors (%u) in algorithmic range %u\n", - factorsCount, i); - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - - /* read and swap the factors */ p=(const uint16_t *)(inRange+1); q=(uint16_t *)(outRange+1); - for(j=0; j<factorsCount; ++j) { - factors[j]=ds->readUInt16(p[j]); - } ds->swapArray16(ds, p, (int32_t)(factorsCount*2), q, pErrorCode); /* swap the strings, up to the last terminating NUL */ diff --git a/Build/source/libs/icu-xetex/common/unicode/brkiter.h b/Build/source/libs/icu-xetex/common/unicode/brkiter.h index 152e6a3d781..ba65650b5f3 100644 --- a/Build/source/libs/icu-xetex/common/unicode/brkiter.h +++ b/Build/source/libs/icu-xetex/common/unicode/brkiter.h @@ -1,6 +1,6 @@ /* ******************************************************************************** -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * @@ -48,38 +48,31 @@ U_NAMESPACE_END #include "unicode/ubrk.h" #include "unicode/strenum.h" #include "unicode/utext.h" +#include "unicode/umisc.h" U_NAMESPACE_BEGIN -#if !UCONFIG_NO_SERVICE -/** - * Opaque type returned by registerInstance. - * @stable - */ -typedef const void* URegistryKey; -#endif - /** * The BreakIterator class implements methods for finding the location * of boundaries in text. BreakIterator is an abstract base class. * Instances of BreakIterator maintain a current position and scan over * text returning the index of characters where boundaries occur. - * <P> + * <p> * Line boundary analysis determines where a text string can be broken * when line-wrapping. The mechanism correctly handles punctuation and * hyphenated words. - * <P> + * <p> * Sentence boundary analysis allows selection with correct * interpretation of periods within numbers and abbreviations, and * trailing punctuation marks such as quotation marks and parentheses. - * <P> + * <p> * Word boundary analysis is used by search and replace functions, as * well as within text editing applications that allow the user to * select words with a double click. Word selection provides correct * interpretation of punctuation marks within and following * words. Characters that are not part of a word, such as symbols or * punctuation marks, have word-breaks on both sides. - * <P> + * <p> * Character boundary analysis allows users to interact with * characters as they expect to, for example, when moving the cursor * through a text string. Character boundary analysis provides correct @@ -87,126 +80,22 @@ typedef const void* URegistryKey; * character is stored. For example, an accented character might be * stored as a base character and a diacritical mark. What users * consider to be a character can differ between languages. - * <P> - * This is the interface for all text boundaries. - * <P> - * Examples: - * <P> - * Helper function to output text - * <pre> - * \code - * void printTextRange( BreakIterator& iterator, int32_t start, int32_t end ) - * { - * UnicodeString textBuffer, temp; - * CharacterIterator *strIter = iterator.createText(); - * strIter->getText(temp); - * cout << " " << start << " " << end << " |" - * << temp.extractBetween(start, end, textBuffer) - * << "|" << endl; - * delete strIter; - * } - * \endcode - * </pre> - * Print each element in order: - * <pre> - * \code - * void printEachForward( BreakIterator& boundary) - * { - * int32_t start = boundary.first(); - * for (int32_t end = boundary.next(); - * end != BreakIterator::DONE; - * start = end, end = boundary.next()) - * { - * printTextRange( boundary, start, end ); - * } - * } - * \endcode - * </pre> - * Print each element in reverse order: - * <pre> - * \code - * void printEachBackward( BreakIterator& boundary) - * { - * int32_t end = boundary.last(); - * for (int32_t start = boundary.previous(); - * start != BreakIterator::DONE; - * end = start, start = boundary.previous()) - * { - * printTextRange( boundary, start, end ); - * } - * } - * \endcode - * </pre> - * Print first element - * <pre> - * \code - * void printFirst(BreakIterator& boundary) - * { - * int32_t start = boundary.first(); - * int32_t end = boundary.next(); - * printTextRange( boundary, start, end ); - * } - * \endcode - * </pre> - * Print last element - * <pre> - * \code - * void printLast(BreakIterator& boundary) - * { - * int32_t end = boundary.last(); - * int32_t start = boundary.previous(); - * printTextRange( boundary, start, end ); - * } - * \endcode - * </pre> - * Print the element at a specified position - * <pre> - * \code - * void printAt(BreakIterator &boundary, int32_t pos ) - * { - * int32_t end = boundary.following(pos); - * int32_t start = boundary.previous(); - * printTextRange( boundary, start, end ); - * } - * \endcode - * </pre> - * Creating and using text boundaries - * <pre> - * \code - * void BreakIterator_Example( void ) - * { - * BreakIterator* boundary; - * UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff."); - * cout << "Examining: " << stringToExamine << endl; - * - * //print each sentence in forward and reverse order - * boundary = BreakIterator::createSentenceInstance( Locale::US ); - * boundary->setText(stringToExamine); - * cout << "----- forward: -----------" << endl; - * printEachForward(*boundary); - * cout << "----- backward: ----------" << endl; - * printEachBackward(*boundary); - * delete boundary; - * - * //print each word in order - * boundary = BreakIterator::createWordInstance(); - * boundary->setText(stringToExamine); - * cout << "----- forward: -----------" << endl; - * printEachForward(*boundary); - * //print first element - * cout << "----- first: -------------" << endl; - * printFirst(*boundary); - * //print last element - * cout << "----- last: --------------" << endl; - * printLast(*boundary); - * //print word at charpos 10 - * cout << "----- at pos 10: ---------" << endl; - * printAt(*boundary, 10 ); + * <p> + * The text boundary positions are found according to the rules + * described in Unicode Standard Annex #29, Text Boundaries, and + * Unicode Standard Annex #14, Line Breaking Properties. These + * are available at http://www.unicode.org/reports/tr14/ and + * http://www.unicode.org/reports/tr29/. + * <p> + * In addition to the C++ API defined in this header file, a + * plain C API with equivalent functionality is defined in the + * file ubrk.h + * <p> + * Code snippits illustrating the use of the Break Iterator APIs + * are available in the ICU User Guide, + * http://icu.sourceforge.net/userguide/boundaryAnalysis.html + * and in the sample program icu/source/samples/break/break.cpp" * - * delete boundary; - * } - * \endcode - * </pre> */ class U_COMMON_API BreakIterator : public UObject { public: @@ -255,11 +144,9 @@ public: /** * Return a CharacterIterator over the text being analyzed. - * Changing the state of the returned iterator can have undefined consequences - * on the operation of the break iterator. If you need to change it, clone it first. * @stable ICU 2.0 */ - virtual const CharacterIterator& getText(void) const = 0; + virtual CharacterIterator& getText(void) const = 0; /** @@ -304,6 +191,8 @@ public: /** * Change the text over which this operates. The text boundary is * reset to the start. + * Note that setText(UText *) provides similar functionality to this function, + * and is more efficient. * @param it The CharacterIterator used to change the text. * @stable ICU 2.0 */ @@ -613,7 +502,7 @@ public: /** * Returns the locale for this break iterator. Two flavors are available: valid and * actual locale. - * @draft ICU 2.8 likely to change after ICU 3.0, based on feedback + * @stable ICU 2.8 */ Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; @@ -626,8 +515,8 @@ public: const char *getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; private: - static BreakIterator* buildInstance(const Locale& loc, const char *type, UBool dict, UErrorCode& status); - static BreakIterator* createInstance(const Locale& loc, UBreakIteratorType kind, UErrorCode& status); + static BreakIterator* buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode& status); + static BreakIterator* createInstance(const Locale& loc, int32_t kind, UErrorCode& status); static BreakIterator* makeInstance(const Locale& loc, int32_t kind, UErrorCode& status); friend class ICUBreakIteratorFactory; diff --git a/Build/source/libs/icu-xetex/common/unicode/caniter.h b/Build/source/libs/icu-xetex/common/unicode/caniter.h index 5e1526dbf48..84a65958d16 100644 --- a/Build/source/libs/icu-xetex/common/unicode/caniter.h +++ b/Build/source/libs/icu-xetex/common/unicode/caniter.h @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 1996-2005, International Business Machines Corporation and * + * Copyright (C) 1996-2006, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -178,7 +178,7 @@ private: UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment) //Set getEquivalents2(String segment); - Hashtable *getEquivalents2(const UChar *segment, int32_t segLen, UErrorCode &status); + Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status); //Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status); /** @@ -187,7 +187,7 @@ private: * If so, take the remainder, and return the equivalents */ //Set extract(int comp, String segment, int segmentPos, StringBuffer buffer); - Hashtable *extract(UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); + Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); //Hashtable *extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); void cleanPieces(); diff --git a/Build/source/libs/icu-xetex/common/unicode/dbbi.h b/Build/source/libs/icu-xetex/common/unicode/dbbi.h index 2fb15497c9b..c7984ef862f 100644 --- a/Build/source/libs/icu-xetex/common/unicode/dbbi.h +++ b/Build/source/libs/icu-xetex/common/unicode/dbbi.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005 IBM Corp. All rights reserved. +* Copyright (C) 1999-2006 IBM Corp. All rights reserved. ********************************************************************** * Date Name Description * 12/1/99 rgillam Complete port from Java. @@ -22,253 +22,17 @@ U_NAMESPACE_BEGIN -/* forward declaration */ -class DictionaryBasedBreakIteratorTables; - /** - * A subclass of RuleBasedBreakIterator that adds the ability to use a dictionary - * to further subdivide ranges of text beyond what is possible using just the - * state-table-based algorithm. This is necessary, for example, to handle - * word and line breaking in Thai, which doesn't use spaces between words. The - * state-table-based algorithm used by RuleBasedBreakIterator is used to divide - * up text as far as possible, and then contiguous ranges of letters are - * repeatedly compared against a list of known words (i.e., the dictionary) - * to divide them up into words. - * - * <p>Applications do not normally need to include this header.</p> - * - * <p>This class will probably be deprecated in a future release of ICU, and replaced - * with a more flexible and capable dictionary based break iterator. This change - * should be invisible to applications, because creation and use of instances of - * DictionaryBasedBreakIterator is through the factories and abstract - * API on class BreakIterator, which will remain stable.</p> - * - * <p>This class is not intended to be subclassed.</p> - * - * - * DictionaryBasedBreakIterator uses the same rule language as RuleBasedBreakIterator, - * but adds one more special substitution name: <dictionary>. This substitution - * name is used to identify characters in words in the dictionary. The idea is that - * if the iterator passes over a chunk of text that includes two or more characters - * in a row that are included in <dictionary>, it goes back through that range and - * derives additional break positions (if possible) using the dictionary. - * - * DictionaryBasedBreakIterator is also constructed with the filename of a dictionary - * file. It follows a prescribed search path to locate the dictionary (right now, - * it looks for it in /com/ibm/text/resources in each directory in the classpath, - * and won't find it in JAR files, but this location is likely to change). The - * dictionary file is in a serialized binary format. We have a very primitive (and - * slow) BuildDictionaryFile utility for creating dictionary files, but aren't - * currently making it public. Contact us for help. - * <p> - * <b> NOTE </b> The DictionaryBasedIterator class is still under development. The - * APIs are not in stable condition yet. + * An obsolete subclass of RuleBasedBreakIterator. Handling of dictionary- + * based break iteration has been folded into the base class. This class + * is deprecated as of ICU 3.6. */ -class U_COMMON_API DictionaryBasedBreakIterator : public RuleBasedBreakIterator { - -private: - - /** - * when a range of characters is divided up using the dictionary, the break - * positions that are discovered are stored here, preventing us from having - * to use either the dictionary or the state table again until the iterator - * leaves this range of text - */ - int32_t* cachedBreakPositions; - - /** - * The number of elements in cachedBreakPositions - */ - int32_t numCachedBreakPositions; - - /** - * if cachedBreakPositions is not null, this indicates which item in the - * cache the current iteration position refers to - */ - int32_t positionInCache; - - DictionaryBasedBreakIteratorTables *fTables; - - /**======================================================================= - * Create a dictionary based break boundary detection iterator. - * @param tablesImage The location for the dictionary to be loaded into memory - * @param dictionaryFilename The name of the dictionary file - * @param status the error code status - * @return A dictionary based break detection iterator. The UErrorCode& status - * parameter is used to return status information to the user. - * To check whether the construction succeeded or not, you should check - * the value of U_SUCCESS(err). If you wish more detailed information, you - * can check for informational error results which still indicate success. For example, - * U_FILE_ACCESS_ERROR will be returned if the file does not exist. - * The caller owns the returned object and is responsible for deleting it. - ======================================================================= */ - DictionaryBasedBreakIterator(UDataMemory* tablesImage, const char* dictionaryFilename, UErrorCode& status); - -public: - //======================================================================= - // boilerplate - //======================================================================= - - /** - * Destructor - * @stable ICU 2.0 - */ - virtual ~DictionaryBasedBreakIterator(); - - /** - * Default constructor. Creates an "empty" break iterator. - * Such an iterator can subsequently be assigned to. - * @return the newly created DictionaryBaseBreakIterator. - * @stable ICU 2.0 - */ - DictionaryBasedBreakIterator(); - - /** - * Copy constructor. - * @param other The DictionaryBasedBreakIterator to be copied. - * @return the newly created DictionaryBasedBreakIterator. - * @stable ICU 2.0 - */ - DictionaryBasedBreakIterator(const DictionaryBasedBreakIterator &other); - - /** - * Assignment operator. - * @param that The object to be copied. - * @return the newly set DictionaryBasedBreakIterator. - * @stable ICU 2.0 - */ - DictionaryBasedBreakIterator& operator=(const DictionaryBasedBreakIterator& that); - - /** - * Returns a newly-constructed RuleBasedBreakIterator with the same - * behavior, and iterating over the same text, as this one. - * @return Returns a newly-constructed RuleBasedBreakIterator. - * @stable ICU 2.0 - */ - virtual BreakIterator* clone(void) const; - - //======================================================================= - // BreakIterator overrides - //======================================================================= - /** - * Advances the iterator backwards, to the last boundary preceding this one. - * @return The position of the last boundary position preceding this one. - * @stable ICU 2.0 - */ - virtual int32_t previous(void); - - /** - * Sets the iterator to refer to the first boundary position following - * the specified position. - * @param offset The position from which to begin searching for a break position. - * @return The position of the first break after the current position. - * @stable ICU 2.0 - */ - virtual int32_t following(int32_t offset); - - /** - * Sets the iterator to refer to the last boundary position before the - * specified position. - * @param offset The position to begin searching for a break from. - * @return The position of the last boundary before the starting position. - * @stable ICU 2.0 - */ - virtual int32_t preceding(int32_t offset); - - /** - * Returns the class ID for this class. This is useful only for - * comparing to a return value from getDynamicClassID(). For example: - * - * Base* polymorphic_pointer = createPolymorphicObject(); - * if (polymorphic_pointer->getDynamicClassID() == - * Derived::getStaticClassID()) ... - * - * @return The class ID for all objects of this class. - * @stable ICU 2.0 - */ - static UClassID U_EXPORT2 getStaticClassID(void); - - /** - * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. - * This method is to implement a simple version of RTTI, since not all - * C++ compilers support genuine RTTI. Polymorphic operator==() and - * clone() methods call this method. - * - * @return The class ID for this object. All objects of a - * given class have the same class ID. Objects of - * other classes have different class IDs. - * @stable ICU 2.0 - */ - virtual UClassID getDynamicClassID(void) const; - -protected: - //======================================================================= - // implementation - //======================================================================= - /** - * This method is the actual implementation of the next() method. All iteration - * vectors through here. This method initializes the state machine to state 1 - * and advances through the text character by character until we reach the end - * of the text or the state machine transitions to state 0. We update our return - * value every time the state machine passes through a possible end state. - * @internal - */ - virtual int32_t handleNext(void); - - /** - * removes the cache of break positions (usually in response to a change in - * position of some sort) - * @internal - */ - virtual void reset(void); - - /** - * init Initialize a dbbi. Common routine for use by constructors. - * @internal - */ - void init(); - - /** - * @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated. - * If buffer is not large enough, new memory will be allocated. - * @param BufferSize reference to size of allocated space. - * If BufferSize == 0, a sufficient size for use in cloning will - * be returned ('pre-flighting') - * If BufferSize is not enough for a stack-based safe clone, - * new memory will be allocated. - * @param status to indicate whether the operation went on smoothly or there were errors - * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were - * necessary. - * @return pointer to the new clone - * @internal - */ - virtual BreakIterator * createBufferClone(void *stackBuffer, - int32_t &BufferSize, - UErrorCode &status); - - -private: - /** - * This is the function that actually implements the dictionary-based - * algorithm. Given the endpoints of a range of text, it uses the - * dictionary to determine the positions of any boundaries in this - * range. It stores all the boundary positions it discovers in - * cachedBreakPositions so that we only have to do this work once - * for each time we enter the range. - * @param startPos The start position of a range of text - * @param endPos The end position of a range of text - * @param status The error code status - */ - void divideUpDictionaryRange(int32_t startPos, int32_t endPos, UErrorCode &status); + +#ifndef U_HIDE_DEPRECATED_API +typedef RuleBasedBreakIterator DictionaryBasedBreakIterator; - /* - * HSYS : Please revisit with Rich, the ctors of the DBBI class is currently - * marked as private. - */ - friend class DictionaryBasedBreakIteratorTables; - friend class BreakIterator; -}; +#endif U_NAMESPACE_END diff --git a/Build/source/libs/icu-xetex/common/unicode/locid.h b/Build/source/libs/icu-xetex/common/unicode/locid.h index aba214aa239..a3cc23b31fa 100644 --- a/Build/source/libs/icu-xetex/common/unicode/locid.h +++ b/Build/source/libs/icu-xetex/common/unicode/locid.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1996-2005, International Business Machines +* Copyright (C) 1996-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -57,9 +57,9 @@ * this class: * \htmlonly<blockquote>\endhtmlonly * <pre> - * . Locale( const char* language, - * . const char* country, - * . const char* variant); + * Locale( const char* language, + * const char* country, + * const char* variant); * </pre> * \htmlonly</blockquote>\endhtmlonly * The first argument to the constructors is a valid <STRONG>ISO @@ -74,8 +74,8 @@ * Code.</STRONG> These codes are the upper-case two-letter codes * as defined by ISO-3166. * You can find a full list of these codes at a number of sites, such as: - * <BR><a href="http://www.iso.ch/iso/en/prods-services/iso3166ma/index.html"> - * http://www.iso.ch/iso/en/prods-services/iso3166ma/index.html</a> + * <BR><a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html"> + * http://www.iso.org/iso/en/prods-services/iso3166ma/index.html</a> * * <P> * The third constructor requires a third argument--the <STRONG>Variant.</STRONG> @@ -367,7 +367,7 @@ public: * the string by calling uloc_canonicalize(). * @param name the locale ID to create from. Must not be NULL. * @return a new locale object corresponding to the given name - * @draft ICU 3.0 + * @stable ICU 3.0 * @see uloc_canonicalize */ static Locale U_EXPORT2 createCanonical(const char* name); @@ -446,7 +446,7 @@ public: /** * returns the locale's three-letter language code, as specified - * in ISO draft standard ISO-639-2.. + * in ISO draft standard ISO-639-2. * @return An alias to the code, or NULL * @stable ICU 2.0 */ diff --git a/Build/source/libs/icu-xetex/common/unicode/normlzr.h b/Build/source/libs/icu-xetex/common/unicode/normlzr.h index 2b1f7e61de9..7974f1ac4dd 100644 --- a/Build/source/libs/icu-xetex/common/unicode/normlzr.h +++ b/Build/source/libs/icu-xetex/common/unicode/normlzr.h @@ -1,7 +1,7 @@ /* ******************************************************************** * COPYRIGHT: - * Copyright (c) 1996-2005, International Business Machines Corporation and + * Copyright (c) 1996-2006, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************** */ @@ -29,6 +29,9 @@ typedef struct UCharIterator UCharIterator; /**< C typedef for struct UCharItera U_NAMESPACE_BEGIN /** + * The Normalizer class supports the standard normalization forms described in + * <a href="http://www.unicode.org/unicode/reports/tr15/" target="unicode"> + * Unicode Standard Annex #15: Unicode Normalization Forms</a>. * * The Normalizer class consists of two parts: * - static functions that normalize strings or test if strings are normalized diff --git a/Build/source/libs/icu-xetex/common/unicode/platform.h.in b/Build/source/libs/icu-xetex/common/unicode/platform.h.in index 2726ebd218a..80766a253e2 100644 --- a/Build/source/libs/icu-xetex/common/unicode/platform.h.in +++ b/Build/source/libs/icu-xetex/common/unicode/platform.h.in @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -249,7 +249,16 @@ typedef unsigned int uint32_t; /* Symbol import-export control */ /*===========================================================================*/ +#if defined(U_DARWIN) && defined(__GNUC__) && (__GNUC__ >= 4) +#define USE_GCC_VISIBILITY_ATTRIBUTE 1 +#endif + +#ifdef USE_GCC_VISIBILITY_ATTRIBUTE +#define U_EXPORT __attribute__((visibility("default"))) +#else #define U_EXPORT +#endif + /* U_CALLCONV is releated to U_EXPORT2 */ #define U_EXPORT2 diff --git a/Build/source/libs/icu-xetex/common/unicode/ppalmos.h b/Build/source/libs/icu-xetex/common/unicode/ppalmos.h index a14d306b920..c15b2ceae32 100644 --- a/Build/source/libs/icu-xetex/common/unicode/ppalmos.h +++ b/Build/source/libs/icu-xetex/common/unicode/ppalmos.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -270,4 +270,4 @@ typedef unsigned int uint32_t; #define U_MAKE_IS_NMAKE 1 #endif -#endif
\ No newline at end of file +#endif diff --git a/Build/source/libs/icu-xetex/common/unicode/pwin32.h b/Build/source/libs/icu-xetex/common/unicode/pwin32.h index e31ac84d5ac..198ce8e3322 100644 --- a/Build/source/libs/icu-xetex/common/unicode/pwin32.h +++ b/Build/source/libs/icu-xetex/common/unicode/pwin32.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -97,8 +97,12 @@ /* Define 64 bit limits */ #if !U_INT64_IS_LONG_LONG -#define INT64_C(x) ((int64_t)x) -#define UINT64_C(x) ((uint64_t)x) +# ifndef INT64_C +# define INT64_C(x) ((int64_t)x) +# endif +# ifndef UINT64_C +# define UINT64_C(x) ((uint64_t)x) +# endif /* else use the umachine.h definition */ #endif @@ -168,8 +172,14 @@ typedef unsigned int uint32_t; /* 1 or 0 to enable or disable threads. If undefined, default is: enable threads. */ #define ICU_USE_THREADS 1 -/* Windows currently only runs on x86 CPUs which currently all have strong memory models. */ +/* On strong memory model CPUs (e.g. x86 CPUs), we use a safe & quick double check mutex lock. */ +/* +Microsoft can define _M_IX86, _M_AMD64 (before Visual Studio 8) or _M_X64 (starting in Visual Studio 8). +Intel can define _M_IX86 or _M_X64 +*/ +#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) #define UMTX_STRONG_MEMORY_MODEL 1 +#endif #ifndef U_DEBUG #ifdef _DEBUG @@ -271,7 +281,7 @@ typedef unsigned int uint32_t; # endif #endif -#if defined(_MSC_VER) && defined(_M_IX86) +#if defined(_MSC_VER) && defined(_M_IX86) && !defined(_MANAGED) #define U_ALIGN_CODE(val) __asm align val #else #define U_ALIGN_CODE(val) diff --git a/Build/source/libs/icu-xetex/common/unicode/rbbi.h b/Build/source/libs/icu-xetex/common/unicode/rbbi.h index 1097a4e7d07..2b81c3ecf29 100644 --- a/Build/source/libs/icu-xetex/common/unicode/rbbi.h +++ b/Build/source/libs/icu-xetex/common/unicode/rbbi.h @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 1999-2005 International Business Machines Corporation * +* Copyright (C) 1999-2006 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** @@ -26,6 +26,8 @@ #include "unicode/brkiter.h" #include "unicode/udata.h" #include "unicode/parseerr.h" +#include "unicode/schriter.h" +#include "unicode/uchriter.h" struct UTrie; @@ -37,10 +39,14 @@ struct RBBIDataHeader; class RuleBasedBreakIteratorTables; class BreakIterator; class RBBIDataWrapper; +class UStack; +class LanguageBreakEngine; +class UnhandledEngine; struct RBBIStateTable; + /** * * A subclass of BreakIterator whose behavior is specified using a list of rules. @@ -60,10 +66,31 @@ class U_COMMON_API RuleBasedBreakIterator : public BreakIterator { protected: /** - * The character iterator through which this BreakIterator accesses the text + * The UText through which this BreakIterator accesses the text * @internal */ - CharacterIterator* fText; + UText *fText; + + /** + * A character iterator that refers to the same text as the UText, above. + * Only included for compatibility with old API, which was based on CharacterIterators. + * Value may be adopted from outside, or one of fSCharIter or fDCharIter, below. + */ + CharacterIterator *fCharIter; + + /** + * When the input text is provided by a UnicodeString, this will point to + * a characterIterator that wraps that data. Needed only for the + * implementation of getText(), a backwards compatibility issue. + */ + StringCharacterIterator *fSCharIter; + + /** + * When the input text is provided by a UText, this + * dummy CharacterIterator over an empty string will + * be returned from getText() + */ + UCharCharacterIterator *fDCharIter; /** * The rule data for this BreakIterator instance @@ -86,20 +113,58 @@ protected: /** * Counter for the number of characters encountered with the "dictionary" - * flag set. Normal RBBI iterators don't use it, although the code - * for updating it is live. Dictionary Based break iterators (a subclass - * of us) access this field directly. + * flag set. * @internal */ - uint32_t fDictionaryCharCount; + uint32_t fDictionaryCharCount; /** - * Debugging flag. Trace operation of state machine when true. + * When a range of characters is divided up using the dictionary, the break + * positions that are discovered are stored here, preventing us from having + * to use either the dictionary or the state table again until the iterator + * leaves this range of text. Has the most impact for line breaking. * @internal */ - static UBool fTrace; + int32_t* fCachedBreakPositions; + /** + * The number of elements in fCachedBreakPositions + * @internal + */ + int32_t fNumCachedBreakPositions; + /** + * if fCachedBreakPositions is not null, this indicates which item in the + * cache the current iteration position refers to + * @internal + */ + int32_t fPositionInCache; + + /** + * + * If present, UStack of LanguageBreakEngine objects that might handle + * dictionary characters. Searched from top to bottom to find an object to + * handle a given character. + * @internal + */ + UStack *fLanguageBreakEngines; + + /** + * + * If present, the special LanguageBreakEngine used for handling + * characters that are in the dictionary set, but not handled by any + * LangugageBreakEngine. + * @internal + */ + UnhandledEngine *fUnhandledBreakEngine; + + /** + * + * The type of the break iterator, or -1 if it has not been set. + * @internal + */ + int32_t fBreakType; + protected: //======================================================================= // constructors @@ -117,7 +182,7 @@ protected: */ RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); - /** @internal */ + friend class RBBIRuleBuilder; /** @internal */ friend class BreakIterator; @@ -232,14 +297,31 @@ public: //======================================================================= /** - * Return a CharacterIterator over the text being analyzed. This version - * of this method returns the actual CharacterIterator we're using internally. - * Changing the state of this iterator can have undefined consequences. If - * you need to change it, clone it first. + * <p> + * Return a CharacterIterator over the text being analyzed. + * The returned character iterator is owned by the break iterator, and must + * not be deleted by the caller. Repeated calls to this function may + * return the same CharacterIterator. + * </p> + * <p> + * The returned character iterator must not be used concurrently with + * the break iterator. If concurrent operation is needed, clone the + * returned character iterator first and operate on the clone. + * </p> + * <p> + * When the break iterator is operating on text supplied via a UText, + * this function will fail. Lacking any way to signal failures, it + * returns an CharacterIterator containing no text. + * The function getUText() provides similar functionality, + * is reliable, and is more efficient. + * </p> + * + * TODO: deprecate this function? + * * @return An iterator over the text being analyzed. - * @stable ICU 2.0 + * @stable ICU 2.0 */ - virtual const CharacterIterator& getText(void) const; + virtual CharacterIterator& getText(void) const; /** @@ -292,7 +374,6 @@ public: /** * Sets the current iteration position to the beginning of the text. - * (i.e., the CharacterIterator's starting offset). * @return The offset of the beginning of the text. * @stable ICU 2.0 */ @@ -300,7 +381,6 @@ public: /** * Sets the current iteration position to the end of the text. - * (i.e., the CharacterIterator's ending offset). * @return The text's past-the-end offset. * @stable ICU 2.0 */ @@ -423,7 +503,7 @@ public: * is the total number of status values that were available, * not the reduced number that were actually returned. * @see getRuleStatus - * @draft ICU 3.0 + * @stable ICU 3.0 */ virtual int32_t getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status); @@ -507,33 +587,13 @@ protected: // implementation //======================================================================= /** - * This method is the actual implementation of the next() method. All iteration - * vectors through here. This method initializes the state machine to state 1 - * and advances through the text character by character until we reach the end - * of the text or the state machine transitions to state 0. We update our return - * value every time the state machine passes through a possible end state. - * @internal - */ - virtual int32_t handleNext(void); - - /** - * This method backs the iterator back up to a "safe position" in the text. - * This is a position that we know, without any context, must be a break position. - * The various calling methods then iterate forward from this safe position to - * the appropriate position to return. (For more information, see the description - * of buildBackwardsStateTable() in RuleBasedBreakIterator.Builder.) - * @internal - */ - virtual int32_t handlePrevious(void); - - /** * Dumps caches and performs other actions associated with a complete change - * in text or iteration position. This function is a no-op in RuleBasedBreakIterator, - * but subclasses can and do override it. + * in text or iteration position. * @internal */ virtual void reset(void); +#if 0 /** * Return true if the category lookup for this char * indicates that it is in the set of dictionary lookup chars. @@ -545,6 +605,19 @@ protected: virtual UBool isDictionaryChar(UChar32); /** + * Get the type of the break iterator. + * @internal + */ + virtual int32_t getBreakType() const; +#endif + + /** + * Set the type of the break iterator. + * @internal + */ + virtual void setBreakType(int32_t type); + + /** * Common initialization function, used by constructors and bufferClone. * (Also used by DictionaryBasedBreakIterator::createBufferClone().) * @internal @@ -576,6 +649,30 @@ private: int32_t handleNext(const RBBIStateTable *statetable); /** + * This is the function that actually implements dictionary-based + * breaking. Covering at least the range from startPos to endPos, + * it checks for dictionary characters, and if it finds them determines + * the appropriate object to deal with them. It may cache found breaks in + * fCachedBreakPositions as it goes. It may well also look at text outside + * the range startPos to endPos. + * If going forward, endPos is the normal Unicode break result, and + * if goind in reverse, startPos is the normal Unicode break result + * @param startPos The start position of a range of text + * @param endPos The end position of a range of text + * @param reverse The call is for the reverse direction + * @internal + */ + int32_t checkDictionary(int32_t startPos, int32_t endPos, UBool reverse); + + /** + * This function returns the appropriate LanguageBreakEngine for a + * given character c. + * @param c A character in the dictionary set + * @internal + */ + const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c); + + /** * @internal */ void makeRuleStatusValid(); diff --git a/Build/source/libs/icu-xetex/common/unicode/strenum.h b/Build/source/libs/icu-xetex/common/unicode/strenum.h index c75e4b223b6..5e956430dcc 100644 --- a/Build/source/libs/icu-xetex/common/unicode/strenum.h +++ b/Build/source/libs/icu-xetex/common/unicode/strenum.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -184,6 +184,23 @@ public: */ virtual void reset(UErrorCode& status) = 0; + /** + * Compares this enumeration to other to check if both are equal + * + * @param that The other string enumeration to compare this object to + * @return TRUE if the enumerations are equal. FALSE if not. + * @draft ICU 3.6 + */ + virtual UBool operator==(const StringEnumeration& that)const; + /** + * Compares this enumeration to other to check if both are not equal + * + * @param that The other string enumeration to compare this object to + * @return TRUE if the enumerations are equal. FALSE if not. + * @draft ICU 3.6 + */ + virtual UBool operator!=(const StringEnumeration& that)const; + protected: /** * UnicodeString field for use with default implementations and subclasses. diff --git a/Build/source/libs/icu-xetex/common/unicode/ubidi.h b/Build/source/libs/icu-xetex/common/unicode/ubidi.h index 9cfe827b7dd..71d181cadee 100644 --- a/Build/source/libs/icu-xetex/common/unicode/ubidi.h +++ b/Build/source/libs/icu-xetex/common/unicode/ubidi.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -20,20 +20,6 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" -/* - * javadoc-style comments are intended to be transformed into HTML - * using DOC++ - see - * http://www.zib.de/Visual/software/doc++/index.html . - * - * The HTML documentation is created with - * doc++ -H ubidi.h - * - * The following #define trick allows us to do it all in one file - * and still be able to compile it. - */ -/*#define DOCXX_TAG*/ -/*#define BIDI_SAMPLE_CODE*/ - /** *\file * \brief C API: BIDI algorithm @@ -369,6 +355,21 @@ typedef uint8_t UBiDiLevel; #define UBIDI_LEVEL_OVERRIDE 0x80 /** + * Special value which can be returned by the mapping functions when a logical + * index has no corresponding visual index or vice-versa. This may happen + * for the logical-to-visual mapping of a BiDi control when option + * <code>#UBIDI_OPTION_REMOVE_CONTROLS</code> is specified. This can also happen + * for the visual-to-logical mapping of a BiDi mark (LRM or RLM) inserted + * by option <code>#UBIDI_OPTION_INSERT_MARKS</code>. + * @see ubidi_getVisualIndex + * @see ubidi_getVisualMap + * @see ubidi_getLogicalIndex + * @see ubidi_getLogicalMap + * @draft ICU 3.6 + */ +#define UBIDI_MAP_NOWHERE (-1) + +/** * <code>UBiDiDirection</code> values indicate the text direction. * @stable ICU 2.0 */ @@ -442,9 +443,9 @@ ubidi_open(void); * that internal memory will be preallocated for. An attempt to access * visual runs on an object that was not preallocated for as many runs * as the text was actually resolved to will fail, - * unless this value is 0, which leaves the allocation up to the implementation.<p> + * unless this value is 0, which leaves the allocation up to the implementation.<br><br> * The number of runs depends on the actual text and maybe anywhere between - * 1 and <code>maxLength</code>. It is typically small.<p> + * 1 and <code>maxLength</code>. It is typically small. * * @param pErrorCode must be a valid pointer to an error code value. * @@ -461,8 +462,8 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode); * <strong>Important: </strong> * A parent <code>UBiDi</code> object must not be destroyed or reused if * it still has children. - * If a <code>UBiDi</code> object is the <i>child</i> - * of another one (its <i>parent</i>), after calling + * If a <code>UBiDi</code> object has become the <i>child</i> + * of another one (its <i>parent</i>) by calling * <code>ubidi_setLine()</code>, then the child object must * be destroyed (closed) or reused (by calling * <code>ubidi_setPara()</code> or <code>ubidi_setLine()</code>) @@ -505,12 +506,24 @@ ubidi_close(UBiDi *pBiDi); * <code>ubidi_getVisualRun()</code> gets the reordered runs, these are actually * the runs of the logically ordered output.</p> * + * <p>Calling this function with argument <code>isInverse</code> set to + * <code>TRUE</code> is equivalent to calling + * <code>ubidi_setReorderingMode</code> with argument + * <code>reorderingMode</code> + * set to <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code>.<br> + * Calling this function with argument <code>isInverse</code> set to + * <code>FALSE</code> is equivalent to calling + * <code>ubidi_setReorderingMode</code> with argument + * <code>reorderingMode</code> + * set to <code>#UBIDI_REORDER_DEFAULT</code>. + * * @param pBiDi is a <code>UBiDi</code> object. * - * @param isInverse specifies "forward" or "inverse" BiDi operation + * @param isInverse specifies "forward" or "inverse" BiDi operation. * * @see ubidi_setPara * @see ubidi_writeReordered + * @see ubidi_setReorderingMode * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -518,11 +531,17 @@ ubidi_setInverse(UBiDi *pBiDi, UBool isInverse); /** * Is this BiDi object set to perform the inverse BiDi algorithm? + * <p>Note: calling this function after setting the reordering mode with + * <code>ubidi_setReorderingMode</code> will return <code>TRUE</code> if the + * reordering mode was set to <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code>, + * <code>FALSE</code> for all other values.</p> * * @param pBiDi is a <code>UBiDi</code> object. * @return TRUE if the BiDi object is set to perform the inverse BiDi algorithm + * by handling numbers as L. * * @see ubidi_setInverse + * @see ubidi_setReorderingMode * @stable ICU 2.0 */ @@ -567,6 +586,373 @@ U_STABLE UBool U_EXPORT2 ubidi_isOrderParagraphsLTR(UBiDi *pBiDi); /** + * <code>UBiDiReorderingMode</code> values indicate which variant of the BiDi + * algorithm to use. + * + * @see ubidi_setReorderingMode + * @draft ICU 3.6 + */ +typedef enum UBiDiReorderingMode { + /** Regular Logical to Visual BiDi algorithm according to Unicode. + * This is a 0 value. @draft ICU 3.6 */ + UBIDI_REORDER_DEFAULT = 0, + /** Logical to Visual algorithm which handles numbers in a way which + * mimicks the behavior of Windows XP. + * @draft ICU 3.6 */ + UBIDI_REORDER_NUMBERS_SPECIAL, + /** Logical to Visual algorithm grouping numbers with adjacent R characters + * (reversible algorithm). + * @draft ICU 3.6 */ + UBIDI_REORDER_GROUP_NUMBERS_WITH_R, + /** Reorder runs only to transform a Logical LTR string to the Logical RTL + * string with the same display, or vice-versa.<br> + * If this mode is set together with option + * <code>#UBIDI_OPTION_INSERT_MARKS</code>, some BiDi controls in the source + * text may be removed and other controls may be added to produce the + * minimum combination which has the required display. + * @draft ICU 3.6 */ + UBIDI_REORDER_RUNS_ONLY, + /** Visual to Logical algorithm which handles numbers like L + * (same algorithm as selected by <code>ubidi_setInverse(TRUE)</code>. + * @see ubidi_setInverse + * @draft ICU 3.6 */ + UBIDI_REORDER_INVERSE_NUMBERS_AS_L, + /** Visual to Logical algorithm equivalent to the regular Logical to Visual + * algorithm. @draft ICU 3.6 */ + UBIDI_REORDER_INVERSE_LIKE_DIRECT, + /** Inverse BiDi (Visual to Logical) algorithm for the + * <code>UBIDI_REORDER_NUMBERS_SPECIAL</code> BiDi algorithm. + * @draft ICU 3.6 */ + UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL, + /** Number of values for reordering mode. + * @draft ICU 3.6 */ + UBIDI_REORDER_COUNT +} UBiDiReorderingMode; + +/** + * Modify the operation of the BiDi algorithm such that it implements some + * variant to the basic BiDi algorithm or approximates an "inverse BiDi" + * algorithm, depending on different values of the "reordering mode". + * This function must be called before <code>ubidi_setPara()</code>, and stays + * in effect until called again with a different argument. + * + * <p>The normal operation of the BiDi algorithm as described + * in the Unicode Standard Annex #9 is to take text stored in logical + * (keyboard, typing) order and to determine how to reorder it for visual + * rendering.</p> + * + * <p>With the reordering mode set to a value other than + * <code>#UBIDI_REORDER_DEFAULT</code>, this function changes the behavior of + * some of the subsequent functions in a way such that they implement an + * inverse BiDi algorithm or some other algorithm variants.</p> + * + * <p>Some legacy systems store text in visual order, and for operations + * with standard, Unicode-based algorithms, the text needs to be transformed + * into logical order. This is effectively the inverse algorithm of the + * described BiDi algorithm. Note that there is no standard algorithm for + * this "inverse BiDi", so a number of variants are implemented here.</p> + * + * <p>In other cases, it may be desirable to emulate some variant of the + * Logical to Visual algorithm (e.g. one used in MS Windows), or perform a + * Logical to Logical transformation.</p> + * + * <ul> + * <li>When the reordering mode is set to <code>#UBIDI_REORDER_DEFAULT</code>, + * the standard BiDi Logical to Visual algorithm is applied.</li> + * + * <li>When the reordering mode is set to + * <code>#UBIDI_REORDER_NUMBERS_SPECIAL</code>, + * the algorithm used to perform BiDi transformations when calling + * <code>ubidi_setPara</code> should approximate the algorithm used in + * Microsoft Windows XP rather than strictly conform to the Unicode BiDi + * algorithm. + * <br> + * The differences between the basic algorithm and the algorithm addressed + * by this option are as follows: + * <ul> + * <li>Within text at an even embedding level, the sequence "123AB" + * (where AB represent R or AL letters) is transformed to "123BA" by the + * Unicode algorithm and to "BA123" by the Windows algorithm.</li> + * <li>Arabic-Indic numbers (AN) are handled by the Windows algorithm just + * like regular numbers (EN).</li> + * </ul></li> + * + * <li>When the reordering mode is set to + * <code>#UBIDI_REORDER_GROUP_NUMBERS_WITH_R</code>, + * numbers located between LTR text and RTL text are associated with the RTL + * text. For instance, an LTR paragraph with content "abc 123 DEF" (where + * upper case letters represent RTL characters) will be transformed to + * "abc FED 123" (and not "abc 123 FED"), "DEF 123 abc" will be transformed + * to "123 FED abc" and "123 FED abc" will be transformed to "DEF 123 abc". + * This makes the algorithm reversible and makes it useful when round trip + * (from visual to logical and back to visual) must be achieved without + * adding LRM characters. However, this is a variation from the standard + * Unicode Bidi algorithm.<br> + * The source text should not contain BiDi control characters other than LRM + * or RLM.</li> + * + * <li>When the reordering mode is set to + * <code>#UBIDI_REORDER_RUNS_ONLY</code>, + * a "Logical to Logical" transformation must be performed: + * <ul> + * <li>If the default text level of the source text (argument <code>paraLevel</code> + * in <code>ubidi_setPara</code>) is even, the source text will be handled as + * LTR logical text and will be transformed to the RTL logical text which has + * the same LTR visual display.</li> + * <li>If the default level of the source text is odd, the source text + * will be handled as RTL logical text and will be transformed to the + * LTR logical text which has the same LTR visual display.</li> + * </ul> + * This mode may be needed when logical text which is basically Arabic or + * Hebrew, with possible included numbers or phrases in English, has to be + * displayed as if it had an even embedding level (this can happen if the + * displaying application treats all text as if it was basically LTR. + * <br> + * This mode may also be needed in the reverse case, when logical text which is + * basically English, with possible included phrases in Arabic or Hebrew, has to + * be displayed as if it had an odd embedding level. + * <br> + * Both cases could be handled by adding LRE or RLE at the head of the text, + * if the display subsystem supports these formatting controls. If it does not, + * the problem may be handled by transforming the source text in this mode + * before displaying it, so that it will be displayed properly.<br> + * The source text should not contain BiDi control characters other than LRM + * or RLM.</li> + * + * <li>When the reordering mode is set to + * <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code>, an "inverse BiDi" algorithm + * is applied. + * Runs of text with numeric characters will be treated like LTR letters and + * may need to be surrounded with LRM characters when they are written in + * reordered sequence (the option <code>#UBIDI_INSERT_LRM_FOR_NUMERIC</code> can + * be used with function <code>ubidi_writeReordered</code> to this end. This + * mode is equivalent to calling <code>ubidi_setInverse()</code> with + * argument <code>isInverse</code> set to <code>TRUE</code>.</li> + * + * <li>When the reordering mode is set to + * <code>#UBIDI_REORDER_INVERSE_LIKE_DIRECT</code>, the "direct" Logical to Visual + * BiDi algorithm is used as an approximation of an "inverse BiDi" algorithm. + * This mode is similar to mode <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code> + * but is closer to the regular BiDi algorithm. + * <br> + * For example, an LTR paragraph with the content "FED 123 456 CBA" (where + * upper case represents RTL characters) will be transformed to + * "ABC 456 123 DEF", as opposed to "DEF 123 456 ABC" + * with mode <code>UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code>.<br> + * When used in conjunction with option + * <code>#UBIDI_OPTION_INSERT_MARKS</code>, this mode generally + * adds BiDi marks to the output significantly more sparingly than mode + * <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code> with option + * <code>#UBIDI_INSERT_LRM_FOR_NUMERIC</code> in calls to + * <code>ubidi_writeReordered</code>.</li> + * + * <li>When the reordering mode is set to + * <code>#UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL</code>, the Logical to Visual + * BiDi algorithm used in Windows XP is used as an approximation of an + * "inverse BiDi" algorithm. + * <br> + * For example, an LTR paragraph with the content "abc FED123" (where + * upper case represents RTL characters) will be transformed to + * "abc 123DEF.</li> + * </ul> + * + * <p>In all the reordering modes specifying an "inverse BiDi" algorithm + * (i.e. those with a name starting with <code>UBIDI_REORDER_INVERSE</code>), + * output runs should be retrieved using + * <code>ubidi_getVisualRun()</code>, and the output text with + * <code>ubidi_writeReordered()</code>. The caller should keep in mind that in + * "inverse BiDi" modes the input is actually visually ordered text and + * reordered output returned by <code>ubidi_getVisualRun()</code> or + * <code>ubidi_writeReordered()</code> are actually runs or character string + * of logically ordered output.<br> + * For all the "inverse BiDi" modes, the source text should not contain + * BiDi control characters other than LRM or RLM.</p> + * + * <p>Note that option <code>#UBIDI_OUTPUT_REVERSE</code> of + * <code>ubidi_writeReordered</code> has no useful meaning and should not be + * used in conjunction with any value of the reordering mode specifying + * "inverse BiDi" or with value <code>UBIDI_REORDER_RUNS_ONLY</code>. + * + * @param pBiDi is a <code>UBiDi</code> object. + * @param reorderingMode specifies the required variant of the BiDi algorithm. + * + * @see UBiDiReorderingMode + * @see ubidi_setInverse + * @see ubidi_setPara + * @see ubidi_writeReordered + * @draft ICU 3.6 + */ +U_DRAFT void U_EXPORT2 +ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode); + +/** + * What is the requested reordering mode for a given BiDi object? + * + * @param pBiDi is a <code>UBiDi</code> object. + * @return the current reordering mode of the BiDi object + * @see ubidi_setReorderingMode + * @draft ICU 3.6 + */ +U_DRAFT UBiDiReorderingMode U_EXPORT2 +ubidi_getReorderingMode(UBiDi *pBiDi); + +/** + * <code>UBiDiReorderingOption</code> values indicate which options are + * specified to affect the BiDi algorithm. + * + * @see ubidi_setReorderingOptions + * @draft ICU 3.6 + */ +typedef enum UBiDiReorderingOption { + /** + * option value for <code>ubidi_setReorderingOptions</code>: + * disable all the options which can be set with this function + * @see ubidi_setReorderingOptions + * @draft ICU 3.6 + */ + UBIDI_OPTION_DEFAULT = 0, + + /** + * option bit for <code>ubidi_setReorderingOptions</code>: + * insert BiDi marks (LRM or RLM) when needed to ensure correct result of + * a reordering to a Logical order + * + * <p>This option must be set or reset before calling + * <code>ubidi_setPara</code>.</p> + * + * <p>This option is significant only with reordering modes which generate + * a result with Logical order, specifically:</p> + * <ul> + * <li><code>#UBIDI_REORDER_RUNS_ONLY</code></li> + * <li><code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code></li> + * <li><code>#UBIDI_REORDER_INVERSE_LIKE_DIRECT</code></li> + * <li><code>#UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL</code></li> + * </ul> + * + * <p>If this option is set in conjunction with reordering mode + * <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code> or with calling + * <code>ubidi_setInverse(TRUE)</code>, it implies + * option <code>#UBIDI_INSERT_LRM_FOR_NUMERIC</code> + * in calls to function <code>ubidi_writeReordered()</code>.</p> + * + * <p>For other reordering modes, a minimum number of LRM or RLM characters + * will be added to the source text after reordering it so as to ensure + * round trip, i.e. when applying the inverse reordering mode on the + * resulting logical text with removal of BiDi marks + * (option <code>#UBIDI_OPTION_REMOVE_CONTROLS</code> set before calling + * <code>ubidi_setPara()</code> or option <code>#UBIDI_REMOVE_BIDI_CONTROLS</code> + * in <code>ubidi_writeReordered</code>), the result will be identical to the + * source text in the first transformation. + * + * <p>This option will be ignored if specified together with option + * <code>#UBIDI_OPTION_REMOVE_CONTROLS</code>. It inhibits option + * <code>UBIDI_REMOVE_BIDI_CONTROLS</code> in calls to function + * <code>ubidi_writeReordered()</code> and it implies option + * <code>#UBIDI_INSERT_LRM_FOR_NUMERIC</code> in calls to function + * <code>ubidi_writeReordered()</code> if the reordering mode is + * <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code>.</p> + * + * @see ubidi_setReorderingMode + * @see ubidi_setReorderingOptions + * @draft ICU 3.6 + */ + UBIDI_OPTION_INSERT_MARKS = 1, + + /** + * option bit for <code>ubidi_setReorderingOptions</code>: + * remove BiDi control characters + * + * <p>This option must be set or reset before calling + * <code>ubidi_setPara</code>.</p> + * + * <p>This option nullifies option <code>#UBIDI_OPTION_INSERT_MARKS</code>. + * It inhibits option <code>#UBIDI_INSERT_LRM_FOR_NUMERIC</code> in calls + * to function <code>ubidi_writeReordered()</code> and it implies option + * <code>#UBIDI_REMOVE_BIDI_CONTROLS</code> in calls to that function.</p> + * + * @see ubidi_setReorderingMode + * @see ubidi_setReorderingOptions + * @draft ICU 3.6 + */ + UBIDI_OPTION_REMOVE_CONTROLS = 2, + + /** + * option bit for <code>ubidi_setReorderingOptions</code>: + * process the output as part of a stream to be continued + * + * <p>This option must be set or reset before calling + * <code>ubidi_setPara</code>.</p> + * + * <p>This option specifies that the caller is interested in processing large + * text object in parts. + * The results of the successive calls are expected to be concatenated by the + * caller. Only the call for the last part will have this option bit off.</p> + * + * <p>When this option bit is on, <code>ubidi_setPara()</code> may process + * less than the full source text in order to truncate the text at a meaningful + * boundary. The caller should call <code>ubidi_getProcessedLength()</code> + * immediately after calling <code>ubidi_setPara()</code> in order to + * determine how much of the source text has been processed. + * Source text beyond that length should be resubmitted in following calls to + * <code>ubidi_setPara</code>. The processed length may be less than + * the length of the source text if a character preceding the last character of + * the source text constitutes a reasonable boundary (like a block separator) + * for text to be continued.<br> + * If the last character of the source text constitutes a reasonable + * boundary, the whole text will be processed at once.<br> + * If nowhere in the source text there exists + * such a reasonable boundary, the processed length will be zero.<br> + * The caller should check for such an occurrence and do one of the following: + * <ul><li>submit a larger amount of text with a better chance to include + * a reasonable boundary.</li> + * <li>resubmit the same text after turning off option + * <code>UBIDI_OPTION_STREAMING</code>.</li></ul> + * In all cases, this option should be turned off before processing the last + * part of the text.</p> + * + * <p>When the <code>UBIDI_OPTION_STREAMING</code> option is used, + * it is recommended to call <code>ubidi_orderParagraphsLTR()</code> with + * argument <code>orderParagraphsLTR</code> set to <code>TRUE</code> before + * calling <code>ubidi_setPara</code> so that later paragraphs may be + * concatenated to previous paragraphs on the right.</p> + * + * @see ubidi_setReorderingMode + * @see ubidi_setReorderingOptions + * @see ubidi_getProcessedLength + * @see ubidi_orderParagraphsLTR + * @draft ICU 3.6 + */ + UBIDI_OPTION_STREAMING = 4 +} UBiDiReorderingOption; + +/** + * Specify which of the reordering options + * should be applied during BiDi transformations. + * + * @param pBiDi is a <code>UBiDi</code> object. + * @param reorderingOptions is a combination of zero or more of the following + * options: + * <code>#UBIDI_OPTION_DEFAULT</code>, <code>#UBIDI_OPTION_INSERT_MARKS</code>, + * <code>#UBIDI_OPTION_REMOVE_CONTROLS</code>, <code>#UBIDI_OPTION_STREAMING</code>. + * + * @see ubidi_getReorderingOptions + * @draft ICU 3.6 + */ +U_DRAFT void U_EXPORT2 +ubidi_setReorderingOptions(UBiDi *pBiDi, uint32_t reorderingOptions); + +/** + * What are the reordering options applied to a given BiDi object? + * + * @param pBiDi is a <code>UBiDi</code> object. + * @return the current reordering options of the BiDi object + * @see ubidi_setReorderingOptions + * @draft ICU 3.6 + */ +U_DRAFT uint32_t U_EXPORT2 +ubidi_getReorderingOptions(UBiDi *pBiDi); + +/** * Perform the Unicode BiDi algorithm. It is defined in the * <a href="http://www.unicode.org/unicode/reports/tr9/">Unicode Standard Anned #9</a>, * version 13, @@ -597,11 +983,10 @@ ubidi_isOrderParagraphsLTR(UBiDi *pBiDi); * which will be set to contain the reordering information, * especially the resolved levels for all the characters in <code>text</code>. * - * @param text is a pointer to the text that the - * BiDi algorithm will be performed on - * <strong>The text must be (at least) <code>length</code> long.</strong> + * @param text is a pointer to the text that the BiDi algorithm will be performed on. * This pointer is stored in the UBiDi object and can be retrieved - * with <code>ubidi_getText()</code>. + * with <code>ubidi_getText()</code>.<br> + * <strong>Note:</strong> the text must be (at least) <code>length</code> long. * * @param length is the length of the text; if <code>length==-1</code> then * the text must be zero-terminated. @@ -610,24 +995,24 @@ ubidi_isOrderParagraphsLTR(UBiDi *pBiDi); * it is typically 0 (LTR) or 1 (RTL). * If the function shall determine the paragraph level from the text, * then <code>paraLevel</code> can be set to - * either <code>UBIDI_DEFAULT_LTR</code> - * or <code>UBIDI_DEFAULT_RTL</code>; if the text contains multiple + * either <code>#UBIDI_DEFAULT_LTR</code> + * or <code>#UBIDI_DEFAULT_RTL</code>; if the text contains multiple * paragraphs, the paragraph level shall be determined separately for * each paragraph; if a paragraph does not include any strongly typed * character, then the desired default is used (0 for LTR or 1 for RTL). - * Any other value between 0 and <code>UBIDI_MAX_EXPLICIT_LEVEL</code> is also valid, - * with odd levels indicating RTL. + * Any other value between 0 and <code>#UBIDI_MAX_EXPLICIT_LEVEL</code> + * is also valid, with odd levels indicating RTL. * * @param embeddingLevels (in) may be used to preset the embedding and override levels, * ignoring characters like LRE and PDF in the text. * A level overrides the directional property of its corresponding * (same index) character if the level has the - * <code>UBIDI_LEVEL_OVERRIDE</code> bit set.<p> + * <code>#UBIDI_LEVEL_OVERRIDE</code> bit set.<br><br> * Except for that bit, it must be * <code>paraLevel<=embeddingLevels[]<=UBIDI_MAX_EXPLICIT_LEVEL</code>, * with one exception: a level of zero may be specified for a paragraph * separator even if <code>paraLevel>0</code> when multiple paragraphs - * are submitted in the same call to <code>ubidi_setPara()</code>.<p> + * are submitted in the same call to <code>ubidi_setPara()</code>.<br><br> * <strong>Caution: </strong>A copy of this pointer, not of the levels, * will be stored in the <code>UBiDi</code> object; * the <code>embeddingLevels</code> array must not be @@ -635,11 +1020,11 @@ ubidi_isOrderParagraphsLTR(UBiDi *pBiDi); * and the <code>embeddingLevels</code> * should not be modified to avoid unexpected results on subsequent BiDi operations. * However, the <code>ubidi_setPara()</code> and - * <code>ubidi_setLine()</code> functions may modify some or all of the levels.<p> + * <code>ubidi_setLine()</code> functions may modify some or all of the levels.<br><br> * After the <code>UBiDi</code> object is reused or destroyed, the caller - * must take care of the deallocation of the <code>embeddingLevels</code> array.<p> - * <strong>The <code>embeddingLevels</code> array must be - * at least <code>length</code> long.</strong> + * must take care of the deallocation of the <code>embeddingLevels</code> array.<br><br> + * <strong>Note:</strong> the <code>embeddingLevels</code> array must be + * at least <code>length</code> long. * * @param pErrorCode must be a valid pointer to an error code value. * @stable ICU 2.0 @@ -692,6 +1077,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, * @param pErrorCode must be a valid pointer to an error code value. * * @see ubidi_setPara + * @see ubidi_getProcessedLength * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -776,7 +1162,7 @@ ubidi_countParagraphs(UBiDi *pBiDi); * @param pBiDi is the paragraph or line <code>UBiDi</code> object. * * @param charIndex is the index of a character within the text, in the - * range <code>[0..ubidi_getLength(pBiDi)-1]</code>. + * range <code>[0..ubidi_getProcessedLength(pBiDi)-1]</code>. * * @param pParaStart will receive the index of the first character of the * paragraph in the text. @@ -797,6 +1183,8 @@ ubidi_countParagraphs(UBiDi *pBiDi); * @param pErrorCode must be a valid pointer to an error code value. * * @return The index of the paragraph containing the specified position. + * + * @see ubidi_getProcessedLength * @stable ICU 3.4 */ U_STABLE int32_t U_EXPORT2 @@ -846,6 +1234,7 @@ ubidi_getParagraphByIndex(const UBiDi *pBiDi, int32_t paraIndex, * @return The level for the character at charIndex. * * @see UBiDiLevel + * @see ubidi_getProcessedLength * @stable ICU 2.0 */ U_STABLE UBiDiLevel U_EXPORT2 @@ -866,6 +1255,7 @@ ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex); * or <code>NULL</code> if an error occurs. * * @see UBiDiLevel + * @see ubidi_getProcessedLength * @stable ICU 2.0 */ U_STABLE const UBiDiLevel * U_EXPORT2 @@ -891,6 +1281,8 @@ ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode); * @param pLevel will receive the level of the run. * This pointer can be <code>NULL</code> if this * value is not necessary. + * + * @see ubidi_getProcessedLength * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -976,6 +1368,10 @@ ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, * <code>UBiDi</code> object, then calling * <code>ubidi_getLogicalMap()</code> is more efficient.<p> * + * The value returned may be <code>#UBIDI_MAP_NOWHERE</code> if there is no + * visual position because the corresponding text character is a BiDi control + * removed from output by the option <code>#UBIDI_OPTION_REMOVE_CONTROLS</code>. + * <p> * Note that in right-to-left runs, this mapping places * modifier letters before base characters and second surrogates * before first ones. @@ -990,6 +1386,7 @@ ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, * * @see ubidi_getLogicalMap * @see ubidi_getLogicalIndex + * @see ubidi_getProcessedLength * @stable ICU 2.0 */ U_STABLE int32_t U_EXPORT2 @@ -1001,6 +1398,10 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) * <code>UBiDi</code> object, then calling * <code>ubidi_getVisualMap()</code> is more efficient.<p> * + * The value returned may be <code>#UBIDI_MAP_NOWHERE</code> if there is no + * logical position because the corresponding text character is a BiDi mark + * inserted in the output by option <code>#UBIDI_OPTION_INSERT_MARKS</code>. + * <p> * This is the inverse function to <code>ubidi_getVisualIndex()</code>. * * @param pBiDi is the paragraph or line <code>UBiDi</code> object. @@ -1013,6 +1414,7 @@ ubidi_getVisualIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) * * @see ubidi_getVisualMap * @see ubidi_getVisualIndex + * @see ubidi_getResultLength * @stable ICU 2.0 */ U_STABLE int32_t U_EXPORT2 @@ -1021,18 +1423,27 @@ ubidi_getLogicalIndex(UBiDi *pBiDi, int32_t visualIndex, UErrorCode *pErrorCode) /** * Get a logical-to-visual index map (array) for the characters in the UBiDi * (paragraph or line) object. + * <p> + * Some values in the map may be <code>#UBIDI_MAP_NOWHERE</code> if the + * corresponding text characters are BiDi controls removed from the visual + * output by the option <code>#UBIDI_OPTION_REMOVE_CONTROLS</code>. * * @param pBiDi is the paragraph or line <code>UBiDi</code> object. * - * @param indexMap is a pointer to an array of <code>ubidi_getLength()</code> + * @param indexMap is a pointer to an array of <code>ubidi_getProcessedLength()</code> * indexes which will reflect the reordering of the characters. - * The array does not need to be initialized.<p> - * The index map will result in <code>indexMap[logicalIndex]==visualIndex</code>.<p> + * If option <code>#UBIDI_OPTION_INSERT_MARKS</code> is set, the number + * of elements allocated in <code>indexMap</code> must be no less than + * <code>ubidi_getResultLength()</code>. + * The array does not need to be initialized.<br><br> + * The index map will result in <code>indexMap[logicalIndex]==visualIndex</code>. * * @param pErrorCode must be a valid pointer to an error code value. * * @see ubidi_getVisualMap * @see ubidi_getVisualIndex + * @see ubidi_getProcessedLength + * @see ubidi_getResultLength * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -1041,18 +1452,27 @@ ubidi_getLogicalMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode); /** * Get a visual-to-logical index map (array) for the characters in the UBiDi * (paragraph or line) object. + * <p> + * Some values in the map may be <code>#UBIDI_MAP_NOWHERE</code> if the + * corresponding text characters are BiDi marks inserted in the visual output + * by the option <code>#UBIDI_OPTION_INSERT_MARKS</code>. * * @param pBiDi is the paragraph or line <code>UBiDi</code> object. * - * @param indexMap is a pointer to an array of <code>ubidi_getLength()</code> + * @param indexMap is a pointer to an array of <code>ubidi_getResultLength()</code> * indexes which will reflect the reordering of the characters. - * The array does not need to be initialized.<p> - * The index map will result in <code>indexMap[visualIndex]==logicalIndex</code>.<p> + * If option <code>#UBIDI_OPTION_REMOVE_CONTROLS</code> is set, the number + * of elements allocated in <code>indexMap</code> must be no less than + * <code>ubidi_getProcessedLength()</code>. + * The array does not need to be initialized.<br><br> + * The index map will result in <code>indexMap[visualIndex]==logicalIndex</code>. * * @param pErrorCode must be a valid pointer to an error code value. * * @see ubidi_getLogicalMap * @see ubidi_getLogicalIndex + * @see ubidi_getProcessedLength + * @see ubidi_getResultLength * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -1062,7 +1482,7 @@ ubidi_getVisualMap(UBiDi *pBiDi, int32_t *indexMap, UErrorCode *pErrorCode); * This is a convenience function that does not use a UBiDi object. * It is intended to be used for when an application has determined the levels * of objects (character sequences) and just needs to have them reordered (L2). - * This is equivalent to using <code>ubidi_getLogicalMap</code> on a + * This is equivalent to using <code>ubidi_getLogicalMap()</code> on a * <code>UBiDi</code> object. * * @param levels is an array with <code>length</code> levels that have been determined by @@ -1085,7 +1505,7 @@ ubidi_reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap * This is a convenience function that does not use a UBiDi object. * It is intended to be used for when an application has determined the levels * of objects (character sequences) and just needs to have them reordered (L2). - * This is equivalent to using <code>ubidi_getVisualMap</code> on a + * This is equivalent to using <code>ubidi_getVisualMap()</code> on a * <code>UBiDi</code> object. * * @param levels is an array with <code>length</code> levels that have been determined by @@ -1106,16 +1526,29 @@ ubidi_reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) /** * Invert an index map. - * The one-to-one index mapping of the first map is inverted and written to + * The index mapping of the first map is inverted and written to * the second one. * * @param srcMap is an array with <code>length</code> indexes - * which define the original mapping. - * - * @param destMap is an array with <code>length</code> indexes - * which will be filled with the inverse mapping. + * which defines the original mapping from a source array containing + * <code>length</code> elements to a destination array. + * All indexes must be >=0 or equal to <code>UBIDI_MAP_NOWHERE</code>. + * This special value means that the corresponding elements in the source + * array have no matching element in the destination array. + * Some indexes may have a value >= <code>length</code>, if the + * destination array has more elements than the source array. + * There must be no duplicate indexes (two or more indexes with the + * same value except <code>UBIDI_MAP_NOWHERE</code>). + * + * @param destMap is an array with a number of indexes equal to 1 + the highest + * value in <code>srcMap</code>. + * <code>destMap</code> will be filled with the inverse mapping. + * Elements of <code>destMap</code> which have no matching elements in + * <code>srcMap</code> will receive an index equal to + * <code>UBIDI_MAP_NOWHERE</code> * * @param length is the length of each array. + * @See UBIDI_MAP_NOWHERE * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -1147,6 +1580,9 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); * surround the run with LRMs if necessary; * this is part of the approximate "inverse BiDi" algorithm * + * <p>This option does not imply corresponding adjustment of the index + * mappings.</p> + * * @see ubidi_setInverse * @see ubidi_writeReordered * @stable ICU 2.0 @@ -1156,7 +1592,10 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); /** * option bit for ubidi_writeReordered(): * remove BiDi control characters - * (this does not affect UBIDI_INSERT_LRM_FOR_NUMERIC) + * (this does not affect #UBIDI_INSERT_LRM_FOR_NUMERIC) + * + * <p>This option does not imply corresponding adjustment of the index + * mappings.</p> * * @see ubidi_writeReordered * @stable ICU 2.0 @@ -1180,10 +1619,181 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); #define UBIDI_OUTPUT_REVERSE 16 /** + * Get the length of the source text processed by the last call to + * <code>ubidi_setPara()</code>. This length may be different from the length + * of the source text if option <code>#UBIDI_OPTION_STREAMING</code> + * has been set. + * <br> + * Note that whenever the length of the text affects the execution or the + * result of a function, it is the processed length which must be considered, + * except for <code>ubidi_setPara</code> (which receives unprocessed source + * text) and <code>ubidi_getLength</code> (which returns the original length + * of the source text).<br> + * In particular, the processed length is the one to consider in the following + * cases: + * <ul> + * <li>maximum value of the <code>limit</code> argument of + * <code>ubidi_setLine</code></li> + * <li>maximum value of the <code>charIndex</code> argument of + * <code>ubidi_getParagraph</code></li> + * <li>maximum value of the <code>charIndex</code> argument of + * <code>ubidi_getLevelAt</code></li> + * <li>number of elements in the array returned by <code>ubidi_getLevels</code></li> + * <li>maximum value of the <code>logicalStart</code> argument of + * <code>ubidi_getLogicalRun</code></li> + * <li>maximum value of the <code>logicalIndex</code> argument of + * <code>ubidi_getVisualIndex</code></li> + * <li>number of elements filled in the <code>*indexMap</code> argument of + * <code>ubidi_getLogicalMap</code></li> + * <li>length of text processed by <code>ubidi_writeReordered</code></li> + * </ul> + * + * @param pBiDi is the paragraph <code>UBiDi</code> object. + * + * @return The length of the part of the source text processed by + * the last call to <code>ubidi_setPara</code>. + * @see ubidi_setPara + * @see UBIDI_OPTION_STREAMING + * @draft ICU 3.6 + */ +U_DRAFT int32_t U_EXPORT2 +ubidi_getProcessedLength(const UBiDi *pBiDi); + +/** + * Get the length of the reordered text resulting from the last call to + * <code>ubidi_setPara()</code>. This length may be different from the length + * of the source text if option <code>#UBIDI_OPTION_INSERT_MARKS</code> + * or option <code>#UBIDI_OPTION_REMOVE_CONTROLS</code> has been set. + * <br> + * This resulting length is the one to consider in the following cases: + * <ul> + * <li>maximum value of the <code>visualIndex</code> argument of + * <code>ubidi_getLogicalIndex</code></li> + * <li>number of elements of the <code>*indexMap</code> argument of + * <code>ubidi_getVisualMap</code></li> + * </ul> + * Note that this length stays identical to the source text length if + * BiDi marks are inserted or removed using option bits of + * <code>ubidi_writeReordered</code>, or if option + * <code>#UBIDI_REORDER_INVERSE_NUMBERS_AS_L</code> has been set. + * + * @param pBiDi is the paragraph <code>UBiDi</code> object. + * + * @return The length of the reordered text resulting from + * the last call to <code>ubidi_setPara</code>. + * @see ubidi_setPara + * @see UBIDI_OPTION_INSERT_MARKS + * @see UBIDI_OPTION_REMOVE_CONTROLS + * @draft ICU 3.6 + */ +U_DRAFT int32_t U_EXPORT2 +ubidi_getResultLength(const UBiDi *pBiDi); + +U_CDECL_BEGIN +/** + * value returned by <code>UBiDiClassCallback</code> callbacks when + * there is no need to override the standard BiDi class for a given code point. + * @see UBiDiClassCallback + * @draft ICU 3.6 + */ +#define U_BIDI_CLASS_DEFAULT U_CHAR_DIRECTION_COUNT + +/** + * Callback type declaration for overriding default BiDi class values with + * custom ones. + * <p>Usually, the function pointer will be propagated to a <code>UBiDi</code> + * object by calling the <code>ubidi_setClassCallback()</code> function; + * then the callback will be invoked by the UBA implementation any time the + * class of a character is to be determined.</p> + * + * @param context is a pointer to the callback private data. + * + * @param c is the code point to get a BiDi class for. + * + * @return The directional property / BiDi class for the given code point + * <code>c</code> if the default class has been overridden, or + * <code>#U_BIDI_CLASS_DEFAULT</code> if the standard BiDi class value + * for <code>c</code> is to be used. + * @see ubidi_setClassCallback + * @see ubidi_getClassCallback + * @draft ICU 3.6 + */ +typedef UCharDirection U_CALLCONV +UBiDiClassCallback(const void *context, UChar32 c); + +U_CDECL_END + +/** + * Retrieve the BiDi class for a given code point. + * <p>If a <code>#UBiDiClassCallback</code> callback is defined and returns a + * value other than <code>#U_BIDI_CLASS_DEFAULT</code>, that value is used; + * otherwise the default class determination mechanism is invoked.</p> + * + * @param pBiDi is the paragraph <code>UBiDi</code> object. + * + * @param c is the code point whose BiDi class must be retrieved. + * + * @return The BiDi class for character <code>c</code> based + * on the given <code>pBiDi</code> instance. + * @see UBiDiClassCallback + * @draft ICU 3.6 + */ +U_DRAFT UCharDirection U_EXPORT2 +ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c); + +/** + * Set the callback function and callback data used by the UBA + * implementation for BiDi class determination. + * <p>This may be useful for assigning BiDi classes to PUA characters, or + * for special application needs. For instance, an application may want to + * handle all spaces like L or R characters (according to the base direction) + * when creating the visual ordering of logical lines which are part of a report + * organized in columns: there should not be interaction between adjacent + * cells.<p> + * + * @param pBiDi is the paragraph <code>UBiDi</code> object. + * + * @param newFn is the new callback function pointer. + * + * @param newContext is the new callback context pointer. This can be NULL. + * + * @param oldFn fillin: Returns the old callback function pointer. This can be + * NULL. + * + * @param oldContext fillin: Returns the old callback's context. This can be + * NULL. + * + * @param pErrorCode must be a valid pointer to an error code value. + * + * @see ubidi_getClassCallback + * @draft ICU 3.6 + */ +U_DRAFT void U_EXPORT2 +ubidi_setClassCallback(UBiDi *pBiDi, UBiDiClassCallback *newFn, + const void *newContext, UBiDiClassCallback **oldFn, + const void **oldContext, UErrorCode *pErrorCode); + +/** + * Get the current callback function used for BiDi class determination. + * + * @param pBiDi is the paragraph <code>UBiDi</code> object. + * + * @param fn fillin: Returns the callback function pointer. + * + * @param context fillin: Returns the callback's private context. + * + * @see ubidi_setClassCallback + * @draft ICU 3.6 + */ +U_DRAFT void U_EXPORT2 +ubidi_getClassCallback(UBiDi *pBiDi, UBiDiClassCallback **fn, const void **context); + +/** * Take a <code>UBiDi</code> object containing the reordering * information for a piece of text (one or more paragraphs) set by - * <code>ubidi_setPara()</code> or for a line of text set by <code>ubidi_setLine()</code> - * and write a reordered string to the destination buffer. + * <code>ubidi_setPara()</code> or for a line of text set by + * <code>ubidi_setLine()</code> and write a reordered string to the + * destination buffer. * * This function preserves the integrity of characters with multiple * code units and (optionally) modifier letters. @@ -1196,20 +1806,14 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); * characters; see the description of the <code>destSize</code> * and <code>options</code> parameters and of the option bit flags. * - * @see UBIDI_DO_MIRRORING - * @see UBIDI_INSERT_LRM_FOR_NUMERIC - * @see UBIDI_KEEP_BASE_COMBINING - * @see UBIDI_OUTPUT_REVERSE - * @see UBIDI_REMOVE_BIDI_CONTROLS - * * @param pBiDi A pointer to a <code>UBiDi</code> object that * is set by <code>ubidi_setPara()</code> or * <code>ubidi_setLine()</code> and contains the reordering * information for the text that it was defined for, - * as well as a pointer to that text. - * <p>The text was aliased (only the pointer was stored + * as well as a pointer to that text.<br><br> + * The text was aliased (only the pointer was stored * without copying the contents) and must not have been modified - * since the <code>ubidi_setPara()</code> call.</p> + * since the <code>ubidi_setPara()</code> call. * * @param dest A pointer to where the reordered text is to be copied. * The source text and <code>dest[destSize]</code> @@ -1245,6 +1849,8 @@ ubidi_invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length); * @param pErrorCode must be a valid pointer to an error code value. * * @return The length of the output string. + * + * @see ubidi_getProcessedLength * @stable ICU 2.0 */ U_STABLE int32_t U_EXPORT2 diff --git a/Build/source/libs/icu-xetex/common/unicode/ubrk.h b/Build/source/libs/icu-xetex/common/unicode/ubrk.h index f4e734aa5c4..39f25cf8833 100644 --- a/Build/source/libs/icu-xetex/common/unicode/ubrk.h +++ b/Build/source/libs/icu-xetex/common/unicode/ubrk.h @@ -1,6 +1,8 @@ /* -* Copyright (C) 1996-2005, International Business Machines Corporation and others. All Rights Reserved. -***************************************************************************************** +****************************************************************************** +* Copyright (C) 1996-2006, International Business Machines Corporation and others. +* All Rights Reserved. +****************************************************************************** */ #ifndef UBRK_H @@ -37,22 +39,22 @@ * of boundaries in text. Pointer to a UBreakIterator maintain a * current position and scan over text returning the index of characters * where boundaries occur. - * <P> + * <p> * Line boundary analysis determines where a text string can be broken * when line-wrapping. The mechanism correctly handles punctuation and * hyphenated words. - * <P> + * <p> * Sentence boundary analysis allows selection with correct * interpretation of periods within numbers and abbreviations, and * trailing punctuation marks such as quotation marks and parentheses. - * <P> + * <p> * Word boundary analysis is used by search and replace functions, as * well as within text editing applications that allow the user to * select words with a double click. Word selection provides correct * interpretation of punctuation marks within and following * words. Characters that are not part of a word, such as symbols or * punctuation marks, have word-breaks on both sides. - * <P> + * <p> * Character boundary analysis allows users to interact with * characters as they expect to, for example, when moving the cursor * through a text string. Character boundary analysis provides correct @@ -60,140 +62,37 @@ * character is stored. For example, an accented character might be * stored as a base character and a diacritical mark. What users * consider to be a character can differ between languages. - * <P> + * <p> * Title boundary analysis locates all positions, * typically starts of words, that should be set to Title Case * when title casing the text. - * <P> - * - * This is the interface for all text boundaries. - * <P> - * Examples: - * <P> - * Helper function to output text - * <pre> - * \code - * void printTextRange(UChar* str, int32_t start, int32_t end ) { - * UChar* result; - * UChar* temp; - * const char* res; - * temp=(UChar*)malloc(sizeof(UChar) * ((u_strlen(str)-start)+1)); - * result=(UChar*)malloc(sizeof(UChar) * ((end-start)+1)); - * u_strcpy(temp, &str[start]); - * u_strncpy(result, temp, end-start); - * res=(char*)malloc(sizeof(char) * (u_strlen(result)+1)); - * u_austrcpy(res, result); - * printf("%s\n", res); - * } - * \endcode - * </pre> - * Print each element in order: - * <pre> - * \code - * void printEachForward( UBreakIterator* boundary, UChar* str) { - * int32_t end; - * int32_t start = ubrk_first(boundary); - * for (end = ubrk_next(boundary)); end != UBRK_DONE; start = end, end = ubrk_next(boundary)) { - * printTextRange(str, start, end ); - * } - * } - * \endcode - * </pre> - * Print each element in reverse order: - * <pre> - * \code - * void printEachBackward( UBreakIterator* boundary, UChar* str) { - * int32_t start; - * int32_t end = ubrk_last(boundary); - * for (start = ubrk_previous(boundary); start != UBRK_DONE; end = start, start =ubrk_previous(boundary)) { - * printTextRange( str, start, end ); - * } - * } - * \endcode - * </pre> - * Print first element - * <pre> - * \code - * void printFirst(UBreakIterator* boundary, UChar* str) { - * int32_t end; - * int32_t start = ubrk_first(boundary); - * end = ubrk_next(boundary); - * printTextRange( str, start, end ); - * } - * \endcode - * </pre> - * Print last element - * <pre> - * \code - * void printLast(UBreakIterator* boundary, UChar* str) { - * int32_t start; - * int32_t end = ubrk_last(boundary); - * start = ubrk_previous(boundary); - * printTextRange(str, start, end ); - * } - * \endcode - * </pre> - * Print the element at a specified position - * <pre> - * \code - * void printAt(UBreakIterator* boundary, int32_t pos , UChar* str) { - * int32_t start; - * int32_t end = ubrk_following(boundary, pos); - * start = ubrk_previous(boundary); - * printTextRange(str, start, end ); - * } - * \endcode - * </pre> - * Creating and using text boundaries - * <pre> - * \code - * void BreakIterator_Example( void ) { - * UBreakIterator* boundary; - * UChar *stringToExamine; - * stringToExamine=(UChar*)malloc(sizeof(UChar) * (strlen("Aaa bbb ccc. Ddd eee fff.")+1) ); - * u_uastrcpy(stringToExamine, "Aaa bbb ccc. Ddd eee fff."); - * printf("Examining: "Aaa bbb ccc. Ddd eee fff."); - * - * //print each sentence in forward and reverse order - * boundary = ubrk_open(UBRK_SENTENCE, "en_us", stringToExamine, u_strlen(stringToExamine), &status); - * printf("----- forward: -----------\n"); - * printEachForward(boundary, stringToExamine); - * printf("----- backward: ----------\n"); - * printEachBackward(boundary, stringToExamine); - * ubrk_close(boundary); - * - * //print each word in order - * boundary = ubrk_open(UBRK_WORD, "en_us", stringToExamine, u_strlen(stringToExamine), &status); - * printf("----- forward: -----------\n"); - * printEachForward(boundary, stringToExamine); - * printf("----- backward: ----------\n"); - * printEachBackward(boundary, stringToExamine); - * //print first element - * printf("----- first: -------------\n"); - * printFirst(boundary, stringToExamine); - * //print last element - * printf("----- last: --------------\n"); - * printLast(boundary, stringToExamine); - * //print word at charpos 10 - * printf("----- at pos 10: ---------\n"); - * printAt(boundary, 10 , stringToExamine); - * - * ubrk_close(boundary); - * } - * \endcode - * </pre> + * <p> + * The text boundary positions are found according to the rules + * described in Unicode Standard Annex #29, Text Boundaries, and + * Unicode Standard Annex #14, Line Breaking Properties. These + * are available at http://www.unicode.org/reports/tr14/ and + * http://www.unicode.org/reports/tr29/. + * <p> + * In addition to the plain C API defined in this header file, an + * object oriented C++ API with equivalent functionality is defined in the + * file brkiter.h. + * <p> + * Code snippits illustrating the use of the Break Iterator APIs + * are available in the ICU User Guide, + * http://icu.sourceforge.net/userguide/boundaryAnalysis.html + * and in the sample program icu/source/samples/break/break.cpp" */ /** The possible types of text boundaries. @stable ICU 2.0 */ typedef enum UBreakIteratorType { /** Character breaks @stable ICU 2.0 */ - UBRK_CHARACTER, + UBRK_CHARACTER = 0, /** Word breaks @stable ICU 2.0 */ - UBRK_WORD, + UBRK_WORD = 1, /** Line breaks @stable ICU 2.0 */ - UBRK_LINE, + UBRK_LINE = 2, /** Sentence breaks @stable ICU 2.0 */ - UBRK_SENTENCE, + UBRK_SENTENCE = 3, #ifndef U_HIDE_DEPRECATED_API /** @@ -204,9 +103,9 @@ typedef enum UBreakIteratorType { * * @deprecated ICU 2.8 Use the word break iterator for titlecasing for Unicode 4 and later. */ - UBRK_TITLE + UBRK_TITLE = 4, #endif /* U_HIDE_DEPRECATED_API */ - + UBRK_COUNT = 5 } UBreakIteratorType; /** Value indicating all text boundaries have been returned. @@ -556,9 +455,9 @@ ubrk_getRuleStatus(UBreakIterator *bi); * @param status receives error codes. * @return The number of rule status values from rules that determined * the most recent boundary returned by the break iterator. - * @draft ICU 3.0 + * @stable ICU 3.0 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status); /** @@ -568,9 +467,9 @@ ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, * @param type locale type (valid or actual) * @param status error code * @return locale string - * @draft ICU 2.8 likely to change after ICU 3.0, based on feedback + * @stable ICU 2.8 */ -U_DRAFT const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ubrk_getLocaleByType(const UBreakIterator *bi, ULocDataLocaleType type, UErrorCode* status); diff --git a/Build/source/libs/icu-xetex/common/unicode/uchar.h b/Build/source/libs/icu-xetex/common/unicode/uchar.h index 0adb47f83c5..ce5fc4f4805 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uchar.h +++ b/Build/source/libs/icu-xetex/common/unicode/uchar.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -39,7 +39,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "4.1" +#define U_UNICODE_VERSION "5.0" /** * \file @@ -187,137 +187,137 @@ typedef enum UProperty { /** First constant for binary Unicode properties. @stable ICU 2.1 */ UCHAR_BINARY_START=UCHAR_ALPHABETIC, /** Binary property ASCII_Hex_Digit. 0-9 A-F a-f @stable ICU 2.1 */ - UCHAR_ASCII_HEX_DIGIT, + UCHAR_ASCII_HEX_DIGIT=1, /** Binary property Bidi_Control. Format controls which have specific functions in the Bidi Algorithm. @stable ICU 2.1 */ - UCHAR_BIDI_CONTROL, + UCHAR_BIDI_CONTROL=2, /** Binary property Bidi_Mirrored. Characters that may change display in RTL text. Same as u_isMirrored. See Bidi Algorithm, UTR 9. @stable ICU 2.1 */ - UCHAR_BIDI_MIRRORED, + UCHAR_BIDI_MIRRORED=3, /** Binary property Dash. Variations of dashes. @stable ICU 2.1 */ - UCHAR_DASH, + UCHAR_DASH=4, /** Binary property Default_Ignorable_Code_Point (new in Unicode 3.2). Ignorable in most processing. <2060..206F, FFF0..FFFB, E0000..E0FFF>+Other_Default_Ignorable_Code_Point+(Cf+Cc+Cs-White_Space) @stable ICU 2.1 */ - UCHAR_DEFAULT_IGNORABLE_CODE_POINT, + UCHAR_DEFAULT_IGNORABLE_CODE_POINT=5, /** Binary property Deprecated (new in Unicode 3.2). The usage of deprecated characters is strongly discouraged. @stable ICU 2.1 */ - UCHAR_DEPRECATED, + UCHAR_DEPRECATED=6, /** Binary property Diacritic. Characters that linguistically modify the meaning of another character to which they apply. @stable ICU 2.1 */ - UCHAR_DIACRITIC, + UCHAR_DIACRITIC=7, /** Binary property Extender. Extend the value or shape of a preceding alphabetic character, e.g., length and iteration marks. @stable ICU 2.1 */ - UCHAR_EXTENDER, + UCHAR_EXTENDER=8, /** Binary property Full_Composition_Exclusion. CompositionExclusions.txt+Singleton Decompositions+ Non-Starter Decompositions. @stable ICU 2.1 */ - UCHAR_FULL_COMPOSITION_EXCLUSION, + UCHAR_FULL_COMPOSITION_EXCLUSION=9, /** Binary property Grapheme_Base (new in Unicode 3.2). For programmatic determination of grapheme cluster boundaries. [0..10FFFF]-Cc-Cf-Cs-Co-Cn-Zl-Zp-Grapheme_Link-Grapheme_Extend-CGJ @stable ICU 2.1 */ - UCHAR_GRAPHEME_BASE, + UCHAR_GRAPHEME_BASE=10, /** Binary property Grapheme_Extend (new in Unicode 3.2). For programmatic determination of grapheme cluster boundaries. Me+Mn+Mc+Other_Grapheme_Extend-Grapheme_Link-CGJ @stable ICU 2.1 */ - UCHAR_GRAPHEME_EXTEND, + UCHAR_GRAPHEME_EXTEND=11, /** Binary property Grapheme_Link (new in Unicode 3.2). For programmatic determination of grapheme cluster boundaries. @stable ICU 2.1 */ - UCHAR_GRAPHEME_LINK, + UCHAR_GRAPHEME_LINK=12, /** Binary property Hex_Digit. Characters commonly used for hexadecimal numbers. @stable ICU 2.1 */ - UCHAR_HEX_DIGIT, + UCHAR_HEX_DIGIT=13, /** Binary property Hyphen. Dashes used to mark connections between pieces of words, plus the Katakana middle dot. @stable ICU 2.1 */ - UCHAR_HYPHEN, + UCHAR_HYPHEN=14, /** Binary property ID_Continue. Characters that can continue an identifier. DerivedCoreProperties.txt also says "NOTE: Cf characters should be filtered out." ID_Start+Mn+Mc+Nd+Pc @stable ICU 2.1 */ - UCHAR_ID_CONTINUE, + UCHAR_ID_CONTINUE=15, /** Binary property ID_Start. Characters that can start an identifier. Lu+Ll+Lt+Lm+Lo+Nl @stable ICU 2.1 */ - UCHAR_ID_START, + UCHAR_ID_START=16, /** Binary property Ideographic. CJKV ideographs. @stable ICU 2.1 */ - UCHAR_IDEOGRAPHIC, + UCHAR_IDEOGRAPHIC=17, /** Binary property IDS_Binary_Operator (new in Unicode 3.2). For programmatic determination of Ideographic Description Sequences. @stable ICU 2.1 */ - UCHAR_IDS_BINARY_OPERATOR, + UCHAR_IDS_BINARY_OPERATOR=18, /** Binary property IDS_Trinary_Operator (new in Unicode 3.2). For programmatic determination of Ideographic Description Sequences. @stable ICU 2.1 */ - UCHAR_IDS_TRINARY_OPERATOR, + UCHAR_IDS_TRINARY_OPERATOR=19, /** Binary property Join_Control. Format controls for cursive joining and ligation. @stable ICU 2.1 */ - UCHAR_JOIN_CONTROL, + UCHAR_JOIN_CONTROL=20, /** Binary property Logical_Order_Exception (new in Unicode 3.2). Characters that do not use logical order and require special handling in most processing. @stable ICU 2.1 */ - UCHAR_LOGICAL_ORDER_EXCEPTION, + UCHAR_LOGICAL_ORDER_EXCEPTION=21, /** Binary property Lowercase. Same as u_isULowercase, different from u_islower. Ll+Other_Lowercase @stable ICU 2.1 */ - UCHAR_LOWERCASE, + UCHAR_LOWERCASE=22, /** Binary property Math. Sm+Other_Math @stable ICU 2.1 */ - UCHAR_MATH, + UCHAR_MATH=23, /** Binary property Noncharacter_Code_Point. Code points that are explicitly defined as illegal for the encoding of characters. @stable ICU 2.1 */ - UCHAR_NONCHARACTER_CODE_POINT, + UCHAR_NONCHARACTER_CODE_POINT=24, /** Binary property Quotation_Mark. @stable ICU 2.1 */ - UCHAR_QUOTATION_MARK, + UCHAR_QUOTATION_MARK=25, /** Binary property Radical (new in Unicode 3.2). For programmatic determination of Ideographic Description Sequences. @stable ICU 2.1 */ - UCHAR_RADICAL, + UCHAR_RADICAL=26, /** Binary property Soft_Dotted (new in Unicode 3.2). Characters with a "soft dot", like i or j. An accent placed on these characters causes the dot to disappear. @stable ICU 2.1 */ - UCHAR_SOFT_DOTTED, + UCHAR_SOFT_DOTTED=27, /** Binary property Terminal_Punctuation. Punctuation characters that generally mark the end of textual units. @stable ICU 2.1 */ - UCHAR_TERMINAL_PUNCTUATION, + UCHAR_TERMINAL_PUNCTUATION=28, /** Binary property Unified_Ideograph (new in Unicode 3.2). For programmatic determination of Ideographic Description Sequences. @stable ICU 2.1 */ - UCHAR_UNIFIED_IDEOGRAPH, + UCHAR_UNIFIED_IDEOGRAPH=29, /** Binary property Uppercase. Same as u_isUUppercase, different from u_isupper. Lu+Other_Uppercase @stable ICU 2.1 */ - UCHAR_UPPERCASE, + UCHAR_UPPERCASE=30, /** Binary property White_Space. Same as u_isUWhiteSpace, different from u_isspace and u_isWhitespace. Space characters+TAB+CR+LF-ZWSP-ZWNBSP @stable ICU 2.1 */ - UCHAR_WHITE_SPACE, + UCHAR_WHITE_SPACE=31, /** Binary property XID_Continue. ID_Continue modified to allow closure under normalization forms NFKC and NFKD. @stable ICU 2.1 */ - UCHAR_XID_CONTINUE, + UCHAR_XID_CONTINUE=32, /** Binary property XID_Start. ID_Start modified to allow closure under normalization forms NFKC and NFKD. @stable ICU 2.1 */ - UCHAR_XID_START, + UCHAR_XID_START=33, /** Binary property Case_Sensitive. Either the source of a case mapping or _in_ the target of a case mapping. Not the same as the general category Cased_Letter. @stable ICU 2.6 */ - UCHAR_CASE_SENSITIVE, + UCHAR_CASE_SENSITIVE=34, /** Binary property STerm (new in Unicode 4.0.1). Sentence Terminal. Used in UAX #29: Text Boundaries (http://www.unicode.org/reports/tr29/) - @draft ICU 3.0 */ - UCHAR_S_TERM, + @stable ICU 3.0 */ + UCHAR_S_TERM=35, /** Binary property Variation_Selector (new in Unicode 4.0.1). Indicates all those characters that qualify as Variation Selectors. For details on the behavior of these characters, see StandardizedVariants.html and 15.6 Variation Selectors. - @draft ICU 3.0 */ - UCHAR_VARIATION_SELECTOR, + @stable ICU 3.0 */ + UCHAR_VARIATION_SELECTOR=36, /** Binary property NFD_Inert. ICU-specific property for characters that are inert under NFD, i.e., they do not interact with adjacent characters. @@ -339,8 +339,8 @@ typedef enum UProperty { See also com.ibm.text.UCD.NFSkippable in the ICU4J repository, and icu/source/common/unormimp.h . - @draft ICU 3.0 */ - UCHAR_NFD_INERT, + @stable ICU 3.0 */ + UCHAR_NFD_INERT=37, /** Binary property NFKD_Inert. ICU-specific property for characters that are inert under NFKD, i.e., they do not interact with adjacent characters. @@ -348,8 +348,8 @@ typedef enum UProperty { to find the boundary of safely normalizable text despite possible text additions. @see UCHAR_NFD_INERT - @draft ICU 3.0 */ - UCHAR_NFKD_INERT, + @stable ICU 3.0 */ + UCHAR_NFKD_INERT=38, /** Binary property NFC_Inert. ICU-specific property for characters that are inert under NFC, i.e., they do not interact with adjacent characters. @@ -357,8 +357,8 @@ typedef enum UProperty { to find the boundary of safely normalizable text despite possible text additions. @see UCHAR_NFD_INERT - @draft ICU 3.0 */ - UCHAR_NFC_INERT, + @stable ICU 3.0 */ + UCHAR_NFC_INERT=39, /** Binary property NFKC_Inert. ICU-specific property for characters that are inert under NFKC, i.e., they do not interact with adjacent characters. @@ -366,8 +366,8 @@ typedef enum UProperty { to find the boundary of safely normalizable text despite possible text additions. @see UCHAR_NFD_INERT - @draft ICU 3.0 */ - UCHAR_NFKC_INERT, + @stable ICU 3.0 */ + UCHAR_NFKC_INERT=40, /** Binary Property Segment_Starter. ICU-specific property for characters that are starters in terms of Unicode normalization and combining character sequences. @@ -377,45 +377,47 @@ typedef enum UProperty { ICU uses this property for segmenting a string for generating a set of canonically equivalent strings, e.g. for canonical closure while processing collation tailoring rules. - @draft ICU 3.0 */ - UCHAR_SEGMENT_STARTER, + @stable ICU 3.0 */ + UCHAR_SEGMENT_STARTER=41, +#ifndef U_HIDE_DRAFT_API /** Binary property Pattern_Syntax (new in Unicode 4.1). See UAX #31 Identifier and Pattern Syntax (http://www.unicode.org/reports/tr31/) @draft ICU 3.4 */ - UCHAR_PATTERN_SYNTAX, + UCHAR_PATTERN_SYNTAX=42, /** Binary property Pattern_White_Space (new in Unicode 4.1). See UAX #31 Identifier and Pattern Syntax (http://www.unicode.org/reports/tr31/) @draft ICU 3.4 */ - UCHAR_PATTERN_WHITE_SPACE, + UCHAR_PATTERN_WHITE_SPACE=43, /** Binary property alnum (a C/POSIX character class). Implemented according to the UTS #18 Annex C Standard Recommendation. See the uchar.h file documentation. @draft ICU 3.4 */ - UCHAR_POSIX_ALNUM, + UCHAR_POSIX_ALNUM=44, /** Binary property blank (a C/POSIX character class). Implemented according to the UTS #18 Annex C Standard Recommendation. See the uchar.h file documentation. @draft ICU 3.4 */ - UCHAR_POSIX_BLANK, + UCHAR_POSIX_BLANK=45, /** Binary property graph (a C/POSIX character class). Implemented according to the UTS #18 Annex C Standard Recommendation. See the uchar.h file documentation. @draft ICU 3.4 */ - UCHAR_POSIX_GRAPH, + UCHAR_POSIX_GRAPH=46, /** Binary property print (a C/POSIX character class). Implemented according to the UTS #18 Annex C Standard Recommendation. See the uchar.h file documentation. @draft ICU 3.4 */ - UCHAR_POSIX_PRINT, + UCHAR_POSIX_PRINT=47, /** Binary property xdigit (a C/POSIX character class). Implemented according to the UTS #18 Annex C Standard Recommendation. See the uchar.h file documentation. @draft ICU 3.4 */ - UCHAR_POSIX_XDIGIT, + UCHAR_POSIX_XDIGIT=48, +#endif /* U_HIDE_DRAFT_API */ /** One more than the last constant for binary Unicode properties. @stable ICU 2.1 */ - UCHAR_BINARY_LIMIT, + UCHAR_BINARY_LIMIT=49, /** Enumerated property Bidi_Class. Same as u_charDirection, returns UCharDirection values. @stable ICU 2.2 */ @@ -424,81 +426,83 @@ typedef enum UProperty { UCHAR_INT_START=UCHAR_BIDI_CLASS, /** Enumerated property Block. Same as ublock_getCode, returns UBlockCode values. @stable ICU 2.2 */ - UCHAR_BLOCK, + UCHAR_BLOCK=0x1001, /** Enumerated property Canonical_Combining_Class. Same as u_getCombiningClass, returns 8-bit numeric values. @stable ICU 2.2 */ - UCHAR_CANONICAL_COMBINING_CLASS, + UCHAR_CANONICAL_COMBINING_CLASS=0x1002, /** Enumerated property Decomposition_Type. Returns UDecompositionType values. @stable ICU 2.2 */ - UCHAR_DECOMPOSITION_TYPE, + UCHAR_DECOMPOSITION_TYPE=0x1003, /** Enumerated property East_Asian_Width. See http://www.unicode.org/reports/tr11/ Returns UEastAsianWidth values. @stable ICU 2.2 */ - UCHAR_EAST_ASIAN_WIDTH, + UCHAR_EAST_ASIAN_WIDTH=0x1004, /** Enumerated property General_Category. Same as u_charType, returns UCharCategory values. @stable ICU 2.2 */ - UCHAR_GENERAL_CATEGORY, + UCHAR_GENERAL_CATEGORY=0x1005, /** Enumerated property Joining_Group. Returns UJoiningGroup values. @stable ICU 2.2 */ - UCHAR_JOINING_GROUP, + UCHAR_JOINING_GROUP=0x1006, /** Enumerated property Joining_Type. Returns UJoiningType values. @stable ICU 2.2 */ - UCHAR_JOINING_TYPE, + UCHAR_JOINING_TYPE=0x1007, /** Enumerated property Line_Break. Returns ULineBreak values. @stable ICU 2.2 */ - UCHAR_LINE_BREAK, + UCHAR_LINE_BREAK=0x1008, /** Enumerated property Numeric_Type. Returns UNumericType values. @stable ICU 2.2 */ - UCHAR_NUMERIC_TYPE, + UCHAR_NUMERIC_TYPE=0x1009, /** Enumerated property Script. Same as uscript_getScript, returns UScriptCode values. @stable ICU 2.2 */ - UCHAR_SCRIPT, + UCHAR_SCRIPT=0x100A, /** Enumerated property Hangul_Syllable_Type, new in Unicode 4. Returns UHangulSyllableType values. @stable ICU 2.6 */ - UCHAR_HANGUL_SYLLABLE_TYPE, + UCHAR_HANGUL_SYLLABLE_TYPE=0x100B, /** Enumerated property NFD_Quick_Check. - Returns UNormalizationCheckResult values. @draft ICU 3.0 */ - UCHAR_NFD_QUICK_CHECK, + Returns UNormalizationCheckResult values. @stable ICU 3.0 */ + UCHAR_NFD_QUICK_CHECK=0x100C, /** Enumerated property NFKD_Quick_Check. - Returns UNormalizationCheckResult values. @draft ICU 3.0 */ - UCHAR_NFKD_QUICK_CHECK, + Returns UNormalizationCheckResult values. @stable ICU 3.0 */ + UCHAR_NFKD_QUICK_CHECK=0x100D, /** Enumerated property NFC_Quick_Check. - Returns UNormalizationCheckResult values. @draft ICU 3.0 */ - UCHAR_NFC_QUICK_CHECK, + Returns UNormalizationCheckResult values. @stable ICU 3.0 */ + UCHAR_NFC_QUICK_CHECK=0x100E, /** Enumerated property NFKC_Quick_Check. - Returns UNormalizationCheckResult values. @draft ICU 3.0 */ - UCHAR_NFKC_QUICK_CHECK, + Returns UNormalizationCheckResult values. @stable ICU 3.0 */ + UCHAR_NFKC_QUICK_CHECK=0x100F, /** Enumerated property Lead_Canonical_Combining_Class. ICU-specific property for the ccc of the first code point of the decomposition, or lccc(c)=ccc(NFD(c)[0]). Useful for checking for canonically ordered text; see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD . - Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */ - UCHAR_LEAD_CANONICAL_COMBINING_CLASS, + Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @stable ICU 3.0 */ + UCHAR_LEAD_CANONICAL_COMBINING_CLASS=0x1010, /** Enumerated property Trail_Canonical_Combining_Class. ICU-specific property for the ccc of the last code point of the decomposition, or tccc(c)=ccc(NFD(c)[last]). Useful for checking for canonically ordered text; see UNORM_FCD and http://www.unicode.org/notes/tn5/#FCD . - Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @draft ICU 3.0 */ - UCHAR_TRAIL_CANONICAL_COMBINING_CLASS, + Returns 8-bit numeric values like UCHAR_CANONICAL_COMBINING_CLASS. @stable ICU 3.0 */ + UCHAR_TRAIL_CANONICAL_COMBINING_CLASS=0x1011, +#ifndef U_HIDE_DRAFT_API /** Enumerated property Grapheme_Cluster_Break (new in Unicode 4.1). Used in UAX #29: Text Boundaries (http://www.unicode.org/reports/tr29/) Returns UGraphemeClusterBreak values. @draft ICU 3.4 */ - UCHAR_GRAPHEME_CLUSTER_BREAK, + UCHAR_GRAPHEME_CLUSTER_BREAK=0x1012, /** Enumerated property Sentence_Break (new in Unicode 4.1). Used in UAX #29: Text Boundaries (http://www.unicode.org/reports/tr29/) Returns USentenceBreak values. @draft ICU 3.4 */ - UCHAR_SENTENCE_BREAK, + UCHAR_SENTENCE_BREAK=0x1013, /** Enumerated property Word_Break (new in Unicode 4.1). Used in UAX #29: Text Boundaries (http://www.unicode.org/reports/tr29/) Returns UWordBreakValues values. @draft ICU 3.4 */ - UCHAR_WORD_BREAK, + UCHAR_WORD_BREAK=0x1014, +#endif /*U_HIDE_DRAFT_API*/ /** One more than the last constant for enumerated/integer Unicode properties. @stable ICU 2.2 */ - UCHAR_INT_LIMIT, + UCHAR_INT_LIMIT=0x1015, /** Bitmask property General_Category_Mask. This is the General_Category property returned as a bit mask. @@ -512,7 +516,7 @@ typedef enum UProperty { /** First constant for bit-mask Unicode properties. @stable ICU 2.4 */ UCHAR_MASK_START=UCHAR_GENERAL_CATEGORY_MASK, /** One more than the last constant for bit-mask Unicode properties. @stable ICU 2.4 */ - UCHAR_MASK_LIMIT, + UCHAR_MASK_LIMIT=0x2001, /** Double property Numeric_Value. Corresponds to u_getNumericValue. @stable ICU 2.4 */ @@ -520,7 +524,7 @@ typedef enum UProperty { /** First constant for double Unicode properties. @stable ICU 2.4 */ UCHAR_DOUBLE_START=UCHAR_NUMERIC_VALUE, /** One more than the last constant for double Unicode properties. @stable ICU 2.4 */ - UCHAR_DOUBLE_LIMIT, + UCHAR_DOUBLE_LIMIT=0x3001, /** String property Age. Corresponds to u_charAge. @stable ICU 2.4 */ @@ -529,42 +533,42 @@ typedef enum UProperty { UCHAR_STRING_START=UCHAR_AGE, /** String property Bidi_Mirroring_Glyph. Corresponds to u_charMirror. @stable ICU 2.4 */ - UCHAR_BIDI_MIRRORING_GLYPH, + UCHAR_BIDI_MIRRORING_GLYPH=0x4001, /** String property Case_Folding. Corresponds to u_strFoldCase in ustring.h. @stable ICU 2.4 */ - UCHAR_CASE_FOLDING, + UCHAR_CASE_FOLDING=0x4002, /** String property ISO_Comment. Corresponds to u_getISOComment. @stable ICU 2.4 */ - UCHAR_ISO_COMMENT, + UCHAR_ISO_COMMENT=0x4003, /** String property Lowercase_Mapping. Corresponds to u_strToLower in ustring.h. @stable ICU 2.4 */ - UCHAR_LOWERCASE_MAPPING, + UCHAR_LOWERCASE_MAPPING=0x4004, /** String property Name. Corresponds to u_charName. @stable ICU 2.4 */ - UCHAR_NAME, + UCHAR_NAME=0x4005, /** String property Simple_Case_Folding. Corresponds to u_foldCase. @stable ICU 2.4 */ - UCHAR_SIMPLE_CASE_FOLDING, + UCHAR_SIMPLE_CASE_FOLDING=0x4006, /** String property Simple_Lowercase_Mapping. Corresponds to u_tolower. @stable ICU 2.4 */ - UCHAR_SIMPLE_LOWERCASE_MAPPING, + UCHAR_SIMPLE_LOWERCASE_MAPPING=0x4007, /** String property Simple_Titlecase_Mapping. Corresponds to u_totitle. @stable ICU 2.4 */ - UCHAR_SIMPLE_TITLECASE_MAPPING, + UCHAR_SIMPLE_TITLECASE_MAPPING=0x4008, /** String property Simple_Uppercase_Mapping. Corresponds to u_toupper. @stable ICU 2.4 */ - UCHAR_SIMPLE_UPPERCASE_MAPPING, + UCHAR_SIMPLE_UPPERCASE_MAPPING=0x4009, /** String property Titlecase_Mapping. Corresponds to u_strToTitle in ustring.h. @stable ICU 2.4 */ - UCHAR_TITLECASE_MAPPING, + UCHAR_TITLECASE_MAPPING=0x400A, /** String property Unicode_1_Name. Corresponds to u_charName. @stable ICU 2.4 */ - UCHAR_UNICODE_1_NAME, + UCHAR_UNICODE_1_NAME=0x400B, /** String property Uppercase_Mapping. Corresponds to u_strToUpper in ustring.h. @stable ICU 2.4 */ - UCHAR_UPPERCASE_MAPPING, + UCHAR_UPPERCASE_MAPPING=0x400C, /** One more than the last constant for string Unicode properties. @stable ICU 2.4 */ - UCHAR_STRING_LIMIT, + UCHAR_STRING_LIMIT=0x400D, /** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */ UCHAR_INVALID_CODE = -1 @@ -1128,7 +1132,7 @@ enum UBlockCode { * @stable ICU 2.2 */ UBLOCK_CYRILLIC_SUPPLEMENTARY = 97, - /** @draft ICU 3.0 */ + /** @stable ICU 3.0 */ UBLOCK_CYRILLIC_SUPPLEMENT = UBLOCK_CYRILLIC_SUPPLEMENTARY, /*[0500]*/ /** @stable ICU 2.2 */ UBLOCK_TAGALOG = 98, /*[1700]*/ @@ -1190,6 +1194,7 @@ enum UBlockCode { /** @stable ICU 2.6 */ UBLOCK_VARIATION_SELECTORS_SUPPLEMENT = 125, /*[E0100]*/ +#ifndef U_HIDE_DRAFT_API /* New blocks in Unicode 4.1 */ /** @draft ICU 3.4 */ @@ -1233,8 +1238,31 @@ enum UBlockCode { /** @draft ICU 3.4 */ UBLOCK_VERTICAL_FORMS = 145, /*[FE10]*/ - /** @stable ICU 2.0 */ - UBLOCK_COUNT, + /* New blocks in Unicode 5.0 */ + + /** @draft ICU 3.6 */ + UBLOCK_NKO = 146, /*[07C0]*/ + /** @draft ICU 3.6 */ + UBLOCK_BALINESE = 147, /*[1B00]*/ + /** @draft ICU 3.6 */ + UBLOCK_LATIN_EXTENDED_C = 148, /*[2C60]*/ + /** @draft ICU 3.6 */ + UBLOCK_LATIN_EXTENDED_D = 149, /*[A720]*/ + /** @draft ICU 3.6 */ + UBLOCK_PHAGS_PA = 150, /*[A840]*/ + /** @draft ICU 3.6 */ + UBLOCK_PHOENICIAN = 151, /*[10900]*/ + /** @draft ICU 3.6 */ + UBLOCK_CUNEIFORM = 152, /*[12000]*/ + /** @draft ICU 3.6 */ + UBLOCK_CUNEIFORM_NUMBERS_AND_PUNCTUATION = 153, /*[12400]*/ + /** @draft ICU 3.6 */ + UBLOCK_COUNTING_ROD_NUMERALS = 154, /*[1D360]*/ + +#endif /*U_HIDE_DRAFT_API*/ + + /** @stable ICU 2.0 */ + UBLOCK_COUNT = 155, /** @stable ICU 2.0 */ UBLOCK_INVALID_CODE=-1 @@ -1416,17 +1444,19 @@ typedef enum UJoiningGroup { * @draft ICU 3.4 */ typedef enum UGraphemeClusterBreak { - U_GCB_OTHER, /*[XX]*/ /*See note !!*/ - U_GCB_CONTROL, /*[CN]*/ - U_GCB_CR, /*[CR]*/ - U_GCB_EXTEND, /*[EX]*/ - U_GCB_L, /*[L]*/ - U_GCB_LF, /*[LF]*/ - U_GCB_LV, /*[LV]*/ - U_GCB_LVT, /*[LVT]*/ - U_GCB_T, /*[T]*/ - U_GCB_V, /*[V]*/ - U_GCB_COUNT +#ifndef U_HIDE_DRAFT_API + U_GCB_OTHER = 0, /*[XX]*/ /*See note !!*/ + U_GCB_CONTROL = 1, /*[CN]*/ + U_GCB_CR = 2, /*[CR]*/ + U_GCB_EXTEND = 3, /*[EX]*/ + U_GCB_L = 4, /*[L]*/ + U_GCB_LF = 5, /*[LF]*/ + U_GCB_LV = 6, /*[LV]*/ + U_GCB_LVT = 7, /*[LVT]*/ + U_GCB_T = 8, /*[T]*/ + U_GCB_V = 9, /*[V]*/ +#endif /*U_HIDE_DRAFT_API*/ + U_GCB_COUNT = 10 } UGraphemeClusterBreak; /** @@ -1437,15 +1467,17 @@ typedef enum UGraphemeClusterBreak { * @draft ICU 3.4 */ typedef enum UWordBreakValues { - U_WB_OTHER, /*[XX]*/ /*See note !!*/ - U_WB_ALETTER, /*[LE]*/ - U_WB_FORMAT, /*[FO]*/ - U_WB_KATAKANA, /*[KA]*/ - U_WB_MIDLETTER, /*[ML]*/ - U_WB_MIDNUM, /*[MN]*/ - U_WB_NUMERIC, /*[NU]*/ - U_WB_EXTENDNUMLET, /*[EX]*/ - U_WB_COUNT +#ifndef U_HIDE_DRAFT_API + U_WB_OTHER = 0, /*[XX]*/ /*See note !!*/ + U_WB_ALETTER = 1, /*[LE]*/ + U_WB_FORMAT = 2, /*[FO]*/ + U_WB_KATAKANA = 3, /*[KA]*/ + U_WB_MIDLETTER = 4, /*[ML]*/ + U_WB_MIDNUM = 5, /*[MN]*/ + U_WB_NUMERIC = 6, /*[NU]*/ + U_WB_EXTENDNUMLET = 7, /*[EX]*/ +#endif /*U_HIDE_DRAFT_API*/ + U_WB_COUNT = 8 } UWordBreakValues; /** @@ -1455,18 +1487,20 @@ typedef enum UWordBreakValues { * @draft ICU 3.4 */ typedef enum USentenceBreak { - U_SB_OTHER, /*[XX]*/ /*See note !!*/ - U_SB_ATERM, /*[AT]*/ - U_SB_CLOSE, /*[CL]*/ - U_SB_FORMAT, /*[FO]*/ - U_SB_LOWER, /*[LO]*/ - U_SB_NUMERIC, /*[NU]*/ - U_SB_OLETTER, /*[LE]*/ - U_SB_SEP, /*[SE]*/ - U_SB_SP, /*[SP]*/ - U_SB_STERM, /*[ST]*/ - U_SB_UPPER, /*[UP]*/ - U_SB_COUNT +#ifndef U_HIDE_DRAFT_API + U_SB_OTHER = 0, /*[XX]*/ /*See note !!*/ + U_SB_ATERM = 1, /*[AT]*/ + U_SB_CLOSE = 2, /*[CL]*/ + U_SB_FORMAT = 3, /*[FO]*/ + U_SB_LOWER = 4, /*[LO]*/ + U_SB_NUMERIC = 5, /*[NU]*/ + U_SB_OLETTER = 6, /*[LE]*/ + U_SB_SEP = 7, /*[SE]*/ + U_SB_SP = 8, /*[SP]*/ + U_SB_STERM = 9, /*[ST]*/ + U_SB_UPPER = 10, /*[UP]*/ +#endif /*U_HIDE_DRAFT_API*/ + U_SB_COUNT = 11 } USentenceBreak; /** @@ -1476,45 +1510,45 @@ typedef enum USentenceBreak { * @stable ICU 2.2 */ typedef enum ULineBreak { - U_LB_UNKNOWN, /*[XX]*/ /*See note !!*/ - U_LB_AMBIGUOUS, /*[AI]*/ - U_LB_ALPHABETIC, /*[AL]*/ - U_LB_BREAK_BOTH, /*[B2]*/ - U_LB_BREAK_AFTER, /*[BA]*/ - U_LB_BREAK_BEFORE, /*[BB]*/ - U_LB_MANDATORY_BREAK, /*[BK]*/ - U_LB_CONTINGENT_BREAK, /*[CB]*/ - U_LB_CLOSE_PUNCTUATION, /*[CL]*/ - U_LB_COMBINING_MARK, /*[CM]*/ - U_LB_CARRIAGE_RETURN, /*[CR]*/ - U_LB_EXCLAMATION, /*[EX]*/ - U_LB_GLUE, /*[GL]*/ - U_LB_HYPHEN, /*[HY]*/ - U_LB_IDEOGRAPHIC, /*[ID]*/ - U_LB_INSEPERABLE, - /** Renamed from the misspelled "inseperable" in Unicode 4.0.1/ICU 3.0 @draft ICU 3.0 */ + U_LB_UNKNOWN = 0, /*[XX]*/ /*See note !!*/ + U_LB_AMBIGUOUS = 1, /*[AI]*/ + U_LB_ALPHABETIC = 2, /*[AL]*/ + U_LB_BREAK_BOTH = 3, /*[B2]*/ + U_LB_BREAK_AFTER = 4, /*[BA]*/ + U_LB_BREAK_BEFORE = 5, /*[BB]*/ + U_LB_MANDATORY_BREAK = 6, /*[BK]*/ + U_LB_CONTINGENT_BREAK = 7, /*[CB]*/ + U_LB_CLOSE_PUNCTUATION = 8, /*[CL]*/ + U_LB_COMBINING_MARK = 9, /*[CM]*/ + U_LB_CARRIAGE_RETURN = 10, /*[CR]*/ + U_LB_EXCLAMATION = 11, /*[EX]*/ + U_LB_GLUE = 12, /*[GL]*/ + U_LB_HYPHEN = 13, /*[HY]*/ + U_LB_IDEOGRAPHIC = 14, /*[ID]*/ + U_LB_INSEPERABLE = 15, + /** Renamed from the misspelled "inseperable" in Unicode 4.0.1/ICU 3.0 @stable ICU 3.0 */ U_LB_INSEPARABLE=U_LB_INSEPERABLE,/*[IN]*/ - U_LB_INFIX_NUMERIC, /*[IS]*/ - U_LB_LINE_FEED, /*[LF]*/ - U_LB_NONSTARTER, /*[NS]*/ - U_LB_NUMERIC, /*[NU]*/ - U_LB_OPEN_PUNCTUATION, /*[OP]*/ - U_LB_POSTFIX_NUMERIC, /*[PO]*/ - U_LB_PREFIX_NUMERIC, /*[PR]*/ - U_LB_QUOTATION, /*[QU]*/ - U_LB_COMPLEX_CONTEXT, /*[SA]*/ - U_LB_SURROGATE, /*[SG]*/ - U_LB_SPACE, /*[SP]*/ - U_LB_BREAK_SYMBOLS, /*[SY]*/ - U_LB_ZWSPACE, /*[ZW]*/ - U_LB_NEXT_LINE, /*[NL]*/ /* from here on: new in Unicode 4/ICU 2.6 */ - U_LB_WORD_JOINER, /*[WJ]*/ - U_LB_H2, /*[H2]*/ /* from here on: new in Unicode 4.1/ICU 3.4 */ - U_LB_H3, /*[H3]*/ - U_LB_JL, /*[JL]*/ - U_LB_JT, /*[JT]*/ - U_LB_JV, /*[JV]*/ - U_LB_COUNT + U_LB_INFIX_NUMERIC = 16, /*[IS]*/ + U_LB_LINE_FEED = 17, /*[LF]*/ + U_LB_NONSTARTER = 18, /*[NS]*/ + U_LB_NUMERIC = 19, /*[NU]*/ + U_LB_OPEN_PUNCTUATION = 20, /*[OP]*/ + U_LB_POSTFIX_NUMERIC = 21, /*[PO]*/ + U_LB_PREFIX_NUMERIC = 22, /*[PR]*/ + U_LB_QUOTATION = 23, /*[QU]*/ + U_LB_COMPLEX_CONTEXT = 24, /*[SA]*/ + U_LB_SURROGATE = 25, /*[SG]*/ + U_LB_SPACE = 26, /*[SP]*/ + U_LB_BREAK_SYMBOLS = 27, /*[SY]*/ + U_LB_ZWSPACE = 28, /*[ZW]*/ + U_LB_NEXT_LINE = 29, /*[NL]*/ /* from here on: new in Unicode 4/ICU 2.6 */ + U_LB_WORD_JOINER = 30, /*[WJ]*/ + U_LB_H2 = 31, /*[H2]*/ /* from here on: new in Unicode 4.1/ICU 3.4 */ + U_LB_H3 = 32, /*[H3]*/ + U_LB_JL = 33, /*[JL]*/ + U_LB_JT = 34, /*[JT]*/ + U_LB_JV = 35, /*[JV]*/ + U_LB_COUNT = 36 } ULineBreak; /** @@ -2451,7 +2485,7 @@ u_charFromName(UCharNameChoice nameChoice, * @see u_enumCharNames * @stable ICU 1.7 */ -typedef UBool UEnumCharNamesFn(void *context, +typedef UBool U_CALLCONV UEnumCharNamesFn(void *context, UChar32 code, UCharNameChoice nameChoice, const char *name, diff --git a/Build/source/libs/icu-xetex/common/unicode/ucnv.h b/Build/source/libs/icu-xetex/common/unicode/ucnv.h index 14ac8021adb..f8fce55bebd 100644 --- a/Build/source/libs/icu-xetex/common/unicode/ucnv.h +++ b/Build/source/libs/icu-xetex/common/unicode/ucnv.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * ucnv.h: @@ -253,11 +253,13 @@ U_CDECL_END #define UCNV_SWAP_LFNL_OPTION_STRING ",swaplfnl" /** - * Do a fuzzy compare of a two converter/alias names. The comparison - * is case-insensitive. It also ignores the characters '-', '_', and - * ' ' (dash, underscore, and space). Thus the strings "UTF-8", - * "utf_8", and "Utf 8" are exactly equivalent. - * + * Do a fuzzy compare of two converter/alias names. + * The comparison is case-insensitive, ignores leading zeroes if they are not + * followed by further digits, and ignores all but letters and digits. + * Thus the strings "UTF-8", "utf_8", "u*T@f08" and "Utf 8" are exactly equivalent. + * See section 1.4, Charset Alias Matching in Unicode Technical Standard #22 + * at http://www.unicode.org/reports/tr22/ + * * @param name1 a converter name or alias, zero-terminated * @param name2 a converter name or alias, zero-terminated * @return 0 if the names match, or a negative value if the name1 @@ -270,11 +272,12 @@ ucnv_compareNames(const char *name1, const char *name2); /** - * Creates a UConverter object with the names specified as a C string. + * Creates a UConverter object with the name of a coded character set specified as a C string. * The actual name will be resolved with the alias file * using a case-insensitive string comparison that ignores - * the delimiters '-', '_', and ' ' (dash, underscore, and space). - * E.g., the names "UTF8", "utf-8", and "Utf 8" are all equivalent. + * leading zeroes and all non-alphanumeric characters. + * E.g., the names "UTF8", "utf-8", "u*T@f08" and "Utf 8" are all equivalent. + * (See also ucnv_compareNames().) * If <code>NULL</code> is passed for the converter name, it will create one with the * getDefaultName return value. * @@ -294,14 +297,26 @@ ucnv_compareNames(const char *name1, const char *name2); * <p>The conversion behavior and names can vary between platforms. ICU may * convert some characters differently from other platforms. Details on this topic * are in the <a href="http://icu.sourceforge.net/userguide/conversion.html">User's - * Guide</a>.</p> - * - * @param converterName Name of the uconv table, may have options appended + * Guide</a>. Aliases starting with a "cp" prefix have no specific meaning + * other than its an alias starting with the letters "cp". Please do not + * associate any meaning to these aliases.</p> + * + * @param converterName Name of the coded character set table. + * This may have options appended to the string. + * IANA alias character set names, IBM CCSIDs starting with "ibm-", + * Windows codepage numbers starting with "windows-" are frequently + * used for this parameter. See ucnv_getAvailableName and + * ucnv_getAlias for a complete list that is available. + * If this parameter is NULL, the default converter will be used. * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR</TT> * @return the created Unicode converter object, or <TT>NULL</TT> if an error occured * @see ucnv_openU * @see ucnv_openCCSID + * @see ucnv_getAvailableName + * @see ucnv_getAlias + * @see ucnv_getDefaultName * @see ucnv_close + * @ee ucnv_compareNames * @stable ICU 2.0 */ U_STABLE UConverter* U_EXPORT2 @@ -313,13 +328,16 @@ ucnv_open(const char *converterName, UErrorCode *err); * The name should be limited to the ASCII-7 alphanumerics range. * The actual name will be resolved with the alias file * using a case-insensitive string comparison that ignores - * the delimiters '-', '_', and ' ' (dash, underscore, and space). - * E.g., the names "UTF8", "utf-8", and "Utf 8" are all equivalent. + * leading zeroes and all non-alphanumeric characters. + * E.g., the names "UTF8", "utf-8", "u*T@f08" and "Utf 8" are all equivalent. + * (See also ucnv_compareNames().) * If <TT>NULL</TT> is passed for the converter name, it will create * one with the ucnv_getDefaultName() return value. * If the alias is ambiguous, then the preferred converter is used * and the status is set to U_AMBIGUOUS_ALIAS_WARNING. - * @param name : name of the uconv table in a zero terminated + * + * <p>See ucnv_open for the complete details</p> + * @param name Name of the UConverter table in a zero terminated * Unicode string * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, * U_FILE_ACCESS_ERROR</TT> @@ -328,7 +346,7 @@ ucnv_open(const char *converterName, UErrorCode *err); * @see ucnv_open * @see ucnv_openCCSID * @see ucnv_close - * @see ucnv_getDefaultName + * @ee ucnv_compareNames * @stable ICU 2.0 */ U_STABLE UConverter* U_EXPORT2 @@ -505,6 +523,8 @@ ucnv_close(UConverter * converter); /** * Fills in the output parameter, subChars, with the substitution characters * as multiple bytes. + * If ucnv_setSubstString() set a Unicode string because the converter is + * stateful, then subChars will be an empty string. * * @param converter the Unicode converter * @param subChars the subsitution characters @@ -513,6 +533,7 @@ ucnv_close(UConverter * converter); * @param err the outgoing error status code. * If the substitution character array is too small, an * <TT>U_INDEX_OUTOFBOUNDS_ERROR</TT> will be returned. + * @see ucnv_setSubstString * @see ucnv_setSubstChars * @stable ICU 2.0 */ @@ -525,12 +546,19 @@ ucnv_getSubstChars(const UConverter *converter, /** * Sets the substitution chars when converting from unicode to a codepage. The * substitution is specified as a string of 1-4 bytes, and may contain - * <TT>NULL</TT> byte. + * <TT>NULL</TT> bytes. + * The subChars must represent a single character. The caller needs to know the + * byte sequence of a valid character in the converter's charset. + * For some converters, for example some ISO 2022 variants, only single-byte + * substitution characters may be supported. + * The newer ucnv_setSubstString() function relaxes these limitations. + * * @param converter the Unicode converter * @param subChars the substitution character byte sequence we want set * @param len the number of bytes in subChars * @param err the error status code. <TT>U_INDEX_OUTOFBOUNDS_ERROR </TT> if * len is bigger than the maximum number of bytes allowed in subchars + * @see ucnv_setSubstString * @see ucnv_getSubstChars * @stable ICU 2.0 */ @@ -541,6 +569,39 @@ ucnv_setSubstChars(UConverter *converter, UErrorCode *err); /** + * Set a substitution string for converting from Unicode to a charset. + * The caller need not know the charset byte sequence for each charset. + * + * Unlike ucnv_setSubstChars() which is designed to set a charset byte sequence + * for a single character, this function takes a Unicode string with + * zero, one or more characters, and immediately verifies that the string can be + * converted to the charset. + * If not, or if the result is too long (more than 32 bytes as of ICU 3.6), + * then the function returns with an error accordingly. + * + * Also unlike ucnv_setSubstChars(), this function works for stateful charsets + * by converting on the fly at the point of substitution rather than setting + * a fixed byte sequence. + * + * @param cnv The UConverter object. + * @param s The Unicode string. + * @param length The number of UChars in s, or -1 for a NUL-terminated string. + * @param err Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * + * @see ucnv_setSubstChars + * @see ucnv_getSubstChars + * @draft ICU 3.6 + */ +U_DRAFT void U_EXPORT2 +ucnv_setSubstString(UConverter *cnv, + const UChar *s, + int32_t length, + UErrorCode *err); + +/** * Fills in the output parameter, errBytes, with the error characters from the * last failing conversion. * @@ -661,8 +722,6 @@ ucnv_resetFromUnicode(UConverter *converter); U_STABLE int8_t U_EXPORT2 ucnv_getMaxCharSize(const UConverter *converter); -#ifndef U_HIDE_DRAFT_API - /** * Calculates the size of a buffer for conversion from Unicode to a charset. * The calculated size is guaranteed to be sufficient for this conversion. @@ -685,8 +744,6 @@ ucnv_getMaxCharSize(const UConverter *converter); #define UCNV_GET_MAX_BYTES_FOR_STRING(length, maxCharSize) \ (((int32_t)(length)+10)*(int32_t)(maxCharSize)) -#endif /*U_HIDE_DRAFT_API*/ - /** * Returns the minimum byte length for characters in this codepage. * This is usually either 1 or 2. @@ -1219,6 +1276,12 @@ ucnv_getNextUChar(UConverter * converter, * Internally, two conversions - ucnv_toUnicode() and ucnv_fromUnicode() - * are used, "pivoting" through 16-bit Unicode. * + * Important: For streaming conversion (multiple function calls for successive + * parts of a text stream), the caller must provide a pivot buffer explicitly, + * and must preserve the pivot buffer and associated pointers from one + * call to another. (The buffer may be moved if its contents and the relative + * pointer positions are preserved.) + * * There is a similar function, ucnv_convert(), * which has the following limitations: * - it takes charset names, not converter objects, so that @@ -1230,7 +1293,7 @@ ucnv_getNextUChar(UConverter * converter, * * By contrast, ucnv_convertEx() * - takes UConverter parameters instead of charset names - * - fully exposes the pivot buffer for complete error handling + * - fully exposes the pivot buffer for streaming conversion and complete error handling * * ucnv_convertEx() also provides further convenience: * - an option to reset the converters at the beginning @@ -1244,6 +1307,7 @@ ucnv_getNextUChar(UConverter * converter, * or set U_STRING_NOT_TERMINATED_WARNING if the output exactly fills * the target buffer * - the pivot buffer can be provided internally; + * possible only for whole-string conversion, not streaming conversion; * in this case, the caller will not be able to get details about where an * error occurred * (if pivotStart==NULL, see below) @@ -1715,11 +1779,14 @@ U_STABLE const char * U_EXPORT2 ucnv_getDefaultName(void); /** - * sets the current default converter name. Caller must own the storage for 'name' - * and preserve it indefinitely. + * This function sets the current default converter name. + * DO NOT call this function from multiple threads! This function is not + * thread safe. If this function needs to be called, it should be called + * during application initialization. Most of the time, the results from + * ucnv_getDefaultName() is sufficient for your application. * @param name the converter name to be the default (must exist). * @see ucnv_getDefaultName - * @system SYSTEM API + * @system * @stable ICU 2.0 */ U_STABLE void U_EXPORT2 @@ -1796,7 +1863,7 @@ ucnv_usesFallback(const UConverter *cnv); * UErrorCode err = U_ZERO_ERROR; * char input[] = { '\xEF','\xBB', '\xBF','\x41','\x42','\x43' }; * int32_t signatureLength = 0; - * char *encoding = ucnv_detectUnicodeSignatures(input,sizeof(input),&signatureLength,&err); + * char *encoding = ucnv_detectUnicodeSignature(input,sizeof(input),&signatureLength,&err); * UConverter *conv = NULL; * UChar output[100]; * UChar *target = output, *out; diff --git a/Build/source/libs/icu-xetex/common/unicode/uconfig.h b/Build/source/libs/icu-xetex/common/unicode/uconfig.h index 8041cedaacf..8dea2ab8c4d 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uconfig.h +++ b/Build/source/libs/icu-xetex/common/unicode/uconfig.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: uconfig.h @@ -24,6 +24,13 @@ * The switches are fairly coarse, controlling large modules. * Basic services cannot be turned off. * + * Building with any of these options does not guarantee that the + * ICU build process will completely work. It is recommended that + * the ICU libraries and data be built using the normal build. + * At that time you should remove the data used by those services. + * After building the ICU data library, you should rebuild the ICU + * libraries with these switches customized to your needs. + * * @stable ICU 2.4 */ @@ -59,11 +66,33 @@ /* common library switches -------------------------------------------------- */ /** + * \def UCONFIG_NO_FILE_IO + * This switch turns off all file access in the common library + * where file access is only used for data loading. + * ICU data must then be provided in the form of a data DLL (or with an + * equivalent way to link to the data residing in an executable, + * as in building a combined library with both the common library's code and + * the data), or via udata_setCommonData(). + * Application data must be provided via udata_setAppData() or by using + * "open" functions that take pointers to data, for example ucol_openBinary(). + * + * File access is not used at all in the i18n library. + * + * File access cannot be turned off for the icuio library or for the ICU + * test suites and ICU tools. + * + * @draft ICU 3.6 + */ +#ifndef UCONFIG_NO_FILE_IO +# define UCONFIG_NO_FILE_IO 0 +#endif + +/** * \def UCONFIG_NO_CONVERSION * ICU will not completely build with this switch turned on. * This switch turns off all converters. * - * @draft ICU 3.2 + * @stable ICU 3.2 */ #ifndef UCONFIG_NO_CONVERSION # define UCONFIG_NO_CONVERSION 0 @@ -177,7 +206,7 @@ * \def UCONFIG_NO_SERVICE * This switch turns off service registration. * - * @draft ICU 3.2 + * @stable ICU 3.2 */ #ifndef UCONFIG_NO_SERVICE # define UCONFIG_NO_SERVICE 0 diff --git a/Build/source/libs/icu-xetex/common/unicode/udata.h b/Build/source/libs/icu-xetex/common/unicode/udata.h index 0881ef32453..2a12c11fcd8 100644 --- a/Build/source/libs/icu-xetex/common/unicode/udata.h +++ b/Build/source/libs/icu-xetex/common/unicode/udata.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -35,7 +35,8 @@ U_CDECL_BEGIN * * See the User Guide Data Management chapter. */ - + +#ifndef U_HIDE_INTERNAL_API /** * Character used to separate package names from tree names * @internal ICU 3.0 @@ -66,6 +67,8 @@ U_CDECL_BEGIN */ #define U_ICUDATA_ALIAS "ICUDATA" +#endif /* U_HIDE_INTERNAL_API */ + /** * UDataInfo contains the properties about the requested data. * This is meta data. diff --git a/Build/source/libs/icu-xetex/common/unicode/udeprctd.h b/Build/source/libs/icu-xetex/common/unicode/udeprctd.h index 60c423ed6e0..8369eb4ae13 100644 --- a/Build/source/libs/icu-xetex/common/unicode/udeprctd.h +++ b/Build/source/libs/icu-xetex/common/unicode/udeprctd.h @@ -1,15 +1,15 @@ /* ******************************************************************************* -* Copyright (C) 2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * -* file name: udeprctd.h +* file name: * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * -* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* Created by: genheaders.pl, a perl script written by Ram Viswanadha * * Contains data for commenting out APIs. * Gets included by umachine.h @@ -23,27 +23,27 @@ #ifdef U_HIDE_DEPRECATED_API -#define LEUnicode_3_4 LEUnicode_DEPRECATED_API_DO_NOT_USE -#define UBRK_TITLE_3_4 UBRK_TITLE_DEPRECATED_API_DO_NOT_USE -#define ucol_getContractions_3_4 ucol_getContractions_DEPRECATED_API_DO_NOT_USE -#define ucol_getLocale_3_4 ucol_getLocale_DEPRECATED_API_DO_NOT_USE -#define ULOC_REQUESTED_LOCALE_3_4 ULOC_REQUESTED_LOCALE_DEPRECATED_API_DO_NOT_USE -#define RES_NONE_3_4 RES_NONE_DEPRECATED_API_DO_NOT_USE -#define RES_STRING_3_4 RES_STRING_DEPRECATED_API_DO_NOT_USE -#define RES_BINARY_3_4 RES_BINARY_DEPRECATED_API_DO_NOT_USE -#define RES_TABLE_3_4 RES_TABLE_DEPRECATED_API_DO_NOT_USE -#define RES_ALIAS_3_4 RES_ALIAS_DEPRECATED_API_DO_NOT_USE -#define RES_INT_3_4 RES_INT_DEPRECATED_API_DO_NOT_USE -#define RES_ARRAY_3_4 RES_ARRAY_DEPRECATED_API_DO_NOT_USE -#define RES_INT_VECTOR_3_4 RES_INT_VECTOR_DEPRECATED_API_DO_NOT_USE -#define RES_RESERVED_3_4 RES_RESERVED_DEPRECATED_API_DO_NOT_USE -#define ures_countArrayItems_3_4 ures_countArrayItems_DEPRECATED_API_DO_NOT_USE -#define ures_getVersionNumber_3_4 ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE -#define ures_getLocale_3_4 ures_getLocale_DEPRECATED_API_DO_NOT_USE -#define utrans_open_3_4 utrans_open_DEPRECATED_API_DO_NOT_USE -#define utrans_getID_3_4 utrans_getID_DEPRECATED_API_DO_NOT_USE -#define utrans_unregister_3_4 utrans_unregister_DEPRECATED_API_DO_NOT_USE -#define utrans_getAvailableID_3_4 utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE +# if U_DISABLE_RENAMING +# define ucol_getContractions ucol_getContractions_DEPRECATED_API_DO_NOT_USE +# define ucol_getLocale ucol_getLocale_DEPRECATED_API_DO_NOT_USE +# define ures_countArrayItems ures_countArrayItems_DEPRECATED_API_DO_NOT_USE +# define ures_getLocale ures_getLocale_DEPRECATED_API_DO_NOT_USE +# define ures_getVersionNumber ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE +# define utrans_getAvailableID utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE +# define utrans_getID utrans_getID_DEPRECATED_API_DO_NOT_USE +# define utrans_open utrans_open_DEPRECATED_API_DO_NOT_USE +# define utrans_unregister utrans_unregister_DEPRECATED_API_DO_NOT_USE +# else +# define ucol_getContractions_3_6 ucol_getContractions_DEPRECATED_API_DO_NOT_USE +# define ucol_getLocale_3_6 ucol_getLocale_DEPRECATED_API_DO_NOT_USE +# define ures_countArrayItems_3_6 ures_countArrayItems_DEPRECATED_API_DO_NOT_USE +# define ures_getLocale_3_6 ures_getLocale_DEPRECATED_API_DO_NOT_USE +# define ures_getVersionNumber_3_6 ures_getVersionNumber_DEPRECATED_API_DO_NOT_USE +# define utrans_getAvailableID_3_6 utrans_getAvailableID_DEPRECATED_API_DO_NOT_USE +# define utrans_getID_3_6 utrans_getID_DEPRECATED_API_DO_NOT_USE +# define utrans_open_3_6 utrans_open_DEPRECATED_API_DO_NOT_USE +# define utrans_unregister_3_6 utrans_unregister_DEPRECATED_API_DO_NOT_USE +# endif /* U_DISABLE_RENAMING */ #endif /* U_HIDE_DEPRECATED_API */ #endif /* UDEPRCTD_H */ diff --git a/Build/source/libs/icu-xetex/common/unicode/udraft.h b/Build/source/libs/icu-xetex/common/unicode/udraft.h index 180586289df..2c4150e108c 100644 --- a/Build/source/libs/icu-xetex/common/unicode/udraft.h +++ b/Build/source/libs/icu-xetex/common/unicode/udraft.h @@ -1,15 +1,15 @@ /* ******************************************************************************* -* Copyright (C) 2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * -* file name: udraft.h +* file name: * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * -* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* Created by: genheaders.pl, a perl script written by Ram Viswanadha * * Contains data for commenting out APIs. * Gets included by umachine.h @@ -23,273 +23,239 @@ #ifdef U_HIDE_DRAFT_API -#define ubrk_setUText_3_4 ubrk_setUText_DRAFT_API_DO_NOT_USE -#define ubrk_getRuleStatusVec_3_4 ubrk_getRuleStatusVec_DRAFT_API_DO_NOT_USE -#define ubrk_getLocaleByType_3_4 ubrk_getLocaleByType_DRAFT_API_DO_NOT_USE -#define ucal_getLocaleByType_3_4 ucal_getLocaleByType_DRAFT_API_DO_NOT_USE -#define UCaseMap_3_4 UCaseMap_DRAFT_API_DO_NOT_USE -#define ucasemap_open_3_4 ucasemap_open_DRAFT_API_DO_NOT_USE -#define ucasemap_close_3_4 ucasemap_close_DRAFT_API_DO_NOT_USE -#define ucasemap_getLocale_3_4 ucasemap_getLocale_DRAFT_API_DO_NOT_USE -#define ucasemap_getOptions_3_4 ucasemap_getOptions_DRAFT_API_DO_NOT_USE -#define ucasemap_setLocale_3_4 ucasemap_setLocale_DRAFT_API_DO_NOT_USE -#define ucasemap_setOptions_3_4 ucasemap_setOptions_DRAFT_API_DO_NOT_USE -#define ucasemap_utf8ToLower_3_4 ucasemap_utf8ToLower_DRAFT_API_DO_NOT_USE -#define ucasemap_utf8ToUpper_3_4 ucasemap_utf8ToUpper_DRAFT_API_DO_NOT_USE -#define UCHAR_S_TERM_3_4 UCHAR_S_TERM_DRAFT_API_DO_NOT_USE -#define UCHAR_VARIATION_SELECTOR_3_4 UCHAR_VARIATION_SELECTOR_DRAFT_API_DO_NOT_USE -#define UCHAR_NFD_INERT_3_4 UCHAR_NFD_INERT_DRAFT_API_DO_NOT_USE -#define UCHAR_NFKD_INERT_3_4 UCHAR_NFKD_INERT_DRAFT_API_DO_NOT_USE -#define UCHAR_NFC_INERT_3_4 UCHAR_NFC_INERT_DRAFT_API_DO_NOT_USE -#define UCHAR_NFKC_INERT_3_4 UCHAR_NFKC_INERT_DRAFT_API_DO_NOT_USE -#define UCHAR_SEGMENT_STARTER_3_4 UCHAR_SEGMENT_STARTER_DRAFT_API_DO_NOT_USE -#define UCHAR_PATTERN_SYNTAX_3_4 UCHAR_PATTERN_SYNTAX_DRAFT_API_DO_NOT_USE -#define UCHAR_PATTERN_WHITE_SPACE_3_4 UCHAR_PATTERN_WHITE_SPACE_DRAFT_API_DO_NOT_USE -#define UCHAR_POSIX_ALNUM_3_4 UCHAR_POSIX_ALNUM_DRAFT_API_DO_NOT_USE -#define UCHAR_POSIX_BLANK_3_4 UCHAR_POSIX_BLANK_DRAFT_API_DO_NOT_USE -#define UCHAR_POSIX_GRAPH_3_4 UCHAR_POSIX_GRAPH_DRAFT_API_DO_NOT_USE -#define UCHAR_POSIX_PRINT_3_4 UCHAR_POSIX_PRINT_DRAFT_API_DO_NOT_USE -#define UCHAR_POSIX_XDIGIT_3_4 UCHAR_POSIX_XDIGIT_DRAFT_API_DO_NOT_USE -#define UCHAR_NFD_QUICK_CHECK_3_4 UCHAR_NFD_QUICK_CHECK_DRAFT_API_DO_NOT_USE -#define UCHAR_NFKD_QUICK_CHECK_3_4 UCHAR_NFKD_QUICK_CHECK_DRAFT_API_DO_NOT_USE -#define UCHAR_NFC_QUICK_CHECK_3_4 UCHAR_NFC_QUICK_CHECK_DRAFT_API_DO_NOT_USE -#define UCHAR_NFKC_QUICK_CHECK_3_4 UCHAR_NFKC_QUICK_CHECK_DRAFT_API_DO_NOT_USE -#define UCHAR_LEAD_CANONICAL_COMBINING_CLASS_3_4 UCHAR_LEAD_CANONICAL_COMBINING_CLASS_DRAFT_API_DO_NOT_USE -#define UCHAR_TRAIL_CANONICAL_COMBINING_CLASS_3_4 UCHAR_TRAIL_CANONICAL_COMBINING_CLASS_DRAFT_API_DO_NOT_USE -#define UCHAR_GRAPHEME_CLUSTER_BREAK_3_4 UCHAR_GRAPHEME_CLUSTER_BREAK_DRAFT_API_DO_NOT_USE -#define UCHAR_SENTENCE_BREAK_3_4 UCHAR_SENTENCE_BREAK_DRAFT_API_DO_NOT_USE -#define UCHAR_WORD_BREAK_3_4 UCHAR_WORD_BREAK_DRAFT_API_DO_NOT_USE -#define UGraphemeClusterBreak_3_4 UGraphemeClusterBreak_DRAFT_API_DO_NOT_USE -#define UWordBreakValues_3_4 UWordBreakValues_DRAFT_API_DO_NOT_USE -#define USentenceBreak_3_4 USentenceBreak_DRAFT_API_DO_NOT_USE -#define U_LB_INSEPARABLE_3_4 U_LB_INSEPARABLE_DRAFT_API_DO_NOT_USE -#define ucnv_fromUCountPending_3_4 ucnv_fromUCountPending_DRAFT_API_DO_NOT_USE -#define ucnv_toUCountPending_3_4 ucnv_toUCountPending_DRAFT_API_DO_NOT_USE -#define ucol_openFromShortString_3_4 ucol_openFromShortString_DRAFT_API_DO_NOT_USE -#define ucol_getContractionsAndExpansions_3_4 ucol_getContractionsAndExpansions_DRAFT_API_DO_NOT_USE -#define ucol_openAvailableLocales_3_4 ucol_openAvailableLocales_DRAFT_API_DO_NOT_USE -#define ucol_getKeywords_3_4 ucol_getKeywords_DRAFT_API_DO_NOT_USE -#define ucol_getKeywordValues_3_4 ucol_getKeywordValues_DRAFT_API_DO_NOT_USE -#define ucol_getFunctionalEquivalent_3_4 ucol_getFunctionalEquivalent_DRAFT_API_DO_NOT_USE -#define ucol_getShortDefinitionString_3_4 ucol_getShortDefinitionString_DRAFT_API_DO_NOT_USE -#define ucol_normalizeShortDefinitionString_3_4 ucol_normalizeShortDefinitionString_DRAFT_API_DO_NOT_USE -#define ucol_getLocaleByType_3_4 ucol_getLocaleByType_DRAFT_API_DO_NOT_USE -#define ucol_cloneBinary_3_4 ucol_cloneBinary_DRAFT_API_DO_NOT_USE -#define ucol_openBinary_3_4 ucol_openBinary_DRAFT_API_DO_NOT_USE -#define UCURR_ALL_3_4 UCURR_ALL_DRAFT_API_DO_NOT_USE -#define UCURR_COMMON_3_4 UCURR_COMMON_DRAFT_API_DO_NOT_USE -#define UCURR_UNCOMMON_3_4 UCURR_UNCOMMON_DRAFT_API_DO_NOT_USE -#define UCURR_DEPRECATED_3_4 UCURR_DEPRECATED_DRAFT_API_DO_NOT_USE -#define UCURR_NON_DEPRECATED_3_4 UCURR_NON_DEPRECATED_DRAFT_API_DO_NOT_USE -#define UCurrCurrencyType_3_4 UCurrCurrencyType_DRAFT_API_DO_NOT_USE -#define ucurr_getDefaultFractionDigits_3_4 ucurr_getDefaultFractionDigits_DRAFT_API_DO_NOT_USE -#define ucurr_getRoundingIncrement_3_4 ucurr_getRoundingIncrement_DRAFT_API_DO_NOT_USE -#define ucurr_openISOCurrencies_3_4 ucurr_openISOCurrencies_DRAFT_API_DO_NOT_USE -#define UDAT_ERA_FIELD_3_4 UDAT_ERA_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_YEAR_FIELD_3_4 UDAT_YEAR_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_MONTH_FIELD_3_4 UDAT_MONTH_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_DATE_FIELD_3_4 UDAT_DATE_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_HOUR_OF_DAY1_FIELD_3_4 UDAT_HOUR_OF_DAY1_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_HOUR_OF_DAY0_FIELD_3_4 UDAT_HOUR_OF_DAY0_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_MINUTE_FIELD_3_4 UDAT_MINUTE_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_SECOND_FIELD_3_4 UDAT_SECOND_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_FRACTIONAL_SECOND_FIELD_3_4 UDAT_FRACTIONAL_SECOND_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_DAY_OF_WEEK_FIELD_3_4 UDAT_DAY_OF_WEEK_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_DAY_OF_YEAR_FIELD_3_4 UDAT_DAY_OF_YEAR_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_DAY_OF_WEEK_IN_MONTH_FIELD_3_4 UDAT_DAY_OF_WEEK_IN_MONTH_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_WEEK_OF_YEAR_FIELD_3_4 UDAT_WEEK_OF_YEAR_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_WEEK_OF_MONTH_FIELD_3_4 UDAT_WEEK_OF_MONTH_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_AM_PM_FIELD_3_4 UDAT_AM_PM_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_HOUR1_FIELD_3_4 UDAT_HOUR1_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_HOUR0_FIELD_3_4 UDAT_HOUR0_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_TIMEZONE_FIELD_3_4 UDAT_TIMEZONE_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_YEAR_WOY_FIELD_3_4 UDAT_YEAR_WOY_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_DOW_LOCAL_FIELD_3_4 UDAT_DOW_LOCAL_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_EXTENDED_YEAR_FIELD_3_4 UDAT_EXTENDED_YEAR_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_JULIAN_DAY_FIELD_3_4 UDAT_JULIAN_DAY_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_MILLISECONDS_IN_DAY_FIELD_3_4 UDAT_MILLISECONDS_IN_DAY_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_TIMEZONE_RFC_FIELD_3_4 UDAT_TIMEZONE_RFC_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_TIMEZONE_GENERIC_FIELD_3_4 UDAT_TIMEZONE_GENERIC_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_STANDALONE_DAY_FIELD_3_4 UDAT_STANDALONE_DAY_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_STANDALONE_MONTH_FIELD_3_4 UDAT_STANDALONE_MONTH_FIELD_DRAFT_API_DO_NOT_USE -#define UDAT_FIELD_COUNT_3_4 UDAT_FIELD_COUNT_DRAFT_API_DO_NOT_USE -#define UDateFormatField_3_4 UDateFormatField_DRAFT_API_DO_NOT_USE -#define udat_getLocaleByType_3_4 udat_getLocaleByType_DRAFT_API_DO_NOT_USE -#define UDataFileAccess_3_4 UDataFileAccess_DRAFT_API_DO_NOT_USE -#define udata_setFileAccess_3_4 udata_setFileAccess_DRAFT_API_DO_NOT_USE -#define UAcceptResult_3_4 UAcceptResult_DRAFT_API_DO_NOT_USE -#define uloc_setKeywordValue_3_4 uloc_setKeywordValue_DRAFT_API_DO_NOT_USE -#define uloc_acceptLanguageFromHTTP_3_4 uloc_acceptLanguageFromHTTP_DRAFT_API_DO_NOT_USE -#define uloc_acceptLanguage_3_4 uloc_acceptLanguage_DRAFT_API_DO_NOT_USE -#define ULocaleData_3_4 ULocaleData_DRAFT_API_DO_NOT_USE -#define ULocaleDataExemplarSetType_3_4 ULocaleDataExemplarSetType_DRAFT_API_DO_NOT_USE -#define ULocaleDataDelimiterType_3_4 ULocaleDataDelimiterType_DRAFT_API_DO_NOT_USE -#define UMeasurementSystem_3_4 UMeasurementSystem_DRAFT_API_DO_NOT_USE -#define ulocdata_open_3_4 ulocdata_open_DRAFT_API_DO_NOT_USE -#define ulocdata_close_3_4 ulocdata_close_DRAFT_API_DO_NOT_USE -#define ulocdata_setNoSubstitute_3_4 ulocdata_setNoSubstitute_DRAFT_API_DO_NOT_USE -#define ulocdata_getNoSubstitute_3_4 ulocdata_getNoSubstitute_DRAFT_API_DO_NOT_USE -#define ulocdata_getExemplarSet_3_4 ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE -#define ulocdata_getDelimiter_3_4 ulocdata_getDelimiter_DRAFT_API_DO_NOT_USE -#define ulocdata_getMeasurementSystem_3_4 ulocdata_getMeasurementSystem_DRAFT_API_DO_NOT_USE -#define ulocdata_getPaperSize_3_4 ulocdata_getPaperSize_DRAFT_API_DO_NOT_USE -#define umsg_autoQuoteApostrophe_3_4 umsg_autoQuoteApostrophe_DRAFT_API_DO_NOT_USE -#define UNUM_PATTERN_DECIMAL_3_4 UNUM_PATTERN_DECIMAL_DRAFT_API_DO_NOT_USE -#define UNUM_ORDINAL_3_4 UNUM_ORDINAL_DRAFT_API_DO_NOT_USE -#define UNUM_DURATION_3_4 UNUM_DURATION_DRAFT_API_DO_NOT_USE -#define UNUM_PATTERN_RULEBASED_3_4 UNUM_PATTERN_RULEBASED_DRAFT_API_DO_NOT_USE -#define UNUM_SIGNIFICANT_DIGITS_USED_3_4 UNUM_SIGNIFICANT_DIGITS_USED_DRAFT_API_DO_NOT_USE -#define UNUM_MIN_SIGNIFICANT_DIGITS_3_4 UNUM_MIN_SIGNIFICANT_DIGITS_DRAFT_API_DO_NOT_USE -#define UNUM_MAX_SIGNIFICANT_DIGITS_3_4 UNUM_MAX_SIGNIFICANT_DIGITS_DRAFT_API_DO_NOT_USE -#define UNUM_LENIENT_PARSE_3_4 UNUM_LENIENT_PARSE_DRAFT_API_DO_NOT_USE -#define UNUM_DEFAULT_RULESET_3_4 UNUM_DEFAULT_RULESET_DRAFT_API_DO_NOT_USE -#define UNUM_PUBLIC_RULESETS_3_4 UNUM_PUBLIC_RULESETS_DRAFT_API_DO_NOT_USE -#define UNUM_SIGNIFICANT_DIGIT_SYMBOL_3_4 UNUM_SIGNIFICANT_DIGIT_SYMBOL_DRAFT_API_DO_NOT_USE -#define unum_formatDoubleCurrency_3_4 unum_formatDoubleCurrency_DRAFT_API_DO_NOT_USE -#define unum_parseDoubleCurrency_3_4 unum_parseDoubleCurrency_DRAFT_API_DO_NOT_USE -#define unum_getLocaleByType_3_4 unum_getLocaleByType_DRAFT_API_DO_NOT_USE -#define URegularExpression_3_4 URegularExpression_DRAFT_API_DO_NOT_USE -#define UREGEX_CANON_EQ_3_4 UREGEX_CANON_EQ_DRAFT_API_DO_NOT_USE -#define uregex_open_3_4 uregex_open_DRAFT_API_DO_NOT_USE -#define uregex_openC_3_4 uregex_openC_DRAFT_API_DO_NOT_USE -#define uregex_close_3_4 uregex_close_DRAFT_API_DO_NOT_USE -#define uregex_clone_3_4 uregex_clone_DRAFT_API_DO_NOT_USE -#define uregex_pattern_3_4 uregex_pattern_DRAFT_API_DO_NOT_USE -#define uregex_flags_3_4 uregex_flags_DRAFT_API_DO_NOT_USE -#define uregex_setText_3_4 uregex_setText_DRAFT_API_DO_NOT_USE -#define uregex_getText_3_4 uregex_getText_DRAFT_API_DO_NOT_USE -#define uregex_matches_3_4 uregex_matches_DRAFT_API_DO_NOT_USE -#define uregex_lookingAt_3_4 uregex_lookingAt_DRAFT_API_DO_NOT_USE -#define uregex_find_3_4 uregex_find_DRAFT_API_DO_NOT_USE -#define uregex_findNext_3_4 uregex_findNext_DRAFT_API_DO_NOT_USE -#define uregex_groupCount_3_4 uregex_groupCount_DRAFT_API_DO_NOT_USE -#define uregex_group_3_4 uregex_group_DRAFT_API_DO_NOT_USE -#define uregex_start_3_4 uregex_start_DRAFT_API_DO_NOT_USE -#define uregex_end_3_4 uregex_end_DRAFT_API_DO_NOT_USE -#define uregex_reset_3_4 uregex_reset_DRAFT_API_DO_NOT_USE -#define uregex_replaceAll_3_4 uregex_replaceAll_DRAFT_API_DO_NOT_USE -#define uregex_replaceFirst_3_4 uregex_replaceFirst_DRAFT_API_DO_NOT_USE -#define uregex_appendReplacement_3_4 uregex_appendReplacement_DRAFT_API_DO_NOT_USE -#define uregex_appendTail_3_4 uregex_appendTail_DRAFT_API_DO_NOT_USE -#define uregex_split_3_4 uregex_split_DRAFT_API_DO_NOT_USE -#define ures_getLocaleByType_3_4 ures_getLocaleByType_DRAFT_API_DO_NOT_USE -#define ures_openAvailableLocales_3_4 ures_openAvailableLocales_DRAFT_API_DO_NOT_USE -#define USCRIPT_KATAKANA_OR_HIRAGANA_3_4 USCRIPT_KATAKANA_OR_HIRAGANA_DRAFT_API_DO_NOT_USE -#define USET_ADD_CASE_MAPPINGS_3_4 USET_ADD_CASE_MAPPINGS_DRAFT_API_DO_NOT_USE -#define uset_set_3_4 uset_set_DRAFT_API_DO_NOT_USE -#define uset_applyIntPropertyValue_3_4 uset_applyIntPropertyValue_DRAFT_API_DO_NOT_USE -#define uset_applyPropertyAlias_3_4 uset_applyPropertyAlias_DRAFT_API_DO_NOT_USE -#define uset_resemblesPattern_3_4 uset_resemblesPattern_DRAFT_API_DO_NOT_USE -#define uset_addAllCodePoints_3_4 uset_addAllCodePoints_DRAFT_API_DO_NOT_USE -#define uset_removeAll_3_4 uset_removeAll_DRAFT_API_DO_NOT_USE -#define uset_retain_3_4 uset_retain_DRAFT_API_DO_NOT_USE -#define uset_retainAll_3_4 uset_retainAll_DRAFT_API_DO_NOT_USE -#define uset_compact_3_4 uset_compact_DRAFT_API_DO_NOT_USE -#define uset_complementAll_3_4 uset_complementAll_DRAFT_API_DO_NOT_USE -#define uset_indexOf_3_4 uset_indexOf_DRAFT_API_DO_NOT_USE -#define uset_charAt_3_4 uset_charAt_DRAFT_API_DO_NOT_USE -#define uset_containsAll_3_4 uset_containsAll_DRAFT_API_DO_NOT_USE -#define uset_containsAllCodePoints_3_4 uset_containsAllCodePoints_DRAFT_API_DO_NOT_USE -#define uset_containsNone_3_4 uset_containsNone_DRAFT_API_DO_NOT_USE -#define uset_containsSome_3_4 uset_containsSome_DRAFT_API_DO_NOT_USE -#define uset_equals_3_4 uset_equals_DRAFT_API_DO_NOT_USE -#define UFILE_3_4 UFILE_DRAFT_API_DO_NOT_USE -#define UFileDirection_3_4 UFileDirection_DRAFT_API_DO_NOT_USE -#define u_fopen_3_4 u_fopen_DRAFT_API_DO_NOT_USE -#define u_finit_3_4 u_finit_DRAFT_API_DO_NOT_USE -#define u_fstropen_3_4 u_fstropen_DRAFT_API_DO_NOT_USE -#define u_fclose_3_4 u_fclose_DRAFT_API_DO_NOT_USE -#define u_feof_3_4 u_feof_DRAFT_API_DO_NOT_USE -#define u_fflush_3_4 u_fflush_DRAFT_API_DO_NOT_USE -#define u_frewind_3_4 u_frewind_DRAFT_API_DO_NOT_USE -#define u_fgetfile_3_4 u_fgetfile_DRAFT_API_DO_NOT_USE -#define u_fgetlocale_3_4 u_fgetlocale_DRAFT_API_DO_NOT_USE -#define u_fsetlocale_3_4 u_fsetlocale_DRAFT_API_DO_NOT_USE -#define u_fgetcodepage_3_4 u_fgetcodepage_DRAFT_API_DO_NOT_USE -#define u_fsetcodepage_3_4 u_fsetcodepage_DRAFT_API_DO_NOT_USE -#define u_fgetConverter_3_4 u_fgetConverter_DRAFT_API_DO_NOT_USE -#define u_fprintf_3_4 u_fprintf_DRAFT_API_DO_NOT_USE -#define u_vfprintf_3_4 u_vfprintf_DRAFT_API_DO_NOT_USE -#define u_fprintf_u_3_4 u_fprintf_u_DRAFT_API_DO_NOT_USE -#define u_vfprintf_u_3_4 u_vfprintf_u_DRAFT_API_DO_NOT_USE -#define u_fputs_3_4 u_fputs_DRAFT_API_DO_NOT_USE -#define u_fputc_3_4 u_fputc_DRAFT_API_DO_NOT_USE -#define u_file_write_3_4 u_file_write_DRAFT_API_DO_NOT_USE -#define u_fscanf_3_4 u_fscanf_DRAFT_API_DO_NOT_USE -#define u_vfscanf_3_4 u_vfscanf_DRAFT_API_DO_NOT_USE -#define u_fscanf_u_3_4 u_fscanf_u_DRAFT_API_DO_NOT_USE -#define u_vfscanf_u_3_4 u_vfscanf_u_DRAFT_API_DO_NOT_USE -#define u_fgets_3_4 u_fgets_DRAFT_API_DO_NOT_USE -#define u_fgetc_3_4 u_fgetc_DRAFT_API_DO_NOT_USE -#define u_fgetcx_3_4 u_fgetcx_DRAFT_API_DO_NOT_USE -#define u_fungetc_3_4 u_fungetc_DRAFT_API_DO_NOT_USE -#define u_file_read_3_4 u_file_read_DRAFT_API_DO_NOT_USE -#define u_fsettransliterator_3_4 u_fsettransliterator_DRAFT_API_DO_NOT_USE -#define u_sprintf_3_4 u_sprintf_DRAFT_API_DO_NOT_USE -#define u_snprintf_3_4 u_snprintf_DRAFT_API_DO_NOT_USE -#define u_vsprintf_3_4 u_vsprintf_DRAFT_API_DO_NOT_USE -#define u_vsnprintf_3_4 u_vsnprintf_DRAFT_API_DO_NOT_USE -#define u_sprintf_u_3_4 u_sprintf_u_DRAFT_API_DO_NOT_USE -#define u_snprintf_u_3_4 u_snprintf_u_DRAFT_API_DO_NOT_USE -#define u_vsprintf_u_3_4 u_vsprintf_u_DRAFT_API_DO_NOT_USE -#define u_vsnprintf_u_3_4 u_vsnprintf_u_DRAFT_API_DO_NOT_USE -#define u_sscanf_3_4 u_sscanf_DRAFT_API_DO_NOT_USE -#define u_vsscanf_3_4 u_vsscanf_DRAFT_API_DO_NOT_USE -#define u_sscanf_u_3_4 u_sscanf_u_DRAFT_API_DO_NOT_USE -#define u_vsscanf_u_3_4 u_vsscanf_u_DRAFT_API_DO_NOT_USE -#define UText_3_4 UText_DRAFT_API_DO_NOT_USE -#define UTextChunk_3_4 UTextChunk_DRAFT_API_DO_NOT_USE -#define UTextClone_3_4 UTextClone_DRAFT_API_DO_NOT_USE -#define UTextNativeLength_3_4 UTextNativeLength_DRAFT_API_DO_NOT_USE -#define UTextAccess_3_4 UTextAccess_DRAFT_API_DO_NOT_USE -#define UTextExtract_3_4 UTextExtract_DRAFT_API_DO_NOT_USE -#define UTextReplace_3_4 UTextReplace_DRAFT_API_DO_NOT_USE -#define UTextCopy_3_4 UTextCopy_DRAFT_API_DO_NOT_USE -#define UTextMapOffsetToNative_3_4 UTextMapOffsetToNative_DRAFT_API_DO_NOT_USE -#define UTextMapNativeIndexToUTF16_3_4 UTextMapNativeIndexToUTF16_DRAFT_API_DO_NOT_USE -#define UTextClose_3_4 UTextClose_DRAFT_API_DO_NOT_USE -#define utext_close_3_4 utext_close_DRAFT_API_DO_NOT_USE -#define utext_openUTF8_3_4 utext_openUTF8_DRAFT_API_DO_NOT_USE -#define utext_openUChars_3_4 utext_openUChars_DRAFT_API_DO_NOT_USE -#define utext_clone_3_4 utext_clone_DRAFT_API_DO_NOT_USE -#define utext_nativeLength_3_4 utext_nativeLength_DRAFT_API_DO_NOT_USE -#define utext_isLengthExpensive_3_4 utext_isLengthExpensive_DRAFT_API_DO_NOT_USE -#define utext_char32At_3_4 utext_char32At_DRAFT_API_DO_NOT_USE -#define utext_current32_3_4 utext_current32_DRAFT_API_DO_NOT_USE -#define utext_next32From_3_4 utext_next32From_DRAFT_API_DO_NOT_USE -#define utext_previous32From_3_4 utext_previous32From_DRAFT_API_DO_NOT_USE -#define utext_getNativeIndex_3_4 utext_getNativeIndex_DRAFT_API_DO_NOT_USE -#define utext_setNativeIndex_3_4 utext_setNativeIndex_DRAFT_API_DO_NOT_USE -#define utext_moveIndex32_3_4 utext_moveIndex32_DRAFT_API_DO_NOT_USE -#define utext_extract_3_4 utext_extract_DRAFT_API_DO_NOT_USE -#define utext_isWritable_3_4 utext_isWritable_DRAFT_API_DO_NOT_USE -#define utext_hasMetaData_3_4 utext_hasMetaData_DRAFT_API_DO_NOT_USE -#define utext_replace_3_4 utext_replace_DRAFT_API_DO_NOT_USE -#define utext_copy_3_4 utext_copy_DRAFT_API_DO_NOT_USE -#define utext_setup_3_4 utext_setup_DRAFT_API_DO_NOT_USE -#define UDTS_JAVA_TIME_3_4 UDTS_JAVA_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_UNIX_TIME_3_4 UDTS_UNIX_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_ICU4C_TIME_3_4 UDTS_ICU4C_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_WINDOWS_FILE_TIME_3_4 UDTS_WINDOWS_FILE_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_DOTNET_DATE_TIME_3_4 UDTS_DOTNET_DATE_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_MAC_OLD_TIME_3_4 UDTS_MAC_OLD_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_MAC_TIME_3_4 UDTS_MAC_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_EXCEL_TIME_3_4 UDTS_EXCEL_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_DB2_TIME_3_4 UDTS_DB2_TIME_DRAFT_API_DO_NOT_USE -#define UDTS_MAX_SCALE_3_4 UDTS_MAX_SCALE_DRAFT_API_DO_NOT_USE -#define UDateTimeScale_3_4 UDateTimeScale_DRAFT_API_DO_NOT_USE -#define UTSV_UNITS_VALUE_3_4 UTSV_UNITS_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_EPOCH_OFFSET_VALUE_3_4 UTSV_EPOCH_OFFSET_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_FROM_MIN_VALUE_3_4 UTSV_FROM_MIN_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_FROM_MAX_VALUE_3_4 UTSV_FROM_MAX_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_TO_MIN_VALUE_3_4 UTSV_TO_MIN_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_TO_MAX_VALUE_3_4 UTSV_TO_MAX_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_EPOCH_OFFSET_PLUS_1_VALUE_3_4 UTSV_EPOCH_OFFSET_PLUS_1_VALUE_DRAFT_API_DO_NOT_USE -#define UTSV_EPOCH_OFFSET_MINUS_1_VALUE_3_4 UTSV_EPOCH_OFFSET_MINUS_1_VALUE_DRAFT_API_DO_NOT_USE -#define UTimeScaleValue_3_4 UTimeScaleValue_DRAFT_API_DO_NOT_USE -#define utmscale_getTimeScaleValue_3_4 utmscale_getTimeScaleValue_DRAFT_API_DO_NOT_USE -#define utmscale_fromInt64_3_4 utmscale_fromInt64_DRAFT_API_DO_NOT_USE -#define utmscale_toInt64_3_4 utmscale_toInt64_DRAFT_API_DO_NOT_USE +# if U_DISABLE_RENAMING +# define u_fclose u_fclose_DRAFT_API_DO_NOT_USE +# define u_feof u_feof_DRAFT_API_DO_NOT_USE +# define u_fflush u_fflush_DRAFT_API_DO_NOT_USE +# define u_fgetConverter u_fgetConverter_DRAFT_API_DO_NOT_USE +# define u_fgetc u_fgetc_DRAFT_API_DO_NOT_USE +# define u_fgetcodepage u_fgetcodepage_DRAFT_API_DO_NOT_USE +# define u_fgetcx u_fgetcx_DRAFT_API_DO_NOT_USE +# define u_fgetfile u_fgetfile_DRAFT_API_DO_NOT_USE +# define u_fgetlocale u_fgetlocale_DRAFT_API_DO_NOT_USE +# define u_fgets u_fgets_DRAFT_API_DO_NOT_USE +# define u_file_read u_file_read_DRAFT_API_DO_NOT_USE +# define u_file_write u_file_write_DRAFT_API_DO_NOT_USE +# define u_finit u_finit_DRAFT_API_DO_NOT_USE +# define u_fopen u_fopen_DRAFT_API_DO_NOT_USE +# define u_fprintf u_fprintf_DRAFT_API_DO_NOT_USE +# define u_fprintf_u u_fprintf_u_DRAFT_API_DO_NOT_USE +# define u_fputc u_fputc_DRAFT_API_DO_NOT_USE +# define u_fputs u_fputs_DRAFT_API_DO_NOT_USE +# define u_frewind u_frewind_DRAFT_API_DO_NOT_USE +# define u_fscanf u_fscanf_DRAFT_API_DO_NOT_USE +# define u_fscanf_u u_fscanf_u_DRAFT_API_DO_NOT_USE +# define u_fsetcodepage u_fsetcodepage_DRAFT_API_DO_NOT_USE +# define u_fsetlocale u_fsetlocale_DRAFT_API_DO_NOT_USE +# define u_fsettransliterator u_fsettransliterator_DRAFT_API_DO_NOT_USE +# define u_fstropen u_fstropen_DRAFT_API_DO_NOT_USE +# define u_fungetc u_fungetc_DRAFT_API_DO_NOT_USE +# define u_snprintf u_snprintf_DRAFT_API_DO_NOT_USE +# define u_snprintf_u u_snprintf_u_DRAFT_API_DO_NOT_USE +# define u_sprintf u_sprintf_DRAFT_API_DO_NOT_USE +# define u_sprintf_u u_sprintf_u_DRAFT_API_DO_NOT_USE +# define u_sscanf u_sscanf_DRAFT_API_DO_NOT_USE +# define u_sscanf_u u_sscanf_u_DRAFT_API_DO_NOT_USE +# define u_strFromUTF8Lenient u_strFromUTF8Lenient_DRAFT_API_DO_NOT_USE +# define u_strFromUTF8WithSub u_strFromUTF8WithSub_DRAFT_API_DO_NOT_USE +# define u_strToUTF8WithSub u_strToUTF8WithSub_DRAFT_API_DO_NOT_USE +# define u_vfprintf u_vfprintf_DRAFT_API_DO_NOT_USE +# define u_vfprintf_u u_vfprintf_u_DRAFT_API_DO_NOT_USE +# define u_vfscanf u_vfscanf_DRAFT_API_DO_NOT_USE +# define u_vfscanf_u u_vfscanf_u_DRAFT_API_DO_NOT_USE +# define u_vsnprintf u_vsnprintf_DRAFT_API_DO_NOT_USE +# define u_vsnprintf_u u_vsnprintf_u_DRAFT_API_DO_NOT_USE +# define u_vsprintf u_vsprintf_DRAFT_API_DO_NOT_USE +# define u_vsprintf_u u_vsprintf_u_DRAFT_API_DO_NOT_USE +# define u_vsscanf u_vsscanf_DRAFT_API_DO_NOT_USE +# define u_vsscanf_u u_vsscanf_u_DRAFT_API_DO_NOT_USE +# define ubidi_getProcessedLength ubidi_getProcessedLength_DRAFT_API_DO_NOT_USE +# define ubidi_getReorderingMode ubidi_getReorderingMode_DRAFT_API_DO_NOT_USE +# define ubidi_getReorderingOptions ubidi_getReorderingOptions_DRAFT_API_DO_NOT_USE +# define ubidi_getResultLength ubidi_getResultLength_DRAFT_API_DO_NOT_USE +# define ubidi_setReorderingMode ubidi_setReorderingMode_DRAFT_API_DO_NOT_USE +# define ubidi_setReorderingOptions ubidi_setReorderingOptions_DRAFT_API_DO_NOT_USE +# define ubrk_setUText ubrk_setUText_DRAFT_API_DO_NOT_USE +# define ucal_getGregorianChange ucal_getGregorianChange_DRAFT_API_DO_NOT_USE +# define ucal_setGregorianChange ucal_setGregorianChange_DRAFT_API_DO_NOT_USE +# define ucasemap_close ucasemap_close_DRAFT_API_DO_NOT_USE +# define ucasemap_getLocale ucasemap_getLocale_DRAFT_API_DO_NOT_USE +# define ucasemap_getOptions ucasemap_getOptions_DRAFT_API_DO_NOT_USE +# define ucasemap_open ucasemap_open_DRAFT_API_DO_NOT_USE +# define ucasemap_setLocale ucasemap_setLocale_DRAFT_API_DO_NOT_USE +# define ucasemap_setOptions ucasemap_setOptions_DRAFT_API_DO_NOT_USE +# define ucasemap_utf8ToLower ucasemap_utf8ToLower_DRAFT_API_DO_NOT_USE +# define ucasemap_utf8ToUpper ucasemap_utf8ToUpper_DRAFT_API_DO_NOT_USE +# define ucnv_fromUCountPending ucnv_fromUCountPending_DRAFT_API_DO_NOT_USE +# define ucnv_setSubstString ucnv_setSubstString_DRAFT_API_DO_NOT_USE +# define ucnv_toUCountPending ucnv_toUCountPending_DRAFT_API_DO_NOT_USE +# define ucol_getContractionsAndExpansions ucol_getContractionsAndExpansions_DRAFT_API_DO_NOT_USE +# define ucsdet_close ucsdet_close_DRAFT_API_DO_NOT_USE +# define ucsdet_detect ucsdet_detect_DRAFT_API_DO_NOT_USE +# define ucsdet_detectAll ucsdet_detectAll_DRAFT_API_DO_NOT_USE +# define ucsdet_enableInputFilter ucsdet_enableInputFilter_DRAFT_API_DO_NOT_USE +# define ucsdet_getAllDetectableCharsets ucsdet_getAllDetectableCharsets_DRAFT_API_DO_NOT_USE +# define ucsdet_getConfidence ucsdet_getConfidence_DRAFT_API_DO_NOT_USE +# define ucsdet_getLanguage ucsdet_getLanguage_DRAFT_API_DO_NOT_USE +# define ucsdet_getName ucsdet_getName_DRAFT_API_DO_NOT_USE +# define ucsdet_getUChars ucsdet_getUChars_DRAFT_API_DO_NOT_USE +# define ucsdet_isInputFilterEnabled ucsdet_isInputFilterEnabled_DRAFT_API_DO_NOT_USE +# define ucsdet_open ucsdet_open_DRAFT_API_DO_NOT_USE +# define ucsdet_setDeclaredEncoding ucsdet_setDeclaredEncoding_DRAFT_API_DO_NOT_USE +# define ucsdet_setText ucsdet_setText_DRAFT_API_DO_NOT_USE +# define udata_setFileAccess udata_setFileAccess_DRAFT_API_DO_NOT_USE +# define ulocdata_close ulocdata_close_DRAFT_API_DO_NOT_USE +# define ulocdata_getDelimiter ulocdata_getDelimiter_DRAFT_API_DO_NOT_USE +# define ulocdata_getExemplarSet ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE +# define ulocdata_getNoSubstitute ulocdata_getNoSubstitute_DRAFT_API_DO_NOT_USE +# define ulocdata_open ulocdata_open_DRAFT_API_DO_NOT_USE +# define ulocdata_setNoSubstitute ulocdata_setNoSubstitute_DRAFT_API_DO_NOT_USE +# define ures_getUTF8String ures_getUTF8String_DRAFT_API_DO_NOT_USE +# define ures_getUTF8StringByIndex ures_getUTF8StringByIndex_DRAFT_API_DO_NOT_USE +# define ures_getUTF8StringByKey ures_getUTF8StringByKey_DRAFT_API_DO_NOT_USE +# define uset_addAllCodePoints uset_addAllCodePoints_DRAFT_API_DO_NOT_USE +# define uset_containsAllCodePoints uset_containsAllCodePoints_DRAFT_API_DO_NOT_USE +# define utext_char32At utext_char32At_DRAFT_API_DO_NOT_USE +# define utext_clone utext_clone_DRAFT_API_DO_NOT_USE +# define utext_close utext_close_DRAFT_API_DO_NOT_USE +# define utext_copy utext_copy_DRAFT_API_DO_NOT_USE +# define utext_current32 utext_current32_DRAFT_API_DO_NOT_USE +# define utext_equals utext_equals_DRAFT_API_DO_NOT_USE +# define utext_extract utext_extract_DRAFT_API_DO_NOT_USE +# define utext_freeze utext_freeze_DRAFT_API_DO_NOT_USE +# define utext_getNativeIndex utext_getNativeIndex_DRAFT_API_DO_NOT_USE +# define utext_getPreviousNativeIndex utext_getPreviousNativeIndex_DRAFT_API_DO_NOT_USE +# define utext_hasMetaData utext_hasMetaData_DRAFT_API_DO_NOT_USE +# define utext_isLengthExpensive utext_isLengthExpensive_DRAFT_API_DO_NOT_USE +# define utext_isWritable utext_isWritable_DRAFT_API_DO_NOT_USE +# define utext_moveIndex32 utext_moveIndex32_DRAFT_API_DO_NOT_USE +# define utext_nativeLength utext_nativeLength_DRAFT_API_DO_NOT_USE +# define utext_next32 utext_next32_DRAFT_API_DO_NOT_USE +# define utext_next32From utext_next32From_DRAFT_API_DO_NOT_USE +# define utext_openUChars utext_openUChars_DRAFT_API_DO_NOT_USE +# define utext_openUTF8 utext_openUTF8_DRAFT_API_DO_NOT_USE +# define utext_previous32 utext_previous32_DRAFT_API_DO_NOT_USE +# define utext_previous32From utext_previous32From_DRAFT_API_DO_NOT_USE +# define utext_replace utext_replace_DRAFT_API_DO_NOT_USE +# define utext_setNativeIndex utext_setNativeIndex_DRAFT_API_DO_NOT_USE +# define utext_setup utext_setup_DRAFT_API_DO_NOT_USE +# else +# define u_fclose_3_6 u_fclose_DRAFT_API_DO_NOT_USE +# define u_feof_3_6 u_feof_DRAFT_API_DO_NOT_USE +# define u_fflush_3_6 u_fflush_DRAFT_API_DO_NOT_USE +# define u_fgetConverter_3_6 u_fgetConverter_DRAFT_API_DO_NOT_USE +# define u_fgetc_3_6 u_fgetc_DRAFT_API_DO_NOT_USE +# define u_fgetcodepage_3_6 u_fgetcodepage_DRAFT_API_DO_NOT_USE +# define u_fgetcx_3_6 u_fgetcx_DRAFT_API_DO_NOT_USE +# define u_fgetfile_3_6 u_fgetfile_DRAFT_API_DO_NOT_USE +# define u_fgetlocale_3_6 u_fgetlocale_DRAFT_API_DO_NOT_USE +# define u_fgets_3_6 u_fgets_DRAFT_API_DO_NOT_USE +# define u_file_read_3_6 u_file_read_DRAFT_API_DO_NOT_USE +# define u_file_write_3_6 u_file_write_DRAFT_API_DO_NOT_USE +# define u_finit_3_6 u_finit_DRAFT_API_DO_NOT_USE +# define u_fopen_3_6 u_fopen_DRAFT_API_DO_NOT_USE +# define u_fprintf_3_6 u_fprintf_DRAFT_API_DO_NOT_USE +# define u_fprintf_u_3_6 u_fprintf_u_DRAFT_API_DO_NOT_USE +# define u_fputc_3_6 u_fputc_DRAFT_API_DO_NOT_USE +# define u_fputs_3_6 u_fputs_DRAFT_API_DO_NOT_USE +# define u_frewind_3_6 u_frewind_DRAFT_API_DO_NOT_USE +# define u_fscanf_3_6 u_fscanf_DRAFT_API_DO_NOT_USE +# define u_fscanf_u_3_6 u_fscanf_u_DRAFT_API_DO_NOT_USE +# define u_fsetcodepage_3_6 u_fsetcodepage_DRAFT_API_DO_NOT_USE +# define u_fsetlocale_3_6 u_fsetlocale_DRAFT_API_DO_NOT_USE +# define u_fsettransliterator_3_6 u_fsettransliterator_DRAFT_API_DO_NOT_USE +# define u_fstropen_3_6 u_fstropen_DRAFT_API_DO_NOT_USE +# define u_fungetc_3_6 u_fungetc_DRAFT_API_DO_NOT_USE +# define u_snprintf_3_6 u_snprintf_DRAFT_API_DO_NOT_USE +# define u_snprintf_u_3_6 u_snprintf_u_DRAFT_API_DO_NOT_USE +# define u_sprintf_3_6 u_sprintf_DRAFT_API_DO_NOT_USE +# define u_sprintf_u_3_6 u_sprintf_u_DRAFT_API_DO_NOT_USE +# define u_sscanf_3_6 u_sscanf_DRAFT_API_DO_NOT_USE +# define u_sscanf_u_3_6 u_sscanf_u_DRAFT_API_DO_NOT_USE +# define u_strFromUTF8Lenient_3_6 u_strFromUTF8Lenient_DRAFT_API_DO_NOT_USE +# define u_strFromUTF8WithSub_3_6 u_strFromUTF8WithSub_DRAFT_API_DO_NOT_USE +# define u_strToUTF8WithSub_3_6 u_strToUTF8WithSub_DRAFT_API_DO_NOT_USE +# define u_vfprintf_3_6 u_vfprintf_DRAFT_API_DO_NOT_USE +# define u_vfprintf_u_3_6 u_vfprintf_u_DRAFT_API_DO_NOT_USE +# define u_vfscanf_3_6 u_vfscanf_DRAFT_API_DO_NOT_USE +# define u_vfscanf_u_3_6 u_vfscanf_u_DRAFT_API_DO_NOT_USE +# define u_vsnprintf_3_6 u_vsnprintf_DRAFT_API_DO_NOT_USE +# define u_vsnprintf_u_3_6 u_vsnprintf_u_DRAFT_API_DO_NOT_USE +# define u_vsprintf_3_6 u_vsprintf_DRAFT_API_DO_NOT_USE +# define u_vsprintf_u_3_6 u_vsprintf_u_DRAFT_API_DO_NOT_USE +# define u_vsscanf_3_6 u_vsscanf_DRAFT_API_DO_NOT_USE +# define u_vsscanf_u_3_6 u_vsscanf_u_DRAFT_API_DO_NOT_USE +# define ubidi_getProcessedLength_3_6 ubidi_getProcessedLength_DRAFT_API_DO_NOT_USE +# define ubidi_getReorderingMode_3_6 ubidi_getReorderingMode_DRAFT_API_DO_NOT_USE +# define ubidi_getReorderingOptions_3_6 ubidi_getReorderingOptions_DRAFT_API_DO_NOT_USE +# define ubidi_getResultLength_3_6 ubidi_getResultLength_DRAFT_API_DO_NOT_USE +# define ubidi_setReorderingMode_3_6 ubidi_setReorderingMode_DRAFT_API_DO_NOT_USE +# define ubidi_setReorderingOptions_3_6 ubidi_setReorderingOptions_DRAFT_API_DO_NOT_USE +# define ubrk_setUText_3_6 ubrk_setUText_DRAFT_API_DO_NOT_USE +# define ucal_getGregorianChange_3_6 ucal_getGregorianChange_DRAFT_API_DO_NOT_USE +# define ucal_setGregorianChange_3_6 ucal_setGregorianChange_DRAFT_API_DO_NOT_USE +# define ucasemap_close_3_6 ucasemap_close_DRAFT_API_DO_NOT_USE +# define ucasemap_getLocale_3_6 ucasemap_getLocale_DRAFT_API_DO_NOT_USE +# define ucasemap_getOptions_3_6 ucasemap_getOptions_DRAFT_API_DO_NOT_USE +# define ucasemap_open_3_6 ucasemap_open_DRAFT_API_DO_NOT_USE +# define ucasemap_setLocale_3_6 ucasemap_setLocale_DRAFT_API_DO_NOT_USE +# define ucasemap_setOptions_3_6 ucasemap_setOptions_DRAFT_API_DO_NOT_USE +# define ucasemap_utf8ToLower_3_6 ucasemap_utf8ToLower_DRAFT_API_DO_NOT_USE +# define ucasemap_utf8ToUpper_3_6 ucasemap_utf8ToUpper_DRAFT_API_DO_NOT_USE +# define ucnv_fromUCountPending_3_6 ucnv_fromUCountPending_DRAFT_API_DO_NOT_USE +# define ucnv_setSubstString_3_6 ucnv_setSubstString_DRAFT_API_DO_NOT_USE +# define ucnv_toUCountPending_3_6 ucnv_toUCountPending_DRAFT_API_DO_NOT_USE +# define ucol_getContractionsAndExpansions_3_6 ucol_getContractionsAndExpansions_DRAFT_API_DO_NOT_USE +# define ucsdet_close_3_6 ucsdet_close_DRAFT_API_DO_NOT_USE +# define ucsdet_detectAll_3_6 ucsdet_detectAll_DRAFT_API_DO_NOT_USE +# define ucsdet_detect_3_6 ucsdet_detect_DRAFT_API_DO_NOT_USE +# define ucsdet_enableInputFilter_3_6 ucsdet_enableInputFilter_DRAFT_API_DO_NOT_USE +# define ucsdet_getAllDetectableCharsets_3_6 ucsdet_getAllDetectableCharsets_DRAFT_API_DO_NOT_USE +# define ucsdet_getConfidence_3_6 ucsdet_getConfidence_DRAFT_API_DO_NOT_USE +# define ucsdet_getLanguage_3_6 ucsdet_getLanguage_DRAFT_API_DO_NOT_USE +# define ucsdet_getName_3_6 ucsdet_getName_DRAFT_API_DO_NOT_USE +# define ucsdet_getUChars_3_6 ucsdet_getUChars_DRAFT_API_DO_NOT_USE +# define ucsdet_isInputFilterEnabled_3_6 ucsdet_isInputFilterEnabled_DRAFT_API_DO_NOT_USE +# define ucsdet_open_3_6 ucsdet_open_DRAFT_API_DO_NOT_USE +# define ucsdet_setDeclaredEncoding_3_6 ucsdet_setDeclaredEncoding_DRAFT_API_DO_NOT_USE +# define ucsdet_setText_3_6 ucsdet_setText_DRAFT_API_DO_NOT_USE +# define udata_setFileAccess_3_6 udata_setFileAccess_DRAFT_API_DO_NOT_USE +# define ulocdata_close_3_6 ulocdata_close_DRAFT_API_DO_NOT_USE +# define ulocdata_getDelimiter_3_6 ulocdata_getDelimiter_DRAFT_API_DO_NOT_USE +# define ulocdata_getExemplarSet_3_6 ulocdata_getExemplarSet_DRAFT_API_DO_NOT_USE +# define ulocdata_getNoSubstitute_3_6 ulocdata_getNoSubstitute_DRAFT_API_DO_NOT_USE +# define ulocdata_open_3_6 ulocdata_open_DRAFT_API_DO_NOT_USE +# define ulocdata_setNoSubstitute_3_6 ulocdata_setNoSubstitute_DRAFT_API_DO_NOT_USE +# define ures_getUTF8StringByIndex_3_6 ures_getUTF8StringByIndex_DRAFT_API_DO_NOT_USE +# define ures_getUTF8StringByKey_3_6 ures_getUTF8StringByKey_DRAFT_API_DO_NOT_USE +# define ures_getUTF8String_3_6 ures_getUTF8String_DRAFT_API_DO_NOT_USE +# define uset_addAllCodePoints_3_6 uset_addAllCodePoints_DRAFT_API_DO_NOT_USE +# define uset_containsAllCodePoints_3_6 uset_containsAllCodePoints_DRAFT_API_DO_NOT_USE +# define utext_char32At_3_6 utext_char32At_DRAFT_API_DO_NOT_USE +# define utext_clone_3_6 utext_clone_DRAFT_API_DO_NOT_USE +# define utext_close_3_6 utext_close_DRAFT_API_DO_NOT_USE +# define utext_copy_3_6 utext_copy_DRAFT_API_DO_NOT_USE +# define utext_current32_3_6 utext_current32_DRAFT_API_DO_NOT_USE +# define utext_equals_3_6 utext_equals_DRAFT_API_DO_NOT_USE +# define utext_extract_3_6 utext_extract_DRAFT_API_DO_NOT_USE +# define utext_freeze_3_6 utext_freeze_DRAFT_API_DO_NOT_USE +# define utext_getNativeIndex_3_6 utext_getNativeIndex_DRAFT_API_DO_NOT_USE +# define utext_getPreviousNativeIndex_3_6 utext_getPreviousNativeIndex_DRAFT_API_DO_NOT_USE +# define utext_hasMetaData_3_6 utext_hasMetaData_DRAFT_API_DO_NOT_USE +# define utext_isLengthExpensive_3_6 utext_isLengthExpensive_DRAFT_API_DO_NOT_USE +# define utext_isWritable_3_6 utext_isWritable_DRAFT_API_DO_NOT_USE +# define utext_moveIndex32_3_6 utext_moveIndex32_DRAFT_API_DO_NOT_USE +# define utext_nativeLength_3_6 utext_nativeLength_DRAFT_API_DO_NOT_USE +# define utext_next32From_3_6 utext_next32From_DRAFT_API_DO_NOT_USE +# define utext_next32_3_6 utext_next32_DRAFT_API_DO_NOT_USE +# define utext_openUChars_3_6 utext_openUChars_DRAFT_API_DO_NOT_USE +# define utext_openUTF8_3_6 utext_openUTF8_DRAFT_API_DO_NOT_USE +# define utext_previous32From_3_6 utext_previous32From_DRAFT_API_DO_NOT_USE +# define utext_previous32_3_6 utext_previous32_DRAFT_API_DO_NOT_USE +# define utext_replace_3_6 utext_replace_DRAFT_API_DO_NOT_USE +# define utext_setNativeIndex_3_6 utext_setNativeIndex_DRAFT_API_DO_NOT_USE +# define utext_setup_3_6 utext_setup_DRAFT_API_DO_NOT_USE +# endif /* U_DISABLE_RENAMING */ #endif /* U_HIDE_DRAFT_API */ #endif /* UDRAFT_H */ diff --git a/Build/source/libs/icu-xetex/common/unicode/uidna.h b/Build/source/libs/icu-xetex/common/unicode/uidna.h index 00e2d3808b9..1371b9ed3cd 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uidna.h +++ b/Build/source/libs/icu-xetex/common/unicode/uidna.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003-2005, International Business Machines + * Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -49,8 +49,6 @@ * */ -#ifndef U_HIDE_DRAFT_API - /** * Option to prohibit processing of unassigned codepoints in the input and * do not check if the input conforms to STD-3 ASCII rules. @@ -74,8 +72,6 @@ */ #define UIDNA_USE_STD3_RULES 0x0002 -#endif /*U_HIDE_DRAFT_API*/ - /** * This function implements the ToASCII operation as defined in the IDNA RFC. * This operation is done on <b>single labels</b> before sending it to something that expects diff --git a/Build/source/libs/icu-xetex/common/unicode/uintrnal.h b/Build/source/libs/icu-xetex/common/unicode/uintrnal.h new file mode 100644 index 00000000000..79630d1d172 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/unicode/uintrnal.h @@ -0,0 +1,68 @@ +/* +******************************************************************************* +* Copyright (C) 2004-2006, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* +* file name: +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Created by: genheaders.pl, a perl script written by Ram Viswanadha +* +* Contains data for commenting out APIs. +* Gets included by umachine.h +* +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! +*/ + +#ifndef UINTRNAL_H +#define UINTRNAL_H + +#ifdef U_HIDE_INTERNAL_API + +# if U_DISABLE_RENAMING +# define RegexPatternDump RegexPatternDump_INTERNAL_API_DO_NOT_USE +# define ucol_collatorToIdentifier ucol_collatorToIdentifier_INTERNAL_API_DO_NOT_USE +# define ucol_equals ucol_equals_INTERNAL_API_DO_NOT_USE +# define ucol_forgetUCA ucol_forgetUCA_INTERNAL_API_DO_NOT_USE +# define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_INTERNAL_API_DO_NOT_USE +# define ucol_getUnsafeSet ucol_getUnsafeSet_INTERNAL_API_DO_NOT_USE +# define ucol_identifierToShortString ucol_identifierToShortString_INTERNAL_API_DO_NOT_USE +# define ucol_openFromIdentifier ucol_openFromIdentifier_INTERNAL_API_DO_NOT_USE +# define ucol_prepareShortStringOpen ucol_prepareShortStringOpen_INTERNAL_API_DO_NOT_USE +# define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_INTERNAL_API_DO_NOT_USE +# define uprv_getDefaultCodepage uprv_getDefaultCodepage_INTERNAL_API_DO_NOT_USE +# define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_INTERNAL_API_DO_NOT_USE +# define ures_openFillIn ures_openFillIn_INTERNAL_API_DO_NOT_USE +# define utf8_appendCharSafeBody utf8_appendCharSafeBody_INTERNAL_API_DO_NOT_USE +# define utf8_back1SafeBody utf8_back1SafeBody_INTERNAL_API_DO_NOT_USE +# define utf8_countTrailBytes utf8_countTrailBytes_INTERNAL_API_DO_NOT_USE +# define utf8_nextCharSafeBody utf8_nextCharSafeBody_INTERNAL_API_DO_NOT_USE +# define utf8_prevCharSafeBody utf8_prevCharSafeBody_INTERNAL_API_DO_NOT_USE +# else +# define RegexPatternDump_3_6 RegexPatternDump_INTERNAL_API_DO_NOT_USE +# define ucol_collatorToIdentifier_3_6 ucol_collatorToIdentifier_INTERNAL_API_DO_NOT_USE +# define ucol_equals_3_6 ucol_equals_INTERNAL_API_DO_NOT_USE +# define ucol_forgetUCA_3_6 ucol_forgetUCA_INTERNAL_API_DO_NOT_USE +# define ucol_getAttributeOrDefault_3_6 ucol_getAttributeOrDefault_INTERNAL_API_DO_NOT_USE +# define ucol_getUnsafeSet_3_6 ucol_getUnsafeSet_INTERNAL_API_DO_NOT_USE +# define ucol_identifierToShortString_3_6 ucol_identifierToShortString_INTERNAL_API_DO_NOT_USE +# define ucol_openFromIdentifier_3_6 ucol_openFromIdentifier_INTERNAL_API_DO_NOT_USE +# define ucol_prepareShortStringOpen_3_6 ucol_prepareShortStringOpen_INTERNAL_API_DO_NOT_USE +# define ucol_shortStringToIdentifier_3_6 ucol_shortStringToIdentifier_INTERNAL_API_DO_NOT_USE +# define uprv_getDefaultCodepage_3_6 uprv_getDefaultCodepage_INTERNAL_API_DO_NOT_USE +# define uprv_getDefaultLocaleID_3_6 uprv_getDefaultLocaleID_INTERNAL_API_DO_NOT_USE +# define ures_openFillIn_3_6 ures_openFillIn_INTERNAL_API_DO_NOT_USE +# define utf8_appendCharSafeBody_3_6 utf8_appendCharSafeBody_INTERNAL_API_DO_NOT_USE +# define utf8_back1SafeBody_3_6 utf8_back1SafeBody_INTERNAL_API_DO_NOT_USE +# define utf8_countTrailBytes_3_6 utf8_countTrailBytes_INTERNAL_API_DO_NOT_USE +# define utf8_nextCharSafeBody_3_6 utf8_nextCharSafeBody_INTERNAL_API_DO_NOT_USE +# define utf8_prevCharSafeBody_3_6 utf8_prevCharSafeBody_INTERNAL_API_DO_NOT_USE +# endif /* U_DISABLE_RENAMING */ + +#endif /* U_HIDE_INTERNAL_API */ +#endif /* UINTRNAL_H */ + diff --git a/Build/source/libs/icu-xetex/common/unicode/uloc.h b/Build/source/libs/icu-xetex/common/unicode/uloc.h index c16fcc8e2a9..61b70607866 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uloc.h +++ b/Build/source/libs/icu-xetex/common/unicode/uloc.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -261,25 +261,22 @@ */ #define ULOC_FULLNAME_CAPACITY 56 - -#ifndef U_HIDE_DRAFT_API - /** * Useful constant for the maximum size of the script part of a locale ID * (including the terminating NULL). - * @internal ICU 2.8 + * @stable ICU 2.8 */ #define ULOC_SCRIPT_CAPACITY 6 /** * Useful constant for the maximum size of keywords in a locale - * @internal ICU 2.8 + * @stable ICU 2.8 */ #define ULOC_KEYWORDS_CAPACITY 50 /** - * Useful constant for the maximum size of keywords in a locale - * @internal ICU 2.8 + * Useful constant for the maximum SIZE of keywords in a locale + * @stable ICU 2.8 */ #define ULOC_KEYWORD_AND_VALUES_CAPACITY 100 @@ -300,8 +297,6 @@ */ #define ULOC_KEYWORD_ITEM_SEPARATOR ';' -#endif /*U_HIDE_DRAFT_API*/ - /** * Constants for *_getLocale() * Allow user to select whether she wants information on @@ -333,7 +328,7 @@ typedef enum { ULOC_REQUESTED_LOCALE = 2, #endif /* U_HIDE_DEPRECATED_API */ - ULOC_DATA_LOCALE_TYPE_LIMIT + ULOC_DATA_LOCALE_TYPE_LIMIT = 3 } ULocDataLocaleType ; @@ -420,7 +415,7 @@ uloc_getScript(const char* localeID, * than countryCapacity, the returned country code will be truncated. * @stable ICU 2.0 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_getCountry(const char* localeID, char* country, int32_t countryCapacity, @@ -852,9 +847,9 @@ uloc_getKeywordValue(const char* localeID, * @param status containing error code - buffer not big enough. * @return the length needed for the buffer * @see uloc_getKeywordValue - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_setKeywordValue(const char* keywordName, const char* keywordValue, char* buffer, int32_t bufferCapacity, @@ -864,7 +859,7 @@ uloc_setKeywordValue(const char* keywordName, * enums for the 'outResult' parameter return value * @see uloc_acceptLanguageFromHTTP * @see uloc_acceptLanguage - * @draft ICU 3.2 + * @stable ICU 3.2 */ typedef enum { ULOC_ACCEPT_FAILED = 0, /* No exact match was found. */ @@ -885,9 +880,9 @@ typedef enum { * @param availableLocales - list of available locales to match * @param status Error status, may be BUFFER_OVERFLOW_ERROR * @return length needed for the locale. - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult *outResult, const char *httpAcceptLanguage, @@ -905,9 +900,9 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, * @param availableLocales - list of available locales to match * @param status Error status, may be BUFFER_OVERFLOW_ERROR * @return length needed for the locale. - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uloc_acceptLanguage(char *result, int32_t resultAvailable, UAcceptResult *outResult, const char **acceptList, int32_t acceptListCount, diff --git a/Build/source/libs/icu-xetex/common/unicode/umachine.h b/Build/source/libs/icu-xetex/common/unicode/umachine.h index a38e3f04dac..60419cda808 100644 --- a/Build/source/libs/icu-xetex/common/unicode/umachine.h +++ b/Build/source/libs/icu-xetex/common/unicode/umachine.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -354,6 +354,8 @@ typedef int32_t UChar32; /* the OS in use. */ /*==========================================================================*/ +#ifndef U_HIDE_INTERNAL_API + /** * \def U_ALIGN_CODE * This is used to align code fragments to a specific byte boundary. @@ -364,6 +366,8 @@ typedef int32_t UChar32; # define U_ALIGN_CODE(n) #endif +#endif /* U_HIDE_INTERNAL_API */ + #ifndef U_INLINE # ifdef XP_CPLUSPLUS # define U_INLINE inline diff --git a/Build/source/libs/icu-xetex/common/unicode/umisc.h b/Build/source/libs/icu-xetex/common/unicode/umisc.h index d47fa3837d2..d85451fc767 100644 --- a/Build/source/libs/icu-xetex/common/unicode/umisc.h +++ b/Build/source/libs/icu-xetex/common/unicode/umisc.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: umisc.h @@ -23,7 +23,9 @@ * * This file contains miscellaneous definitions for the C APIs. */ - + +U_CDECL_BEGIN + /** A struct representing a range of text containing a specific field * @stable ICU 2.0 */ @@ -45,4 +47,14 @@ typedef struct UFieldPosition { int32_t endIndex; } UFieldPosition; +#if !UCONFIG_NO_SERVICE +/** + * Opaque type returned by registerInstance, registerFactory and unregister for service registration. + * @stable ICU 2.6 + */ +typedef const void* URegistryKey; +#endif + +U_CDECL_END + #endif diff --git a/Build/source/libs/icu-xetex/common/unicode/unifilt.h b/Build/source/libs/icu-xetex/common/unicode/unifilt.h index 7ab46657dc1..5bf1ba4e4fd 100644 --- a/Build/source/libs/icu-xetex/common/unicode/unifilt.h +++ b/Build/source/libs/icu-xetex/common/unicode/unifilt.h @@ -1,5 +1,6 @@ /* -* Copyright (C) 1999-2005, International Business Machines Corporation and others. +********************************************************************** +* Copyright (C) 1999-2006, International Business Machines Corporation and others. * All Rights Reserved. ********************************************************************** * Date Name Description @@ -25,7 +26,7 @@ U_NAMESPACE_BEGIN * characters outside the range contextStart..contextLimit-1. This * allows explicit matching by rules and UnicodeSets of text outside a * defined range. - * @draft ICU 3.0 + * @stable ICU 3.0 */ #define U_ETHER ((UChar)0xFFFF) diff --git a/Build/source/libs/icu-xetex/common/unicode/uniset.h b/Build/source/libs/icu-xetex/common/unicode/uniset.h index d44725f14bd..1e48aa8365e 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uniset.h +++ b/Build/source/libs/icu-xetex/common/unicode/uniset.h @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 1999-2005, International Business Machines Corporation +* Copyright (C) 1999-2006, International Business Machines Corporation * and others. All Rights Reserved. *************************************************************************** * Date Name Description @@ -363,16 +363,6 @@ public: const SymbolTable* symbols, UErrorCode& status); -#ifdef U_USE_UNICODESET_DEPRECATES - /** - * Obsolete: Constructs a set from the given Unicode character category. - * @param category an integer indicating the character category as - * defined in uchar.h. - * @obsolete ICU 2.6. Use a pattern with the category instead since this API will be removed in that release. - */ - UnicodeSet(int8_t category, UErrorCode& status); -#endif - /** * Constructs a set that is identical to the given UnicodeSet. * @stable ICU 2.0 diff --git a/Build/source/libs/icu-xetex/common/unicode/unistr.h b/Build/source/libs/icu-xetex/common/unicode/unistr.h index cce66c8ae69..fe1722bdc97 100644 --- a/Build/source/libs/icu-xetex/common/unicode/unistr.h +++ b/Build/source/libs/icu-xetex/common/unicode/unistr.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2005, International Business Machines +* Copyright (C) 1998-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -42,7 +42,9 @@ class StringThreadTest; #endif #ifndef USTRING_H -/* see ustring.h */ +/** + * \ingroup ustring_ustrlen + */ U_STABLE int32_t U_EXPORT2 u_strlen(const UChar *s); #endif @@ -63,7 +65,7 @@ class BreakIterator; // unicode/brkiter.h * therefore recommended over ones taking a charset name string * (where the empty string "" indicates invariant-character conversion). * - * @draft ICU 3.2 + * @stable ICU 3.2 */ #define US_INV UnicodeString::kInvariant @@ -192,12 +194,12 @@ public: * Use the macro US_INV instead of the full qualification for this value. * * @see US_INV - * @draft ICU 3.2 + * @stable ICU 3.2 */ enum EInvariant { /** * @see EInvariant - * @draft ICU 3.2 + * @stable ICU 3.2 */ kInvariant }; @@ -1438,7 +1440,7 @@ public: * @param targetCapacity the length of the target buffer * @param inv Signature-distinguishing paramater, use US_INV. * @return the output string length, not including the terminating NUL - * @draft ICU 3.2 + * @stable ICU 3.2 */ int32_t extract(int32_t start, int32_t startLength, @@ -2817,7 +2819,7 @@ public: * @param inv Signature-distinguishing paramater, use US_INV. * * @see US_INV - * @draft ICU 3.2 + * @stable ICU 3.2 */ UnicodeString(const char *src, int32_t length, enum EInvariant inv); @@ -3201,32 +3203,6 @@ private: U_COMMON_API UnicodeString U_EXPORT2 operator+ (const UnicodeString &s1, const UnicodeString &s2); -U_NAMESPACE_END - -// inline implementations -------------------------------------------------- *** - -//======================================== -// Array copying -//======================================== -/** - * Copy an array of UnicodeString OBJECTS (not pointers). - * @internal - */ -inline void -uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t count) -{ while(count-- > 0) *dst++ = *src++; } - -/** - * Copy an array of UnicodeString OBJECTS (not pointers). - * @internal - */ -inline void -uprv_arrayCopy(const U_NAMESPACE_QUALIFIER UnicodeString *src, int32_t srcStart, - U_NAMESPACE_QUALIFIER UnicodeString *dst, int32_t dstStart, int32_t count) -{ uprv_arrayCopy(src+srcStart, dst+dstStart, count); } - -U_NAMESPACE_BEGIN - //======================================== // Inline members //======================================== @@ -4005,23 +3981,6 @@ UnicodeString::setTo(UChar32 srcChar) } inline UnicodeString& -UnicodeString::operator+= (UChar ch) -{ return doReplace(fLength, 0, &ch, 0, 1); } - -inline UnicodeString& -UnicodeString::operator+= (UChar32 ch) { - UChar buffer[U16_MAX_LENGTH]; - int32_t _length = 0; - UBool isError = FALSE; - U16_APPEND(buffer, _length, U16_MAX_LENGTH, ch, isError); - return doReplace(fLength, 0, buffer, 0, _length); -} - -inline UnicodeString& -UnicodeString::operator+= (const UnicodeString& srcText) -{ return doReplace(fLength, 0, srcText, 0, srcText.fLength); } - -inline UnicodeString& UnicodeString::append(const UnicodeString& srcText, int32_t srcStart, int32_t srcLength) @@ -4056,6 +4015,19 @@ UnicodeString::append(UChar32 srcChar) { } inline UnicodeString& +UnicodeString::operator+= (UChar ch) +{ return doReplace(fLength, 0, &ch, 0, 1); } + +inline UnicodeString& +UnicodeString::operator+= (UChar32 ch) { + return append(ch); +} + +inline UnicodeString& +UnicodeString::operator+= (const UnicodeString& srcText) +{ return doReplace(fLength, 0, srcText, 0, srcText.fLength); } + +inline UnicodeString& UnicodeString::insert(int32_t start, const UnicodeString& srcText, int32_t srcStart, @@ -4107,12 +4079,11 @@ inline UnicodeString& UnicodeString::remove(int32_t start, int32_t _length) { - if(start <= 0 && _length == INT32_MAX) { - // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus - return remove(); - } else { + if(start <= 0 && _length == INT32_MAX) { + // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus + return remove(); + } return doReplace(start, _length, NULL, 0, 0); - } } inline UnicodeString& diff --git a/Build/source/libs/icu-xetex/common/unicode/uobject.h b/Build/source/libs/icu-xetex/common/unicode/uobject.h index 4dfc247bdd6..877359942de 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uobject.h +++ b/Build/source/libs/icu-xetex/common/unicode/uobject.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -49,6 +49,8 @@ U_NAMESPACE_BEGIN #define U_HAVE_PLACEMENT_NEW 1 #endif + +#ifndef U_HIDE_DRAFT_API /** U_HAVE_DEBUG_LOCATION_NEW - Define this to define the MFC debug * version of the operator new. * @@ -57,7 +59,7 @@ U_NAMESPACE_BEGIN #ifndef U_HAVE_DEBUG_LOCATION_NEW #define U_HAVE_DEBUG_LOCATION_NEW 0 #endif - +#endif /*U_HIDE_DRAFT_API*/ /** * UMemory is the common ICU base class. diff --git a/Build/source/libs/icu-xetex/common/unicode/uobslete.h b/Build/source/libs/icu-xetex/common/unicode/uobslete.h index c898f7f1790..e4f160f4fb9 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uobslete.h +++ b/Build/source/libs/icu-xetex/common/unicode/uobslete.h @@ -1,15 +1,15 @@ /* ******************************************************************************* -* Copyright (C) 2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * -* file name: uobslete.h +* file name: * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * -* Created by: gendraft.pl, a perl script written by Ram Viswanadha +* Created by: genheaders.pl, a perl script written by Ram Viswanadha * * Contains data for commenting out APIs. * Gets included by umachine.h @@ -23,6 +23,9 @@ #ifdef U_HIDE_OBSOLETE_API +# if U_DISABLE_RENAMING +# else +# endif /* U_DISABLE_RENAMING */ #endif /* U_HIDE_OBSOLETE_API */ #endif /* UOBSLETE_H */ diff --git a/Build/source/libs/icu-xetex/common/unicode/urename.h b/Build/source/libs/icu-xetex/common/unicode/urename.h index 0d9b7a37ad7..b95800200bd 100644 --- a/Build/source/libs/icu-xetex/common/unicode/urename.h +++ b/Build/source/libs/icu-xetex/common/unicode/urename.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * @@ -29,1501 +29,1572 @@ /* C exports renaming data */ -#define T_CString_int64ToString T_CString_int64ToString_3_4 -#define T_CString_integerToString T_CString_integerToString_3_4 -#define T_CString_stricmp T_CString_stricmp_3_4 -#define T_CString_stringToInteger T_CString_stringToInteger_3_4 -#define T_CString_strnicmp T_CString_strnicmp_3_4 -#define T_CString_toLowerCase T_CString_toLowerCase_3_4 -#define T_CString_toUpperCase T_CString_toUpperCase_3_4 -#define T_FileStream_close T_FileStream_close_3_4 -#define T_FileStream_eof T_FileStream_eof_3_4 -#define T_FileStream_error T_FileStream_error_3_4 -#define T_FileStream_file_exists T_FileStream_file_exists_3_4 -#define T_FileStream_getc T_FileStream_getc_3_4 -#define T_FileStream_open T_FileStream_open_3_4 -#define T_FileStream_peek T_FileStream_peek_3_4 -#define T_FileStream_putc T_FileStream_putc_3_4 -#define T_FileStream_read T_FileStream_read_3_4 -#define T_FileStream_readLine T_FileStream_readLine_3_4 -#define T_FileStream_remove T_FileStream_remove_3_4 -#define T_FileStream_rewind T_FileStream_rewind_3_4 -#define T_FileStream_size T_FileStream_size_3_4 -#define T_FileStream_stderr T_FileStream_stderr_3_4 -#define T_FileStream_stdin T_FileStream_stdin_3_4 -#define T_FileStream_stdout T_FileStream_stdout_3_4 -#define T_FileStream_ungetc T_FileStream_ungetc_3_4 -#define T_FileStream_write T_FileStream_write_3_4 -#define T_FileStream_writeLine T_FileStream_writeLine_3_4 -#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_3_4 -#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_3_4 -#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_3_4 -#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_3_4 -#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_3_4 -#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_3_4 -#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_3_4 -#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_3_4 -#define UDataMemory_createNewInstance UDataMemory_createNewInstance_3_4 -#define UDataMemory_init UDataMemory_init_3_4 -#define UDataMemory_isLoaded UDataMemory_isLoaded_3_4 -#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_3_4 -#define UDataMemory_setData UDataMemory_setData_3_4 -#define UDatamemory_assign UDatamemory_assign_3_4 -#define _ASCIIData _ASCIIData_3_4 -#define _Bocu1Data _Bocu1Data_3_4 -#define _CESU8Data _CESU8Data_3_4 -#define _HZData _HZData_3_4 -#define _IMAPData _IMAPData_3_4 -#define _ISCIIData _ISCIIData_3_4 -#define _ISO2022Data _ISO2022Data_3_4 -#define _LMBCSData1 _LMBCSData1_3_4 -#define _LMBCSData11 _LMBCSData11_3_4 -#define _LMBCSData16 _LMBCSData16_3_4 -#define _LMBCSData17 _LMBCSData17_3_4 -#define _LMBCSData18 _LMBCSData18_3_4 -#define _LMBCSData19 _LMBCSData19_3_4 -#define _LMBCSData2 _LMBCSData2_3_4 -#define _LMBCSData3 _LMBCSData3_3_4 -#define _LMBCSData4 _LMBCSData4_3_4 -#define _LMBCSData5 _LMBCSData5_3_4 -#define _LMBCSData6 _LMBCSData6_3_4 -#define _LMBCSData8 _LMBCSData8_3_4 -#define _Latin1Data _Latin1Data_3_4 -#define _MBCSData _MBCSData_3_4 -#define _SCSUData _SCSUData_3_4 -#define _UTF16BEData _UTF16BEData_3_4 -#define _UTF16Data _UTF16Data_3_4 -#define _UTF16LEData _UTF16LEData_3_4 -#define _UTF32BEData _UTF32BEData_3_4 -#define _UTF32Data _UTF32Data_3_4 -#define _UTF32LEData _UTF32LEData_3_4 -#define _UTF7Data _UTF7Data_3_4 -#define _UTF8Data _UTF8Data_3_4 -#define cmemory_cleanup cmemory_cleanup_3_4 -#define cmemory_inUse cmemory_inUse_3_4 -#define locale_getKeywords locale_getKeywords_3_4 -#define locale_get_default locale_get_default_3_4 -#define locale_set_default locale_set_default_3_4 -#define res_countArrayItems res_countArrayItems_3_4 -#define res_findResource res_findResource_3_4 -#define res_getAlias res_getAlias_3_4 -#define res_getArrayItem res_getArrayItem_3_4 -#define res_getBinary res_getBinary_3_4 -#define res_getIntVector res_getIntVector_3_4 -#define res_getResource res_getResource_3_4 -#define res_getString res_getString_3_4 -#define res_getTableItemByIndex res_getTableItemByIndex_3_4 -#define res_getTableItemByKey res_getTableItemByKey_3_4 -#define res_load res_load_3_4 -#define res_unload res_unload_3_4 -#define transliterator_cleanup transliterator_cleanup_3_4 -#define u_UCharsToChars u_UCharsToChars_3_4 -#define u_austrcpy u_austrcpy_3_4 -#define u_austrncpy u_austrncpy_3_4 -#define u_catclose u_catclose_3_4 -#define u_catgets u_catgets_3_4 -#define u_catopen u_catopen_3_4 -#define u_charAge u_charAge_3_4 -#define u_charDigitValue u_charDigitValue_3_4 -#define u_charDirection u_charDirection_3_4 -#define u_charFromName u_charFromName_3_4 -#define u_charMirror u_charMirror_3_4 -#define u_charName u_charName_3_4 -#define u_charType u_charType_3_4 -#define u_charsToUChars u_charsToUChars_3_4 -#define u_cleanup u_cleanup_3_4 -#define u_countChar32 u_countChar32_3_4 -#define u_digit u_digit_3_4 -#define u_enumCharNames u_enumCharNames_3_4 -#define u_enumCharTypes u_enumCharTypes_3_4 -#define u_errorName u_errorName_3_4 -#define u_fclose u_fclose_3_4 -#define u_feof u_feof_3_4 -#define u_fflush u_fflush_3_4 -#define u_fgetConverter u_fgetConverter_3_4 -#define u_fgetc u_fgetc_3_4 -#define u_fgetcodepage u_fgetcodepage_3_4 -#define u_fgetcx u_fgetcx_3_4 -#define u_fgetfile u_fgetfile_3_4 -#define u_fgetlocale u_fgetlocale_3_4 -#define u_fgets u_fgets_3_4 -#define u_file_read u_file_read_3_4 -#define u_file_write u_file_write_3_4 -#define u_file_write_flush u_file_write_flush_3_4 -#define u_finit u_finit_3_4 -#define u_foldCase u_foldCase_3_4 -#define u_fopen u_fopen_3_4 -#define u_forDigit u_forDigit_3_4 -#define u_formatMessage u_formatMessage_3_4 -#define u_formatMessageWithError u_formatMessageWithError_3_4 -#define u_fprintf u_fprintf_3_4 -#define u_fprintf_u u_fprintf_u_3_4 -#define u_fputc u_fputc_3_4 -#define u_fputs u_fputs_3_4 -#define u_frewind u_frewind_3_4 -#define u_fscanf u_fscanf_3_4 -#define u_fscanf_u u_fscanf_u_3_4 -#define u_fsetcodepage u_fsetcodepage_3_4 -#define u_fsetlocale u_fsetlocale_3_4 -#define u_fsettransliterator u_fsettransliterator_3_4 -#define u_fstropen u_fstropen_3_4 -#define u_fungetc u_fungetc_3_4 -#define u_getCombiningClass u_getCombiningClass_3_4 -#define u_getDataDirectory u_getDataDirectory_3_4 -#define u_getDefaultConverter u_getDefaultConverter_3_4 -#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_3_4 -#define u_getISOComment u_getISOComment_3_4 -#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_3_4 -#define u_getIntPropertyMinValue u_getIntPropertyMinValue_3_4 -#define u_getIntPropertyValue u_getIntPropertyValue_3_4 -#define u_getNumericValue u_getNumericValue_3_4 -#define u_getPropertyEnum u_getPropertyEnum_3_4 -#define u_getPropertyName u_getPropertyName_3_4 -#define u_getPropertyValueEnum u_getPropertyValueEnum_3_4 -#define u_getPropertyValueName u_getPropertyValueName_3_4 -#define u_getUnicodeProperties u_getUnicodeProperties_3_4 -#define u_getUnicodeVersion u_getUnicodeVersion_3_4 -#define u_getVersion u_getVersion_3_4 -#define u_growBufferFromStatic u_growBufferFromStatic_3_4 -#define u_hasBinaryProperty u_hasBinaryProperty_3_4 -#define u_init u_init_3_4 -#define u_isIDIgnorable u_isIDIgnorable_3_4 -#define u_isIDPart u_isIDPart_3_4 -#define u_isIDStart u_isIDStart_3_4 -#define u_isISOControl u_isISOControl_3_4 -#define u_isJavaIDPart u_isJavaIDPart_3_4 -#define u_isJavaIDStart u_isJavaIDStart_3_4 -#define u_isJavaSpaceChar u_isJavaSpaceChar_3_4 -#define u_isMirrored u_isMirrored_3_4 -#define u_isUAlphabetic u_isUAlphabetic_3_4 -#define u_isULowercase u_isULowercase_3_4 -#define u_isUUppercase u_isUUppercase_3_4 -#define u_isUWhiteSpace u_isUWhiteSpace_3_4 -#define u_isWhitespace u_isWhitespace_3_4 -#define u_isalnum u_isalnum_3_4 -#define u_isalnumPOSIX u_isalnumPOSIX_3_4 -#define u_isalpha u_isalpha_3_4 -#define u_isbase u_isbase_3_4 -#define u_isblank u_isblank_3_4 -#define u_iscntrl u_iscntrl_3_4 -#define u_isdefined u_isdefined_3_4 -#define u_isdigit u_isdigit_3_4 -#define u_isgraph u_isgraph_3_4 -#define u_isgraphPOSIX u_isgraphPOSIX_3_4 -#define u_islower u_islower_3_4 -#define u_isprint u_isprint_3_4 -#define u_isprintPOSIX u_isprintPOSIX_3_4 -#define u_ispunct u_ispunct_3_4 -#define u_isspace u_isspace_3_4 -#define u_istitle u_istitle_3_4 -#define u_isupper u_isupper_3_4 -#define u_isxdigit u_isxdigit_3_4 -#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_3_4 -#define u_locbund_close u_locbund_close_3_4 -#define u_locbund_getNumberFormat u_locbund_getNumberFormat_3_4 -#define u_locbund_init u_locbund_init_3_4 -#define u_memcasecmp u_memcasecmp_3_4 -#define u_memchr u_memchr_3_4 -#define u_memchr32 u_memchr32_3_4 -#define u_memcmp u_memcmp_3_4 -#define u_memcmpCodePointOrder u_memcmpCodePointOrder_3_4 -#define u_memcpy u_memcpy_3_4 -#define u_memmove u_memmove_3_4 -#define u_memrchr u_memrchr_3_4 -#define u_memrchr32 u_memrchr32_3_4 -#define u_memset u_memset_3_4 -#define u_parseMessage u_parseMessage_3_4 -#define u_parseMessageWithError u_parseMessageWithError_3_4 -#define u_printf_parse u_printf_parse_3_4 -#define u_releaseDefaultConverter u_releaseDefaultConverter_3_4 -#define u_scanf_parse u_scanf_parse_3_4 -#define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_3_4 -#define u_setDataDirectory u_setDataDirectory_3_4 -#define u_setMemoryFunctions u_setMemoryFunctions_3_4 -#define u_setMutexFunctions u_setMutexFunctions_3_4 -#define u_shapeArabic u_shapeArabic_3_4 -#define u_snprintf u_snprintf_3_4 -#define u_snprintf_u u_snprintf_u_3_4 -#define u_sprintf u_sprintf_3_4 -#define u_sprintf_u u_sprintf_u_3_4 -#define u_sscanf u_sscanf_3_4 -#define u_sscanf_u u_sscanf_u_3_4 -#define u_strCaseCompare u_strCaseCompare_3_4 -#define u_strCompare u_strCompare_3_4 -#define u_strCompareIter u_strCompareIter_3_4 -#define u_strFindFirst u_strFindFirst_3_4 -#define u_strFindLast u_strFindLast_3_4 -#define u_strFoldCase u_strFoldCase_3_4 -#define u_strFromPunycode u_strFromPunycode_3_4 -#define u_strFromUTF32 u_strFromUTF32_3_4 -#define u_strFromUTF8 u_strFromUTF8_3_4 -#define u_strFromWCS u_strFromWCS_3_4 -#define u_strHasMoreChar32Than u_strHasMoreChar32Than_3_4 -#define u_strToLower u_strToLower_3_4 -#define u_strToPunycode u_strToPunycode_3_4 -#define u_strToTitle u_strToTitle_3_4 -#define u_strToUTF32 u_strToUTF32_3_4 -#define u_strToUTF8 u_strToUTF8_3_4 -#define u_strToUpper u_strToUpper_3_4 -#define u_strToWCS u_strToWCS_3_4 -#define u_strcasecmp u_strcasecmp_3_4 -#define u_strcat u_strcat_3_4 -#define u_strchr u_strchr_3_4 -#define u_strchr32 u_strchr32_3_4 -#define u_strcmp u_strcmp_3_4 -#define u_strcmpCodePointOrder u_strcmpCodePointOrder_3_4 -#define u_strcmpFold u_strcmpFold_3_4 -#define u_strcpy u_strcpy_3_4 -#define u_strcspn u_strcspn_3_4 -#define u_strlen u_strlen_3_4 -#define u_strncasecmp u_strncasecmp_3_4 -#define u_strncat u_strncat_3_4 -#define u_strncmp u_strncmp_3_4 -#define u_strncmpCodePointOrder u_strncmpCodePointOrder_3_4 -#define u_strncpy u_strncpy_3_4 -#define u_strpbrk u_strpbrk_3_4 -#define u_strrchr u_strrchr_3_4 -#define u_strrchr32 u_strrchr32_3_4 -#define u_strrstr u_strrstr_3_4 -#define u_strspn u_strspn_3_4 -#define u_strstr u_strstr_3_4 -#define u_strtok_r u_strtok_r_3_4 -#define u_terminateChars u_terminateChars_3_4 -#define u_terminateUChar32s u_terminateUChar32s_3_4 -#define u_terminateUChars u_terminateUChars_3_4 -#define u_terminateWChars u_terminateWChars_3_4 -#define u_tolower u_tolower_3_4 -#define u_totitle u_totitle_3_4 -#define u_toupper u_toupper_3_4 -#define u_uastrcpy u_uastrcpy_3_4 -#define u_uastrncpy u_uastrncpy_3_4 -#define u_unescape u_unescape_3_4 -#define u_unescapeAt u_unescapeAt_3_4 -#define u_versionFromString u_versionFromString_3_4 -#define u_versionToString u_versionToString_3_4 -#define u_vformatMessage u_vformatMessage_3_4 -#define u_vformatMessageWithError u_vformatMessageWithError_3_4 -#define u_vfprintf u_vfprintf_3_4 -#define u_vfprintf_u u_vfprintf_u_3_4 -#define u_vfscanf u_vfscanf_3_4 -#define u_vfscanf_u u_vfscanf_u_3_4 -#define u_vparseMessage u_vparseMessage_3_4 -#define u_vparseMessageWithError u_vparseMessageWithError_3_4 -#define u_vsnprintf u_vsnprintf_3_4 -#define u_vsnprintf_u u_vsnprintf_u_3_4 -#define u_vsprintf u_vsprintf_3_4 -#define u_vsprintf_u u_vsprintf_u_3_4 -#define u_vsscanf u_vsscanf_3_4 -#define u_vsscanf_u u_vsscanf_u_3_4 -#define u_writeDiff u_writeDiff_3_4 -#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_3_4 -#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_3_4 -#define ubidi_addPropertyStarts ubidi_addPropertyStarts_3_4 -#define ubidi_close ubidi_close_3_4 -#define ubidi_closeProps ubidi_closeProps_3_4 -#define ubidi_countParagraphs ubidi_countParagraphs_3_4 -#define ubidi_countRuns ubidi_countRuns_3_4 -#define ubidi_getClass ubidi_getClass_3_4 -#define ubidi_getDirection ubidi_getDirection_3_4 -#define ubidi_getDummy ubidi_getDummy_3_4 -#define ubidi_getJoiningGroup ubidi_getJoiningGroup_3_4 -#define ubidi_getJoiningType ubidi_getJoiningType_3_4 -#define ubidi_getLength ubidi_getLength_3_4 -#define ubidi_getLevelAt ubidi_getLevelAt_3_4 -#define ubidi_getLevels ubidi_getLevels_3_4 -#define ubidi_getLogicalIndex ubidi_getLogicalIndex_3_4 -#define ubidi_getLogicalMap ubidi_getLogicalMap_3_4 -#define ubidi_getLogicalRun ubidi_getLogicalRun_3_4 -#define ubidi_getMaxValue ubidi_getMaxValue_3_4 -#define ubidi_getMemory ubidi_getMemory_3_4 -#define ubidi_getMirror ubidi_getMirror_3_4 -#define ubidi_getParaLevel ubidi_getParaLevel_3_4 -#define ubidi_getParagraph ubidi_getParagraph_3_4 -#define ubidi_getParagraphByIndex ubidi_getParagraphByIndex_3_4 -#define ubidi_getRuns ubidi_getRuns_3_4 -#define ubidi_getSingleton ubidi_getSingleton_3_4 -#define ubidi_getText ubidi_getText_3_4 -#define ubidi_getVisualIndex ubidi_getVisualIndex_3_4 -#define ubidi_getVisualMap ubidi_getVisualMap_3_4 -#define ubidi_getVisualRun ubidi_getVisualRun_3_4 -#define ubidi_invertMap ubidi_invertMap_3_4 -#define ubidi_isBidiControl ubidi_isBidiControl_3_4 -#define ubidi_isInverse ubidi_isInverse_3_4 -#define ubidi_isJoinControl ubidi_isJoinControl_3_4 -#define ubidi_isMirrored ubidi_isMirrored_3_4 -#define ubidi_isOrderParagraphsLTR ubidi_isOrderParagraphsLTR_3_4 -#define ubidi_open ubidi_open_3_4 -#define ubidi_openSized ubidi_openSized_3_4 -#define ubidi_orderParagraphsLTR ubidi_orderParagraphsLTR_3_4 -#define ubidi_reorderLogical ubidi_reorderLogical_3_4 -#define ubidi_reorderVisual ubidi_reorderVisual_3_4 -#define ubidi_setInverse ubidi_setInverse_3_4 -#define ubidi_setLine ubidi_setLine_3_4 -#define ubidi_setPara ubidi_setPara_3_4 -#define ubidi_writeReordered ubidi_writeReordered_3_4 -#define ubidi_writeReverse ubidi_writeReverse_3_4 -#define ublock_getCode ublock_getCode_3_4 -#define ubrk_close ubrk_close_3_4 -#define ubrk_countAvailable ubrk_countAvailable_3_4 -#define ubrk_current ubrk_current_3_4 -#define ubrk_first ubrk_first_3_4 -#define ubrk_following ubrk_following_3_4 -#define ubrk_getAvailable ubrk_getAvailable_3_4 -#define ubrk_getLocaleByType ubrk_getLocaleByType_3_4 -#define ubrk_getRuleStatus ubrk_getRuleStatus_3_4 -#define ubrk_getRuleStatusVec ubrk_getRuleStatusVec_3_4 -#define ubrk_isBoundary ubrk_isBoundary_3_4 -#define ubrk_last ubrk_last_3_4 -#define ubrk_next ubrk_next_3_4 -#define ubrk_open ubrk_open_3_4 -#define ubrk_openRules ubrk_openRules_3_4 -#define ubrk_preceding ubrk_preceding_3_4 -#define ubrk_previous ubrk_previous_3_4 -#define ubrk_safeClone ubrk_safeClone_3_4 -#define ubrk_setText ubrk_setText_3_4 -#define ubrk_setUText ubrk_setUText_3_4 -#define ubrk_swap ubrk_swap_3_4 -#define ucal_add ucal_add_3_4 -#define ucal_clear ucal_clear_3_4 -#define ucal_clearField ucal_clearField_3_4 -#define ucal_close ucal_close_3_4 -#define ucal_countAvailable ucal_countAvailable_3_4 -#define ucal_equivalentTo ucal_equivalentTo_3_4 -#define ucal_get ucal_get_3_4 -#define ucal_getAttribute ucal_getAttribute_3_4 -#define ucal_getAvailable ucal_getAvailable_3_4 -#define ucal_getDSTSavings ucal_getDSTSavings_3_4 -#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_3_4 -#define ucal_getLimit ucal_getLimit_3_4 -#define ucal_getLocaleByType ucal_getLocaleByType_3_4 -#define ucal_getMillis ucal_getMillis_3_4 -#define ucal_getNow ucal_getNow_3_4 -#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_3_4 -#define ucal_inDaylightTime ucal_inDaylightTime_3_4 -#define ucal_isSet ucal_isSet_3_4 -#define ucal_open ucal_open_3_4 -#define ucal_openCountryTimeZones ucal_openCountryTimeZones_3_4 -#define ucal_openTimeZones ucal_openTimeZones_3_4 -#define ucal_roll ucal_roll_3_4 -#define ucal_set ucal_set_3_4 -#define ucal_setAttribute ucal_setAttribute_3_4 -#define ucal_setDate ucal_setDate_3_4 -#define ucal_setDateTime ucal_setDateTime_3_4 -#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_3_4 -#define ucal_setMillis ucal_setMillis_3_4 -#define ucal_setTimeZone ucal_setTimeZone_3_4 -#define ucase_addCaseClosure ucase_addCaseClosure_3_4 -#define ucase_addPropertyStarts ucase_addPropertyStarts_3_4 -#define ucase_addStringCaseClosure ucase_addStringCaseClosure_3_4 -#define ucase_close ucase_close_3_4 -#define ucase_fold ucase_fold_3_4 -#define ucase_getCaseLocale ucase_getCaseLocale_3_4 -#define ucase_getDummy ucase_getDummy_3_4 -#define ucase_getSingleton ucase_getSingleton_3_4 -#define ucase_getType ucase_getType_3_4 -#define ucase_getTypeOrIgnorable ucase_getTypeOrIgnorable_3_4 -#define ucase_isCaseSensitive ucase_isCaseSensitive_3_4 -#define ucase_isSoftDotted ucase_isSoftDotted_3_4 -#define ucase_toFullFolding ucase_toFullFolding_3_4 -#define ucase_toFullLower ucase_toFullLower_3_4 -#define ucase_toFullTitle ucase_toFullTitle_3_4 -#define ucase_toFullUpper ucase_toFullUpper_3_4 -#define ucase_tolower ucase_tolower_3_4 -#define ucase_totitle ucase_totitle_3_4 -#define ucase_toupper ucase_toupper_3_4 -#define ucasemap_close ucasemap_close_3_4 -#define ucasemap_getLocale ucasemap_getLocale_3_4 -#define ucasemap_getOptions ucasemap_getOptions_3_4 -#define ucasemap_open ucasemap_open_3_4 -#define ucasemap_setLocale ucasemap_setLocale_3_4 -#define ucasemap_setOptions ucasemap_setOptions_3_4 -#define ucasemap_utf8ToLower ucasemap_utf8ToLower_3_4 -#define ucasemap_utf8ToUpper ucasemap_utf8ToUpper_3_4 -#define uchar_addPropertyStarts uchar_addPropertyStarts_3_4 -#define uchar_getHST uchar_getHST_3_4 -#define uchar_swapNames uchar_swapNames_3_4 -#define ucln_common_lib_cleanup ucln_common_lib_cleanup_3_4 -#define ucln_common_registerCleanup ucln_common_registerCleanup_3_4 -#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_3_4 -#define ucln_registerCleanup ucln_registerCleanup_3_4 -#define ucmp8_close ucmp8_close_3_4 -#define ucmp8_compact ucmp8_compact_3_4 -#define ucmp8_expand ucmp8_expand_3_4 -#define ucmp8_flattenMem ucmp8_flattenMem_3_4 -#define ucmp8_getArray ucmp8_getArray_3_4 -#define ucmp8_getCount ucmp8_getCount_3_4 -#define ucmp8_getIndex ucmp8_getIndex_3_4 -#define ucmp8_getkBlockCount ucmp8_getkBlockCount_3_4 -#define ucmp8_getkUnicodeCount ucmp8_getkUnicodeCount_3_4 -#define ucmp8_init ucmp8_init_3_4 -#define ucmp8_initAdopt ucmp8_initAdopt_3_4 -#define ucmp8_initAlias ucmp8_initAlias_3_4 -#define ucmp8_initBogus ucmp8_initBogus_3_4 -#define ucmp8_initFromData ucmp8_initFromData_3_4 -#define ucmp8_isBogus ucmp8_isBogus_3_4 -#define ucmp8_open ucmp8_open_3_4 -#define ucmp8_openAdopt ucmp8_openAdopt_3_4 -#define ucmp8_openAlias ucmp8_openAlias_3_4 -#define ucmp8_set ucmp8_set_3_4 -#define ucmp8_setRange ucmp8_setRange_3_4 -#define ucnv_MBCSFromUChar32 ucnv_MBCSFromUChar32_3_4 -#define ucnv_MBCSFromUnicodeWithOffsets ucnv_MBCSFromUnicodeWithOffsets_3_4 -#define ucnv_MBCSGetType ucnv_MBCSGetType_3_4 -#define ucnv_MBCSGetUnicodeSetForBytes ucnv_MBCSGetUnicodeSetForBytes_3_4 -#define ucnv_MBCSGetUnicodeSetForUnicode ucnv_MBCSGetUnicodeSetForUnicode_3_4 -#define ucnv_MBCSIsLeadByte ucnv_MBCSIsLeadByte_3_4 -#define ucnv_MBCSSimpleGetNextUChar ucnv_MBCSSimpleGetNextUChar_3_4 -#define ucnv_MBCSToUnicodeWithOffsets ucnv_MBCSToUnicodeWithOffsets_3_4 -#define ucnv_bld_countAvailableConverters ucnv_bld_countAvailableConverters_3_4 -#define ucnv_bld_getAvailableConverter ucnv_bld_getAvailableConverter_3_4 -#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_3_4 -#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_3_4 -#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_3_4 -#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_3_4 -#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_3_4 -#define ucnv_close ucnv_close_3_4 -#define ucnv_compareNames ucnv_compareNames_3_4 -#define ucnv_convert ucnv_convert_3_4 -#define ucnv_convertEx ucnv_convertEx_3_4 -#define ucnv_countAliases ucnv_countAliases_3_4 -#define ucnv_countAvailable ucnv_countAvailable_3_4 -#define ucnv_countStandards ucnv_countStandards_3_4 -#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_3_4 -#define ucnv_createConverter ucnv_createConverter_3_4 -#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_3_4 -#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_3_4 -#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_3_4 -#define ucnv_extContinueMatchFromU ucnv_extContinueMatchFromU_3_4 -#define ucnv_extContinueMatchToU ucnv_extContinueMatchToU_3_4 -#define ucnv_extGetUnicodeSet ucnv_extGetUnicodeSet_3_4 -#define ucnv_extInitialMatchFromU ucnv_extInitialMatchFromU_3_4 -#define ucnv_extInitialMatchToU ucnv_extInitialMatchToU_3_4 -#define ucnv_extSimpleMatchFromU ucnv_extSimpleMatchFromU_3_4 -#define ucnv_extSimpleMatchToU ucnv_extSimpleMatchToU_3_4 -#define ucnv_fixFileSeparator ucnv_fixFileSeparator_3_4 -#define ucnv_flushCache ucnv_flushCache_3_4 -#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_3_4 -#define ucnv_fromUChars ucnv_fromUChars_3_4 -#define ucnv_fromUCountPending ucnv_fromUCountPending_3_4 -#define ucnv_fromUWriteBytes ucnv_fromUWriteBytes_3_4 -#define ucnv_fromUnicode ucnv_fromUnicode_3_4 -#define ucnv_fromUnicode_UTF8 ucnv_fromUnicode_UTF8_3_4 -#define ucnv_fromUnicode_UTF8_OFFSETS_LOGIC ucnv_fromUnicode_UTF8_OFFSETS_LOGIC_3_4 -#define ucnv_getAlias ucnv_getAlias_3_4 -#define ucnv_getAliases ucnv_getAliases_3_4 -#define ucnv_getAvailableName ucnv_getAvailableName_3_4 -#define ucnv_getCCSID ucnv_getCCSID_3_4 -#define ucnv_getCanonicalName ucnv_getCanonicalName_3_4 -#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_3_4 -#define ucnv_getDefaultName ucnv_getDefaultName_3_4 -#define ucnv_getDisplayName ucnv_getDisplayName_3_4 -#define ucnv_getFromUCallBack ucnv_getFromUCallBack_3_4 -#define ucnv_getInvalidChars ucnv_getInvalidChars_3_4 -#define ucnv_getInvalidUChars ucnv_getInvalidUChars_3_4 -#define ucnv_getMaxCharSize ucnv_getMaxCharSize_3_4 -#define ucnv_getMinCharSize ucnv_getMinCharSize_3_4 -#define ucnv_getName ucnv_getName_3_4 -#define ucnv_getNextUChar ucnv_getNextUChar_3_4 -#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_3_4 -#define ucnv_getPlatform ucnv_getPlatform_3_4 -#define ucnv_getStandard ucnv_getStandard_3_4 -#define ucnv_getStandardName ucnv_getStandardName_3_4 -#define ucnv_getStarters ucnv_getStarters_3_4 -#define ucnv_getSubstChars ucnv_getSubstChars_3_4 -#define ucnv_getToUCallBack ucnv_getToUCallBack_3_4 -#define ucnv_getType ucnv_getType_3_4 -#define ucnv_getUnicodeSet ucnv_getUnicodeSet_3_4 -#define ucnv_incrementRefCount ucnv_incrementRefCount_3_4 -#define ucnv_io_countAliases ucnv_io_countAliases_3_4 -#define ucnv_io_countStandards ucnv_io_countStandards_3_4 -#define ucnv_io_countTotalAliases ucnv_io_countTotalAliases_3_4 -#define ucnv_io_getAlias ucnv_io_getAlias_3_4 -#define ucnv_io_getAliases ucnv_io_getAliases_3_4 -#define ucnv_io_getConverterName ucnv_io_getConverterName_3_4 -#define ucnv_io_stripASCIIForCompare ucnv_io_stripASCIIForCompare_3_4 -#define ucnv_io_stripEBCDICForCompare ucnv_io_stripEBCDICForCompare_3_4 -#define ucnv_isAmbiguous ucnv_isAmbiguous_3_4 -#define ucnv_load ucnv_load_3_4 -#define ucnv_loadSharedData ucnv_loadSharedData_3_4 -#define ucnv_open ucnv_open_3_4 -#define ucnv_openAllNames ucnv_openAllNames_3_4 -#define ucnv_openCCSID ucnv_openCCSID_3_4 -#define ucnv_openPackage ucnv_openPackage_3_4 -#define ucnv_openStandardNames ucnv_openStandardNames_3_4 -#define ucnv_openU ucnv_openU_3_4 -#define ucnv_reset ucnv_reset_3_4 -#define ucnv_resetFromUnicode ucnv_resetFromUnicode_3_4 -#define ucnv_resetToUnicode ucnv_resetToUnicode_3_4 -#define ucnv_safeClone ucnv_safeClone_3_4 -#define ucnv_setDefaultName ucnv_setDefaultName_3_4 -#define ucnv_setFallback ucnv_setFallback_3_4 -#define ucnv_setFromUCallBack ucnv_setFromUCallBack_3_4 -#define ucnv_setSubstChars ucnv_setSubstChars_3_4 -#define ucnv_setToUCallBack ucnv_setToUCallBack_3_4 -#define ucnv_swap ucnv_swap_3_4 -#define ucnv_swapAliases ucnv_swapAliases_3_4 -#define ucnv_toAlgorithmic ucnv_toAlgorithmic_3_4 -#define ucnv_toUChars ucnv_toUChars_3_4 -#define ucnv_toUCountPending ucnv_toUCountPending_3_4 -#define ucnv_toUWriteCodePoint ucnv_toUWriteCodePoint_3_4 -#define ucnv_toUWriteUChars ucnv_toUWriteUChars_3_4 -#define ucnv_toUnicode ucnv_toUnicode_3_4 -#define ucnv_unload ucnv_unload_3_4 -#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_3_4 -#define ucnv_usesFallback ucnv_usesFallback_3_4 -#define ucol_allocWeights ucol_allocWeights_3_4 -#define ucol_assembleTailoringTable ucol_assembleTailoringTable_3_4 -#define ucol_calcSortKey ucol_calcSortKey_3_4 -#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_3_4 -#define ucol_cloneBinary ucol_cloneBinary_3_4 -#define ucol_cloneRuleData ucol_cloneRuleData_3_4 -#define ucol_close ucol_close_3_4 -#define ucol_closeElements ucol_closeElements_3_4 -#define ucol_collatorToIdentifier ucol_collatorToIdentifier_3_4 -#define ucol_countAvailable ucol_countAvailable_3_4 -#define ucol_createElements ucol_createElements_3_4 -#define ucol_doCE ucol_doCE_3_4 -#define ucol_equal ucol_equal_3_4 -#define ucol_equals ucol_equals_3_4 -#define ucol_forgetUCA ucol_forgetUCA_3_4 -#define ucol_getAttribute ucol_getAttribute_3_4 -#define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_3_4 -#define ucol_getAvailable ucol_getAvailable_3_4 -#define ucol_getBound ucol_getBound_3_4 -#define ucol_getCEGenerator ucol_getCEGenerator_3_4 -#define ucol_getCEStrengthDifference ucol_getCEStrengthDifference_3_4 -#define ucol_getContractions ucol_getContractions_3_4 -#define ucol_getContractionsAndExpansions ucol_getContractionsAndExpansions_3_4 -#define ucol_getDisplayName ucol_getDisplayName_3_4 -#define ucol_getFirstCE ucol_getFirstCE_3_4 -#define ucol_getFunctionalEquivalent ucol_getFunctionalEquivalent_3_4 -#define ucol_getKeywordValues ucol_getKeywordValues_3_4 -#define ucol_getKeywords ucol_getKeywords_3_4 -#define ucol_getLocale ucol_getLocale_3_4 -#define ucol_getLocaleByType ucol_getLocaleByType_3_4 -#define ucol_getMaxExpansion ucol_getMaxExpansion_3_4 -#define ucol_getNextCE ucol_getNextCE_3_4 -#define ucol_getNextGenerated ucol_getNextGenerated_3_4 -#define ucol_getOffset ucol_getOffset_3_4 -#define ucol_getPrevCE ucol_getPrevCE_3_4 -#define ucol_getRules ucol_getRules_3_4 -#define ucol_getRulesEx ucol_getRulesEx_3_4 -#define ucol_getShortDefinitionString ucol_getShortDefinitionString_3_4 -#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_3_4 -#define ucol_getSortKey ucol_getSortKey_3_4 -#define ucol_getSortKeySize ucol_getSortKeySize_3_4 -#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_3_4 -#define ucol_getStrength ucol_getStrength_3_4 -#define ucol_getTailoredSet ucol_getTailoredSet_3_4 -#define ucol_getUCAVersion ucol_getUCAVersion_3_4 -#define ucol_getUnsafeSet ucol_getUnsafeSet_3_4 -#define ucol_getVariableTop ucol_getVariableTop_3_4 -#define ucol_getVersion ucol_getVersion_3_4 -#define ucol_greater ucol_greater_3_4 -#define ucol_greaterOrEqual ucol_greaterOrEqual_3_4 -#define ucol_identifierToShortString ucol_identifierToShortString_3_4 -#define ucol_initBuffers ucol_initBuffers_3_4 -#define ucol_initCollator ucol_initCollator_3_4 -#define ucol_initInverseUCA ucol_initInverseUCA_3_4 -#define ucol_initUCA ucol_initUCA_3_4 -#define ucol_inv_getGapPositions ucol_inv_getGapPositions_3_4 -#define ucol_inv_getNextCE ucol_inv_getNextCE_3_4 -#define ucol_inv_getPrevCE ucol_inv_getPrevCE_3_4 -#define ucol_isTailored ucol_isTailored_3_4 -#define ucol_keyHashCode ucol_keyHashCode_3_4 -#define ucol_mergeSortkeys ucol_mergeSortkeys_3_4 -#define ucol_next ucol_next_3_4 -#define ucol_nextSortKeyPart ucol_nextSortKeyPart_3_4 -#define ucol_nextWeight ucol_nextWeight_3_4 -#define ucol_normalizeShortDefinitionString ucol_normalizeShortDefinitionString_3_4 -#define ucol_open ucol_open_3_4 -#define ucol_openAvailableLocales ucol_openAvailableLocales_3_4 -#define ucol_openBinary ucol_openBinary_3_4 -#define ucol_openElements ucol_openElements_3_4 -#define ucol_openFromIdentifier ucol_openFromIdentifier_3_4 -#define ucol_openFromShortString ucol_openFromShortString_3_4 -#define ucol_openRules ucol_openRules_3_4 -#define ucol_open_internal ucol_open_internal_3_4 -#define ucol_prepareShortStringOpen ucol_prepareShortStringOpen_3_4 -#define ucol_previous ucol_previous_3_4 -#define ucol_primaryOrder ucol_primaryOrder_3_4 -#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_3_4 -#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_3_4 -#define ucol_reset ucol_reset_3_4 -#define ucol_restoreVariableTop ucol_restoreVariableTop_3_4 -#define ucol_safeClone ucol_safeClone_3_4 -#define ucol_secondaryOrder ucol_secondaryOrder_3_4 -#define ucol_setAttribute ucol_setAttribute_3_4 -#define ucol_setOffset ucol_setOffset_3_4 -#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_3_4 -#define ucol_setReqValidLocales ucol_setReqValidLocales_3_4 -#define ucol_setStrength ucol_setStrength_3_4 -#define ucol_setText ucol_setText_3_4 -#define ucol_setVariableTop ucol_setVariableTop_3_4 -#define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_3_4 -#define ucol_strcoll ucol_strcoll_3_4 -#define ucol_strcollIter ucol_strcollIter_3_4 -#define ucol_swap ucol_swap_3_4 -#define ucol_swapBinary ucol_swapBinary_3_4 -#define ucol_swapInverseUCA ucol_swapInverseUCA_3_4 -#define ucol_tertiaryOrder ucol_tertiaryOrder_3_4 -#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_3_4 -#define ucol_tok_closeTokenList ucol_tok_closeTokenList_3_4 -#define ucol_tok_getNextArgument ucol_tok_getNextArgument_3_4 -#define ucol_tok_initTokenList ucol_tok_initTokenList_3_4 -#define ucol_tok_parseNextToken ucol_tok_parseNextToken_3_4 -#define ucol_updateInternalState ucol_updateInternalState_3_4 -#define ucurr_forLocale ucurr_forLocale_3_4 -#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_3_4 -#define ucurr_getName ucurr_getName_3_4 -#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_3_4 -#define ucurr_openISOCurrencies ucurr_openISOCurrencies_3_4 -#define ucurr_register ucurr_register_3_4 -#define ucurr_unregister ucurr_unregister_3_4 -#define udat_applyPattern udat_applyPattern_3_4 -#define udat_clone udat_clone_3_4 -#define udat_close udat_close_3_4 -#define udat_countAvailable udat_countAvailable_3_4 -#define udat_countSymbols udat_countSymbols_3_4 -#define udat_format udat_format_3_4 -#define udat_get2DigitYearStart udat_get2DigitYearStart_3_4 -#define udat_getAvailable udat_getAvailable_3_4 -#define udat_getCalendar udat_getCalendar_3_4 -#define udat_getLocaleByType udat_getLocaleByType_3_4 -#define udat_getNumberFormat udat_getNumberFormat_3_4 -#define udat_getSymbols udat_getSymbols_3_4 -#define udat_isLenient udat_isLenient_3_4 -#define udat_open udat_open_3_4 -#define udat_parse udat_parse_3_4 -#define udat_parseCalendar udat_parseCalendar_3_4 -#define udat_set2DigitYearStart udat_set2DigitYearStart_3_4 -#define udat_setCalendar udat_setCalendar_3_4 -#define udat_setLenient udat_setLenient_3_4 -#define udat_setNumberFormat udat_setNumberFormat_3_4 -#define udat_setSymbols udat_setSymbols_3_4 -#define udat_toPattern udat_toPattern_3_4 -#define udata_checkCommonData udata_checkCommonData_3_4 -#define udata_close udata_close_3_4 -#define udata_closeSwapper udata_closeSwapper_3_4 -#define udata_getHeaderSize udata_getHeaderSize_3_4 -#define udata_getInfo udata_getInfo_3_4 -#define udata_getInfoSize udata_getInfoSize_3_4 -#define udata_getLength udata_getLength_3_4 -#define udata_getMemory udata_getMemory_3_4 -#define udata_getRawMemory udata_getRawMemory_3_4 -#define udata_open udata_open_3_4 -#define udata_openChoice udata_openChoice_3_4 -#define udata_openSwapper udata_openSwapper_3_4 -#define udata_openSwapperForInputData udata_openSwapperForInputData_3_4 -#define udata_printError udata_printError_3_4 -#define udata_readInt16 udata_readInt16_3_4 -#define udata_readInt32 udata_readInt32_3_4 -#define udata_setAppData udata_setAppData_3_4 -#define udata_setCommonData udata_setCommonData_3_4 -#define udata_setFileAccess udata_setFileAccess_3_4 -#define udata_swapDataHeader udata_swapDataHeader_3_4 -#define udata_swapInvStringBlock udata_swapInvStringBlock_3_4 -#define uenum_close uenum_close_3_4 -#define uenum_count uenum_count_3_4 -#define uenum_next uenum_next_3_4 -#define uenum_nextDefault uenum_nextDefault_3_4 -#define uenum_openCharStringsEnumeration uenum_openCharStringsEnumeration_3_4 -#define uenum_openStringEnumeration uenum_openStringEnumeration_3_4 -#define uenum_reset uenum_reset_3_4 -#define uenum_unext uenum_unext_3_4 -#define uenum_unextDefault uenum_unextDefault_3_4 -#define ufile_close_translit ufile_close_translit_3_4 -#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_3_4 -#define ufile_flush_translit ufile_flush_translit_3_4 -#define ufile_getch ufile_getch_3_4 -#define ufile_getch32 ufile_getch32_3_4 -#define ufmt_64tou ufmt_64tou_3_4 -#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_3_4 -#define ufmt_digitvalue ufmt_digitvalue_3_4 -#define ufmt_isdigit ufmt_isdigit_3_4 -#define ufmt_ptou ufmt_ptou_3_4 -#define ufmt_uto64 ufmt_uto64_3_4 -#define ufmt_utop ufmt_utop_3_4 -#define uhash_close uhash_close_3_4 -#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_3_4 -#define uhash_compareChars uhash_compareChars_3_4 -#define uhash_compareIChars uhash_compareIChars_3_4 -#define uhash_compareLong uhash_compareLong_3_4 -#define uhash_compareUChars uhash_compareUChars_3_4 -#define uhash_compareUnicodeString uhash_compareUnicodeString_3_4 -#define uhash_count uhash_count_3_4 -#define uhash_deleteHashtable uhash_deleteHashtable_3_4 -#define uhash_deleteUVector uhash_deleteUVector_3_4 -#define uhash_deleteUnicodeString uhash_deleteUnicodeString_3_4 -#define uhash_find uhash_find_3_4 -#define uhash_freeBlock uhash_freeBlock_3_4 -#define uhash_get uhash_get_3_4 -#define uhash_geti uhash_geti_3_4 -#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_3_4 -#define uhash_hashChars uhash_hashChars_3_4 -#define uhash_hashIChars uhash_hashIChars_3_4 -#define uhash_hashLong uhash_hashLong_3_4 -#define uhash_hashUChars uhash_hashUChars_3_4 -#define uhash_hashUCharsN uhash_hashUCharsN_3_4 -#define uhash_hashUnicodeString uhash_hashUnicodeString_3_4 -#define uhash_iget uhash_iget_3_4 -#define uhash_igeti uhash_igeti_3_4 -#define uhash_iput uhash_iput_3_4 -#define uhash_iputi uhash_iputi_3_4 -#define uhash_iremove uhash_iremove_3_4 -#define uhash_iremovei uhash_iremovei_3_4 -#define uhash_nextElement uhash_nextElement_3_4 -#define uhash_open uhash_open_3_4 -#define uhash_openSize uhash_openSize_3_4 -#define uhash_put uhash_put_3_4 -#define uhash_puti uhash_puti_3_4 -#define uhash_remove uhash_remove_3_4 -#define uhash_removeAll uhash_removeAll_3_4 -#define uhash_removeElement uhash_removeElement_3_4 -#define uhash_removei uhash_removei_3_4 -#define uhash_setKeyComparator uhash_setKeyComparator_3_4 -#define uhash_setKeyDeleter uhash_setKeyDeleter_3_4 -#define uhash_setKeyHasher uhash_setKeyHasher_3_4 -#define uhash_setResizePolicy uhash_setResizePolicy_3_4 -#define uhash_setValueDeleter uhash_setValueDeleter_3_4 -#define uhst_addPropertyStarts uhst_addPropertyStarts_3_4 -#define uidna_IDNToASCII uidna_IDNToASCII_3_4 -#define uidna_IDNToUnicode uidna_IDNToUnicode_3_4 -#define uidna_compare uidna_compare_3_4 -#define uidna_toASCII uidna_toASCII_3_4 -#define uidna_toUnicode uidna_toUnicode_3_4 -#define uiter_current32 uiter_current32_3_4 -#define uiter_getState uiter_getState_3_4 -#define uiter_next32 uiter_next32_3_4 -#define uiter_previous32 uiter_previous32_3_4 -#define uiter_setCharacterIterator uiter_setCharacterIterator_3_4 -#define uiter_setReplaceable uiter_setReplaceable_3_4 -#define uiter_setState uiter_setState_3_4 -#define uiter_setString uiter_setString_3_4 -#define uiter_setUTF16BE uiter_setUTF16BE_3_4 -#define uiter_setUTF8 uiter_setUTF8_3_4 -#define uloc_acceptLanguage uloc_acceptLanguage_3_4 -#define uloc_acceptLanguageFromHTTP uloc_acceptLanguageFromHTTP_3_4 -#define uloc_canonicalize uloc_canonicalize_3_4 -#define uloc_countAvailable uloc_countAvailable_3_4 -#define uloc_getAvailable uloc_getAvailable_3_4 -#define uloc_getBaseName uloc_getBaseName_3_4 -#define uloc_getCountry uloc_getCountry_3_4 -#define uloc_getDefault uloc_getDefault_3_4 -#define uloc_getDisplayCountry uloc_getDisplayCountry_3_4 -#define uloc_getDisplayKeyword uloc_getDisplayKeyword_3_4 -#define uloc_getDisplayKeywordValue uloc_getDisplayKeywordValue_3_4 -#define uloc_getDisplayLanguage uloc_getDisplayLanguage_3_4 -#define uloc_getDisplayName uloc_getDisplayName_3_4 -#define uloc_getDisplayScript uloc_getDisplayScript_3_4 -#define uloc_getDisplayVariant uloc_getDisplayVariant_3_4 -#define uloc_getISO3Country uloc_getISO3Country_3_4 -#define uloc_getISO3Language uloc_getISO3Language_3_4 -#define uloc_getISOCountries uloc_getISOCountries_3_4 -#define uloc_getISOLanguages uloc_getISOLanguages_3_4 -#define uloc_getKeywordValue uloc_getKeywordValue_3_4 -#define uloc_getLCID uloc_getLCID_3_4 -#define uloc_getLanguage uloc_getLanguage_3_4 -#define uloc_getName uloc_getName_3_4 -#define uloc_getParent uloc_getParent_3_4 -#define uloc_getScript uloc_getScript_3_4 -#define uloc_getVariant uloc_getVariant_3_4 -#define uloc_openKeywordList uloc_openKeywordList_3_4 -#define uloc_openKeywords uloc_openKeywords_3_4 -#define uloc_setDefault uloc_setDefault_3_4 -#define uloc_setKeywordValue uloc_setKeywordValue_3_4 -#define ulocdata_close ulocdata_close_3_4 -#define ulocdata_getDelimiter ulocdata_getDelimiter_3_4 -#define ulocdata_getExemplarSet ulocdata_getExemplarSet_3_4 -#define ulocdata_getMeasurementSystem ulocdata_getMeasurementSystem_3_4 -#define ulocdata_getPaperSize ulocdata_getPaperSize_3_4 -#define ulocdata_open ulocdata_open_3_4 -#define umsg_applyPattern umsg_applyPattern_3_4 -#define umsg_autoQuoteApostrophe umsg_autoQuoteApostrophe_3_4 -#define umsg_clone umsg_clone_3_4 -#define umsg_close umsg_close_3_4 -#define umsg_format umsg_format_3_4 -#define umsg_getLocale umsg_getLocale_3_4 -#define umsg_open umsg_open_3_4 -#define umsg_parse umsg_parse_3_4 -#define umsg_setLocale umsg_setLocale_3_4 -#define umsg_toPattern umsg_toPattern_3_4 -#define umsg_vformat umsg_vformat_3_4 -#define umsg_vparse umsg_vparse_3_4 -#define umtx_atomic_dec umtx_atomic_dec_3_4 -#define umtx_atomic_inc umtx_atomic_inc_3_4 -#define umtx_cleanup umtx_cleanup_3_4 -#define umtx_destroy umtx_destroy_3_4 -#define umtx_init umtx_init_3_4 -#define umtx_lock umtx_lock_3_4 -#define umtx_unlock umtx_unlock_3_4 -#define unorm_addPropertyStarts unorm_addPropertyStarts_3_4 -#define unorm_closeIter unorm_closeIter_3_4 -#define unorm_compare unorm_compare_3_4 -#define unorm_compose unorm_compose_3_4 -#define unorm_concatenate unorm_concatenate_3_4 -#define unorm_decompose unorm_decompose_3_4 -#define unorm_getCanonStartSet unorm_getCanonStartSet_3_4 -#define unorm_getCanonicalDecomposition unorm_getCanonicalDecomposition_3_4 -#define unorm_getDecomposition unorm_getDecomposition_3_4 -#define unorm_getFCD16FromCodePoint unorm_getFCD16FromCodePoint_3_4 -#define unorm_getFCDTrie unorm_getFCDTrie_3_4 -#define unorm_getNX unorm_getNX_3_4 -#define unorm_getQuickCheck unorm_getQuickCheck_3_4 -#define unorm_getUnicodeVersion unorm_getUnicodeVersion_3_4 -#define unorm_haveData unorm_haveData_3_4 -#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_3_4 -#define unorm_internalNormalize unorm_internalNormalize_3_4 -#define unorm_internalNormalizeWithNX unorm_internalNormalizeWithNX_3_4 -#define unorm_internalQuickCheck unorm_internalQuickCheck_3_4 -#define unorm_isCanonSafeStart unorm_isCanonSafeStart_3_4 -#define unorm_isNFSkippable unorm_isNFSkippable_3_4 -#define unorm_isNormalized unorm_isNormalized_3_4 -#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_3_4 -#define unorm_next unorm_next_3_4 -#define unorm_normalize unorm_normalize_3_4 -#define unorm_openIter unorm_openIter_3_4 -#define unorm_previous unorm_previous_3_4 -#define unorm_quickCheck unorm_quickCheck_3_4 -#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_3_4 -#define unorm_setIter unorm_setIter_3_4 -#define unum_applyPattern unum_applyPattern_3_4 -#define unum_clone unum_clone_3_4 -#define unum_close unum_close_3_4 -#define unum_countAvailable unum_countAvailable_3_4 -#define unum_format unum_format_3_4 -#define unum_formatDouble unum_formatDouble_3_4 -#define unum_formatDoubleCurrency unum_formatDoubleCurrency_3_4 -#define unum_formatInt64 unum_formatInt64_3_4 -#define unum_getAttribute unum_getAttribute_3_4 -#define unum_getAvailable unum_getAvailable_3_4 -#define unum_getDoubleAttribute unum_getDoubleAttribute_3_4 -#define unum_getLocaleByType unum_getLocaleByType_3_4 -#define unum_getSymbol unum_getSymbol_3_4 -#define unum_getTextAttribute unum_getTextAttribute_3_4 -#define unum_open unum_open_3_4 -#define unum_parse unum_parse_3_4 -#define unum_parseDouble unum_parseDouble_3_4 -#define unum_parseDoubleCurrency unum_parseDoubleCurrency_3_4 -#define unum_parseInt64 unum_parseInt64_3_4 -#define unum_setAttribute unum_setAttribute_3_4 -#define unum_setDoubleAttribute unum_setDoubleAttribute_3_4 -#define unum_setSymbol unum_setSymbol_3_4 -#define unum_setTextAttribute unum_setTextAttribute_3_4 -#define unum_toPattern unum_toPattern_3_4 -#define upname_swap upname_swap_3_4 -#define uprops_getSource uprops_getSource_3_4 -#define upropsvec_addPropertyStarts upropsvec_addPropertyStarts_3_4 -#define uprv_asciiFromEbcdic uprv_asciiFromEbcdic_3_4 -#define uprv_asciitolower uprv_asciitolower_3_4 -#define uprv_ceil uprv_ceil_3_4 -#define uprv_cnttab_addContraction uprv_cnttab_addContraction_3_4 -#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_3_4 -#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_3_4 -#define uprv_cnttab_clone uprv_cnttab_clone_3_4 -#define uprv_cnttab_close uprv_cnttab_close_3_4 -#define uprv_cnttab_constructTable uprv_cnttab_constructTable_3_4 -#define uprv_cnttab_findCE uprv_cnttab_findCE_3_4 -#define uprv_cnttab_findCP uprv_cnttab_findCP_3_4 -#define uprv_cnttab_getCE uprv_cnttab_getCE_3_4 -#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_3_4 -#define uprv_cnttab_isTailored uprv_cnttab_isTailored_3_4 -#define uprv_cnttab_open uprv_cnttab_open_3_4 -#define uprv_cnttab_setContraction uprv_cnttab_setContraction_3_4 -#define uprv_compareASCIIPropertyNames uprv_compareASCIIPropertyNames_3_4 -#define uprv_compareEBCDICPropertyNames uprv_compareEBCDICPropertyNames_3_4 -#define uprv_compareInvAscii uprv_compareInvAscii_3_4 -#define uprv_compareInvEbcdic uprv_compareInvEbcdic_3_4 -#define uprv_convertToLCID uprv_convertToLCID_3_4 -#define uprv_convertToPosix uprv_convertToPosix_3_4 -#define uprv_copyAscii uprv_copyAscii_3_4 -#define uprv_copyEbcdic uprv_copyEbcdic_3_4 -#define uprv_dtostr uprv_dtostr_3_4 -#define uprv_ebcdicFromAscii uprv_ebcdicFromAscii_3_4 -#define uprv_ebcdictolower uprv_ebcdictolower_3_4 -#define uprv_fabs uprv_fabs_3_4 -#define uprv_floor uprv_floor_3_4 -#define uprv_fmax uprv_fmax_3_4 -#define uprv_fmin uprv_fmin_3_4 -#define uprv_fmod uprv_fmod_3_4 -#define uprv_free uprv_free_3_4 -#define uprv_getCharNameCharacters uprv_getCharNameCharacters_3_4 -#define uprv_getDefaultCodepage uprv_getDefaultCodepage_3_4 -#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_3_4 -#define uprv_getInfinity uprv_getInfinity_3_4 -#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_3_4 -#define uprv_getMaxValues uprv_getMaxValues_3_4 -#define uprv_getNaN uprv_getNaN_3_4 -#define uprv_getStaticCurrencyName uprv_getStaticCurrencyName_3_4 -#define uprv_getUTCtime uprv_getUTCtime_3_4 -#define uprv_haveProperties uprv_haveProperties_3_4 -#define uprv_init_collIterate uprv_init_collIterate_3_4 -#define uprv_int32Comparator uprv_int32Comparator_3_4 -#define uprv_isInfinite uprv_isInfinite_3_4 -#define uprv_isInvariantString uprv_isInvariantString_3_4 -#define uprv_isInvariantUString uprv_isInvariantUString_3_4 -#define uprv_isNaN uprv_isNaN_3_4 -#define uprv_isNegativeInfinity uprv_isNegativeInfinity_3_4 -#define uprv_isPositiveInfinity uprv_isPositiveInfinity_3_4 -#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_3_4 -#define uprv_itou uprv_itou_3_4 -#define uprv_loadPropsData uprv_loadPropsData_3_4 -#define uprv_log uprv_log_3_4 -#define uprv_log10 uprv_log10_3_4 -#define uprv_malloc uprv_malloc_3_4 -#define uprv_mapFile uprv_mapFile_3_4 -#define uprv_max uprv_max_3_4 -#define uprv_maxMantissa uprv_maxMantissa_3_4 -#define uprv_min uprv_min_3_4 -#define uprv_modf uprv_modf_3_4 -#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_3_4 -#define uprv_pathIsAbsolute uprv_pathIsAbsolute_3_4 -#define uprv_pow uprv_pow_3_4 -#define uprv_pow10 uprv_pow10_3_4 -#define uprv_realloc uprv_realloc_3_4 -#define uprv_round uprv_round_3_4 -#define uprv_sortArray uprv_sortArray_3_4 -#define uprv_strCompare uprv_strCompare_3_4 -#define uprv_strdup uprv_strdup_3_4 -#define uprv_strndup uprv_strndup_3_4 -#define uprv_syntaxError uprv_syntaxError_3_4 -#define uprv_timezone uprv_timezone_3_4 -#define uprv_toupper uprv_toupper_3_4 -#define uprv_trunc uprv_trunc_3_4 -#define uprv_tzname uprv_tzname_3_4 -#define uprv_tzset uprv_tzset_3_4 -#define uprv_uca_addAnElement uprv_uca_addAnElement_3_4 -#define uprv_uca_assembleTable uprv_uca_assembleTable_3_4 -#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_3_4 -#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_3_4 -#define uprv_uca_closeTempTable uprv_uca_closeTempTable_3_4 -#define uprv_uca_getCodePointFromRaw uprv_uca_getCodePointFromRaw_3_4 -#define uprv_uca_getImplicitFromRaw uprv_uca_getImplicitFromRaw_3_4 -#define uprv_uca_getImplicitPrimary uprv_uca_getImplicitPrimary_3_4 -#define uprv_uca_getRawFromCodePoint uprv_uca_getRawFromCodePoint_3_4 -#define uprv_uca_getRawFromImplicit uprv_uca_getRawFromImplicit_3_4 -#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_3_4 -#define uprv_uca_initTempTable uprv_uca_initTempTable_3_4 -#define uprv_uint16Comparator uprv_uint16Comparator_3_4 -#define uprv_uint32Comparator uprv_uint32Comparator_3_4 -#define uprv_unmapFile uprv_unmapFile_3_4 -#define uregex_appendReplacement uregex_appendReplacement_3_4 -#define uregex_appendTail uregex_appendTail_3_4 -#define uregex_clone uregex_clone_3_4 -#define uregex_close uregex_close_3_4 -#define uregex_end uregex_end_3_4 -#define uregex_find uregex_find_3_4 -#define uregex_findNext uregex_findNext_3_4 -#define uregex_flags uregex_flags_3_4 -#define uregex_getText uregex_getText_3_4 -#define uregex_group uregex_group_3_4 -#define uregex_groupCount uregex_groupCount_3_4 -#define uregex_lookingAt uregex_lookingAt_3_4 -#define uregex_matches uregex_matches_3_4 -#define uregex_open uregex_open_3_4 -#define uregex_openC uregex_openC_3_4 -#define uregex_pattern uregex_pattern_3_4 -#define uregex_replaceAll uregex_replaceAll_3_4 -#define uregex_replaceFirst uregex_replaceFirst_3_4 -#define uregex_reset uregex_reset_3_4 -#define uregex_setText uregex_setText_3_4 -#define uregex_split uregex_split_3_4 -#define uregex_start uregex_start_3_4 -#define ures_appendResPath ures_appendResPath_3_4 -#define ures_close ures_close_3_4 -#define ures_copyResb ures_copyResb_3_4 -#define ures_countArrayItems ures_countArrayItems_3_4 -#define ures_findResource ures_findResource_3_4 -#define ures_findSubResource ures_findSubResource_3_4 -#define ures_freeResPath ures_freeResPath_3_4 -#define ures_getBinary ures_getBinary_3_4 -#define ures_getByIndex ures_getByIndex_3_4 -#define ures_getByKey ures_getByKey_3_4 -#define ures_getByKeyWithFallback ures_getByKeyWithFallback_3_4 -#define ures_getFunctionalEquivalent ures_getFunctionalEquivalent_3_4 -#define ures_getInt ures_getInt_3_4 -#define ures_getIntVector ures_getIntVector_3_4 -#define ures_getKey ures_getKey_3_4 -#define ures_getKeywordValues ures_getKeywordValues_3_4 -#define ures_getLocale ures_getLocale_3_4 -#define ures_getLocaleByType ures_getLocaleByType_3_4 -#define ures_getName ures_getName_3_4 -#define ures_getNextResource ures_getNextResource_3_4 -#define ures_getNextString ures_getNextString_3_4 -#define ures_getPath ures_getPath_3_4 -#define ures_getSize ures_getSize_3_4 -#define ures_getString ures_getString_3_4 -#define ures_getStringByIndex ures_getStringByIndex_3_4 -#define ures_getStringByKey ures_getStringByKey_3_4 -#define ures_getType ures_getType_3_4 -#define ures_getUInt ures_getUInt_3_4 -#define ures_getVersion ures_getVersion_3_4 -#define ures_getVersionNumber ures_getVersionNumber_3_4 -#define ures_hasNext ures_hasNext_3_4 -#define ures_initStackObject ures_initStackObject_3_4 -#define ures_open ures_open_3_4 -#define ures_openAvailableLocales ures_openAvailableLocales_3_4 -#define ures_openDirect ures_openDirect_3_4 -#define ures_openFillIn ures_openFillIn_3_4 -#define ures_openU ures_openU_3_4 -#define ures_resetIterator ures_resetIterator_3_4 -#define ures_swap ures_swap_3_4 -#define uscript_closeRun uscript_closeRun_3_4 -#define uscript_getCode uscript_getCode_3_4 -#define uscript_getName uscript_getName_3_4 -#define uscript_getScript uscript_getScript_3_4 -#define uscript_getShortName uscript_getShortName_3_4 -#define uscript_nextRun uscript_nextRun_3_4 -#define uscript_openRun uscript_openRun_3_4 -#define uscript_resetRun uscript_resetRun_3_4 -#define uscript_setRunText uscript_setRunText_3_4 -#define usearch_close usearch_close_3_4 -#define usearch_first usearch_first_3_4 -#define usearch_following usearch_following_3_4 -#define usearch_getAttribute usearch_getAttribute_3_4 -#define usearch_getBreakIterator usearch_getBreakIterator_3_4 -#define usearch_getCollator usearch_getCollator_3_4 -#define usearch_getMatchedLength usearch_getMatchedLength_3_4 -#define usearch_getMatchedStart usearch_getMatchedStart_3_4 -#define usearch_getMatchedText usearch_getMatchedText_3_4 -#define usearch_getOffset usearch_getOffset_3_4 -#define usearch_getPattern usearch_getPattern_3_4 -#define usearch_getText usearch_getText_3_4 -#define usearch_handleNextCanonical usearch_handleNextCanonical_3_4 -#define usearch_handleNextExact usearch_handleNextExact_3_4 -#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_3_4 -#define usearch_handlePreviousExact usearch_handlePreviousExact_3_4 -#define usearch_last usearch_last_3_4 -#define usearch_next usearch_next_3_4 -#define usearch_open usearch_open_3_4 -#define usearch_openFromCollator usearch_openFromCollator_3_4 -#define usearch_preceding usearch_preceding_3_4 -#define usearch_previous usearch_previous_3_4 -#define usearch_reset usearch_reset_3_4 -#define usearch_setAttribute usearch_setAttribute_3_4 -#define usearch_setBreakIterator usearch_setBreakIterator_3_4 -#define usearch_setCollator usearch_setCollator_3_4 -#define usearch_setOffset usearch_setOffset_3_4 -#define usearch_setPattern usearch_setPattern_3_4 -#define usearch_setText usearch_setText_3_4 -#define userv_deleteStringPair userv_deleteStringPair_3_4 -#define uset_add uset_add_3_4 -#define uset_addAll uset_addAll_3_4 -#define uset_addAllCodePoints uset_addAllCodePoints_3_4 -#define uset_addRange uset_addRange_3_4 -#define uset_addString uset_addString_3_4 -#define uset_applyIntPropertyValue uset_applyIntPropertyValue_3_4 -#define uset_applyPattern uset_applyPattern_3_4 -#define uset_applyPropertyAlias uset_applyPropertyAlias_3_4 -#define uset_charAt uset_charAt_3_4 -#define uset_clear uset_clear_3_4 -#define uset_close uset_close_3_4 -#define uset_compact uset_compact_3_4 -#define uset_complement uset_complement_3_4 -#define uset_complementAll uset_complementAll_3_4 -#define uset_contains uset_contains_3_4 -#define uset_containsAll uset_containsAll_3_4 -#define uset_containsAllCodePoints uset_containsAllCodePoints_3_4 -#define uset_containsNone uset_containsNone_3_4 -#define uset_containsRange uset_containsRange_3_4 -#define uset_containsSome uset_containsSome_3_4 -#define uset_containsString uset_containsString_3_4 -#define uset_equals uset_equals_3_4 -#define uset_getItem uset_getItem_3_4 -#define uset_getItemCount uset_getItemCount_3_4 -#define uset_getSerializedRange uset_getSerializedRange_3_4 -#define uset_getSerializedRangeCount uset_getSerializedRangeCount_3_4 -#define uset_getSerializedSet uset_getSerializedSet_3_4 -#define uset_indexOf uset_indexOf_3_4 -#define uset_isEmpty uset_isEmpty_3_4 -#define uset_open uset_open_3_4 -#define uset_openPattern uset_openPattern_3_4 -#define uset_openPatternOptions uset_openPatternOptions_3_4 -#define uset_remove uset_remove_3_4 -#define uset_removeAll uset_removeAll_3_4 -#define uset_removeRange uset_removeRange_3_4 -#define uset_removeString uset_removeString_3_4 -#define uset_resemblesPattern uset_resemblesPattern_3_4 -#define uset_retain uset_retain_3_4 -#define uset_retainAll uset_retainAll_3_4 -#define uset_serialize uset_serialize_3_4 -#define uset_serializedContains uset_serializedContains_3_4 -#define uset_set uset_set_3_4 -#define uset_setSerializedToOne uset_setSerializedToOne_3_4 -#define uset_size uset_size_3_4 -#define uset_toPattern uset_toPattern_3_4 -#define usprep_close usprep_close_3_4 -#define usprep_open usprep_open_3_4 -#define usprep_prepare usprep_prepare_3_4 -#define usprep_swap usprep_swap_3_4 -#define ustr_foldCase ustr_foldCase_3_4 -#define ustr_toLower ustr_toLower_3_4 -#define ustr_toTitle ustr_toTitle_3_4 -#define ustr_toUpper ustr_toUpper_3_4 -#define utext_char32At utext_char32At_3_4 -#define utext_clone utext_clone_3_4 -#define utext_close utext_close_3_4 -#define utext_compare utext_compare_3_4 -#define utext_copy utext_copy_3_4 -#define utext_current32 utext_current32_3_4 -#define utext_extract utext_extract_3_4 -#define utext_getNativeIndex utext_getNativeIndex_3_4 -#define utext_hasMetaData utext_hasMetaData_3_4 -#define utext_isLengthExpensive utext_isLengthExpensive_3_4 -#define utext_isWritable utext_isWritable_3_4 -#define utext_moveIndex32 utext_moveIndex32_3_4 -#define utext_nativeLength utext_nativeLength_3_4 -#define utext_next32 utext_next32_3_4 -#define utext_next32From utext_next32From_3_4 -#define utext_openReplaceable utext_openReplaceable_3_4 -#define utext_openUChars utext_openUChars_3_4 -#define utext_openUTF8 utext_openUTF8_3_4 -#define utext_openUnicodeString utext_openUnicodeString_3_4 -#define utext_previous32 utext_previous32_3_4 -#define utext_previous32From utext_previous32From_3_4 -#define utext_replace utext_replace_3_4 -#define utext_setNativeIndex utext_setNativeIndex_3_4 -#define utext_setup utext_setup_3_4 -#define utf8_appendCharSafeBody utf8_appendCharSafeBody_3_4 -#define utf8_back1SafeBody utf8_back1SafeBody_3_4 -#define utf8_countTrailBytes utf8_countTrailBytes_3_4 -#define utf8_nextCharSafeBody utf8_nextCharSafeBody_3_4 -#define utf8_prevCharSafeBody utf8_prevCharSafeBody_3_4 -#define utmscale_fromInt64 utmscale_fromInt64_3_4 -#define utmscale_getTimeScaleValue utmscale_getTimeScaleValue_3_4 -#define utmscale_toInt64 utmscale_toInt64_3_4 -#define utrace_cleanup utrace_cleanup_3_4 -#define utrace_data utrace_data_3_4 -#define utrace_entry utrace_entry_3_4 -#define utrace_exit utrace_exit_3_4 -#define utrace_format utrace_format_3_4 -#define utrace_functionName utrace_functionName_3_4 -#define utrace_getFunctions utrace_getFunctions_3_4 -#define utrace_getLevel utrace_getLevel_3_4 -#define utrace_level utrace_level_3_4 -#define utrace_setFunctions utrace_setFunctions_3_4 -#define utrace_setLevel utrace_setLevel_3_4 -#define utrace_vformat utrace_vformat_3_4 -#define utrans_clone utrans_clone_3_4 -#define utrans_close utrans_close_3_4 -#define utrans_countAvailableIDs utrans_countAvailableIDs_3_4 -#define utrans_getAvailableID utrans_getAvailableID_3_4 -#define utrans_getID utrans_getID_3_4 -#define utrans_getUnicodeID utrans_getUnicodeID_3_4 -#define utrans_open utrans_open_3_4 -#define utrans_openIDs utrans_openIDs_3_4 -#define utrans_openInverse utrans_openInverse_3_4 -#define utrans_openU utrans_openU_3_4 -#define utrans_register utrans_register_3_4 -#define utrans_rep_caseContextIterator utrans_rep_caseContextIterator_3_4 -#define utrans_setFilter utrans_setFilter_3_4 -#define utrans_stripRules utrans_stripRules_3_4 -#define utrans_trans utrans_trans_3_4 -#define utrans_transIncremental utrans_transIncremental_3_4 -#define utrans_transIncrementalUChars utrans_transIncrementalUChars_3_4 -#define utrans_transUChars utrans_transUChars_3_4 -#define utrans_unregister utrans_unregister_3_4 -#define utrans_unregisterID utrans_unregisterID_3_4 -#define utrie_clone utrie_clone_3_4 -#define utrie_close utrie_close_3_4 -#define utrie_defaultGetFoldingOffset utrie_defaultGetFoldingOffset_3_4 -#define utrie_enum utrie_enum_3_4 -#define utrie_get32 utrie_get32_3_4 -#define utrie_getData utrie_getData_3_4 -#define utrie_open utrie_open_3_4 -#define utrie_serialize utrie_serialize_3_4 -#define utrie_set32 utrie_set32_3_4 -#define utrie_setRange32 utrie_setRange32_3_4 -#define utrie_swap utrie_swap_3_4 -#define utrie_unserialize utrie_unserialize_3_4 -#define utrie_unserializeDummy utrie_unserializeDummy_3_4 +#define T_CString_int64ToString T_CString_int64ToString_3_6 +#define T_CString_integerToString T_CString_integerToString_3_6 +#define T_CString_stricmp T_CString_stricmp_3_6 +#define T_CString_stringToInteger T_CString_stringToInteger_3_6 +#define T_CString_strnicmp T_CString_strnicmp_3_6 +#define T_CString_toLowerCase T_CString_toLowerCase_3_6 +#define T_CString_toUpperCase T_CString_toUpperCase_3_6 +#define UCNV_FROM_U_CALLBACK_ESCAPE UCNV_FROM_U_CALLBACK_ESCAPE_3_6 +#define UCNV_FROM_U_CALLBACK_SKIP UCNV_FROM_U_CALLBACK_SKIP_3_6 +#define UCNV_FROM_U_CALLBACK_STOP UCNV_FROM_U_CALLBACK_STOP_3_6 +#define UCNV_FROM_U_CALLBACK_SUBSTITUTE UCNV_FROM_U_CALLBACK_SUBSTITUTE_3_6 +#define UCNV_TO_U_CALLBACK_ESCAPE UCNV_TO_U_CALLBACK_ESCAPE_3_6 +#define UCNV_TO_U_CALLBACK_SKIP UCNV_TO_U_CALLBACK_SKIP_3_6 +#define UCNV_TO_U_CALLBACK_STOP UCNV_TO_U_CALLBACK_STOP_3_6 +#define UCNV_TO_U_CALLBACK_SUBSTITUTE UCNV_TO_U_CALLBACK_SUBSTITUTE_3_6 +#define UDataMemory_createNewInstance UDataMemory_createNewInstance_3_6 +#define UDataMemory_init UDataMemory_init_3_6 +#define UDataMemory_isLoaded UDataMemory_isLoaded_3_6 +#define UDataMemory_normalizeDataPointer UDataMemory_normalizeDataPointer_3_6 +#define UDataMemory_setData UDataMemory_setData_3_6 +#define UDatamemory_assign UDatamemory_assign_3_6 +#define _ASCIIData _ASCIIData_3_6 +#define _Bocu1Data _Bocu1Data_3_6 +#define _CESU8Data _CESU8Data_3_6 +#define _HZData _HZData_3_6 +#define _IMAPData _IMAPData_3_6 +#define _ISCIIData _ISCIIData_3_6 +#define _ISO2022Data _ISO2022Data_3_6 +#define _LMBCSData1 _LMBCSData1_3_6 +#define _LMBCSData11 _LMBCSData11_3_6 +#define _LMBCSData16 _LMBCSData16_3_6 +#define _LMBCSData17 _LMBCSData17_3_6 +#define _LMBCSData18 _LMBCSData18_3_6 +#define _LMBCSData19 _LMBCSData19_3_6 +#define _LMBCSData2 _LMBCSData2_3_6 +#define _LMBCSData3 _LMBCSData3_3_6 +#define _LMBCSData4 _LMBCSData4_3_6 +#define _LMBCSData5 _LMBCSData5_3_6 +#define _LMBCSData6 _LMBCSData6_3_6 +#define _LMBCSData8 _LMBCSData8_3_6 +#define _Latin1Data _Latin1Data_3_6 +#define _MBCSData _MBCSData_3_6 +#define _SCSUData _SCSUData_3_6 +#define _UTF16BEData _UTF16BEData_3_6 +#define _UTF16Data _UTF16Data_3_6 +#define _UTF16LEData _UTF16LEData_3_6 +#define _UTF32BEData _UTF32BEData_3_6 +#define _UTF32Data _UTF32Data_3_6 +#define _UTF32LEData _UTF32LEData_3_6 +#define _UTF7Data _UTF7Data_3_6 +#define _UTF8Data _UTF8Data_3_6 +#define cmemory_cleanup cmemory_cleanup_3_6 +#define cmemory_inUse cmemory_inUse_3_6 +#define locale_getKeywords locale_getKeywords_3_6 +#define locale_get_default locale_get_default_3_6 +#define locale_set_default locale_set_default_3_6 +#define res_countArrayItems res_countArrayItems_3_6 +#define res_findResource res_findResource_3_6 +#define res_getAlias res_getAlias_3_6 +#define res_getArrayItem res_getArrayItem_3_6 +#define res_getBinary res_getBinary_3_6 +#define res_getIntVector res_getIntVector_3_6 +#define res_getResource res_getResource_3_6 +#define res_getString res_getString_3_6 +#define res_getTableItemByIndex res_getTableItemByIndex_3_6 +#define res_getTableItemByKey res_getTableItemByKey_3_6 +#define res_load res_load_3_6 +#define res_unload res_unload_3_6 +#define transliterator_cleanup transliterator_cleanup_3_6 +#define triedict_swap triedict_swap_3_6 +#define u_UCharsToChars u_UCharsToChars_3_6 +#define u_austrcpy u_austrcpy_3_6 +#define u_austrncpy u_austrncpy_3_6 +#define u_catclose u_catclose_3_6 +#define u_catgets u_catgets_3_6 +#define u_catopen u_catopen_3_6 +#define u_charAge u_charAge_3_6 +#define u_charDigitValue u_charDigitValue_3_6 +#define u_charDirection u_charDirection_3_6 +#define u_charFromName u_charFromName_3_6 +#define u_charMirror u_charMirror_3_6 +#define u_charName u_charName_3_6 +#define u_charType u_charType_3_6 +#define u_charsToUChars u_charsToUChars_3_6 +#define u_cleanup u_cleanup_3_6 +#define u_countChar32 u_countChar32_3_6 +#define u_digit u_digit_3_6 +#define u_enumCharNames u_enumCharNames_3_6 +#define u_enumCharTypes u_enumCharTypes_3_6 +#define u_errorName u_errorName_3_6 +#define u_fclose u_fclose_3_6 +#define u_feof u_feof_3_6 +#define u_fflush u_fflush_3_6 +#define u_fgetConverter u_fgetConverter_3_6 +#define u_fgetc u_fgetc_3_6 +#define u_fgetcodepage u_fgetcodepage_3_6 +#define u_fgetcx u_fgetcx_3_6 +#define u_fgetfile u_fgetfile_3_6 +#define u_fgetlocale u_fgetlocale_3_6 +#define u_fgets u_fgets_3_6 +#define u_file_read u_file_read_3_6 +#define u_file_write u_file_write_3_6 +#define u_file_write_flush u_file_write_flush_3_6 +#define u_finit u_finit_3_6 +#define u_foldCase u_foldCase_3_6 +#define u_fopen u_fopen_3_6 +#define u_forDigit u_forDigit_3_6 +#define u_formatMessage u_formatMessage_3_6 +#define u_formatMessageWithError u_formatMessageWithError_3_6 +#define u_fprintf u_fprintf_3_6 +#define u_fprintf_u u_fprintf_u_3_6 +#define u_fputc u_fputc_3_6 +#define u_fputs u_fputs_3_6 +#define u_frewind u_frewind_3_6 +#define u_fscanf u_fscanf_3_6 +#define u_fscanf_u u_fscanf_u_3_6 +#define u_fsetcodepage u_fsetcodepage_3_6 +#define u_fsetlocale u_fsetlocale_3_6 +#define u_fsettransliterator u_fsettransliterator_3_6 +#define u_fstropen u_fstropen_3_6 +#define u_fungetc u_fungetc_3_6 +#define u_getCombiningClass u_getCombiningClass_3_6 +#define u_getDataDirectory u_getDataDirectory_3_6 +#define u_getDefaultConverter u_getDefaultConverter_3_6 +#define u_getFC_NFKC_Closure u_getFC_NFKC_Closure_3_6 +#define u_getISOComment u_getISOComment_3_6 +#define u_getIntPropertyMaxValue u_getIntPropertyMaxValue_3_6 +#define u_getIntPropertyMinValue u_getIntPropertyMinValue_3_6 +#define u_getIntPropertyValue u_getIntPropertyValue_3_6 +#define u_getNumericValue u_getNumericValue_3_6 +#define u_getPropertyEnum u_getPropertyEnum_3_6 +#define u_getPropertyName u_getPropertyName_3_6 +#define u_getPropertyValueEnum u_getPropertyValueEnum_3_6 +#define u_getPropertyValueName u_getPropertyValueName_3_6 +#define u_getUnicodeProperties u_getUnicodeProperties_3_6 +#define u_getUnicodeVersion u_getUnicodeVersion_3_6 +#define u_getVersion u_getVersion_3_6 +#define u_growBufferFromStatic u_growBufferFromStatic_3_6 +#define u_hasBinaryProperty u_hasBinaryProperty_3_6 +#define u_init u_init_3_6 +#define u_isIDIgnorable u_isIDIgnorable_3_6 +#define u_isIDPart u_isIDPart_3_6 +#define u_isIDStart u_isIDStart_3_6 +#define u_isISOControl u_isISOControl_3_6 +#define u_isJavaIDPart u_isJavaIDPart_3_6 +#define u_isJavaIDStart u_isJavaIDStart_3_6 +#define u_isJavaSpaceChar u_isJavaSpaceChar_3_6 +#define u_isMirrored u_isMirrored_3_6 +#define u_isUAlphabetic u_isUAlphabetic_3_6 +#define u_isULowercase u_isULowercase_3_6 +#define u_isUUppercase u_isUUppercase_3_6 +#define u_isUWhiteSpace u_isUWhiteSpace_3_6 +#define u_isWhitespace u_isWhitespace_3_6 +#define u_isalnum u_isalnum_3_6 +#define u_isalnumPOSIX u_isalnumPOSIX_3_6 +#define u_isalpha u_isalpha_3_6 +#define u_isbase u_isbase_3_6 +#define u_isblank u_isblank_3_6 +#define u_iscntrl u_iscntrl_3_6 +#define u_isdefined u_isdefined_3_6 +#define u_isdigit u_isdigit_3_6 +#define u_isgraph u_isgraph_3_6 +#define u_isgraphPOSIX u_isgraphPOSIX_3_6 +#define u_islower u_islower_3_6 +#define u_isprint u_isprint_3_6 +#define u_isprintPOSIX u_isprintPOSIX_3_6 +#define u_ispunct u_ispunct_3_6 +#define u_isspace u_isspace_3_6 +#define u_istitle u_istitle_3_6 +#define u_isupper u_isupper_3_6 +#define u_isxdigit u_isxdigit_3_6 +#define u_lengthOfIdenticalLevelRun u_lengthOfIdenticalLevelRun_3_6 +#define u_locbund_close u_locbund_close_3_6 +#define u_locbund_getNumberFormat u_locbund_getNumberFormat_3_6 +#define u_locbund_init u_locbund_init_3_6 +#define u_memcasecmp u_memcasecmp_3_6 +#define u_memchr u_memchr_3_6 +#define u_memchr32 u_memchr32_3_6 +#define u_memcmp u_memcmp_3_6 +#define u_memcmpCodePointOrder u_memcmpCodePointOrder_3_6 +#define u_memcpy u_memcpy_3_6 +#define u_memmove u_memmove_3_6 +#define u_memrchr u_memrchr_3_6 +#define u_memrchr32 u_memrchr32_3_6 +#define u_memset u_memset_3_6 +#define u_parseMessage u_parseMessage_3_6 +#define u_parseMessageWithError u_parseMessageWithError_3_6 +#define u_printf_parse u_printf_parse_3_6 +#define u_releaseDefaultConverter u_releaseDefaultConverter_3_6 +#define u_scanf_parse u_scanf_parse_3_6 +#define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_3_6 +#define u_setDataDirectory u_setDataDirectory_3_6 +#define u_setMemoryFunctions u_setMemoryFunctions_3_6 +#define u_setMutexFunctions u_setMutexFunctions_3_6 +#define u_shapeArabic u_shapeArabic_3_6 +#define u_snprintf u_snprintf_3_6 +#define u_snprintf_u u_snprintf_u_3_6 +#define u_sprintf u_sprintf_3_6 +#define u_sprintf_u u_sprintf_u_3_6 +#define u_sscanf u_sscanf_3_6 +#define u_sscanf_u u_sscanf_u_3_6 +#define u_strCaseCompare u_strCaseCompare_3_6 +#define u_strCompare u_strCompare_3_6 +#define u_strCompareIter u_strCompareIter_3_6 +#define u_strFindFirst u_strFindFirst_3_6 +#define u_strFindLast u_strFindLast_3_6 +#define u_strFoldCase u_strFoldCase_3_6 +#define u_strFromPunycode u_strFromPunycode_3_6 +#define u_strFromUTF32 u_strFromUTF32_3_6 +#define u_strFromUTF8 u_strFromUTF8_3_6 +#define u_strFromUTF8Lenient u_strFromUTF8Lenient_3_6 +#define u_strFromUTF8WithSub u_strFromUTF8WithSub_3_6 +#define u_strFromWCS u_strFromWCS_3_6 +#define u_strHasMoreChar32Than u_strHasMoreChar32Than_3_6 +#define u_strToLower u_strToLower_3_6 +#define u_strToPunycode u_strToPunycode_3_6 +#define u_strToTitle u_strToTitle_3_6 +#define u_strToUTF32 u_strToUTF32_3_6 +#define u_strToUTF8 u_strToUTF8_3_6 +#define u_strToUTF8WithSub u_strToUTF8WithSub_3_6 +#define u_strToUpper u_strToUpper_3_6 +#define u_strToWCS u_strToWCS_3_6 +#define u_strcasecmp u_strcasecmp_3_6 +#define u_strcat u_strcat_3_6 +#define u_strchr u_strchr_3_6 +#define u_strchr32 u_strchr32_3_6 +#define u_strcmp u_strcmp_3_6 +#define u_strcmpCodePointOrder u_strcmpCodePointOrder_3_6 +#define u_strcmpFold u_strcmpFold_3_6 +#define u_strcpy u_strcpy_3_6 +#define u_strcspn u_strcspn_3_6 +#define u_strlen u_strlen_3_6 +#define u_strncasecmp u_strncasecmp_3_6 +#define u_strncat u_strncat_3_6 +#define u_strncmp u_strncmp_3_6 +#define u_strncmpCodePointOrder u_strncmpCodePointOrder_3_6 +#define u_strncpy u_strncpy_3_6 +#define u_strpbrk u_strpbrk_3_6 +#define u_strrchr u_strrchr_3_6 +#define u_strrchr32 u_strrchr32_3_6 +#define u_strrstr u_strrstr_3_6 +#define u_strspn u_strspn_3_6 +#define u_strstr u_strstr_3_6 +#define u_strtok_r u_strtok_r_3_6 +#define u_terminateChars u_terminateChars_3_6 +#define u_terminateUChar32s u_terminateUChar32s_3_6 +#define u_terminateUChars u_terminateUChars_3_6 +#define u_terminateWChars u_terminateWChars_3_6 +#define u_tolower u_tolower_3_6 +#define u_totitle u_totitle_3_6 +#define u_toupper u_toupper_3_6 +#define u_uastrcpy u_uastrcpy_3_6 +#define u_uastrncpy u_uastrncpy_3_6 +#define u_unescape u_unescape_3_6 +#define u_unescapeAt u_unescapeAt_3_6 +#define u_versionFromString u_versionFromString_3_6 +#define u_versionToString u_versionToString_3_6 +#define u_vformatMessage u_vformatMessage_3_6 +#define u_vformatMessageWithError u_vformatMessageWithError_3_6 +#define u_vfprintf u_vfprintf_3_6 +#define u_vfprintf_u u_vfprintf_u_3_6 +#define u_vfscanf u_vfscanf_3_6 +#define u_vfscanf_u u_vfscanf_u_3_6 +#define u_vparseMessage u_vparseMessage_3_6 +#define u_vparseMessageWithError u_vparseMessageWithError_3_6 +#define u_vsnprintf u_vsnprintf_3_6 +#define u_vsnprintf_u u_vsnprintf_u_3_6 +#define u_vsprintf u_vsprintf_3_6 +#define u_vsprintf_u u_vsprintf_u_3_6 +#define u_vsscanf u_vsscanf_3_6 +#define u_vsscanf_u u_vsscanf_u_3_6 +#define u_writeDiff u_writeDiff_3_6 +#define u_writeIdenticalLevelRun u_writeIdenticalLevelRun_3_6 +#define u_writeIdenticalLevelRunTwoChars u_writeIdenticalLevelRunTwoChars_3_6 +#define ubidi_addPropertyStarts ubidi_addPropertyStarts_3_6 +#define ubidi_close ubidi_close_3_6 +#define ubidi_closeProps ubidi_closeProps_3_6 +#define ubidi_countParagraphs ubidi_countParagraphs_3_6 +#define ubidi_countRuns ubidi_countRuns_3_6 +#define ubidi_getClass ubidi_getClass_3_6 +#define ubidi_getClassCallback ubidi_getClassCallback_3_6 +#define ubidi_getCustomizedClass ubidi_getCustomizedClass_3_6 +#define ubidi_getDirection ubidi_getDirection_3_6 +#define ubidi_getDummy ubidi_getDummy_3_6 +#define ubidi_getJoiningGroup ubidi_getJoiningGroup_3_6 +#define ubidi_getJoiningType ubidi_getJoiningType_3_6 +#define ubidi_getLength ubidi_getLength_3_6 +#define ubidi_getLevelAt ubidi_getLevelAt_3_6 +#define ubidi_getLevels ubidi_getLevels_3_6 +#define ubidi_getLogicalIndex ubidi_getLogicalIndex_3_6 +#define ubidi_getLogicalMap ubidi_getLogicalMap_3_6 +#define ubidi_getLogicalRun ubidi_getLogicalRun_3_6 +#define ubidi_getMaxValue ubidi_getMaxValue_3_6 +#define ubidi_getMemory ubidi_getMemory_3_6 +#define ubidi_getMirror ubidi_getMirror_3_6 +#define ubidi_getParaLevel ubidi_getParaLevel_3_6 +#define ubidi_getParagraph ubidi_getParagraph_3_6 +#define ubidi_getParagraphByIndex ubidi_getParagraphByIndex_3_6 +#define ubidi_getProcessedLength ubidi_getProcessedLength_3_6 +#define ubidi_getReorderingMode ubidi_getReorderingMode_3_6 +#define ubidi_getReorderingOptions ubidi_getReorderingOptions_3_6 +#define ubidi_getResultLength ubidi_getResultLength_3_6 +#define ubidi_getRuns ubidi_getRuns_3_6 +#define ubidi_getSingleton ubidi_getSingleton_3_6 +#define ubidi_getText ubidi_getText_3_6 +#define ubidi_getVisualIndex ubidi_getVisualIndex_3_6 +#define ubidi_getVisualMap ubidi_getVisualMap_3_6 +#define ubidi_getVisualRun ubidi_getVisualRun_3_6 +#define ubidi_invertMap ubidi_invertMap_3_6 +#define ubidi_isBidiControl ubidi_isBidiControl_3_6 +#define ubidi_isInverse ubidi_isInverse_3_6 +#define ubidi_isJoinControl ubidi_isJoinControl_3_6 +#define ubidi_isMirrored ubidi_isMirrored_3_6 +#define ubidi_isOrderParagraphsLTR ubidi_isOrderParagraphsLTR_3_6 +#define ubidi_open ubidi_open_3_6 +#define ubidi_openSized ubidi_openSized_3_6 +#define ubidi_orderParagraphsLTR ubidi_orderParagraphsLTR_3_6 +#define ubidi_reorderLogical ubidi_reorderLogical_3_6 +#define ubidi_reorderVisual ubidi_reorderVisual_3_6 +#define ubidi_setClassCallback ubidi_setClassCallback_3_6 +#define ubidi_setInverse ubidi_setInverse_3_6 +#define ubidi_setLine ubidi_setLine_3_6 +#define ubidi_setPara ubidi_setPara_3_6 +#define ubidi_setReorderingMode ubidi_setReorderingMode_3_6 +#define ubidi_setReorderingOptions ubidi_setReorderingOptions_3_6 +#define ubidi_writeReordered ubidi_writeReordered_3_6 +#define ubidi_writeReverse ubidi_writeReverse_3_6 +#define ublock_getCode ublock_getCode_3_6 +#define ubrk_close ubrk_close_3_6 +#define ubrk_countAvailable ubrk_countAvailable_3_6 +#define ubrk_current ubrk_current_3_6 +#define ubrk_first ubrk_first_3_6 +#define ubrk_following ubrk_following_3_6 +#define ubrk_getAvailable ubrk_getAvailable_3_6 +#define ubrk_getLocaleByType ubrk_getLocaleByType_3_6 +#define ubrk_getRuleStatus ubrk_getRuleStatus_3_6 +#define ubrk_getRuleStatusVec ubrk_getRuleStatusVec_3_6 +#define ubrk_isBoundary ubrk_isBoundary_3_6 +#define ubrk_last ubrk_last_3_6 +#define ubrk_next ubrk_next_3_6 +#define ubrk_open ubrk_open_3_6 +#define ubrk_openRules ubrk_openRules_3_6 +#define ubrk_preceding ubrk_preceding_3_6 +#define ubrk_previous ubrk_previous_3_6 +#define ubrk_safeClone ubrk_safeClone_3_6 +#define ubrk_setText ubrk_setText_3_6 +#define ubrk_setUText ubrk_setUText_3_6 +#define ubrk_swap ubrk_swap_3_6 +#define ucal_add ucal_add_3_6 +#define ucal_clear ucal_clear_3_6 +#define ucal_clearField ucal_clearField_3_6 +#define ucal_close ucal_close_3_6 +#define ucal_countAvailable ucal_countAvailable_3_6 +#define ucal_equivalentTo ucal_equivalentTo_3_6 +#define ucal_get ucal_get_3_6 +#define ucal_getAttribute ucal_getAttribute_3_6 +#define ucal_getAvailable ucal_getAvailable_3_6 +#define ucal_getDSTSavings ucal_getDSTSavings_3_6 +#define ucal_getDefaultTimeZone ucal_getDefaultTimeZone_3_6 +#define ucal_getGregorianChange ucal_getGregorianChange_3_6 +#define ucal_getLimit ucal_getLimit_3_6 +#define ucal_getLocaleByType ucal_getLocaleByType_3_6 +#define ucal_getMillis ucal_getMillis_3_6 +#define ucal_getNow ucal_getNow_3_6 +#define ucal_getTimeZoneDisplayName ucal_getTimeZoneDisplayName_3_6 +#define ucal_inDaylightTime ucal_inDaylightTime_3_6 +#define ucal_isSet ucal_isSet_3_6 +#define ucal_open ucal_open_3_6 +#define ucal_openCountryTimeZones ucal_openCountryTimeZones_3_6 +#define ucal_openTimeZones ucal_openTimeZones_3_6 +#define ucal_roll ucal_roll_3_6 +#define ucal_set ucal_set_3_6 +#define ucal_setAttribute ucal_setAttribute_3_6 +#define ucal_setDate ucal_setDate_3_6 +#define ucal_setDateTime ucal_setDateTime_3_6 +#define ucal_setDefaultTimeZone ucal_setDefaultTimeZone_3_6 +#define ucal_setGregorianChange ucal_setGregorianChange_3_6 +#define ucal_setMillis ucal_setMillis_3_6 +#define ucal_setTimeZone ucal_setTimeZone_3_6 +#define ucase_addCaseClosure ucase_addCaseClosure_3_6 +#define ucase_addPropertyStarts ucase_addPropertyStarts_3_6 +#define ucase_addStringCaseClosure ucase_addStringCaseClosure_3_6 +#define ucase_close ucase_close_3_6 +#define ucase_fold ucase_fold_3_6 +#define ucase_getCaseLocale ucase_getCaseLocale_3_6 +#define ucase_getDummy ucase_getDummy_3_6 +#define ucase_getSingleton ucase_getSingleton_3_6 +#define ucase_getType ucase_getType_3_6 +#define ucase_getTypeOrIgnorable ucase_getTypeOrIgnorable_3_6 +#define ucase_hasBinaryProperty ucase_hasBinaryProperty_3_6 +#define ucase_isCaseSensitive ucase_isCaseSensitive_3_6 +#define ucase_isSoftDotted ucase_isSoftDotted_3_6 +#define ucase_toFullFolding ucase_toFullFolding_3_6 +#define ucase_toFullLower ucase_toFullLower_3_6 +#define ucase_toFullTitle ucase_toFullTitle_3_6 +#define ucase_toFullUpper ucase_toFullUpper_3_6 +#define ucase_tolower ucase_tolower_3_6 +#define ucase_totitle ucase_totitle_3_6 +#define ucase_toupper ucase_toupper_3_6 +#define ucasemap_close ucasemap_close_3_6 +#define ucasemap_getLocale ucasemap_getLocale_3_6 +#define ucasemap_getOptions ucasemap_getOptions_3_6 +#define ucasemap_open ucasemap_open_3_6 +#define ucasemap_setLocale ucasemap_setLocale_3_6 +#define ucasemap_setOptions ucasemap_setOptions_3_6 +#define ucasemap_utf8ToLower ucasemap_utf8ToLower_3_6 +#define ucasemap_utf8ToUpper ucasemap_utf8ToUpper_3_6 +#define uchar_addPropertyStarts uchar_addPropertyStarts_3_6 +#define uchar_getHST uchar_getHST_3_6 +#define uchar_swapNames uchar_swapNames_3_6 +#define ucln_common_registerCleanup ucln_common_registerCleanup_3_6 +#define ucln_i18n_registerCleanup ucln_i18n_registerCleanup_3_6 +#define ucln_io_registerCleanup ucln_io_registerCleanup_3_6 +#define ucln_lib_cleanup ucln_lib_cleanup_3_6 +#define ucln_registerCleanup ucln_registerCleanup_3_6 +#define ucnv_MBCSFromUChar32 ucnv_MBCSFromUChar32_3_6 +#define ucnv_MBCSFromUnicodeWithOffsets ucnv_MBCSFromUnicodeWithOffsets_3_6 +#define ucnv_MBCSGetType ucnv_MBCSGetType_3_6 +#define ucnv_MBCSGetUnicodeSetForBytes ucnv_MBCSGetUnicodeSetForBytes_3_6 +#define ucnv_MBCSGetUnicodeSetForUnicode ucnv_MBCSGetUnicodeSetForUnicode_3_6 +#define ucnv_MBCSIsLeadByte ucnv_MBCSIsLeadByte_3_6 +#define ucnv_MBCSSimpleGetNextUChar ucnv_MBCSSimpleGetNextUChar_3_6 +#define ucnv_MBCSToUnicodeWithOffsets ucnv_MBCSToUnicodeWithOffsets_3_6 +#define ucnv_bld_countAvailableConverters ucnv_bld_countAvailableConverters_3_6 +#define ucnv_bld_getAvailableConverter ucnv_bld_getAvailableConverter_3_6 +#define ucnv_cbFromUWriteBytes ucnv_cbFromUWriteBytes_3_6 +#define ucnv_cbFromUWriteSub ucnv_cbFromUWriteSub_3_6 +#define ucnv_cbFromUWriteUChars ucnv_cbFromUWriteUChars_3_6 +#define ucnv_cbToUWriteSub ucnv_cbToUWriteSub_3_6 +#define ucnv_cbToUWriteUChars ucnv_cbToUWriteUChars_3_6 +#define ucnv_close ucnv_close_3_6 +#define ucnv_compareNames ucnv_compareNames_3_6 +#define ucnv_convert ucnv_convert_3_6 +#define ucnv_convertEx ucnv_convertEx_3_6 +#define ucnv_countAliases ucnv_countAliases_3_6 +#define ucnv_countAvailable ucnv_countAvailable_3_6 +#define ucnv_countStandards ucnv_countStandards_3_6 +#define ucnv_createAlgorithmicConverter ucnv_createAlgorithmicConverter_3_6 +#define ucnv_createConverter ucnv_createConverter_3_6 +#define ucnv_createConverterFromPackage ucnv_createConverterFromPackage_3_6 +#define ucnv_createConverterFromSharedData ucnv_createConverterFromSharedData_3_6 +#define ucnv_detectUnicodeSignature ucnv_detectUnicodeSignature_3_6 +#define ucnv_extContinueMatchFromU ucnv_extContinueMatchFromU_3_6 +#define ucnv_extContinueMatchToU ucnv_extContinueMatchToU_3_6 +#define ucnv_extGetUnicodeSet ucnv_extGetUnicodeSet_3_6 +#define ucnv_extInitialMatchFromU ucnv_extInitialMatchFromU_3_6 +#define ucnv_extInitialMatchToU ucnv_extInitialMatchToU_3_6 +#define ucnv_extSimpleMatchFromU ucnv_extSimpleMatchFromU_3_6 +#define ucnv_extSimpleMatchToU ucnv_extSimpleMatchToU_3_6 +#define ucnv_fixFileSeparator ucnv_fixFileSeparator_3_6 +#define ucnv_flushCache ucnv_flushCache_3_6 +#define ucnv_fromAlgorithmic ucnv_fromAlgorithmic_3_6 +#define ucnv_fromUChars ucnv_fromUChars_3_6 +#define ucnv_fromUCountPending ucnv_fromUCountPending_3_6 +#define ucnv_fromUWriteBytes ucnv_fromUWriteBytes_3_6 +#define ucnv_fromUnicode ucnv_fromUnicode_3_6 +#define ucnv_fromUnicode_UTF8 ucnv_fromUnicode_UTF8_3_6 +#define ucnv_fromUnicode_UTF8_OFFSETS_LOGIC ucnv_fromUnicode_UTF8_OFFSETS_LOGIC_3_6 +#define ucnv_getAlias ucnv_getAlias_3_6 +#define ucnv_getAliases ucnv_getAliases_3_6 +#define ucnv_getAvailableName ucnv_getAvailableName_3_6 +#define ucnv_getCCSID ucnv_getCCSID_3_6 +#define ucnv_getCanonicalName ucnv_getCanonicalName_3_6 +#define ucnv_getCompleteUnicodeSet ucnv_getCompleteUnicodeSet_3_6 +#define ucnv_getDefaultName ucnv_getDefaultName_3_6 +#define ucnv_getDisplayName ucnv_getDisplayName_3_6 +#define ucnv_getFromUCallBack ucnv_getFromUCallBack_3_6 +#define ucnv_getInvalidChars ucnv_getInvalidChars_3_6 +#define ucnv_getInvalidUChars ucnv_getInvalidUChars_3_6 +#define ucnv_getMaxCharSize ucnv_getMaxCharSize_3_6 +#define ucnv_getMinCharSize ucnv_getMinCharSize_3_6 +#define ucnv_getName ucnv_getName_3_6 +#define ucnv_getNextUChar ucnv_getNextUChar_3_6 +#define ucnv_getNonSurrogateUnicodeSet ucnv_getNonSurrogateUnicodeSet_3_6 +#define ucnv_getPlatform ucnv_getPlatform_3_6 +#define ucnv_getStandard ucnv_getStandard_3_6 +#define ucnv_getStandardName ucnv_getStandardName_3_6 +#define ucnv_getStarters ucnv_getStarters_3_6 +#define ucnv_getSubstChars ucnv_getSubstChars_3_6 +#define ucnv_getToUCallBack ucnv_getToUCallBack_3_6 +#define ucnv_getType ucnv_getType_3_6 +#define ucnv_getUnicodeSet ucnv_getUnicodeSet_3_6 +#define ucnv_incrementRefCount ucnv_incrementRefCount_3_6 +#define ucnv_io_countTotalAliases ucnv_io_countTotalAliases_3_6 +#define ucnv_io_getConverterName ucnv_io_getConverterName_3_6 +#define ucnv_io_stripASCIIForCompare ucnv_io_stripASCIIForCompare_3_6 +#define ucnv_io_stripEBCDICForCompare ucnv_io_stripEBCDICForCompare_3_6 +#define ucnv_isAmbiguous ucnv_isAmbiguous_3_6 +#define ucnv_load ucnv_load_3_6 +#define ucnv_loadSharedData ucnv_loadSharedData_3_6 +#define ucnv_open ucnv_open_3_6 +#define ucnv_openAllNames ucnv_openAllNames_3_6 +#define ucnv_openCCSID ucnv_openCCSID_3_6 +#define ucnv_openPackage ucnv_openPackage_3_6 +#define ucnv_openStandardNames ucnv_openStandardNames_3_6 +#define ucnv_openU ucnv_openU_3_6 +#define ucnv_reset ucnv_reset_3_6 +#define ucnv_resetFromUnicode ucnv_resetFromUnicode_3_6 +#define ucnv_resetToUnicode ucnv_resetToUnicode_3_6 +#define ucnv_safeClone ucnv_safeClone_3_6 +#define ucnv_setDefaultName ucnv_setDefaultName_3_6 +#define ucnv_setFallback ucnv_setFallback_3_6 +#define ucnv_setFromUCallBack ucnv_setFromUCallBack_3_6 +#define ucnv_setSubstChars ucnv_setSubstChars_3_6 +#define ucnv_setSubstString ucnv_setSubstString_3_6 +#define ucnv_setToUCallBack ucnv_setToUCallBack_3_6 +#define ucnv_swap ucnv_swap_3_6 +#define ucnv_swapAliases ucnv_swapAliases_3_6 +#define ucnv_toAlgorithmic ucnv_toAlgorithmic_3_6 +#define ucnv_toUChars ucnv_toUChars_3_6 +#define ucnv_toUCountPending ucnv_toUCountPending_3_6 +#define ucnv_toUWriteCodePoint ucnv_toUWriteCodePoint_3_6 +#define ucnv_toUWriteUChars ucnv_toUWriteUChars_3_6 +#define ucnv_toUnicode ucnv_toUnicode_3_6 +#define ucnv_unload ucnv_unload_3_6 +#define ucnv_unloadSharedDataIfReady ucnv_unloadSharedDataIfReady_3_6 +#define ucnv_usesFallback ucnv_usesFallback_3_6 +#define ucol_allocWeights ucol_allocWeights_3_6 +#define ucol_assembleTailoringTable ucol_assembleTailoringTable_3_6 +#define ucol_calcSortKey ucol_calcSortKey_3_6 +#define ucol_calcSortKeySimpleTertiary ucol_calcSortKeySimpleTertiary_3_6 +#define ucol_cloneBinary ucol_cloneBinary_3_6 +#define ucol_cloneRuleData ucol_cloneRuleData_3_6 +#define ucol_close ucol_close_3_6 +#define ucol_closeElements ucol_closeElements_3_6 +#define ucol_collatorToIdentifier ucol_collatorToIdentifier_3_6 +#define ucol_countAvailable ucol_countAvailable_3_6 +#define ucol_createElements ucol_createElements_3_6 +#define ucol_doCE ucol_doCE_3_6 +#define ucol_equal ucol_equal_3_6 +#define ucol_equals ucol_equals_3_6 +#define ucol_forgetUCA ucol_forgetUCA_3_6 +#define ucol_getAttribute ucol_getAttribute_3_6 +#define ucol_getAttributeOrDefault ucol_getAttributeOrDefault_3_6 +#define ucol_getAvailable ucol_getAvailable_3_6 +#define ucol_getBound ucol_getBound_3_6 +#define ucol_getCEGenerator ucol_getCEGenerator_3_6 +#define ucol_getCEStrengthDifference ucol_getCEStrengthDifference_3_6 +#define ucol_getContractions ucol_getContractions_3_6 +#define ucol_getContractionsAndExpansions ucol_getContractionsAndExpansions_3_6 +#define ucol_getDisplayName ucol_getDisplayName_3_6 +#define ucol_getFirstCE ucol_getFirstCE_3_6 +#define ucol_getFunctionalEquivalent ucol_getFunctionalEquivalent_3_6 +#define ucol_getKeywordValues ucol_getKeywordValues_3_6 +#define ucol_getKeywords ucol_getKeywords_3_6 +#define ucol_getLocale ucol_getLocale_3_6 +#define ucol_getLocaleByType ucol_getLocaleByType_3_6 +#define ucol_getMaxExpansion ucol_getMaxExpansion_3_6 +#define ucol_getNextCE ucol_getNextCE_3_6 +#define ucol_getNextGenerated ucol_getNextGenerated_3_6 +#define ucol_getOffset ucol_getOffset_3_6 +#define ucol_getPrevCE ucol_getPrevCE_3_6 +#define ucol_getRules ucol_getRules_3_6 +#define ucol_getRulesEx ucol_getRulesEx_3_6 +#define ucol_getShortDefinitionString ucol_getShortDefinitionString_3_6 +#define ucol_getSimpleCEGenerator ucol_getSimpleCEGenerator_3_6 +#define ucol_getSortKey ucol_getSortKey_3_6 +#define ucol_getSortKeySize ucol_getSortKeySize_3_6 +#define ucol_getSortKeyWithAllocation ucol_getSortKeyWithAllocation_3_6 +#define ucol_getStrength ucol_getStrength_3_6 +#define ucol_getTailoredSet ucol_getTailoredSet_3_6 +#define ucol_getUCAVersion ucol_getUCAVersion_3_6 +#define ucol_getUnsafeSet ucol_getUnsafeSet_3_6 +#define ucol_getVariableTop ucol_getVariableTop_3_6 +#define ucol_getVersion ucol_getVersion_3_6 +#define ucol_greater ucol_greater_3_6 +#define ucol_greaterOrEqual ucol_greaterOrEqual_3_6 +#define ucol_identifierToShortString ucol_identifierToShortString_3_6 +#define ucol_initBuffers ucol_initBuffers_3_6 +#define ucol_initCollator ucol_initCollator_3_6 +#define ucol_initInverseUCA ucol_initInverseUCA_3_6 +#define ucol_initUCA ucol_initUCA_3_6 +#define ucol_inv_getGapPositions ucol_inv_getGapPositions_3_6 +#define ucol_inv_getNextCE ucol_inv_getNextCE_3_6 +#define ucol_inv_getPrevCE ucol_inv_getPrevCE_3_6 +#define ucol_isTailored ucol_isTailored_3_6 +#define ucol_keyHashCode ucol_keyHashCode_3_6 +#define ucol_mergeSortkeys ucol_mergeSortkeys_3_6 +#define ucol_next ucol_next_3_6 +#define ucol_nextSortKeyPart ucol_nextSortKeyPart_3_6 +#define ucol_nextWeight ucol_nextWeight_3_6 +#define ucol_normalizeShortDefinitionString ucol_normalizeShortDefinitionString_3_6 +#define ucol_open ucol_open_3_6 +#define ucol_openAvailableLocales ucol_openAvailableLocales_3_6 +#define ucol_openBinary ucol_openBinary_3_6 +#define ucol_openElements ucol_openElements_3_6 +#define ucol_openFromIdentifier ucol_openFromIdentifier_3_6 +#define ucol_openFromShortString ucol_openFromShortString_3_6 +#define ucol_openRules ucol_openRules_3_6 +#define ucol_open_internal ucol_open_internal_3_6 +#define ucol_prepareShortStringOpen ucol_prepareShortStringOpen_3_6 +#define ucol_previous ucol_previous_3_6 +#define ucol_primaryOrder ucol_primaryOrder_3_6 +#define ucol_prv_getSpecialCE ucol_prv_getSpecialCE_3_6 +#define ucol_prv_getSpecialPrevCE ucol_prv_getSpecialPrevCE_3_6 +#define ucol_reset ucol_reset_3_6 +#define ucol_restoreVariableTop ucol_restoreVariableTop_3_6 +#define ucol_safeClone ucol_safeClone_3_6 +#define ucol_secondaryOrder ucol_secondaryOrder_3_6 +#define ucol_setAttribute ucol_setAttribute_3_6 +#define ucol_setOffset ucol_setOffset_3_6 +#define ucol_setOptionsFromHeader ucol_setOptionsFromHeader_3_6 +#define ucol_setReqValidLocales ucol_setReqValidLocales_3_6 +#define ucol_setStrength ucol_setStrength_3_6 +#define ucol_setText ucol_setText_3_6 +#define ucol_setVariableTop ucol_setVariableTop_3_6 +#define ucol_shortStringToIdentifier ucol_shortStringToIdentifier_3_6 +#define ucol_strcoll ucol_strcoll_3_6 +#define ucol_strcollIter ucol_strcollIter_3_6 +#define ucol_swap ucol_swap_3_6 +#define ucol_swapBinary ucol_swapBinary_3_6 +#define ucol_swapInverseUCA ucol_swapInverseUCA_3_6 +#define ucol_tertiaryOrder ucol_tertiaryOrder_3_6 +#define ucol_tok_assembleTokenList ucol_tok_assembleTokenList_3_6 +#define ucol_tok_closeTokenList ucol_tok_closeTokenList_3_6 +#define ucol_tok_getNextArgument ucol_tok_getNextArgument_3_6 +#define ucol_tok_initTokenList ucol_tok_initTokenList_3_6 +#define ucol_tok_parseNextToken ucol_tok_parseNextToken_3_6 +#define ucol_updateInternalState ucol_updateInternalState_3_6 +#define ucsdet_close ucsdet_close_3_6 +#define ucsdet_detect ucsdet_detect_3_6 +#define ucsdet_detectAll ucsdet_detectAll_3_6 +#define ucsdet_enableInputFilter ucsdet_enableInputFilter_3_6 +#define ucsdet_getAllDetectableCharsets ucsdet_getAllDetectableCharsets_3_6 +#define ucsdet_getConfidence ucsdet_getConfidence_3_6 +#define ucsdet_getLanguage ucsdet_getLanguage_3_6 +#define ucsdet_getName ucsdet_getName_3_6 +#define ucsdet_getUChars ucsdet_getUChars_3_6 +#define ucsdet_isInputFilterEnabled ucsdet_isInputFilterEnabled_3_6 +#define ucsdet_open ucsdet_open_3_6 +#define ucsdet_setDeclaredEncoding ucsdet_setDeclaredEncoding_3_6 +#define ucsdet_setText ucsdet_setText_3_6 +#define ucurr_forLocale ucurr_forLocale_3_6 +#define ucurr_getDefaultFractionDigits ucurr_getDefaultFractionDigits_3_6 +#define ucurr_getName ucurr_getName_3_6 +#define ucurr_getRoundingIncrement ucurr_getRoundingIncrement_3_6 +#define ucurr_openISOCurrencies ucurr_openISOCurrencies_3_6 +#define ucurr_register ucurr_register_3_6 +#define ucurr_unregister ucurr_unregister_3_6 +#define udat_applyPattern udat_applyPattern_3_6 +#define udat_clone udat_clone_3_6 +#define udat_close udat_close_3_6 +#define udat_countAvailable udat_countAvailable_3_6 +#define udat_countSymbols udat_countSymbols_3_6 +#define udat_format udat_format_3_6 +#define udat_get2DigitYearStart udat_get2DigitYearStart_3_6 +#define udat_getAvailable udat_getAvailable_3_6 +#define udat_getCalendar udat_getCalendar_3_6 +#define udat_getLocaleByType udat_getLocaleByType_3_6 +#define udat_getNumberFormat udat_getNumberFormat_3_6 +#define udat_getSymbols udat_getSymbols_3_6 +#define udat_isLenient udat_isLenient_3_6 +#define udat_open udat_open_3_6 +#define udat_parse udat_parse_3_6 +#define udat_parseCalendar udat_parseCalendar_3_6 +#define udat_set2DigitYearStart udat_set2DigitYearStart_3_6 +#define udat_setCalendar udat_setCalendar_3_6 +#define udat_setLenient udat_setLenient_3_6 +#define udat_setNumberFormat udat_setNumberFormat_3_6 +#define udat_setSymbols udat_setSymbols_3_6 +#define udat_toPattern udat_toPattern_3_6 +#define udata_checkCommonData udata_checkCommonData_3_6 +#define udata_close udata_close_3_6 +#define udata_closeSwapper udata_closeSwapper_3_6 +#define udata_getHeaderSize udata_getHeaderSize_3_6 +#define udata_getInfo udata_getInfo_3_6 +#define udata_getInfoSize udata_getInfoSize_3_6 +#define udata_getLength udata_getLength_3_6 +#define udata_getMemory udata_getMemory_3_6 +#define udata_getRawMemory udata_getRawMemory_3_6 +#define udata_open udata_open_3_6 +#define udata_openChoice udata_openChoice_3_6 +#define udata_openSwapper udata_openSwapper_3_6 +#define udata_openSwapperForInputData udata_openSwapperForInputData_3_6 +#define udata_printError udata_printError_3_6 +#define udata_readInt16 udata_readInt16_3_6 +#define udata_readInt32 udata_readInt32_3_6 +#define udata_setAppData udata_setAppData_3_6 +#define udata_setCommonData udata_setCommonData_3_6 +#define udata_setFileAccess udata_setFileAccess_3_6 +#define udata_swapDataHeader udata_swapDataHeader_3_6 +#define udata_swapInvStringBlock udata_swapInvStringBlock_3_6 +#define uenum_close uenum_close_3_6 +#define uenum_count uenum_count_3_6 +#define uenum_next uenum_next_3_6 +#define uenum_nextDefault uenum_nextDefault_3_6 +#define uenum_openCharStringsEnumeration uenum_openCharStringsEnumeration_3_6 +#define uenum_openStringEnumeration uenum_openStringEnumeration_3_6 +#define uenum_reset uenum_reset_3_6 +#define uenum_unext uenum_unext_3_6 +#define uenum_unextDefault uenum_unextDefault_3_6 +#define ufile_close_translit ufile_close_translit_3_6 +#define ufile_fill_uchar_buffer ufile_fill_uchar_buffer_3_6 +#define ufile_flush_translit ufile_flush_translit_3_6 +#define ufile_getch ufile_getch_3_6 +#define ufile_getch32 ufile_getch32_3_6 +#define ufmt_64tou ufmt_64tou_3_6 +#define ufmt_defaultCPToUnicode ufmt_defaultCPToUnicode_3_6 +#define ufmt_digitvalue ufmt_digitvalue_3_6 +#define ufmt_isdigit ufmt_isdigit_3_6 +#define ufmt_ptou ufmt_ptou_3_6 +#define ufmt_uto64 ufmt_uto64_3_6 +#define ufmt_utop ufmt_utop_3_6 +#define uhash_close uhash_close_3_6 +#define uhash_compareCaselessUnicodeString uhash_compareCaselessUnicodeString_3_6 +#define uhash_compareChars uhash_compareChars_3_6 +#define uhash_compareIChars uhash_compareIChars_3_6 +#define uhash_compareLong uhash_compareLong_3_6 +#define uhash_compareUChars uhash_compareUChars_3_6 +#define uhash_compareUnicodeString uhash_compareUnicodeString_3_6 +#define uhash_count uhash_count_3_6 +#define uhash_deleteHashtable uhash_deleteHashtable_3_6 +#define uhash_deleteUVector uhash_deleteUVector_3_6 +#define uhash_deleteUnicodeString uhash_deleteUnicodeString_3_6 +#define uhash_equals uhash_equals_3_6 +#define uhash_find uhash_find_3_6 +#define uhash_freeBlock uhash_freeBlock_3_6 +#define uhash_get uhash_get_3_6 +#define uhash_geti uhash_geti_3_6 +#define uhash_hashCaselessUnicodeString uhash_hashCaselessUnicodeString_3_6 +#define uhash_hashChars uhash_hashChars_3_6 +#define uhash_hashIChars uhash_hashIChars_3_6 +#define uhash_hashLong uhash_hashLong_3_6 +#define uhash_hashUChars uhash_hashUChars_3_6 +#define uhash_hashUCharsN uhash_hashUCharsN_3_6 +#define uhash_hashUnicodeString uhash_hashUnicodeString_3_6 +#define uhash_iget uhash_iget_3_6 +#define uhash_igeti uhash_igeti_3_6 +#define uhash_init uhash_init_3_6 +#define uhash_iput uhash_iput_3_6 +#define uhash_iputi uhash_iputi_3_6 +#define uhash_iremove uhash_iremove_3_6 +#define uhash_iremovei uhash_iremovei_3_6 +#define uhash_nextElement uhash_nextElement_3_6 +#define uhash_open uhash_open_3_6 +#define uhash_openSize uhash_openSize_3_6 +#define uhash_put uhash_put_3_6 +#define uhash_puti uhash_puti_3_6 +#define uhash_remove uhash_remove_3_6 +#define uhash_removeAll uhash_removeAll_3_6 +#define uhash_removeElement uhash_removeElement_3_6 +#define uhash_removei uhash_removei_3_6 +#define uhash_setKeyComparator uhash_setKeyComparator_3_6 +#define uhash_setKeyDeleter uhash_setKeyDeleter_3_6 +#define uhash_setKeyHasher uhash_setKeyHasher_3_6 +#define uhash_setResizePolicy uhash_setResizePolicy_3_6 +#define uhash_setValueComparator uhash_setValueComparator_3_6 +#define uhash_setValueDeleter uhash_setValueDeleter_3_6 +#define uhst_addPropertyStarts uhst_addPropertyStarts_3_6 +#define uidna_IDNToASCII uidna_IDNToASCII_3_6 +#define uidna_IDNToUnicode uidna_IDNToUnicode_3_6 +#define uidna_compare uidna_compare_3_6 +#define uidna_toASCII uidna_toASCII_3_6 +#define uidna_toUnicode uidna_toUnicode_3_6 +#define uiter_current32 uiter_current32_3_6 +#define uiter_getState uiter_getState_3_6 +#define uiter_next32 uiter_next32_3_6 +#define uiter_previous32 uiter_previous32_3_6 +#define uiter_setCharacterIterator uiter_setCharacterIterator_3_6 +#define uiter_setReplaceable uiter_setReplaceable_3_6 +#define uiter_setState uiter_setState_3_6 +#define uiter_setString uiter_setString_3_6 +#define uiter_setUTF16BE uiter_setUTF16BE_3_6 +#define uiter_setUTF8 uiter_setUTF8_3_6 +#define uloc_acceptLanguage uloc_acceptLanguage_3_6 +#define uloc_acceptLanguageFromHTTP uloc_acceptLanguageFromHTTP_3_6 +#define uloc_canonicalize uloc_canonicalize_3_6 +#define uloc_countAvailable uloc_countAvailable_3_6 +#define uloc_getAvailable uloc_getAvailable_3_6 +#define uloc_getBaseName uloc_getBaseName_3_6 +#define uloc_getCountry uloc_getCountry_3_6 +#define uloc_getDefault uloc_getDefault_3_6 +#define uloc_getDisplayCountry uloc_getDisplayCountry_3_6 +#define uloc_getDisplayKeyword uloc_getDisplayKeyword_3_6 +#define uloc_getDisplayKeywordValue uloc_getDisplayKeywordValue_3_6 +#define uloc_getDisplayLanguage uloc_getDisplayLanguage_3_6 +#define uloc_getDisplayName uloc_getDisplayName_3_6 +#define uloc_getDisplayScript uloc_getDisplayScript_3_6 +#define uloc_getDisplayVariant uloc_getDisplayVariant_3_6 +#define uloc_getISO3Country uloc_getISO3Country_3_6 +#define uloc_getISO3Language uloc_getISO3Language_3_6 +#define uloc_getISOCountries uloc_getISOCountries_3_6 +#define uloc_getISOLanguages uloc_getISOLanguages_3_6 +#define uloc_getKeywordValue uloc_getKeywordValue_3_6 +#define uloc_getLCID uloc_getLCID_3_6 +#define uloc_getLanguage uloc_getLanguage_3_6 +#define uloc_getName uloc_getName_3_6 +#define uloc_getParent uloc_getParent_3_6 +#define uloc_getScript uloc_getScript_3_6 +#define uloc_getVariant uloc_getVariant_3_6 +#define uloc_openKeywordList uloc_openKeywordList_3_6 +#define uloc_openKeywords uloc_openKeywords_3_6 +#define uloc_setDefault uloc_setDefault_3_6 +#define uloc_setKeywordValue uloc_setKeywordValue_3_6 +#define ulocdata_close ulocdata_close_3_6 +#define ulocdata_getDelimiter ulocdata_getDelimiter_3_6 +#define ulocdata_getExemplarSet ulocdata_getExemplarSet_3_6 +#define ulocdata_getMeasurementSystem ulocdata_getMeasurementSystem_3_6 +#define ulocdata_getNoSubstitute ulocdata_getNoSubstitute_3_6 +#define ulocdata_getPaperSize ulocdata_getPaperSize_3_6 +#define ulocdata_open ulocdata_open_3_6 +#define ulocdata_setNoSubstitute ulocdata_setNoSubstitute_3_6 +#define umsg_applyPattern umsg_applyPattern_3_6 +#define umsg_autoQuoteApostrophe umsg_autoQuoteApostrophe_3_6 +#define umsg_clone umsg_clone_3_6 +#define umsg_close umsg_close_3_6 +#define umsg_format umsg_format_3_6 +#define umsg_getLocale umsg_getLocale_3_6 +#define umsg_open umsg_open_3_6 +#define umsg_parse umsg_parse_3_6 +#define umsg_setLocale umsg_setLocale_3_6 +#define umsg_toPattern umsg_toPattern_3_6 +#define umsg_vformat umsg_vformat_3_6 +#define umsg_vparse umsg_vparse_3_6 +#define umtx_atomic_dec umtx_atomic_dec_3_6 +#define umtx_atomic_inc umtx_atomic_inc_3_6 +#define umtx_cleanup umtx_cleanup_3_6 +#define umtx_destroy umtx_destroy_3_6 +#define umtx_init umtx_init_3_6 +#define umtx_lock umtx_lock_3_6 +#define umtx_unlock umtx_unlock_3_6 +#define unorm_addPropertyStarts unorm_addPropertyStarts_3_6 +#define unorm_closeIter unorm_closeIter_3_6 +#define unorm_compare unorm_compare_3_6 +#define unorm_compose unorm_compose_3_6 +#define unorm_concatenate unorm_concatenate_3_6 +#define unorm_decompose unorm_decompose_3_6 +#define unorm_getCanonStartSet unorm_getCanonStartSet_3_6 +#define unorm_getCanonicalDecomposition unorm_getCanonicalDecomposition_3_6 +#define unorm_getDecomposition unorm_getDecomposition_3_6 +#define unorm_getFCD16FromCodePoint unorm_getFCD16FromCodePoint_3_6 +#define unorm_getFCDTrie unorm_getFCDTrie_3_6 +#define unorm_getNX unorm_getNX_3_6 +#define unorm_getQuickCheck unorm_getQuickCheck_3_6 +#define unorm_getUnicodeVersion unorm_getUnicodeVersion_3_6 +#define unorm_haveData unorm_haveData_3_6 +#define unorm_internalIsFullCompositionExclusion unorm_internalIsFullCompositionExclusion_3_6 +#define unorm_internalNormalize unorm_internalNormalize_3_6 +#define unorm_internalNormalizeWithNX unorm_internalNormalizeWithNX_3_6 +#define unorm_internalQuickCheck unorm_internalQuickCheck_3_6 +#define unorm_isCanonSafeStart unorm_isCanonSafeStart_3_6 +#define unorm_isNFSkippable unorm_isNFSkippable_3_6 +#define unorm_isNormalized unorm_isNormalized_3_6 +#define unorm_isNormalizedWithOptions unorm_isNormalizedWithOptions_3_6 +#define unorm_next unorm_next_3_6 +#define unorm_normalize unorm_normalize_3_6 +#define unorm_openIter unorm_openIter_3_6 +#define unorm_previous unorm_previous_3_6 +#define unorm_quickCheck unorm_quickCheck_3_6 +#define unorm_quickCheckWithOptions unorm_quickCheckWithOptions_3_6 +#define unorm_setIter unorm_setIter_3_6 +#define unum_applyPattern unum_applyPattern_3_6 +#define unum_clone unum_clone_3_6 +#define unum_close unum_close_3_6 +#define unum_countAvailable unum_countAvailable_3_6 +#define unum_format unum_format_3_6 +#define unum_formatDouble unum_formatDouble_3_6 +#define unum_formatDoubleCurrency unum_formatDoubleCurrency_3_6 +#define unum_formatInt64 unum_formatInt64_3_6 +#define unum_getAttribute unum_getAttribute_3_6 +#define unum_getAvailable unum_getAvailable_3_6 +#define unum_getDoubleAttribute unum_getDoubleAttribute_3_6 +#define unum_getLocaleByType unum_getLocaleByType_3_6 +#define unum_getSymbol unum_getSymbol_3_6 +#define unum_getTextAttribute unum_getTextAttribute_3_6 +#define unum_open unum_open_3_6 +#define unum_parse unum_parse_3_6 +#define unum_parseDouble unum_parseDouble_3_6 +#define unum_parseDoubleCurrency unum_parseDoubleCurrency_3_6 +#define unum_parseInt64 unum_parseInt64_3_6 +#define unum_setAttribute unum_setAttribute_3_6 +#define unum_setDoubleAttribute unum_setDoubleAttribute_3_6 +#define unum_setSymbol unum_setSymbol_3_6 +#define unum_setTextAttribute unum_setTextAttribute_3_6 +#define unum_toPattern unum_toPattern_3_6 +#define upname_swap upname_swap_3_6 +#define uprops_getSource uprops_getSource_3_6 +#define upropsvec_addPropertyStarts upropsvec_addPropertyStarts_3_6 +#define uprv_asciiFromEbcdic uprv_asciiFromEbcdic_3_6 +#define uprv_asciitolower uprv_asciitolower_3_6 +#define uprv_ceil uprv_ceil_3_6 +#define uprv_cnttab_addContraction uprv_cnttab_addContraction_3_6 +#define uprv_cnttab_changeContraction uprv_cnttab_changeContraction_3_6 +#define uprv_cnttab_changeLastCE uprv_cnttab_changeLastCE_3_6 +#define uprv_cnttab_clone uprv_cnttab_clone_3_6 +#define uprv_cnttab_close uprv_cnttab_close_3_6 +#define uprv_cnttab_constructTable uprv_cnttab_constructTable_3_6 +#define uprv_cnttab_findCE uprv_cnttab_findCE_3_6 +#define uprv_cnttab_findCP uprv_cnttab_findCP_3_6 +#define uprv_cnttab_getCE uprv_cnttab_getCE_3_6 +#define uprv_cnttab_insertContraction uprv_cnttab_insertContraction_3_6 +#define uprv_cnttab_isTailored uprv_cnttab_isTailored_3_6 +#define uprv_cnttab_open uprv_cnttab_open_3_6 +#define uprv_cnttab_setContraction uprv_cnttab_setContraction_3_6 +#define uprv_compareASCIIPropertyNames uprv_compareASCIIPropertyNames_3_6 +#define uprv_compareEBCDICPropertyNames uprv_compareEBCDICPropertyNames_3_6 +#define uprv_compareInvAscii uprv_compareInvAscii_3_6 +#define uprv_compareInvEbcdic uprv_compareInvEbcdic_3_6 +#define uprv_convertToLCID uprv_convertToLCID_3_6 +#define uprv_convertToPosix uprv_convertToPosix_3_6 +#define uprv_copyAscii uprv_copyAscii_3_6 +#define uprv_copyEbcdic uprv_copyEbcdic_3_6 +#define uprv_ebcdicFromAscii uprv_ebcdicFromAscii_3_6 +#define uprv_ebcdictolower uprv_ebcdictolower_3_6 +#define uprv_fabs uprv_fabs_3_6 +#define uprv_floor uprv_floor_3_6 +#define uprv_fmax uprv_fmax_3_6 +#define uprv_fmin uprv_fmin_3_6 +#define uprv_fmod uprv_fmod_3_6 +#define uprv_free uprv_free_3_6 +#define uprv_getCharNameCharacters uprv_getCharNameCharacters_3_6 +#define uprv_getDefaultCodepage uprv_getDefaultCodepage_3_6 +#define uprv_getDefaultLocaleID uprv_getDefaultLocaleID_3_6 +#define uprv_getInfinity uprv_getInfinity_3_6 +#define uprv_getMaxCharNameLength uprv_getMaxCharNameLength_3_6 +#define uprv_getMaxValues uprv_getMaxValues_3_6 +#define uprv_getNaN uprv_getNaN_3_6 +#define uprv_getStaticCurrencyName uprv_getStaticCurrencyName_3_6 +#define uprv_getUTCtime uprv_getUTCtime_3_6 +#define uprv_haveProperties uprv_haveProperties_3_6 +#define uprv_init_collIterate uprv_init_collIterate_3_6 +#define uprv_int32Comparator uprv_int32Comparator_3_6 +#define uprv_isInfinite uprv_isInfinite_3_6 +#define uprv_isInvariantString uprv_isInvariantString_3_6 +#define uprv_isInvariantUString uprv_isInvariantUString_3_6 +#define uprv_isNaN uprv_isNaN_3_6 +#define uprv_isNegativeInfinity uprv_isNegativeInfinity_3_6 +#define uprv_isPositiveInfinity uprv_isPositiveInfinity_3_6 +#define uprv_isRuleWhiteSpace uprv_isRuleWhiteSpace_3_6 +#define uprv_itou uprv_itou_3_6 +#define uprv_log uprv_log_3_6 +#define uprv_malloc uprv_malloc_3_6 +#define uprv_mapFile uprv_mapFile_3_6 +#define uprv_max uprv_max_3_6 +#define uprv_maxMantissa uprv_maxMantissa_3_6 +#define uprv_min uprv_min_3_6 +#define uprv_modf uprv_modf_3_6 +#define uprv_openRuleWhiteSpaceSet uprv_openRuleWhiteSpaceSet_3_6 +#define uprv_parseCurrency uprv_parseCurrency_3_6 +#define uprv_pathIsAbsolute uprv_pathIsAbsolute_3_6 +#define uprv_pow uprv_pow_3_6 +#define uprv_pow10 uprv_pow10_3_6 +#define uprv_realloc uprv_realloc_3_6 +#define uprv_round uprv_round_3_6 +#define uprv_sortArray uprv_sortArray_3_6 +#define uprv_strCompare uprv_strCompare_3_6 +#define uprv_strdup uprv_strdup_3_6 +#define uprv_strndup uprv_strndup_3_6 +#define uprv_syntaxError uprv_syntaxError_3_6 +#define uprv_timezone uprv_timezone_3_6 +#define uprv_toupper uprv_toupper_3_6 +#define uprv_trunc uprv_trunc_3_6 +#define uprv_tzname uprv_tzname_3_6 +#define uprv_tzset uprv_tzset_3_6 +#define uprv_uca_addAnElement uprv_uca_addAnElement_3_6 +#define uprv_uca_assembleTable uprv_uca_assembleTable_3_6 +#define uprv_uca_canonicalClosure uprv_uca_canonicalClosure_3_6 +#define uprv_uca_cloneTempTable uprv_uca_cloneTempTable_3_6 +#define uprv_uca_closeTempTable uprv_uca_closeTempTable_3_6 +#define uprv_uca_getCodePointFromRaw uprv_uca_getCodePointFromRaw_3_6 +#define uprv_uca_getImplicitFromRaw uprv_uca_getImplicitFromRaw_3_6 +#define uprv_uca_getImplicitPrimary uprv_uca_getImplicitPrimary_3_6 +#define uprv_uca_getRawFromCodePoint uprv_uca_getRawFromCodePoint_3_6 +#define uprv_uca_getRawFromImplicit uprv_uca_getRawFromImplicit_3_6 +#define uprv_uca_initImplicitConstants uprv_uca_initImplicitConstants_3_6 +#define uprv_uca_initTempTable uprv_uca_initTempTable_3_6 +#define uprv_uint16Comparator uprv_uint16Comparator_3_6 +#define uprv_uint32Comparator uprv_uint32Comparator_3_6 +#define uprv_unmapFile uprv_unmapFile_3_6 +#define uregex_appendReplacement uregex_appendReplacement_3_6 +#define uregex_appendTail uregex_appendTail_3_6 +#define uregex_clone uregex_clone_3_6 +#define uregex_close uregex_close_3_6 +#define uregex_end uregex_end_3_6 +#define uregex_find uregex_find_3_6 +#define uregex_findNext uregex_findNext_3_6 +#define uregex_flags uregex_flags_3_6 +#define uregex_getText uregex_getText_3_6 +#define uregex_group uregex_group_3_6 +#define uregex_groupCount uregex_groupCount_3_6 +#define uregex_lookingAt uregex_lookingAt_3_6 +#define uregex_matches uregex_matches_3_6 +#define uregex_open uregex_open_3_6 +#define uregex_openC uregex_openC_3_6 +#define uregex_pattern uregex_pattern_3_6 +#define uregex_replaceAll uregex_replaceAll_3_6 +#define uregex_replaceFirst uregex_replaceFirst_3_6 +#define uregex_reset uregex_reset_3_6 +#define uregex_setText uregex_setText_3_6 +#define uregex_split uregex_split_3_6 +#define uregex_start uregex_start_3_6 +#define ures_clone ures_clone_3_6 +#define ures_close ures_close_3_6 +#define ures_copyResb ures_copyResb_3_6 +#define ures_countArrayItems ures_countArrayItems_3_6 +#define ures_equal ures_equal_3_6 +#define ures_findResource ures_findResource_3_6 +#define ures_findSubResource ures_findSubResource_3_6 +#define ures_getBinary ures_getBinary_3_6 +#define ures_getByIndex ures_getByIndex_3_6 +#define ures_getByKey ures_getByKey_3_6 +#define ures_getByKeyWithFallback ures_getByKeyWithFallback_3_6 +#define ures_getFunctionalEquivalent ures_getFunctionalEquivalent_3_6 +#define ures_getInt ures_getInt_3_6 +#define ures_getIntVector ures_getIntVector_3_6 +#define ures_getKey ures_getKey_3_6 +#define ures_getKeywordValues ures_getKeywordValues_3_6 +#define ures_getLocale ures_getLocale_3_6 +#define ures_getLocaleByType ures_getLocaleByType_3_6 +#define ures_getName ures_getName_3_6 +#define ures_getNextResource ures_getNextResource_3_6 +#define ures_getNextString ures_getNextString_3_6 +#define ures_getParentBundle ures_getParentBundle_3_6 +#define ures_getPath ures_getPath_3_6 +#define ures_getSize ures_getSize_3_6 +#define ures_getString ures_getString_3_6 +#define ures_getStringByIndex ures_getStringByIndex_3_6 +#define ures_getStringByKey ures_getStringByKey_3_6 +#define ures_getStringByKeyWithFallback ures_getStringByKeyWithFallback_3_6 +#define ures_getType ures_getType_3_6 +#define ures_getUInt ures_getUInt_3_6 +#define ures_getUTF8String ures_getUTF8String_3_6 +#define ures_getUTF8StringByIndex ures_getUTF8StringByIndex_3_6 +#define ures_getUTF8StringByKey ures_getUTF8StringByKey_3_6 +#define ures_getVersion ures_getVersion_3_6 +#define ures_getVersionNumber ures_getVersionNumber_3_6 +#define ures_hasNext ures_hasNext_3_6 +#define ures_initStackObject ures_initStackObject_3_6 +#define ures_open ures_open_3_6 +#define ures_openAvailableLocales ures_openAvailableLocales_3_6 +#define ures_openDirect ures_openDirect_3_6 +#define ures_openFillIn ures_openFillIn_3_6 +#define ures_openU ures_openU_3_6 +#define ures_resetIterator ures_resetIterator_3_6 +#define ures_swap ures_swap_3_6 +#define uscript_closeRun uscript_closeRun_3_6 +#define uscript_getCode uscript_getCode_3_6 +#define uscript_getName uscript_getName_3_6 +#define uscript_getScript uscript_getScript_3_6 +#define uscript_getShortName uscript_getShortName_3_6 +#define uscript_nextRun uscript_nextRun_3_6 +#define uscript_openRun uscript_openRun_3_6 +#define uscript_resetRun uscript_resetRun_3_6 +#define uscript_setRunText uscript_setRunText_3_6 +#define usearch_close usearch_close_3_6 +#define usearch_first usearch_first_3_6 +#define usearch_following usearch_following_3_6 +#define usearch_getAttribute usearch_getAttribute_3_6 +#define usearch_getBreakIterator usearch_getBreakIterator_3_6 +#define usearch_getCollator usearch_getCollator_3_6 +#define usearch_getMatchedLength usearch_getMatchedLength_3_6 +#define usearch_getMatchedStart usearch_getMatchedStart_3_6 +#define usearch_getMatchedText usearch_getMatchedText_3_6 +#define usearch_getOffset usearch_getOffset_3_6 +#define usearch_getPattern usearch_getPattern_3_6 +#define usearch_getText usearch_getText_3_6 +#define usearch_handleNextCanonical usearch_handleNextCanonical_3_6 +#define usearch_handleNextExact usearch_handleNextExact_3_6 +#define usearch_handlePreviousCanonical usearch_handlePreviousCanonical_3_6 +#define usearch_handlePreviousExact usearch_handlePreviousExact_3_6 +#define usearch_last usearch_last_3_6 +#define usearch_next usearch_next_3_6 +#define usearch_open usearch_open_3_6 +#define usearch_openFromCollator usearch_openFromCollator_3_6 +#define usearch_preceding usearch_preceding_3_6 +#define usearch_previous usearch_previous_3_6 +#define usearch_reset usearch_reset_3_6 +#define usearch_setAttribute usearch_setAttribute_3_6 +#define usearch_setBreakIterator usearch_setBreakIterator_3_6 +#define usearch_setCollator usearch_setCollator_3_6 +#define usearch_setOffset usearch_setOffset_3_6 +#define usearch_setPattern usearch_setPattern_3_6 +#define usearch_setText usearch_setText_3_6 +#define userv_deleteStringPair userv_deleteStringPair_3_6 +#define uset_add uset_add_3_6 +#define uset_addAll uset_addAll_3_6 +#define uset_addAllCodePoints uset_addAllCodePoints_3_6 +#define uset_addRange uset_addRange_3_6 +#define uset_addString uset_addString_3_6 +#define uset_applyIntPropertyValue uset_applyIntPropertyValue_3_6 +#define uset_applyPattern uset_applyPattern_3_6 +#define uset_applyPropertyAlias uset_applyPropertyAlias_3_6 +#define uset_charAt uset_charAt_3_6 +#define uset_clear uset_clear_3_6 +#define uset_close uset_close_3_6 +#define uset_compact uset_compact_3_6 +#define uset_complement uset_complement_3_6 +#define uset_complementAll uset_complementAll_3_6 +#define uset_contains uset_contains_3_6 +#define uset_containsAll uset_containsAll_3_6 +#define uset_containsAllCodePoints uset_containsAllCodePoints_3_6 +#define uset_containsNone uset_containsNone_3_6 +#define uset_containsRange uset_containsRange_3_6 +#define uset_containsSome uset_containsSome_3_6 +#define uset_containsString uset_containsString_3_6 +#define uset_equals uset_equals_3_6 +#define uset_getItem uset_getItem_3_6 +#define uset_getItemCount uset_getItemCount_3_6 +#define uset_getSerializedRange uset_getSerializedRange_3_6 +#define uset_getSerializedRangeCount uset_getSerializedRangeCount_3_6 +#define uset_getSerializedSet uset_getSerializedSet_3_6 +#define uset_indexOf uset_indexOf_3_6 +#define uset_isEmpty uset_isEmpty_3_6 +#define uset_open uset_open_3_6 +#define uset_openPattern uset_openPattern_3_6 +#define uset_openPatternOptions uset_openPatternOptions_3_6 +#define uset_remove uset_remove_3_6 +#define uset_removeAll uset_removeAll_3_6 +#define uset_removeRange uset_removeRange_3_6 +#define uset_removeString uset_removeString_3_6 +#define uset_resemblesPattern uset_resemblesPattern_3_6 +#define uset_retain uset_retain_3_6 +#define uset_retainAll uset_retainAll_3_6 +#define uset_serialize uset_serialize_3_6 +#define uset_serializedContains uset_serializedContains_3_6 +#define uset_set uset_set_3_6 +#define uset_setSerializedToOne uset_setSerializedToOne_3_6 +#define uset_size uset_size_3_6 +#define uset_toPattern uset_toPattern_3_6 +#define usprep_close usprep_close_3_6 +#define usprep_open usprep_open_3_6 +#define usprep_prepare usprep_prepare_3_6 +#define usprep_swap usprep_swap_3_6 +#define ustr_foldCase ustr_foldCase_3_6 +#define ustr_toLower ustr_toLower_3_6 +#define ustr_toTitle ustr_toTitle_3_6 +#define ustr_toUpper ustr_toUpper_3_6 +#define utext_char32At utext_char32At_3_6 +#define utext_clone utext_clone_3_6 +#define utext_close utext_close_3_6 +#define utext_copy utext_copy_3_6 +#define utext_current32 utext_current32_3_6 +#define utext_equals utext_equals_3_6 +#define utext_extract utext_extract_3_6 +#define utext_freeze utext_freeze_3_6 +#define utext_getNativeIndex utext_getNativeIndex_3_6 +#define utext_getPreviousNativeIndex utext_getPreviousNativeIndex_3_6 +#define utext_hasMetaData utext_hasMetaData_3_6 +#define utext_isLengthExpensive utext_isLengthExpensive_3_6 +#define utext_isWritable utext_isWritable_3_6 +#define utext_moveIndex32 utext_moveIndex32_3_6 +#define utext_nativeLength utext_nativeLength_3_6 +#define utext_next32 utext_next32_3_6 +#define utext_next32From utext_next32From_3_6 +#define utext_openCharacterIterator utext_openCharacterIterator_3_6 +#define utext_openConstUnicodeString utext_openConstUnicodeString_3_6 +#define utext_openReplaceable utext_openReplaceable_3_6 +#define utext_openUChars utext_openUChars_3_6 +#define utext_openUTF8 utext_openUTF8_3_6 +#define utext_openUnicodeString utext_openUnicodeString_3_6 +#define utext_previous32 utext_previous32_3_6 +#define utext_previous32From utext_previous32From_3_6 +#define utext_replace utext_replace_3_6 +#define utext_setNativeIndex utext_setNativeIndex_3_6 +#define utext_setup utext_setup_3_6 +#define utf8_appendCharSafeBody utf8_appendCharSafeBody_3_6 +#define utf8_back1SafeBody utf8_back1SafeBody_3_6 +#define utf8_countTrailBytes utf8_countTrailBytes_3_6 +#define utf8_nextCharSafeBody utf8_nextCharSafeBody_3_6 +#define utf8_prevCharSafeBody utf8_prevCharSafeBody_3_6 +#define utmscale_fromInt64 utmscale_fromInt64_3_6 +#define utmscale_getTimeScaleValue utmscale_getTimeScaleValue_3_6 +#define utmscale_toInt64 utmscale_toInt64_3_6 +#define utrace_cleanup utrace_cleanup_3_6 +#define utrace_data utrace_data_3_6 +#define utrace_entry utrace_entry_3_6 +#define utrace_exit utrace_exit_3_6 +#define utrace_format utrace_format_3_6 +#define utrace_functionName utrace_functionName_3_6 +#define utrace_getFunctions utrace_getFunctions_3_6 +#define utrace_getLevel utrace_getLevel_3_6 +#define utrace_level utrace_level_3_6 +#define utrace_setFunctions utrace_setFunctions_3_6 +#define utrace_setLevel utrace_setLevel_3_6 +#define utrace_vformat utrace_vformat_3_6 +#define utrans_clone utrans_clone_3_6 +#define utrans_close utrans_close_3_6 +#define utrans_countAvailableIDs utrans_countAvailableIDs_3_6 +#define utrans_getAvailableID utrans_getAvailableID_3_6 +#define utrans_getID utrans_getID_3_6 +#define utrans_getUnicodeID utrans_getUnicodeID_3_6 +#define utrans_open utrans_open_3_6 +#define utrans_openIDs utrans_openIDs_3_6 +#define utrans_openInverse utrans_openInverse_3_6 +#define utrans_openU utrans_openU_3_6 +#define utrans_register utrans_register_3_6 +#define utrans_rep_caseContextIterator utrans_rep_caseContextIterator_3_6 +#define utrans_setFilter utrans_setFilter_3_6 +#define utrans_stripRules utrans_stripRules_3_6 +#define utrans_trans utrans_trans_3_6 +#define utrans_transIncremental utrans_transIncremental_3_6 +#define utrans_transIncrementalUChars utrans_transIncrementalUChars_3_6 +#define utrans_transUChars utrans_transUChars_3_6 +#define utrans_unregister utrans_unregister_3_6 +#define utrans_unregisterID utrans_unregisterID_3_6 +#define utrie_clone utrie_clone_3_6 +#define utrie_close utrie_close_3_6 +#define utrie_defaultGetFoldingOffset utrie_defaultGetFoldingOffset_3_6 +#define utrie_enum utrie_enum_3_6 +#define utrie_get32 utrie_get32_3_6 +#define utrie_getData utrie_getData_3_6 +#define utrie_open utrie_open_3_6 +#define utrie_serialize utrie_serialize_3_6 +#define utrie_set32 utrie_set32_3_6 +#define utrie_setRange32 utrie_setRange32_3_6 +#define utrie_swap utrie_swap_3_6 +#define utrie_unserialize utrie_unserialize_3_6 +#define utrie_unserializeDummy utrie_unserializeDummy_3_6 /* C++ class names renaming defines */ #ifdef XP_CPLUSPLUS #if !U_HAVE_NAMESPACE -#define AbsoluteValueSubstitution AbsoluteValueSubstitution_3_4 -#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_3_4 -#define AnchorTable AnchorTable_3_4 -#define AnyTransliterator AnyTransliterator_3_4 -#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_3_4 -#define ArabicShaping ArabicShaping_3_4 -#define BasicCalendarFactory BasicCalendarFactory_3_4 -#define BinarySearchLookupTable BinarySearchLookupTable_3_4 -#define BreakDictionary BreakDictionary_3_4 -#define BreakIterator BreakIterator_3_4 -#define BuddhistCalendar BuddhistCalendar_3_4 -#define CFactory CFactory_3_4 -#define Calendar Calendar_3_4 -#define CalendarAstronomer CalendarAstronomer_3_4 -#define CalendarCache CalendarCache_3_4 -#define CalendarData CalendarData_3_4 -#define CalendarService CalendarService_3_4 -#define CanonShaping CanonShaping_3_4 -#define CanonicalIterator CanonicalIterator_3_4 -#define CaseMapTransliterator CaseMapTransliterator_3_4 -#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_3_4 -#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_3_4 -#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_3_4 -#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_3_4 -#define CharSubstitutionFilter CharSubstitutionFilter_3_4 -#define CharacterIterator CharacterIterator_3_4 -#define ChoiceFormat ChoiceFormat_3_4 -#define ClassDefFormat1Table ClassDefFormat1Table_3_4 -#define ClassDefFormat2Table ClassDefFormat2Table_3_4 -#define ClassDefinitionTable ClassDefinitionTable_3_4 -#define CollationElementIterator CollationElementIterator_3_4 -#define CollationKey CollationKey_3_4 -#define Collator Collator_3_4 -#define CollatorFactory CollatorFactory_3_4 -#define CompoundTransliterator CompoundTransliterator_3_4 -#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_3_4 -#define ContextualSubstitutionBase ContextualSubstitutionBase_3_4 -#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_3_4 -#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_3_4 -#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_3_4 -#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_3_4 -#define CoverageFormat1Table CoverageFormat1Table_3_4 -#define CoverageFormat2Table CoverageFormat2Table_3_4 -#define CoverageTable CoverageTable_3_4 -#define CurrencyAmount CurrencyAmount_3_4 -#define CurrencyFormat CurrencyFormat_3_4 -#define CurrencyUnit CurrencyUnit_3_4 -#define CursiveAttachmentSubtable CursiveAttachmentSubtable_3_4 -#define DateFormat DateFormat_3_4 -#define DateFormatSymbols DateFormatSymbols_3_4 -#define DecimalFormat DecimalFormat_3_4 -#define DecimalFormatSymbols DecimalFormatSymbols_3_4 -#define DefaultCalendarFactory DefaultCalendarFactory_3_4 -#define DefaultCharMapper DefaultCharMapper_3_4 -#define DeviceTable DeviceTable_3_4 -#define DictionaryBasedBreakIterator DictionaryBasedBreakIterator_3_4 -#define DictionaryBasedBreakIteratorTables DictionaryBasedBreakIteratorTables_3_4 -#define DigitList DigitList_3_4 -#define Entry Entry_3_4 -#define EnumToOffset EnumToOffset_3_4 -#define EscapeTransliterator EscapeTransliterator_3_4 -#define EventListener EventListener_3_4 -#define ExtensionSubtable ExtensionSubtable_3_4 -#define FeatureListTable FeatureListTable_3_4 -#define FieldPosition FieldPosition_3_4 -#define FontRuns FontRuns_3_4 -#define Format Format_3_4 -#define Format1AnchorTable Format1AnchorTable_3_4 -#define Format2AnchorTable Format2AnchorTable_3_4 -#define Format3AnchorTable Format3AnchorTable_3_4 -#define Formattable Formattable_3_4 -#define ForwardCharacterIterator ForwardCharacterIterator_3_4 -#define FractionalPartSubstitution FractionalPartSubstitution_3_4 -#define FunctionReplacer FunctionReplacer_3_4 -#define GDEFMarkFilter GDEFMarkFilter_3_4 -#define GXLayoutEngine GXLayoutEngine_3_4 -#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_3_4 -#define GlyphIterator GlyphIterator_3_4 -#define GlyphLookupTableHeader GlyphLookupTableHeader_3_4 -#define GlyphPositionAdjustments GlyphPositionAdjustments_3_4 -#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_3_4 -#define GlyphPositioningTableHeader GlyphPositioningTableHeader_3_4 -#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_3_4 -#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_3_4 -#define Grego Grego_3_4 -#define GregorianCalendar GregorianCalendar_3_4 -#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_3_4 -#define HebrewCalendar HebrewCalendar_3_4 -#define ICUBreakIteratorFactory ICUBreakIteratorFactory_3_4 -#define ICUBreakIteratorService ICUBreakIteratorService_3_4 -#define ICUCollatorFactory ICUCollatorFactory_3_4 -#define ICUCollatorService ICUCollatorService_3_4 -#define ICULocaleService ICULocaleService_3_4 -#define ICUNotifier ICUNotifier_3_4 -#define ICUNumberFormatFactory ICUNumberFormatFactory_3_4 -#define ICUNumberFormatService ICUNumberFormatService_3_4 -#define ICUResourceBundleFactory ICUResourceBundleFactory_3_4 -#define ICUService ICUService_3_4 -#define ICUServiceFactory ICUServiceFactory_3_4 -#define ICUServiceKey ICUServiceKey_3_4 -#define ICU_Utility ICU_Utility_3_4 -#define IndicClassTable IndicClassTable_3_4 -#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_3_4 -#define IndicRearrangementProcessor IndicRearrangementProcessor_3_4 -#define IndicReordering IndicReordering_3_4 -#define IntegralPartSubstitution IntegralPartSubstitution_3_4 -#define IslamicCalendar IslamicCalendar_3_4 -#define JapaneseCalendar JapaneseCalendar_3_4 -#define KernTable KernTable_3_4 -#define KeywordEnumeration KeywordEnumeration_3_4 -#define KhmerClassTable KhmerClassTable_3_4 -#define KhmerOpenTypeLayoutEngine KhmerOpenTypeLayoutEngine_3_4 -#define KhmerReordering KhmerReordering_3_4 -#define LECharMapper LECharMapper_3_4 -#define LEFontInstance LEFontInstance_3_4 -#define LEGlyphFilter LEGlyphFilter_3_4 -#define LEGlyphStorage LEGlyphStorage_3_4 -#define LEInsertionCallback LEInsertionCallback_3_4 -#define LEInsertionList LEInsertionList_3_4 -#define LXUtilities LXUtilities_3_4 -#define LayoutEngine LayoutEngine_3_4 -#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_3_4 -#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_3_4 -#define LocDataParser LocDataParser_3_4 -#define Locale Locale_3_4 -#define LocaleBased LocaleBased_3_4 -#define LocaleKey LocaleKey_3_4 -#define LocaleKeyFactory LocaleKeyFactory_3_4 -#define LocaleRuns LocaleRuns_3_4 -#define LocaleUtility LocaleUtility_3_4 -#define LocalizationInfo LocalizationInfo_3_4 -#define LookupListTable LookupListTable_3_4 -#define LookupProcessor LookupProcessor_3_4 -#define LookupSubtable LookupSubtable_3_4 -#define LookupTable LookupTable_3_4 -#define LowercaseTransliterator LowercaseTransliterator_3_4 -#define MPreFixups MPreFixups_3_4 -#define MarkArray MarkArray_3_4 -#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_3_4 -#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_3_4 -#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_3_4 -#define Math Math_3_4 -#define Measure Measure_3_4 -#define MeasureFormat MeasureFormat_3_4 -#define MeasureUnit MeasureUnit_3_4 -#define MessageFormat MessageFormat_3_4 -#define MessageFormatAdapter MessageFormatAdapter_3_4 -#define ModulusSubstitution ModulusSubstitution_3_4 -#define MoonRiseSetCoordFunc MoonRiseSetCoordFunc_3_4 -#define MoonTimeAngleFunc MoonTimeAngleFunc_3_4 -#define MorphSubtableHeader MorphSubtableHeader_3_4 -#define MorphTableHeader MorphTableHeader_3_4 -#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_3_4 -#define MultiplierSubstitution MultiplierSubstitution_3_4 -#define NFFactory NFFactory_3_4 -#define NFRule NFRule_3_4 -#define NFRuleSet NFRuleSet_3_4 -#define NFSubstitution NFSubstitution_3_4 -#define NameToEnum NameToEnum_3_4 -#define NameUnicodeTransliterator NameUnicodeTransliterator_3_4 -#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_3_4 -#define NonContiguousEnumToOffset NonContiguousEnumToOffset_3_4 -#define NormalizationTransliterator NormalizationTransliterator_3_4 -#define Normalizer Normalizer_3_4 -#define NullSubstitution NullSubstitution_3_4 -#define NullTransliterator NullTransliterator_3_4 -#define NumberFormat NumberFormat_3_4 -#define NumberFormatFactory NumberFormatFactory_3_4 -#define NumeratorSubstitution NumeratorSubstitution_3_4 -#define OlsonTimeZone OlsonTimeZone_3_4 -#define OpenTypeLayoutEngine OpenTypeLayoutEngine_3_4 -#define OpenTypeUtilities OpenTypeUtilities_3_4 -#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_3_4 -#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_3_4 -#define PairPositioningSubtable PairPositioningSubtable_3_4 -#define ParagraphLayout ParagraphLayout_3_4 -#define ParseData ParseData_3_4 -#define ParsePosition ParsePosition_3_4 -#define PropertyAliases PropertyAliases_3_4 -#define Quantifier Quantifier_3_4 -#define RBBIDataWrapper RBBIDataWrapper_3_4 -#define RBBINode RBBINode_3_4 -#define RBBIRuleBuilder RBBIRuleBuilder_3_4 -#define RBBIRuleScanner RBBIRuleScanner_3_4 -#define RBBISetBuilder RBBISetBuilder_3_4 -#define RBBIStateDescriptor RBBIStateDescriptor_3_4 -#define RBBISymbolTable RBBISymbolTable_3_4 -#define RBBISymbolTableEntry RBBISymbolTableEntry_3_4 -#define RBBITableBuilder RBBITableBuilder_3_4 -#define RangeDescriptor RangeDescriptor_3_4 -#define RegexCompile RegexCompile_3_4 -#define RegexMatcher RegexMatcher_3_4 -#define RegexPattern RegexPattern_3_4 -#define RegexStaticSets RegexStaticSets_3_4 -#define RemoveTransliterator RemoveTransliterator_3_4 -#define Replaceable Replaceable_3_4 -#define ReplaceableGlue ReplaceableGlue_3_4 -#define ResourceBundle ResourceBundle_3_4 -#define RiseSetCoordFunc RiseSetCoordFunc_3_4 -#define RuleBasedBreakIterator RuleBasedBreakIterator_3_4 -#define RuleBasedCollator RuleBasedCollator_3_4 -#define RuleBasedNumberFormat RuleBasedNumberFormat_3_4 -#define RuleBasedTransliterator RuleBasedTransliterator_3_4 -#define RuleCharacterIterator RuleCharacterIterator_3_4 -#define RuleHalf RuleHalf_3_4 -#define RunArray RunArray_3_4 -#define SameValueSubstitution SameValueSubstitution_3_4 -#define ScriptListTable ScriptListTable_3_4 -#define ScriptRunIterator ScriptRunIterator_3_4 -#define ScriptTable ScriptTable_3_4 -#define SearchIterator SearchIterator_3_4 -#define SegmentArrayProcessor SegmentArrayProcessor_3_4 -#define SegmentSingleProcessor SegmentSingleProcessor_3_4 -#define ServiceEnumeration ServiceEnumeration_3_4 -#define ServiceListener ServiceListener_3_4 -#define SimpleArrayProcessor SimpleArrayProcessor_3_4 -#define SimpleDateFormat SimpleDateFormat_3_4 -#define SimpleFactory SimpleFactory_3_4 -#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_3_4 -#define SimpleNumberFormatFactory SimpleNumberFormatFactory_3_4 -#define SimpleTimeZone SimpleTimeZone_3_4 -#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_3_4 -#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_3_4 -#define SinglePositioningSubtable SinglePositioningSubtable_3_4 -#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_3_4 -#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_3_4 -#define SingleSubstitutionSubtable SingleSubstitutionSubtable_3_4 -#define SingleTableProcessor SingleTableProcessor_3_4 -#define Spec Spec_3_4 -#define StateTableProcessor StateTableProcessor_3_4 -#define StringCharacterIterator StringCharacterIterator_3_4 -#define StringEnumeration StringEnumeration_3_4 -#define StringLocalizationInfo StringLocalizationInfo_3_4 -#define StringMatcher StringMatcher_3_4 -#define StringPair StringPair_3_4 -#define StringReplacer StringReplacer_3_4 -#define StringSearch StringSearch_3_4 -#define StyleRuns StyleRuns_3_4 -#define SubstitutionLookup SubstitutionLookup_3_4 -#define SubtableProcessor SubtableProcessor_3_4 -#define SunTimeAngleFunc SunTimeAngleFunc_3_4 -#define SymbolTable SymbolTable_3_4 -#define TZEnumeration TZEnumeration_3_4 -#define ThaiLayoutEngine ThaiLayoutEngine_3_4 -#define ThaiShaping ThaiShaping_3_4 -#define TimeZone TimeZone_3_4 -#define TitlecaseTransliterator TitlecaseTransliterator_3_4 -#define TransliterationRule TransliterationRule_3_4 -#define TransliterationRuleData TransliterationRuleData_3_4 -#define TransliterationRuleSet TransliterationRuleSet_3_4 -#define Transliterator Transliterator_3_4 -#define TransliteratorAlias TransliteratorAlias_3_4 -#define TransliteratorIDParser TransliteratorIDParser_3_4 -#define TransliteratorParser TransliteratorParser_3_4 -#define TransliteratorRegistry TransliteratorRegistry_3_4 -#define TrimmedArrayProcessor TrimmedArrayProcessor_3_4 -#define UCharCharacterIterator UCharCharacterIterator_3_4 -#define UMemory UMemory_3_4 -#define UObject UObject_3_4 -#define URegularExpression URegularExpression_3_4 -#define UStack UStack_3_4 -#define UStringEnumeration UStringEnumeration_3_4 -#define UVector UVector_3_4 -#define UVector32 UVector32_3_4 -#define UnescapeTransliterator UnescapeTransliterator_3_4 -#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_3_4 -#define UnicodeFilter UnicodeFilter_3_4 -#define UnicodeFunctor UnicodeFunctor_3_4 -#define UnicodeMatcher UnicodeMatcher_3_4 -#define UnicodeNameTransliterator UnicodeNameTransliterator_3_4 -#define UnicodeReplacer UnicodeReplacer_3_4 -#define UnicodeSet UnicodeSet_3_4 -#define UnicodeSetIterator UnicodeSetIterator_3_4 -#define UnicodeString UnicodeString_3_4 -#define UppercaseTransliterator UppercaseTransliterator_3_4 -#define ValueRecord ValueRecord_3_4 -#define ValueRuns ValueRuns_3_4 -#define locale_set_default_internal locale_set_default_internal_3_4 -#define uprv_parseCurrency uprv_parseCurrency_3_4 -#define util64_fromDouble util64_fromDouble_3_4 -#define util64_pow util64_pow_3_4 -#define util64_tou util64_tou_3_4 +#define AbsoluteValueSubstitution AbsoluteValueSubstitution_3_6 +#define AlternateSubstitutionSubtable AlternateSubstitutionSubtable_3_6 +#define AnchorTable AnchorTable_3_6 +#define AnyTransliterator AnyTransliterator_3_6 +#define ArabicOpenTypeLayoutEngine ArabicOpenTypeLayoutEngine_3_6 +#define ArabicShaping ArabicShaping_3_6 +#define BasicCalendarFactory BasicCalendarFactory_3_6 +#define BinarySearchLookupTable BinarySearchLookupTable_3_6 +#define BreakIterator BreakIterator_3_6 +#define BuddhistCalendar BuddhistCalendar_3_6 +#define BuildCompactTrieHorizontalNode BuildCompactTrieHorizontalNode_3_6 +#define BuildCompactTrieNode BuildCompactTrieNode_3_6 +#define BuildCompactTrieVerticalNode BuildCompactTrieVerticalNode_3_6 +#define CFactory CFactory_3_6 +#define Calendar Calendar_3_6 +#define CalendarAstronomer CalendarAstronomer_3_6 +#define CalendarCache CalendarCache_3_6 +#define CalendarData CalendarData_3_6 +#define CalendarService CalendarService_3_6 +#define CanonShaping CanonShaping_3_6 +#define CanonicalIterator CanonicalIterator_3_6 +#define CaseMapTransliterator CaseMapTransliterator_3_6 +#define ChainingContextualSubstitutionFormat1Subtable ChainingContextualSubstitutionFormat1Subtable_3_6 +#define ChainingContextualSubstitutionFormat2Subtable ChainingContextualSubstitutionFormat2Subtable_3_6 +#define ChainingContextualSubstitutionFormat3Subtable ChainingContextualSubstitutionFormat3Subtable_3_6 +#define ChainingContextualSubstitutionSubtable ChainingContextualSubstitutionSubtable_3_6 +#define CharSubstitutionFilter CharSubstitutionFilter_3_6 +#define CharacterIterator CharacterIterator_3_6 +#define CharsetDetector CharsetDetector_3_6 +#define CharsetMatch CharsetMatch_3_6 +#define CharsetRecog_2022 CharsetRecog_2022_3_6 +#define CharsetRecog_2022CN CharsetRecog_2022CN_3_6 +#define CharsetRecog_2022JP CharsetRecog_2022JP_3_6 +#define CharsetRecog_2022KR CharsetRecog_2022KR_3_6 +#define CharsetRecog_8859_1 CharsetRecog_8859_1_3_6 +#define CharsetRecog_8859_1_da CharsetRecog_8859_1_da_3_6 +#define CharsetRecog_8859_1_de CharsetRecog_8859_1_de_3_6 +#define CharsetRecog_8859_1_en CharsetRecog_8859_1_en_3_6 +#define CharsetRecog_8859_1_es CharsetRecog_8859_1_es_3_6 +#define CharsetRecog_8859_1_fr CharsetRecog_8859_1_fr_3_6 +#define CharsetRecog_8859_1_it CharsetRecog_8859_1_it_3_6 +#define CharsetRecog_8859_1_nl CharsetRecog_8859_1_nl_3_6 +#define CharsetRecog_8859_1_no CharsetRecog_8859_1_no_3_6 +#define CharsetRecog_8859_1_pt CharsetRecog_8859_1_pt_3_6 +#define CharsetRecog_8859_1_sv CharsetRecog_8859_1_sv_3_6 +#define CharsetRecog_8859_2 CharsetRecog_8859_2_3_6 +#define CharsetRecog_8859_2_cs CharsetRecog_8859_2_cs_3_6 +#define CharsetRecog_8859_2_hu CharsetRecog_8859_2_hu_3_6 +#define CharsetRecog_8859_2_pl CharsetRecog_8859_2_pl_3_6 +#define CharsetRecog_8859_2_ro CharsetRecog_8859_2_ro_3_6 +#define CharsetRecog_8859_5 CharsetRecog_8859_5_3_6 +#define CharsetRecog_8859_5_ru CharsetRecog_8859_5_ru_3_6 +#define CharsetRecog_8859_6 CharsetRecog_8859_6_3_6 +#define CharsetRecog_8859_6_ar CharsetRecog_8859_6_ar_3_6 +#define CharsetRecog_8859_7 CharsetRecog_8859_7_3_6 +#define CharsetRecog_8859_7_el CharsetRecog_8859_7_el_3_6 +#define CharsetRecog_8859_8 CharsetRecog_8859_8_3_6 +#define CharsetRecog_8859_8_I_he CharsetRecog_8859_8_I_he_3_6 +#define CharsetRecog_8859_8_he CharsetRecog_8859_8_he_3_6 +#define CharsetRecog_8859_9 CharsetRecog_8859_9_3_6 +#define CharsetRecog_8859_9_tr CharsetRecog_8859_9_tr_3_6 +#define CharsetRecog_KOI8_R CharsetRecog_KOI8_R_3_6 +#define CharsetRecog_UTF8 CharsetRecog_UTF8_3_6 +#define CharsetRecog_UTF_16_BE CharsetRecog_UTF_16_BE_3_6 +#define CharsetRecog_UTF_16_LE CharsetRecog_UTF_16_LE_3_6 +#define CharsetRecog_UTF_32 CharsetRecog_UTF_32_3_6 +#define CharsetRecog_UTF_32_BE CharsetRecog_UTF_32_BE_3_6 +#define CharsetRecog_UTF_32_LE CharsetRecog_UTF_32_LE_3_6 +#define CharsetRecog_Unicode CharsetRecog_Unicode_3_6 +#define CharsetRecog_big5 CharsetRecog_big5_3_6 +#define CharsetRecog_euc CharsetRecog_euc_3_6 +#define CharsetRecog_euc_jp CharsetRecog_euc_jp_3_6 +#define CharsetRecog_euc_kr CharsetRecog_euc_kr_3_6 +#define CharsetRecog_gb_18030 CharsetRecog_gb_18030_3_6 +#define CharsetRecog_mbcs CharsetRecog_mbcs_3_6 +#define CharsetRecog_sbcs CharsetRecog_sbcs_3_6 +#define CharsetRecog_sjis CharsetRecog_sjis_3_6 +#define CharsetRecog_windows_1251 CharsetRecog_windows_1251_3_6 +#define CharsetRecog_windows_1256 CharsetRecog_windows_1256_3_6 +#define CharsetRecognizer CharsetRecognizer_3_6 +#define ChoiceFormat ChoiceFormat_3_6 +#define ClassDefFormat1Table ClassDefFormat1Table_3_6 +#define ClassDefFormat2Table ClassDefFormat2Table_3_6 +#define ClassDefinitionTable ClassDefinitionTable_3_6 +#define CollationElementIterator CollationElementIterator_3_6 +#define CollationKey CollationKey_3_6 +#define Collator Collator_3_6 +#define CollatorFactory CollatorFactory_3_6 +#define CompactTrieDictionary CompactTrieDictionary_3_6 +#define CompactTrieEnumeration CompactTrieEnumeration_3_6 +#define CompoundTransliterator CompoundTransliterator_3_6 +#define ContextualGlyphSubstitutionProcessor ContextualGlyphSubstitutionProcessor_3_6 +#define ContextualSubstitutionBase ContextualSubstitutionBase_3_6 +#define ContextualSubstitutionFormat1Subtable ContextualSubstitutionFormat1Subtable_3_6 +#define ContextualSubstitutionFormat2Subtable ContextualSubstitutionFormat2Subtable_3_6 +#define ContextualSubstitutionFormat3Subtable ContextualSubstitutionFormat3Subtable_3_6 +#define ContextualSubstitutionSubtable ContextualSubstitutionSubtable_3_6 +#define CoverageFormat1Table CoverageFormat1Table_3_6 +#define CoverageFormat2Table CoverageFormat2Table_3_6 +#define CoverageTable CoverageTable_3_6 +#define CurrencyAmount CurrencyAmount_3_6 +#define CurrencyFormat CurrencyFormat_3_6 +#define CurrencyUnit CurrencyUnit_3_6 +#define CursiveAttachmentSubtable CursiveAttachmentSubtable_3_6 +#define DateFormat DateFormat_3_6 +#define DateFormatSymbols DateFormatSymbols_3_6 +#define DecimalFormat DecimalFormat_3_6 +#define DecimalFormatSymbols DecimalFormatSymbols_3_6 +#define DefaultCalendarFactory DefaultCalendarFactory_3_6 +#define DefaultCharMapper DefaultCharMapper_3_6 +#define DeviceTable DeviceTable_3_6 +#define DictionaryBreakEngine DictionaryBreakEngine_3_6 +#define DigitList DigitList_3_6 +#define Entry Entry_3_6 +#define EnumToOffset EnumToOffset_3_6 +#define EscapeTransliterator EscapeTransliterator_3_6 +#define EventListener EventListener_3_6 +#define ExtensionSubtable ExtensionSubtable_3_6 +#define FeatureListTable FeatureListTable_3_6 +#define FieldPosition FieldPosition_3_6 +#define FontRuns FontRuns_3_6 +#define Format Format_3_6 +#define Format1AnchorTable Format1AnchorTable_3_6 +#define Format2AnchorTable Format2AnchorTable_3_6 +#define Format3AnchorTable Format3AnchorTable_3_6 +#define Formattable Formattable_3_6 +#define ForwardCharacterIterator ForwardCharacterIterator_3_6 +#define FractionalPartSubstitution FractionalPartSubstitution_3_6 +#define FunctionReplacer FunctionReplacer_3_6 +#define GDEFMarkFilter GDEFMarkFilter_3_6 +#define GXLayoutEngine GXLayoutEngine_3_6 +#define GlyphDefinitionTableHeader GlyphDefinitionTableHeader_3_6 +#define GlyphIterator GlyphIterator_3_6 +#define GlyphLookupTableHeader GlyphLookupTableHeader_3_6 +#define GlyphPositionAdjustments GlyphPositionAdjustments_3_6 +#define GlyphPositioningLookupProcessor GlyphPositioningLookupProcessor_3_6 +#define GlyphPositioningTableHeader GlyphPositioningTableHeader_3_6 +#define GlyphSubstitutionLookupProcessor GlyphSubstitutionLookupProcessor_3_6 +#define GlyphSubstitutionTableHeader GlyphSubstitutionTableHeader_3_6 +#define Grego Grego_3_6 +#define GregorianCalendar GregorianCalendar_3_6 +#define HanOpenTypeLayoutEngine HanOpenTypeLayoutEngine_3_6 +#define HangulOpenTypeLayoutEngine HangulOpenTypeLayoutEngine_3_6 +#define HebrewCalendar HebrewCalendar_3_6 +#define ICUBreakIteratorFactory ICUBreakIteratorFactory_3_6 +#define ICUBreakIteratorService ICUBreakIteratorService_3_6 +#define ICUCollatorFactory ICUCollatorFactory_3_6 +#define ICUCollatorService ICUCollatorService_3_6 +#define ICULanguageBreakFactory ICULanguageBreakFactory_3_6 +#define ICULocaleService ICULocaleService_3_6 +#define ICUNotifier ICUNotifier_3_6 +#define ICUNumberFormatFactory ICUNumberFormatFactory_3_6 +#define ICUNumberFormatService ICUNumberFormatService_3_6 +#define ICUResourceBundleFactory ICUResourceBundleFactory_3_6 +#define ICUService ICUService_3_6 +#define ICUServiceFactory ICUServiceFactory_3_6 +#define ICUServiceKey ICUServiceKey_3_6 +#define ICU_Utility ICU_Utility_3_6 +#define IndicClassTable IndicClassTable_3_6 +#define IndicOpenTypeLayoutEngine IndicOpenTypeLayoutEngine_3_6 +#define IndicRearrangementProcessor IndicRearrangementProcessor_3_6 +#define IndicReordering IndicReordering_3_6 +#define InputText InputText_3_6 +#define IntegralPartSubstitution IntegralPartSubstitution_3_6 +#define IslamicCalendar IslamicCalendar_3_6 +#define IteratedChar IteratedChar_3_6 +#define JapaneseCalendar JapaneseCalendar_3_6 +#define KernTable KernTable_3_6 +#define KeywordEnumeration KeywordEnumeration_3_6 +#define KhmerClassTable KhmerClassTable_3_6 +#define KhmerOpenTypeLayoutEngine KhmerOpenTypeLayoutEngine_3_6 +#define KhmerReordering KhmerReordering_3_6 +#define LECharMapper LECharMapper_3_6 +#define LEFontInstance LEFontInstance_3_6 +#define LEGlyphFilter LEGlyphFilter_3_6 +#define LEGlyphStorage LEGlyphStorage_3_6 +#define LEInsertionCallback LEInsertionCallback_3_6 +#define LEInsertionList LEInsertionList_3_6 +#define LXUtilities LXUtilities_3_6 +#define LanguageBreakEngine LanguageBreakEngine_3_6 +#define LanguageBreakFactory LanguageBreakFactory_3_6 +#define LayoutEngine LayoutEngine_3_6 +#define LigatureSubstitutionProcessor LigatureSubstitutionProcessor_3_6 +#define LigatureSubstitutionSubtable LigatureSubstitutionSubtable_3_6 +#define LocDataParser LocDataParser_3_6 +#define Locale Locale_3_6 +#define LocaleBased LocaleBased_3_6 +#define LocaleKey LocaleKey_3_6 +#define LocaleKeyFactory LocaleKeyFactory_3_6 +#define LocaleRuns LocaleRuns_3_6 +#define LocaleUtility LocaleUtility_3_6 +#define LocalizationInfo LocalizationInfo_3_6 +#define LookupListTable LookupListTable_3_6 +#define LookupProcessor LookupProcessor_3_6 +#define LookupSubtable LookupSubtable_3_6 +#define LookupTable LookupTable_3_6 +#define LowercaseTransliterator LowercaseTransliterator_3_6 +#define MPreFixups MPreFixups_3_6 +#define MarkArray MarkArray_3_6 +#define MarkToBasePositioningSubtable MarkToBasePositioningSubtable_3_6 +#define MarkToLigaturePositioningSubtable MarkToLigaturePositioningSubtable_3_6 +#define MarkToMarkPositioningSubtable MarkToMarkPositioningSubtable_3_6 +#define Math Math_3_6 +#define Measure Measure_3_6 +#define MeasureFormat MeasureFormat_3_6 +#define MeasureUnit MeasureUnit_3_6 +#define MessageFormat MessageFormat_3_6 +#define MessageFormatAdapter MessageFormatAdapter_3_6 +#define ModulusSubstitution ModulusSubstitution_3_6 +#define MoonRiseSetCoordFunc MoonRiseSetCoordFunc_3_6 +#define MoonTimeAngleFunc MoonTimeAngleFunc_3_6 +#define MorphSubtableHeader MorphSubtableHeader_3_6 +#define MorphTableHeader MorphTableHeader_3_6 +#define MultipleSubstitutionSubtable MultipleSubstitutionSubtable_3_6 +#define MultiplierSubstitution MultiplierSubstitution_3_6 +#define MutableTrieDictionary MutableTrieDictionary_3_6 +#define MutableTrieEnumeration MutableTrieEnumeration_3_6 +#define NFFactory NFFactory_3_6 +#define NFRule NFRule_3_6 +#define NFRuleSet NFRuleSet_3_6 +#define NFSubstitution NFSubstitution_3_6 +#define NGramParser NGramParser_3_6 +#define NameToEnum NameToEnum_3_6 +#define NameUnicodeTransliterator NameUnicodeTransliterator_3_6 +#define NonContextualGlyphSubstitutionProcessor NonContextualGlyphSubstitutionProcessor_3_6 +#define NonContiguousEnumToOffset NonContiguousEnumToOffset_3_6 +#define NormalizationTransliterator NormalizationTransliterator_3_6 +#define Normalizer Normalizer_3_6 +#define NullSubstitution NullSubstitution_3_6 +#define NullTransliterator NullTransliterator_3_6 +#define NumberFormat NumberFormat_3_6 +#define NumberFormatFactory NumberFormatFactory_3_6 +#define NumeratorSubstitution NumeratorSubstitution_3_6 +#define OlsonTimeZone OlsonTimeZone_3_6 +#define OpenTypeLayoutEngine OpenTypeLayoutEngine_3_6 +#define OpenTypeUtilities OpenTypeUtilities_3_6 +#define PairPositioningFormat1Subtable PairPositioningFormat1Subtable_3_6 +#define PairPositioningFormat2Subtable PairPositioningFormat2Subtable_3_6 +#define PairPositioningSubtable PairPositioningSubtable_3_6 +#define ParagraphLayout ParagraphLayout_3_6 +#define ParseData ParseData_3_6 +#define ParsePosition ParsePosition_3_6 +#define PropertyAliases PropertyAliases_3_6 +#define Quantifier Quantifier_3_6 +#define RBBIDataWrapper RBBIDataWrapper_3_6 +#define RBBINode RBBINode_3_6 +#define RBBIRuleBuilder RBBIRuleBuilder_3_6 +#define RBBIRuleScanner RBBIRuleScanner_3_6 +#define RBBISetBuilder RBBISetBuilder_3_6 +#define RBBIStateDescriptor RBBIStateDescriptor_3_6 +#define RBBISymbolTable RBBISymbolTable_3_6 +#define RBBISymbolTableEntry RBBISymbolTableEntry_3_6 +#define RBBITableBuilder RBBITableBuilder_3_6 +#define RangeDescriptor RangeDescriptor_3_6 +#define RegexCompile RegexCompile_3_6 +#define RegexMatcher RegexMatcher_3_6 +#define RegexPattern RegexPattern_3_6 +#define RegexStaticSets RegexStaticSets_3_6 +#define RemoveTransliterator RemoveTransliterator_3_6 +#define Replaceable Replaceable_3_6 +#define ReplaceableGlue ReplaceableGlue_3_6 +#define ResourceBundle ResourceBundle_3_6 +#define RiseSetCoordFunc RiseSetCoordFunc_3_6 +#define RuleBasedBreakIterator RuleBasedBreakIterator_3_6 +#define RuleBasedCollator RuleBasedCollator_3_6 +#define RuleBasedNumberFormat RuleBasedNumberFormat_3_6 +#define RuleBasedTransliterator RuleBasedTransliterator_3_6 +#define RuleCharacterIterator RuleCharacterIterator_3_6 +#define RuleHalf RuleHalf_3_6 +#define RunArray RunArray_3_6 +#define SameValueSubstitution SameValueSubstitution_3_6 +#define ScriptListTable ScriptListTable_3_6 +#define ScriptRunIterator ScriptRunIterator_3_6 +#define ScriptTable ScriptTable_3_6 +#define SearchIterator SearchIterator_3_6 +#define SegmentArrayProcessor SegmentArrayProcessor_3_6 +#define SegmentSingleProcessor SegmentSingleProcessor_3_6 +#define ServiceEnumeration ServiceEnumeration_3_6 +#define ServiceListener ServiceListener_3_6 +#define SimpleArrayProcessor SimpleArrayProcessor_3_6 +#define SimpleDateFormat SimpleDateFormat_3_6 +#define SimpleFactory SimpleFactory_3_6 +#define SimpleLocaleKeyFactory SimpleLocaleKeyFactory_3_6 +#define SimpleNumberFormatFactory SimpleNumberFormatFactory_3_6 +#define SimpleTimeZone SimpleTimeZone_3_6 +#define SinglePositioningFormat1Subtable SinglePositioningFormat1Subtable_3_6 +#define SinglePositioningFormat2Subtable SinglePositioningFormat2Subtable_3_6 +#define SinglePositioningSubtable SinglePositioningSubtable_3_6 +#define SingleSubstitutionFormat1Subtable SingleSubstitutionFormat1Subtable_3_6 +#define SingleSubstitutionFormat2Subtable SingleSubstitutionFormat2Subtable_3_6 +#define SingleSubstitutionSubtable SingleSubstitutionSubtable_3_6 +#define SingleTableProcessor SingleTableProcessor_3_6 +#define Spec Spec_3_6 +#define StateTableProcessor StateTableProcessor_3_6 +#define StringCharacterIterator StringCharacterIterator_3_6 +#define StringEnumeration StringEnumeration_3_6 +#define StringLocalizationInfo StringLocalizationInfo_3_6 +#define StringMatcher StringMatcher_3_6 +#define StringPair StringPair_3_6 +#define StringReplacer StringReplacer_3_6 +#define StringSearch StringSearch_3_6 +#define StyleRuns StyleRuns_3_6 +#define SubstitutionLookup SubstitutionLookup_3_6 +#define SubtableProcessor SubtableProcessor_3_6 +#define SunTimeAngleFunc SunTimeAngleFunc_3_6 +#define SymbolTable SymbolTable_3_6 +#define TZEnumeration TZEnumeration_3_6 +#define TernaryNode TernaryNode_3_6 +#define ThaiBreakEngine ThaiBreakEngine_3_6 +#define ThaiLayoutEngine ThaiLayoutEngine_3_6 +#define ThaiShaping ThaiShaping_3_6 +#define TibetanClassTable TibetanClassTable_3_6 +#define TibetanOpenTypeLayoutEngine TibetanOpenTypeLayoutEngine_3_6 +#define TibetanReordering TibetanReordering_3_6 +#define TimeZone TimeZone_3_6 +#define TimeZoneKeysEnumeration TimeZoneKeysEnumeration_3_6 +#define TitlecaseTransliterator TitlecaseTransliterator_3_6 +#define TransliterationRule TransliterationRule_3_6 +#define TransliterationRuleData TransliterationRuleData_3_6 +#define TransliterationRuleSet TransliterationRuleSet_3_6 +#define Transliterator Transliterator_3_6 +#define TransliteratorAlias TransliteratorAlias_3_6 +#define TransliteratorIDParser TransliteratorIDParser_3_6 +#define TransliteratorParser TransliteratorParser_3_6 +#define TransliteratorRegistry TransliteratorRegistry_3_6 +#define TrieWordDictionary TrieWordDictionary_3_6 +#define TrimmedArrayProcessor TrimmedArrayProcessor_3_6 +#define UCharCharacterIterator UCharCharacterIterator_3_6 +#define UMemory UMemory_3_6 +#define UObject UObject_3_6 +#define URegularExpression URegularExpression_3_6 +#define UStack UStack_3_6 +#define UStringEnumeration UStringEnumeration_3_6 +#define UVector UVector_3_6 +#define UVector32 UVector32_3_6 +#define UnescapeTransliterator UnescapeTransliterator_3_6 +#define UnhandledEngine UnhandledEngine_3_6 +#define UnicodeArabicOpenTypeLayoutEngine UnicodeArabicOpenTypeLayoutEngine_3_6 +#define UnicodeFilter UnicodeFilter_3_6 +#define UnicodeFunctor UnicodeFunctor_3_6 +#define UnicodeMatcher UnicodeMatcher_3_6 +#define UnicodeNameTransliterator UnicodeNameTransliterator_3_6 +#define UnicodeReplacer UnicodeReplacer_3_6 +#define UnicodeSet UnicodeSet_3_6 +#define UnicodeSetIterator UnicodeSetIterator_3_6 +#define UnicodeString UnicodeString_3_6 +#define UppercaseTransliterator UppercaseTransliterator_3_6 +#define ValueRecord ValueRecord_3_6 +#define ValueRuns ValueRuns_3_6 +#define locale_set_default_internal locale_set_default_internal_3_6 +#define util64_fromDouble util64_fromDouble_3_6 +#define util64_pow util64_pow_3_6 +#define util64_tou util64_tou_3_6 #endif #endif diff --git a/Build/source/libs/icu-xetex/common/unicode/ures.h b/Build/source/libs/icu-xetex/common/unicode/ures.h index 2bf97d77dee..f6e3b347b13 100644 --- a/Build/source/libs/icu-xetex/common/unicode/ures.h +++ b/Build/source/libs/icu-xetex/common/unicode/ures.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -82,6 +82,8 @@ typedef enum { */ URES_ALIAS=3, +#ifndef U_HIDE_INTERNAL_API + /** * Internal use only. * Alternative resource type constant for tables of key-value pairs. @@ -90,6 +92,8 @@ typedef enum { */ URES_TABLE32=4, +#endif /* U_HIDE_INTERNAL_API */ + /** * Resource type constant for a single 28-bit integer, interpreted as * signed or unsigned by the ures_getInt() or ures_getUInt() function. @@ -107,8 +111,7 @@ typedef enum { * @see ures_getIntVector * @stable ICU 2.6 */ - URES_INT_VECTOR=14, - + URES_INT_VECTOR = 14, #ifndef U_HIDE_DEPRECATED_API /** @deprecated ICU 2.6 Use the URES_ constant instead. */ RES_NONE=URES_NONE, @@ -126,10 +129,11 @@ typedef enum { RES_ARRAY=URES_ARRAY, /** @deprecated ICU 2.6 Use the URES_ constant instead. */ RES_INT_VECTOR=URES_INT_VECTOR, + /** @deprecated ICU 2.6 Not used. */ + RES_RESERVED=15, #endif /* U_HIDE_DEPRECATED_API */ - /** @deprecated ICU 2.6 Not used. */ - RES_RESERVED=15 + URES_LIMIT = 16 } UResType; /* @@ -299,9 +303,9 @@ ures_getLocale(const UResourceBundle* resourceBundle, * ULocDataLocaleType in uloc.h * @param status just for catching illegal arguments * @return A Locale name - * @draft ICU 2.8 likely to change in the future + * @stable ICU 2.8 */ -U_DRAFT const char* U_EXPORT2 +U_STABLE const char* U_EXPORT2 ures_getLocaleByType(const UResourceBundle* resourceBundle, ULocDataLocaleType type, UErrorCode* status); @@ -352,6 +356,59 @@ ures_getString(const UResourceBundle* resourceBundle, UErrorCode* status); /** + * Returns a UTF-8 string from a string resource. + * The UTF-8 string may be returnable directly as a pointer, or + * it may need to be copied, or transformed from UTF-16 using u_strToUTF8() + * or equivalent. + * + * If forceCopy==TRUE, then the string is always written to the dest buffer + * and dest is returned. + * + * If forceCopy==FALSE, then the string is returned as a pointer if possible, + * without needing a dest buffer (it can be NULL). If the string needs to be + * copied or transformed, then it may be placed into dest at an arbitrary offset. + * + * If the string is to be written to dest, then U_BUFFER_OVERFLOW_ERROR and + * U_STRING_NOT_TERMINATED_WARNING are set if appropriate, as usual. + * + * If the string is transformed from UTF-16, then a conversion error may occur + * if an unpaired surrogate is encountered. If the function is successful, then + * the output UTF-8 string is always well-formed. + * + * @param resB Resource bundle. + * @param dest Destination buffer. Can be NULL only if capacity=*length==0. + * @param length Input: Capacity of destination buffer. + * Output: Actual length of the UTF-8 string, not counting the + * terminating NUL, even in case of U_BUFFER_OVERFLOW_ERROR. + * Can be NULL, meaning capacity=0 and the string length is not + * returned to the caller. + * @param forceCopy If TRUE, then the output string will always be written to + * dest, with U_BUFFER_OVERFLOW_ERROR and + * U_STRING_NOT_TERMINATED_WARNING set if appropriate. + * If FALSE, then the dest buffer may or may not contain a + * copy of the string. dest may or may not be modified. + * If a copy needs to be written, then the UErrorCode parameter + * indicates overflow etc. as usual. + * @param status Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return The pointer to the UTF-8 string. It may be dest, or at some offset + * from dest (only if !forceCopy), or in unrelated memory. + * Always NUL-terminated unless the string was written to dest and + * length==capacity (in which case U_STRING_NOT_TERMINATED_WARNING is set). + * + * @see ures_getString + * @see u_strToUTF8 + * @draft ICU 3.6 + */ +U_DRAFT const char * U_EXPORT2 +ures_getUTF8String(const UResourceBundle *resB, + char *dest, int32_t *length, + UBool forceCopy, + UErrorCode *status); + +/** * Returns a binary data from a binary resource. * * @param resourceBundle a string resource @@ -498,11 +555,11 @@ ures_hasNext(const UResourceBundle *resourceBundle); * to iterate over. Features a fill-in parameter. * * @param resourceBundle a resource - * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. + * @param fillIn if NULL a new UResourceBundle struct is allocated and must be closed by the caller. * Alternatively, you can supply a struct to be filled by this function. * @param status fills in the outgoing error code. You may still get a non NULL result even if an * error occured. Check status instead. - * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it * @stable ICU 2.0 */ U_STABLE UResourceBundle* U_EXPORT2 @@ -533,11 +590,11 @@ ures_getNextString(UResourceBundle *resourceBundle, * * @param resourceBundle the resource bundle from which to get a sub-resource * @param indexR an index to the wanted resource. - * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. + * @param fillIn if NULL a new UResourceBundle struct is allocated and must be closed by the caller. * Alternatively, you can supply a struct to be filled by this function. * @param status fills in the outgoing error code. Don't count on NULL being returned if an error has * occured. Check status instead. - * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it * @stable ICU 2.0 */ U_STABLE UResourceBundle* U_EXPORT2 @@ -564,15 +621,70 @@ ures_getStringByIndex(const UResourceBundle *resourceBundle, UErrorCode *status); /** + * Returns a UTF-8 string from a resource at the specified index. + * The UTF-8 string may be returnable directly as a pointer, or + * it may need to be copied, or transformed from UTF-16 using u_strToUTF8() + * or equivalent. + * + * If forceCopy==TRUE, then the string is always written to the dest buffer + * and dest is returned. + * + * If forceCopy==FALSE, then the string is returned as a pointer if possible, + * without needing a dest buffer (it can be NULL). If the string needs to be + * copied or transformed, then it may be placed into dest at an arbitrary offset. + * + * If the string is to be written to dest, then U_BUFFER_OVERFLOW_ERROR and + * U_STRING_NOT_TERMINATED_WARNING are set if appropriate, as usual. + * + * If the string is transformed from UTF-16, then a conversion error may occur + * if an unpaired surrogate is encountered. If the function is successful, then + * the output UTF-8 string is always well-formed. + * + * @param resB Resource bundle. + * @param index An index to the wanted string. + * @param dest Destination buffer. Can be NULL only if capacity=*length==0. + * @param pLength Input: Capacity of destination buffer. + * Output: Actual length of the UTF-8 string, not counting the + * terminating NUL, even in case of U_BUFFER_OVERFLOW_ERROR. + * Can be NULL, meaning capacity=0 and the string length is not + * returned to the caller. + * @param forceCopy If TRUE, then the output string will always be written to + * dest, with U_BUFFER_OVERFLOW_ERROR and + * U_STRING_NOT_TERMINATED_WARNING set if appropriate. + * If FALSE, then the dest buffer may or may not contain a + * copy of the string. dest may or may not be modified. + * If a copy needs to be written, then the UErrorCode parameter + * indicates overflow etc. as usual. + * @param status Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return The pointer to the UTF-8 string. It may be dest, or at some offset + * from dest (only if !forceCopy), or in unrelated memory. + * Always NUL-terminated unless the string was written to dest and + * length==capacity (in which case U_STRING_NOT_TERMINATED_WARNING is set). + * + * @see ures_getStringByIndex + * @see u_strToUTF8 + * @draft ICU 3.6 + */ +U_DRAFT const char * U_EXPORT2 +ures_getUTF8StringByIndex(const UResourceBundle *resB, + int32_t index, + char *dest, int32_t *pLength, + UBool forceCopy, + UErrorCode *status); + +/** * Returns a resource in a given resource that has a given key. This procedure works only with table * resources. Features a fill-in parameter. * * @param resourceBundle a resource * @param key a key associated with the wanted resource - * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. + * @param fillIn if NULL a new UResourceBundle struct is allocated and must be closed by the caller. * Alternatively, you can supply a struct to be filled by this function. * @param status fills in the outgoing error code. - * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it * @stable ICU 2.0 */ U_STABLE UResourceBundle* U_EXPORT2 @@ -599,6 +711,63 @@ ures_getStringByKey(const UResourceBundle *resB, int32_t* len, UErrorCode *status); +/** + * Returns a UTF-8 string from a resource and a key. + * This function works only with table resources. + * + * The UTF-8 string may be returnable directly as a pointer, or + * it may need to be copied, or transformed from UTF-16 using u_strToUTF8() + * or equivalent. + * + * If forceCopy==TRUE, then the string is always written to the dest buffer + * and dest is returned. + * + * If forceCopy==FALSE, then the string is returned as a pointer if possible, + * without needing a dest buffer (it can be NULL). If the string needs to be + * copied or transformed, then it may be placed into dest at an arbitrary offset. + * + * If the string is to be written to dest, then U_BUFFER_OVERFLOW_ERROR and + * U_STRING_NOT_TERMINATED_WARNING are set if appropriate, as usual. + * + * If the string is transformed from UTF-16, then a conversion error may occur + * if an unpaired surrogate is encountered. If the function is successful, then + * the output UTF-8 string is always well-formed. + * + * @param resB Resource bundle. + * @param key A key associated with the wanted resource + * @param dest Destination buffer. Can be NULL only if capacity=*length==0. + * @param pLength Input: Capacity of destination buffer. + * Output: Actual length of the UTF-8 string, not counting the + * terminating NUL, even in case of U_BUFFER_OVERFLOW_ERROR. + * Can be NULL, meaning capacity=0 and the string length is not + * returned to the caller. + * @param forceCopy If TRUE, then the output string will always be written to + * dest, with U_BUFFER_OVERFLOW_ERROR and + * U_STRING_NOT_TERMINATED_WARNING set if appropriate. + * If FALSE, then the dest buffer may or may not contain a + * copy of the string. dest may or may not be modified. + * If a copy needs to be written, then the UErrorCode parameter + * indicates overflow etc. as usual. + * @param status Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return The pointer to the UTF-8 string. It may be dest, or at some offset + * from dest (only if !forceCopy), or in unrelated memory. + * Always NUL-terminated unless the string was written to dest and + * length==capacity (in which case U_STRING_NOT_TERMINATED_WARNING is set). + * + * @see ures_getStringByKey + * @see u_strToUTF8 + * @draft ICU 3.6 + */ +U_DRAFT const char * U_EXPORT2 +ures_getUTF8StringByKey(const UResourceBundle *resB, + const char *key, + char *dest, int32_t *pLength, + UBool forceCopy, + UErrorCode *status); + #ifdef XP_CPLUSPLUS #include "unicode/unistr.h" @@ -606,12 +775,12 @@ U_NAMESPACE_BEGIN /** * returns a string from a string resource type * - * @param resB a resource + * @param resB a resource * @param status: fills in the outgoing error code * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found * could be a non-failing error * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> - * @return an UnicodeString object. If there is an error, string is bogus + * @return a UnicodeString object. If there is an error, string is bogus * @stable ICU 2.0 */ inline UnicodeString @@ -686,40 +855,15 @@ U_NAMESPACE_END #endif - -/** - * Get a resource with multi-level fallback. Normally only the top level resources will - * fallback to its parent. This performs fallback on subresources. For example, when a table - * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs - * on the sub-resources because the table is defined in the current resource bundle, but this - * function can perform fallback on the sub-resources of the table. - * @param resB a resource - * @param inKey a key associated with the requested resource - * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. - * Alternatively, you can supply a struct to be filled by this function. - * @param status: fills in the outgoing error code - * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found - * could be a non-failing error - * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> - * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it - * @internal ICU 3.0 - */ -U_INTERNAL UResourceBundle* U_EXPORT2 -ures_getByKeyWithFallback(const UResourceBundle *resB, - const char* inKey, - UResourceBundle *fillIn, - UErrorCode *status); - - /** * Create a string enumerator, owned by the caller, of all locales located within * the specified resource tree. * @param packageName name of the tree, such as (NULL) or U_ICUDATA_ALIAS or or "ICUDATA-coll" * This call is similar to uloc_getAvailable(). * @param status error code - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UEnumeration* U_EXPORT2 +U_STABLE UEnumeration* U_EXPORT2 ures_openAvailableLocales(const char *packageName, UErrorCode *status); diff --git a/Build/source/libs/icu-xetex/common/unicode/uscript.h b/Build/source/libs/icu-xetex/common/unicode/uscript.h index 3420299a023..d7cbc38eb38 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uscript.h +++ b/Build/source/libs/icu-xetex/common/unicode/uscript.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -22,7 +22,23 @@ */ /** - * Constants for Unicode script values from ScriptNames.txt. + * Constants for ISO 15924 script codes. + * + * Many of these script codes - those from Unicode's ScriptNames.txt - + * are character property values for Unicode's Script property. + * See UAX #24 Script Names (http://www.unicode.org/reports/tr24/). + * + * Starting with ICU 3.6, constants for most ISO 15924 script codes + * are included (currently excluding private-use codes Qaaa..Qabx). + * For scripts for which there are codes in ISO 15924 but which are not + * used in the Unicode Character Database (UCD), there are no Unicode characters + * associated with those scripts. + * + * For example, there are no characters that have a UCD script code of + * Hans or Hant. All Han ideographs have the Hani script code. + * The Hans and Hant script codes are used with CLDR data. + * + * ISO 15924 script codes are included for use with CLDR and similar. * * @stable ICU 2.2 */ @@ -36,11 +52,11 @@ typedef enum UScriptCode { USCRIPT_BOPOMOFO = 5, /* Bopo */ USCRIPT_CHEROKEE = 6, /* Cher */ USCRIPT_COPTIC = 7, /* Copt */ - USCRIPT_CYRILLIC = 8, /* Cyrl (Cyrs) */ + USCRIPT_CYRILLIC = 8, /* Cyrl */ USCRIPT_DESERET = 9, /* Dsrt */ USCRIPT_DEVANAGARI = 10, /* Deva */ USCRIPT_ETHIOPIC = 11, /* Ethi */ - USCRIPT_GEORGIAN = 12, /* Geor (Geon, Geoa) */ + USCRIPT_GEORGIAN = 12, /* Geor */ USCRIPT_GOTHIC = 13, /* Goth */ USCRIPT_GREEK = 14, /* Grek */ USCRIPT_GUJARATI = 15, /* Gujr */ @@ -53,7 +69,7 @@ typedef enum UScriptCode { USCRIPT_KATAKANA = 22, /* Kana */ USCRIPT_KHMER = 23, /* Khmr */ USCRIPT_LAO = 24, /* Laoo */ - USCRIPT_LATIN = 25, /* Latn (Latf, Latg) */ + USCRIPT_LATIN = 25, /* Latn */ USCRIPT_MALAYALAM = 26, /* Mlym */ USCRIPT_MONGOLIAN = 27, /* Mong */ USCRIPT_MYANMAR = 28, /* Mymr */ @@ -62,7 +78,7 @@ typedef enum UScriptCode { USCRIPT_ORIYA = 31, /* Orya */ USCRIPT_RUNIC = 32, /* Runr */ USCRIPT_SINHALA = 33, /* Sinh */ - USCRIPT_SYRIAC = 34, /* Syrc (Syrj, Syrn, Syre) */ + USCRIPT_SYRIAC = 34, /* Syrc */ USCRIPT_TAMIL = 35, /* Taml */ USCRIPT_TELUGU = 36, /* Telu */ USCRIPT_THAANA = 37, /* Thaa */ @@ -79,28 +95,74 @@ typedef enum UScriptCode { USCRIPT_TAGBANWA = 45, /* Tagb */ /* New scripts in Unicode 4 @stable ICU 2.6 */ - USCRIPT_BRAILLE, /* Brai */ - USCRIPT_CYPRIOT, /* Cprt */ - USCRIPT_LIMBU, /* Limb */ - USCRIPT_LINEAR_B, /* Linb */ - USCRIPT_OSMANYA, /* Osma */ - USCRIPT_SHAVIAN, /* Shaw */ - USCRIPT_TAI_LE, /* Tale */ - USCRIPT_UGARITIC, /* Ugar */ - - /** New script code in Unicode 4.0.1 @draft ICU 3.0 */ - USCRIPT_KATAKANA_OR_HIRAGANA,/*Hrkt */ + USCRIPT_BRAILLE = 46, /* Brai */ + USCRIPT_CYPRIOT = 47, /* Cprt */ + USCRIPT_LIMBU = 48, /* Limb */ + USCRIPT_LINEAR_B = 49, /* Linb */ + USCRIPT_OSMANYA = 50, /* Osma */ + USCRIPT_SHAVIAN = 51, /* Shaw */ + USCRIPT_TAI_LE = 52, /* Tale */ + USCRIPT_UGARITIC = 53, /* Ugar */ + /** New script code in Unicode 4.0.1 @stable ICU 3.0 */ + USCRIPT_KATAKANA_OR_HIRAGANA = 54,/*Hrkt */ + +#ifndef U_HIDE_DRAFT_API /* New scripts in Unicode 4.1 @draft ICU 3.4 */ - USCRIPT_BUGINESE, /* Bugi */ - USCRIPT_GLAGOLITIC, /* Glag */ - USCRIPT_KHAROSHTHI, /* Khar */ - USCRIPT_SYLOTI_NAGRI, /* Sylo */ - USCRIPT_NEW_TAI_LUE, /* Talu */ - USCRIPT_TIFINAGH, /* Tfng */ - USCRIPT_OLD_PERSIAN, /* Xpeo */ + USCRIPT_BUGINESE = 55, /* Bugi */ + USCRIPT_GLAGOLITIC = 56, /* Glag */ + USCRIPT_KHAROSHTHI = 57, /* Khar */ + USCRIPT_SYLOTI_NAGRI = 58, /* Sylo */ + USCRIPT_NEW_TAI_LUE = 59, /* Talu */ + USCRIPT_TIFINAGH = 60, /* Tfng */ + USCRIPT_OLD_PERSIAN = 61, /* Xpeo */ - USCRIPT_CODE_LIMIT + /* New script codes from ISO 15924 @draft ICU 3.6 */ + USCRIPT_BALINESE = 62, /* Bali */ + USCRIPT_BATAK = 63, /* Batk */ + USCRIPT_BLISSYMBOLS = 64, /* Blis */ + USCRIPT_BRAHMI = 65, /* Brah */ + USCRIPT_CHAM = 66, /* Cham */ + USCRIPT_CIRTH = 67, /* Cirt */ + USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC = 68, /* Cyrs */ + USCRIPT_DEMOTIC_EGYPTIAN = 69, /* Egyd */ + USCRIPT_HIERATIC_EGYPTIAN = 70, /* Egyh */ + USCRIPT_EGYPTIAN_HIEROGLYPHS = 71, /* Egyp */ + USCRIPT_KHUTSURI = 72, /* Geok */ + USCRIPT_SIMPLIFIED_HAN = 73, /* Hans */ + USCRIPT_TRADITIONAL_HAN = 74, /* Hant */ + USCRIPT_PAHAWH_HMONG = 75, /* Hmng */ + USCRIPT_OLD_HUNGARIAN = 76, /* Hung */ + USCRIPT_HARAPPAN_INDUS = 77, /* Inds */ + USCRIPT_JAVANESE = 78, /* Java */ + USCRIPT_KAYAH_LI = 79, /* Kali */ + USCRIPT_LATIN_FRAKTUR = 80, /* Latf */ + USCRIPT_LATIN_GAELIC = 81, /* Latg */ + USCRIPT_LEPCHA = 82, /* Lepc */ + USCRIPT_LINEAR_A = 83, /* Lina */ + USCRIPT_MANDAEAN = 84, /* Mand */ + USCRIPT_MAYAN_HIEROGLYPHS = 85, /* Maya */ + USCRIPT_MEROITIC = 86, /* Mero */ + USCRIPT_NKO = 87, /* Nkoo */ + USCRIPT_ORKHON = 88, /* Orkh */ + USCRIPT_OLD_PERMIC = 89, /* Perm */ + USCRIPT_PHAGS_PA = 90, /* Phag */ + USCRIPT_PHOENICIAN = 91, /* Phnx */ + USCRIPT_PHONETIC_POLLARD = 92, /* Plrd */ + USCRIPT_RONGORONGO = 93, /* Roro */ + USCRIPT_SARATI = 94, /* Sara */ + USCRIPT_ESTRANGELO_SYRIAC = 95, /* Syre */ + USCRIPT_WESTERN_SYRIAC = 96, /* Syrj */ + USCRIPT_EASTERN_SYRIAC = 97, /* Syrn */ + USCRIPT_TENGWAR = 98, /* Teng */ + USCRIPT_VAI = 99, /* Vaii */ + USCRIPT_VISIBLE_SPEECH = 100, /* Visp */ + USCRIPT_CUNEIFORM = 101,/* Xsux */ + USCRIPT_UNWRITTEN_LANGUAGES = 102,/* Zxxx */ + USCRIPT_UNKNOWN = 103,/* Zzzz */ /* Unknown="Code for uncoded script", for unassigned code points */ + /* Private use codes from Qaaa - Qabx are not supported*/ +#endif /* U_HIDE_DRAFT_API */ + USCRIPT_CODE_LIMIT = 104 } UScriptCode; /** diff --git a/Build/source/libs/icu-xetex/common/unicode/uset.h b/Build/source/libs/icu-xetex/common/unicode/uset.h index 050a9070e6e..e6c7d3ecc12 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uset.h +++ b/Build/source/libs/icu-xetex/common/unicode/uset.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -81,22 +81,15 @@ enum { USET_CASE_INSENSITIVE = 2, /** - * Bitmask for UnicodeSet::closeOver() indicating letter case. - * This may be ORed together with other selectors. - * @internal - */ - USET_CASE = 2, - - /** * Enable case insensitive matching. E.g., "[ab]" with this flag * will match 'a', 'A', 'b', and 'B'. "[^ab]" with this flag will * match all except 'a', 'A', 'b', and 'B'. This adds the lower-, * title-, and uppercase mappings as well as the case folding * of each existing element in the set. - * @draft ICU 3.2 + * @stable ICU 3.2 */ USET_ADD_CASE_MAPPINGS = 4, - + /** * Enough for any single-code point set * @internal @@ -192,9 +185,9 @@ uset_close(USet* set); * @param set the object to set to the given range * @param start first character in the set, inclusive * @param end last character in the set, inclusive - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_set(USet* set, UChar32 start, UChar32 end); @@ -243,9 +236,9 @@ uset_applyPattern(USet *set, * * @param ec error code input/output parameter * - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_applyIntPropertyValue(USet* set, UProperty prop, int32_t value, UErrorCode* ec); @@ -281,9 +274,9 @@ uset_applyIntPropertyValue(USet* set, * * @param ec error code input/output parameter * - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_applyPropertyAlias(USet* set, const UChar *prop, int32_t propLength, const UChar *value, int32_t valueLength, @@ -296,9 +289,9 @@ uset_applyPropertyAlias(USet* set, * @param pattern a string specifying the pattern * @param patternLength the length of the pattern, or -1 if NULL * @param pos the given position - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_resemblesPattern(const UChar *pattern, int32_t patternLength, int32_t pos); @@ -420,9 +413,9 @@ uset_removeString(USet* set, const UChar* str, int32_t strLen); * @param set the object from which the elements are to be removed * @param removeSet the object that defines which elements will be * removed from this set - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_removeAll(USet* set, const USet* removeSet); /** @@ -436,9 +429,9 @@ uset_removeAll(USet* set, const USet* removeSet); * to this set. * @param end last character, inclusive, of range to be retained * to this set. - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_retain(USet* set, UChar32 start, UChar32 end); /** @@ -450,9 +443,9 @@ uset_retain(USet* set, UChar32 start, UChar32 end); * * @param set the object on which to perform the retain * @param retain set that defines which elements this set will retain - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_retainAll(USet* set, const USet* retain); /** @@ -460,9 +453,9 @@ uset_retainAll(USet* set, const USet* retain); * possible space, without changing this object's value. * * @param set the object on which to perfrom the compact - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_compact(USet* set); /** @@ -483,9 +476,9 @@ uset_complement(USet* set); * @param set the set with which to complement * @param complement set that defines which elements will be xor'ed * from this set. - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uset_complementAll(USet* set, const USet* complement); /** @@ -548,9 +541,9 @@ uset_containsString(const USet* set, const UChar* str, int32_t strLen); * @param set the set * @param c the character to obtain the index for * @return an index from 0..size()-1, or -1 - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uset_indexOf(const USet* set, UChar32 c); /** @@ -561,9 +554,9 @@ uset_indexOf(const USet* set, UChar32 c); * @param set the set * @param index an index from 0..size()-1 to obtain the char for * @return the character at the given index, or (UChar32)-1. - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UChar32 U_EXPORT2 +U_STABLE UChar32 U_EXPORT2 uset_charAt(const USet* set, int32_t index); /** @@ -614,13 +607,13 @@ uset_getItem(const USet* set, int32_t itemIndex, /** * Returns true if set1 contains all the characters and strings - * of set2. It answers the question, 'Is set1 a subset of set2?' + * of set2. It answers the question, 'Is set1 a superset of set2?' * @param set1 set to be checked for containment * @param set2 set to be checked for containment * @return true if the test condition is met - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_containsAll(const USet* set1, const USet* set2); /** @@ -642,9 +635,9 @@ uset_containsAllCodePoints(const USet* set, const UChar *str, int32_t strLen); * @param set1 set to be checked for containment * @param set2 set to be checked for containment * @return true if the test condition is met - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_containsNone(const USet* set1, const USet* set2); /** @@ -653,9 +646,9 @@ uset_containsNone(const USet* set1, const USet* set2); * @param set1 set to be checked for containment * @param set2 set to be checked for containment * @return true if the test condition is met - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_containsSome(const USet* set1, const USet* set2); /** @@ -664,9 +657,9 @@ uset_containsSome(const USet* set1, const USet* set2); * @param set1 set to be checked for containment * @param set2 set to be checked for containment * @return true if the test condition is met - * @draft ICU 3.2 + * @stable ICU 3.2 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 uset_equals(const USet* set1, const USet* set2); /********************************************************************* diff --git a/Build/source/libs/icu-xetex/common/unicode/usetiter.h b/Build/source/libs/icu-xetex/common/unicode/usetiter.h index 3e77ddde046..defa75cd7ed 100644 --- a/Build/source/libs/icu-xetex/common/unicode/usetiter.h +++ b/Build/source/libs/icu-xetex/common/unicode/usetiter.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2005, International Business Machines +* Copyright (c) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -28,19 +28,23 @@ class UnicodeString; * code points or ranges have been returned, it returns the * multicharacter strings of the UnicodSet, if any. * - * <p>To iterate over code points, use a loop like this: + * This class is not intended to be subclassed. Consider any fields + * or methods declared as "protected" to be private. The use of + * protected in this class is an artifact of history. + * + * <p>To iterate over code points and strings, use a loop like this: * <pre> * UnicodeSetIterator it(set); * while (set.next()) { - * if (set.isString()) { - * processString(set.getString()); - * } else { - * processCodepoint(set.getCodepoint()); - * } + * processItem(set.getString()); * } * </pre> + * <p>Each item in the set is accessed as a string. Set elements + * consisting of single code points are returned as strings containing + * just the one code point. * - * <p>To iterate over code point ranges, use a loop like this: + * <p>To iterate over code point ranges, instead of individual code points, + * use a loop like this: * <pre> * UnicodeSetIterator it(set); * while (it.nextRange()) { @@ -121,9 +125,14 @@ class U_COMMON_API UnicodeSetIterator : public UObject { * caller can retrieve it with <tt>getString()</tt>. If this * method returns false, the current element is a code point or * code point range, depending on whether <tt>next()</tt> or - * <tt>nextRange()</tt> was called, and the caller can retrieve it - * with <tt>getCodepoint()</tt> and, for a range, - * <tt>getCodepointEnd()</tt>. + * <tt>nextRange()</tt> was called. + * Elements of types string and codepoint can both be retrieved + * with the function <tt>getString()</tt>. + * Elements of type codepoint can also be retrieved with + * <tt>getCodepoint()</tt>. + * For ranges, <tt>getCodepoint()</tt> returns the starting codepoint + * of the range, and <tt>getCodepointEnd()</tt> returns the end + * of the range. * @stable ICU 2.4 */ inline UBool isString() const; @@ -145,28 +154,37 @@ class U_COMMON_API UnicodeSetIterator : public UObject { /** * Returns the current string, if <tt>isString()</tt> returned - * true. Otherwise returns an undefined result. + * true. If the current iteration item is a code point, a UnicodeString + * containing that single code point is returned. + * + * Ownership of the returned string remains with the iterator. + * The string is guaranteed to remain valid only until the iterator is + * advanced to the next item, or until the iterator is deleted. + * * @stable ICU 2.4 */ - inline const UnicodeString& getString() const; + const UnicodeString& getString(); /** - * Returns the next element in the set, either a single code point - * or a string. If there are no more elements in the set, return - * false. If <tt>codepoint == IS_STRING</tt>, the value is a - * string in the <tt>string</tt> field. Otherwise the value is a - * single code point in the <tt>codepoint</tt> field. + * Advances the iteration position to the next element in the set, + * which can be either a single code point or a string. + * If there are no more elements in the set, return false. + * + * <p> + * If <tt>isString() == TRUE</tt>, the value is a + * string, otherwise the value is a + * single code point. Elements of either type can be retrieved + * with the function <tt>getString()</tt>, while elements of + * consisting of a single code point can be retrieved with + * <tt>getCodepoint()</tt> * * <p>The order of iteration is all code points in sorted order, - * followed by all strings sorted order. <tt>codepointEnd</tt> is - * undefined after calling this method. <tt>string</tt> is - * undefined unless <tt>codepoint == IS_STRING</tt>. Do not mix + * followed by all strings sorted order. Do not mix * calls to <tt>next()</tt> and <tt>nextRange()</tt> without * calling <tt>reset()</tt> between them. The results of doing so * are undefined. * - * @return true if there was another element in the set and this - * object contains the element. + * @return true if there was another element in the set. * @stable ICU 2.4 */ UBool next(); @@ -174,21 +192,20 @@ class U_COMMON_API UnicodeSetIterator : public UObject { /** * Returns the next element in the set, either a code point range * or a string. If there are no more elements in the set, return - * false. If <tt>codepoint == IS_STRING</tt>, the value is a - * string in the <tt>string</tt> field. Otherwise the value is a - * range of one or more code points from <tt>codepoint</tt> to - * <tt>codepointeEnd</tt> inclusive. + * false. If <tt>isString() == TRUE</tt>, the value is a + * string and can be accessed with <tt>getString()</tt>. Otherwise the value is a + * range of one or more code points from <tt>getCodepoint()</tt> to + * <tt>getCodepointeEnd()</tt> inclusive. * * <p>The order of iteration is all code points ranges in sorted * order, followed by all strings sorted order. Ranges are - * disjoint and non-contiguous. <tt>string</tt> is undefined - * unless <tt>codepoint == IS_STRING</tt>. Do not mix calls to + * disjoint and non-contiguous. The value returned from <tt>getString()</tt> + * is undefined unless <tt>isString() == TRUE</tt>. Do not mix calls to * <tt>next()</tt> and <tt>nextRange()</tt> without calling * <tt>reset()</tt> between them. The results of doing so are * undefined. * - * @return true if there was another element in the set and this - * object contains the element. + * @return true if there was another element in the set. * @stable ICU 2.4 */ UBool nextRange(); @@ -259,6 +276,13 @@ class U_COMMON_API UnicodeSetIterator : public UObject { */ int32_t stringCount; + /** + * Points to the string to use when the caller asks for a + * string and the current iteration item is a code point, not a string. + * @internal + */ + UnicodeString *cpString; + /** Copy constructor. Disallowed. * @stable ICU 2.4 */ @@ -288,9 +312,6 @@ inline UChar32 UnicodeSetIterator::getCodepointEnd() const { return codepointEnd; } -inline const UnicodeString& UnicodeSetIterator::getString() const { - return *string; -} U_NAMESPACE_END diff --git a/Build/source/libs/icu-xetex/common/unicode/usprep.h b/Build/source/libs/icu-xetex/common/unicode/usprep.h index 33bfff25b64..c7e75a53fab 100644 --- a/Build/source/libs/icu-xetex/common/unicode/usprep.h +++ b/Build/source/libs/icu-xetex/common/unicode/usprep.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003-2005, International Business Machines + * Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -59,8 +59,6 @@ #include "unicode/parseerr.h" -#ifndef U_HIDE_DRAFT_API - /** * The StringPrep profile * @stable ICU 2.8 @@ -85,8 +83,6 @@ typedef struct UStringPrepProfile UStringPrepProfile; #define USPREP_ALLOW_UNASSIGNED 0x0001 -#endif /*U_HIDE_DRAFT_API*/ - /** * Creates a StringPrep profile from the data file. * diff --git a/Build/source/libs/icu-xetex/common/unicode/ustring.h b/Build/source/libs/icu-xetex/common/unicode/ustring.h index 485388058b6..4777c269f57 100644 --- a/Build/source/libs/icu-xetex/common/unicode/ustring.h +++ b/Build/source/libs/icu-xetex/common/unicode/ustring.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1998-2005, International Business Machines +* Copyright (C) 1998-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -71,6 +71,10 @@ */ /** +* \defgroup ustring_ustrlen + */ +/*@{*/ +/** * Determine the length of an array of UChar. * * @param s The array of UChars, NULL (U+0000) terminated. @@ -79,6 +83,7 @@ */ U_STABLE int32_t U_EXPORT2 u_strlen(const UChar *s); +/*@}*/ /** * Count Unicode code points in the length UChar code units of the string. @@ -1157,6 +1162,7 @@ u_strFoldCase(UChar *dest, int32_t destCapacity, uint32_t options, UErrorCode *pErrorCode); +#if defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION /** * Converts a sequence of UChars to wchar_t units. * @@ -1209,6 +1215,8 @@ u_strFromWCS(UChar *dest, const wchar_t *src, int32_t srcLength, UErrorCode *pErrorCode); +#endif /* defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION */ + /** * Converts a sequence of UChars (UTF-16) to UTF-8 bytes * @@ -1227,6 +1235,8 @@ u_strFromWCS(UChar *dest, * which must not indicate a failure before the function call. * @return The pointer to destination buffer. * @stable ICU 2.0 + * @see u_strToUTF8WithSub + * @see u_strFromUTF8 */ U_STABLE char* U_EXPORT2 u_strToUTF8(char *dest, @@ -1254,6 +1264,8 @@ u_strToUTF8(char *dest, * which must not indicate a failure before the function call. * @return The pointer to destination buffer. * @stable ICU 2.0 + * @see u_strFromUTF8WithSub + * @see u_strFromUTF8Lenient */ U_STABLE UChar* U_EXPORT2 u_strFromUTF8(UChar *dest, @@ -1264,6 +1276,148 @@ u_strFromUTF8(UChar *dest, UErrorCode *pErrorCode); /** + * Converts a sequence of UChars (UTF-16) to UTF-8 bytes. + * Same as u_strToUTF8() except for the additional subchar which is output for + * illegal input sequences, instead of stopping with the U_INVALID_CHAR_FOUND error code. + * With subchar==U_SENTINEL, this function behaves exactly like u_strToUTF8(). + * + * @param dest A buffer for the result string. The result will be zero-terminated if + * the buffer is large enough. + * @param destCapacity The size of the buffer (number of chars). If it is 0, then + * dest may be NULL and the function will only return the length of the + * result without writing any of the result string (pre-flighting). + * @param pDestLength A pointer to receive the number of units written to the destination. If + * pDestLength!=NULL then *pDestLength is always set to the + * number of output units corresponding to the transformation of + * all the input units, even in case of a buffer overflow. + * @param src The original source string + * @param srcLength The length of the original string. If -1, then src must be zero-terminated. + * @param subchar The substitution character to use in place of an illegal input sequence, + * or U_SENTINEL if the function is to return with U_INVALID_CHAR_FOUND instead. + * A substitution character can be any valid Unicode code point (up to U+10FFFF) + * except for surrogate code points (U+D800..U+DFFF). + * The recommended value is U+FFFD "REPLACEMENT CHARACTER". + * @param pNumSubstitutions Output parameter receiving the number of substitutions if subchar>=0. + * Set to 0 if no substitutions occur or subchar<0. + * pNumSubstitutions can be NULL. + * @param pErrorCode Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return The pointer to destination buffer. + * @see u_strToUTF8 + * @see u_strFromUTF8WithSub + * @draft ICU 3.6 + */ +U_DRAFT char* U_EXPORT2 +u_strToUTF8WithSub(char *dest, + int32_t destCapacity, + int32_t *pDestLength, + const UChar *src, + int32_t srcLength, + UChar32 subchar, int32_t *pNumSubstitutions, + UErrorCode *pErrorCode); + +/** + * Converts a sequence of UTF-8 bytes to UChars (UTF-16). + * Same as u_strFromUTF8() except for the additional subchar which is output for + * illegal input sequences, instead of stopping with the U_INVALID_CHAR_FOUND error code. + * With subchar==U_SENTINEL, this function behaves exactly like u_strFromUTF8(). + * + * @param dest A buffer for the result string. The result will be zero-terminated if + * the buffer is large enough. + * @param destCapacity The size of the buffer (number of UChars). If it is 0, then + * dest may be NULL and the function will only return the length of the + * result without writing any of the result string (pre-flighting). + * @param pDestLength A pointer to receive the number of units written to the destination. If + * pDestLength!=NULL then *pDestLength is always set to the + * number of output units corresponding to the transformation of + * all the input units, even in case of a buffer overflow. + * @param src The original source string + * @param srcLength The length of the original string. If -1, then src must be zero-terminated. + * @param subchar The substitution character to use in place of an illegal input sequence, + * or U_SENTINEL if the function is to return with U_INVALID_CHAR_FOUND instead. + * A substitution character can be any valid Unicode code point (up to U+10FFFF) + * except for surrogate code points (U+D800..U+DFFF). + * The recommended value is U+FFFD "REPLACEMENT CHARACTER". + * @param pNumSubstitutions Output parameter receiving the number of substitutions if subchar>=0. + * Set to 0 if no substitutions occur or subchar<0. + * pNumSubstitutions can be NULL. + * @param pErrorCode Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return The pointer to destination buffer. + * @see u_strFromUTF8 + * @see u_strFromUTF8Lenient + * @see u_strToUTF8WithSub + * @draft ICU 3.6 + */ +U_DRAFT UChar* U_EXPORT2 +u_strFromUTF8WithSub(UChar *dest, + int32_t destCapacity, + int32_t *pDestLength, + const char *src, + int32_t srcLength, + UChar32 subchar, int32_t *pNumSubstitutions, + UErrorCode *pErrorCode); + +/** + * Converts a sequence of UTF-8 bytes to UChars (UTF-16). + * Same as u_strFromUTF8() except that this function is designed to be very fast, + * which it achieves by being lenient about malformed UTF-8 sequences. + * This function is intended for use in environments where UTF-8 text is + * expected to be well-formed. + * + * Its semantics are: + * - Well-formed UTF-8 text is correctly converted to well-formed UTF-16 text. + * - The function will not read beyond the input string, nor write beyond + * the destCapacity. + * - Malformed UTF-8 results in "garbage" 16-bit Unicode strings which may not + * be well-formed UTF-16. + * The function will resynchronize to valid code point boundaries + * within a small number of code points after an illegal sequence. + * - Non-shortest forms are not detected and will result in "spoofing" output. + * + * For further performance improvement, if srcLength is given (>=0), + * then it must be destCapacity>=srcLength. + * + * @param dest A buffer for the result string. The result will be zero-terminated if + * the buffer is large enough. + * @param destCapacity The size of the buffer (number of UChars). If it is 0, then + * dest may be NULL and the function will only return the length of the + * result without writing any of the result string (pre-flighting). + * Unlike for other ICU functions, if srcLength>=0 then it + * must be destCapacity>=srcLength. + * @param pDestLength A pointer to receive the number of units written to the destination. If + * pDestLength!=NULL then *pDestLength is always set to the + * number of output units corresponding to the transformation of + * all the input units, even in case of a buffer overflow. + * Unlike for other ICU functions, if srcLength>=0 but + * destCapacity<srcLength, then *pDestLength will be set to srcLength + * (and U_BUFFER_OVERFLOW_ERROR will be set) + * regardless of the actual result length. + * @param src The original source string + * @param srcLength The length of the original string. If -1, then src must be zero-terminated. + * @param pErrorCode Pointer to a standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return The pointer to destination buffer. + * @see u_strFromUTF8 + * @see u_strFromUTF8WithSub + * @see u_strToUTF8WithSub + * @draft ICU 3.6 + */ +U_CAPI UChar * U_EXPORT2 +u_strFromUTF8Lenient(UChar *dest, + int32_t destCapacity, + int32_t *pDestLength, + const char *src, + int32_t srcLength, + UErrorCode *pErrorCode); + +/** * Converts a sequence of UChars (UTF-16) to UTF32 units. * * @param dest A buffer for the result string. The result will be zero-terminated if diff --git a/Build/source/libs/icu-xetex/common/unicode/usystem.h b/Build/source/libs/icu-xetex/common/unicode/usystem.h new file mode 100644 index 00000000000..b42e1023fe0 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/unicode/usystem.h @@ -0,0 +1,46 @@ +/* +******************************************************************************* +* Copyright (C) 2004-2006, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* +* file name: +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* Created by: genheaders.pl, a perl script written by Ram Viswanadha +* +* Contains data for commenting out APIs. +* Gets included by umachine.h +* +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! +*/ + +#ifndef USYSTEM_H +#define USYSTEM_H + +#ifdef U_HIDE_SYSTEM_API + +# if U_DISABLE_RENAMING +# define u_cleanup u_cleanup_SYSTEM_API_DO_NOT_USE +# define u_setAtomicIncDecFunctions u_setAtomicIncDecFunctions_SYSTEM_API_DO_NOT_USE +# define u_setMemoryFunctions u_setMemoryFunctions_SYSTEM_API_DO_NOT_USE +# define u_setMutexFunctions u_setMutexFunctions_SYSTEM_API_DO_NOT_USE +# define ucnv_setDefaultName ucnv_setDefaultName_SYSTEM_API_DO_NOT_USE +# define uloc_getDefault uloc_getDefault_SYSTEM_API_DO_NOT_USE +# define uloc_setDefault uloc_setDefault_SYSTEM_API_DO_NOT_USE +# else +# define u_cleanup_3_6 u_cleanup_SYSTEM_API_DO_NOT_USE +# define u_setAtomicIncDecFunctions_3_6 u_setAtomicIncDecFunctions_SYSTEM_API_DO_NOT_USE +# define u_setMemoryFunctions_3_6 u_setMemoryFunctions_SYSTEM_API_DO_NOT_USE +# define u_setMutexFunctions_3_6 u_setMutexFunctions_SYSTEM_API_DO_NOT_USE +# define ucnv_setDefaultName_3_6 ucnv_setDefaultName_SYSTEM_API_DO_NOT_USE +# define uloc_getDefault_3_6 uloc_getDefault_SYSTEM_API_DO_NOT_USE +# define uloc_setDefault_3_6 uloc_setDefault_SYSTEM_API_DO_NOT_USE +# endif /* U_DISABLE_RENAMING */ + +#endif /* U_HIDE_SYSTEM_API */ +#endif /* USYSTEM_H */ + diff --git a/Build/source/libs/icu-xetex/common/unicode/utext.h b/Build/source/libs/icu-xetex/common/unicode/utext.h index 1588a18b5d7..84aeb68afeb 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utext.h +++ b/Build/source/libs/icu-xetex/common/unicode/utext.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2004-2005, International Business Machines +* Copyright (C) 2004-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -23,7 +23,7 @@ * * The Text Access API provides a means to allow text that is stored in alternative * formats to work with ICU services. ICU normally operates on text that is - * stored UTF-16 format, in (UChar *) arrays for the C APIs or as type + * stored in UTF-16 format, in (UChar *) arrays for the C APIs or as type * UnicodeString for C++ APIs. * * ICU Text Access allows other formats, such as UTF-8 or non-contiguous @@ -102,6 +102,35 @@ * an adjusted index is returned, the original index referred to the * interior of a character. * + * <em>Conventions for calling UText functions</em> + * + * Most UText access functions have as their first parameter a (UText *) pointer, + * which specifies the UText to be used. Unless otherwise noted, the + * pointer must refer to a valid, open UText. Attempting to + * use a closed UText or passing a NULL pointer is a programming error and + * will produce undefined results or NULL pointer exceptions. + * + * The UText_Open family of functions can either open an existing (closed) + * UText, or heap allocate a new UText. Here is sample code for creating + * a stack-allocated UText. + * + * \code + * char *s = whatever(); // A utf-8 string + * U_ErrorCode status = U_ZERO_ERROR; + * UText ut = UTEXT_INITIALIZER; + * utext_openUTF8(ut, s, -1, &status); + * if (U_FAILURE(status)) { + * // error handling + * } else { + * // work with the UText + * } + * \endcode + * + * Any existing UText passed to an open function _must_ have been initialized, + * either by the UTEXT_INITIALIZER, or by having been originally heap-allocated + * by an open function. Passing NULL will cause the open function to + * heap-allocate and fully initialize a new UText. + * */ @@ -110,18 +139,14 @@ #ifdef XP_CPLUSPLUS #include "unicode/rep.h" #include "unicode/unistr.h" +#include "unicode/chariter.h" #endif -#ifndef U_HIDE_DRAFT_API U_CDECL_BEGIN struct UText; -typedef struct UText UText; /**< C typedef for struct UText. @draft ICU 3.4 */ - -struct UTextChunk; -typedef struct UTextChunk UTextChunk; /**< C typedef for struct UTextChunk. @draft ICU 3.4 */ - +typedef struct UText UText; /**< C typedef for struct UText. @draft ICU 3.6 */ /*************************************************************************************** @@ -132,10 +157,9 @@ typedef struct UTextChunk UTextChunk; /**< C typedef for struct UTextChunk. @dra /** - * utext_close Close function for UText instances. - * Cleans up, releases any resources being held by an - * open UText. - * <p/> + * Close function for UText instances. + * Cleans up, releases any resources being held by an open UText. + * <p> * If the UText was originally allocated by one of the utext_open functions, * the storage associated with the utext will also be freed. * If the UText storage originated with the application, as it would with @@ -169,7 +193,7 @@ utext_close(UText *ut); * @param ut Pointer to a UText struct. If NULL, a new UText will be created. * If non-NULL, must refer to an initialized UText struct, which will then * be reset to reference the specified UTF-8 string. - * @param s A UTF-8 string + * @param s A UTF-8 string. Must not be NULL. * @param length The length of the UTF-8 string in bytes, or -1 if the string is * zero terminated. * @param status Errors are returned here. @@ -178,7 +202,7 @@ utext_close(UText *ut); * @draft ICU 3.4 */ U_DRAFT UText * U_EXPORT2 -utext_openUTF8(UText *ut, const char *s, int32_t length, UErrorCode *status); +utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status); /** @@ -196,7 +220,7 @@ utext_openUTF8(UText *ut, const char *s, int32_t length, UErrorCode *status); * @draft ICU 3.4 */ U_DRAFT UText * U_EXPORT2 -utext_openUChars(UText *ut, const UChar *s, int32_t length, UErrorCode *status); +utext_openUChars(UText *ut, const UChar *s, int64_t length, UErrorCode *status); #ifdef XP_CPLUSPLUS @@ -247,19 +271,41 @@ utext_openConstUnicodeString(UText *ut, const UnicodeString *s, UErrorCode *stat U_DRAFT UText * U_EXPORT2 utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status); +/** + * Open a UText implementation over an ICU CharacterIterator. + * @param ut Pointer to a UText struct. If NULL, a new UText will be created. + * If non-NULL, must refer to an already existing UText, which will then + * be reset to reference the specified replaceable text. + * @param ci A Character Iterator. + * @param status Errors are returned here. + * @return Pointer to the UText. If a UText was supplied as input, this + * will always be used and returned. + * @see Replaceable + * @draft ICU 3.4 + */ +U_DRAFT UText * U_EXPORT2 +utext_openCharacterIterator(UText *ut, CharacterIterator *ic, UErrorCode *status); + #endif /** - * clone a UText. Much like opening a UText where the source text is itself + * Clone a UText. This is much like opening a UText where the source text is itself * another UText. * * A deep clone will copy both the UText data structures and the underlying text. * The original and cloned UText will operate completely independently; modifications - * made to the text in one will not effect the other. Text providers are not + * made to the text in one will not affect the other. Text providers are not * required to support deep clones. The user of clone() must check the status return * and be prepared to handle failures. * + * The standard UText implementations for UTF8, UChar *, UnicodeString and + * Replaceable all support deep cloning. + * + * The UText returned from a deep clone will be writable, assuming that the text + * provider is able to support writing, even if the source UText had been made + * non-writable by means of UText_freeze(). + * * A shallow clone replicates only the UText data structures; it does not make * a copy of the underlying text. Shallow clones can be used as an efficient way to * have multiple iterators active in a single text string that is not being @@ -268,15 +314,32 @@ utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status); * A shallow clone operation will not fail, barring truly exceptional conditions such * as memory allocation failures. * + * Shallow UText clones should be avoided if the UText functions that modify the + * text are expected to be used, either on the original or the cloned UText. + * Any such modifications can cause unpredictable behavior. Read Only + * shallow clones provide some protection against errors of this type by + * disabling text modification via the cloned UText. + * + * A shallow clone made with the readOnly parameter == FALSE will preserve the + * utext_isWritable() state of the source object. Note, however, that + * write operations must be avoided while more than one UText exists that refer + * to the same underlying text. + * * A UText and its clone may be safely concurrently accessed by separate threads. - * This is true for both shallow and deep clones. + * This is true for read access only with shallow clones, and for both read and + * write access with deep clones. * It is the responsibility of the Text Provider to ensure that this thread safety * constraint is met. * * @param dest A UText struct to be filled in with the result of the clone operation, * or NULL if the clone function should heap-allocate a new UText struct. + * If non-NULL, must refer to an already existing UText, which will then + * be reset to become the clone. * @param src The UText to be cloned. * @param deep TRUE to request a deep clone, FALSE for a shallow clone. + * @param readOnly TRUE to request that the cloned UText have read only access to the + * underlying text. + * @param status Errors are returned here. For deep clones, U_UNSUPPORTED_ERROR * will be returned if the text provider is unable to clone the * original text. @@ -284,12 +347,27 @@ utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status); * @draft ICU 3.4 */ U_DRAFT UText * U_EXPORT2 -utext_clone(UText *dest, const UText *src, UBool deep, UErrorCode *status); +utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status); + + +/** + * Compare two UText objects for equality. + * UTexts are equal if they are iterating over the same text, and + * have the same iteration position within the text. + * If either or both of the parameters are NULL, the comparison is FALSE. + * + * @param a The first of the two UTexts to compare. + * @param b The other UText to be compared. + * @return TRUE if the two UTexts are equal. + * @draft ICU 3.6 + */ +U_DRAFT UBool U_EXPORT2 +utext_equals(const UText *a, const UText *b); /***************************************************************************** * - * C Functions to work with the text represeted by a UText wrapper + * Functions to work with the text represeted by a UText wrapper * *****************************************************************************/ @@ -304,7 +382,7 @@ utext_clone(UText *dest, const UText *src, UBool deep, UErrorCode *status); * * @draft ICU 3.4 */ -U_DRAFT int32_t U_EXPORT2 +U_DRAFT int64_t U_EXPORT2 utext_nativeLength(UText *ut); /** @@ -336,7 +414,10 @@ utext_isLengthExpensive(const UText *ut); * This function is roughly equivalent to the the sequence * utext_setNativeIndex(index); * utext_current32(); - * (There is a difference if the index is out of bounds by being less than zero) + * (There is a subtle difference if the index is out of bounds by being less than zero - + * utext_setNativeIndex(negative value) sets the index to zero, after which utext_current() + * will return the char at zero. utext_char32At(negative index), on the other hand, will + * return the U_SENTINEL value of -1.) * * @param ut the text to be accessed * @param nativeIndex the native index of the character to be accessed. If the index points @@ -346,7 +427,7 @@ utext_isLengthExpensive(const UText *ut); * @draft ICU 3.4 */ U_DRAFT UChar32 U_EXPORT2 -utext_char32At(UText *ut, int32_t nativeIndex); +utext_char32At(UText *ut, int64_t nativeIndex); /** @@ -366,9 +447,12 @@ utext_current32(UText *ut); /** * Get the code point at the current iteration position of the UText, and * advance the position to the first index following the character. - * Returns U_SENTINEL (-1) if the position is at the end of the - * text. - * This is a post-increment operation + * + * If the position is at the end of the text (the index following + * the last character, which is also the length of the text), + * return U_SENTINEL (-1) and do not advance the index. + * + * This is a post-increment operation. * * An inline macro version of this function, UTEXT_NEXT32(), * is available for performance critical use. @@ -386,11 +470,12 @@ utext_next32(UText *ut); * Move the iterator position to the character (code point) whose * index precedes the current position, and return that character. * This is a pre-decrement operation. - * Returns U_SENTINEL (-1) if the position is at the start of the text. - * This is a pre-decrement operation. * - * An inline macro version of this function, UTEXT_PREVIOUS32(), - * is available for performance critical use. + * If the initial position is at the start of the text (index of 0) + * return U_SENTINEL (-1), and leave the position unchanged. + * + * An inline macro version of this function, UTEXT_PREVIOUS32(), + * is available for performance critical use. * * @param ut the text to be accessed. * @return the previous UChar32 code point, or U_SENTINEL (-1) @@ -403,12 +488,16 @@ utext_previous32(UText *ut); /** - * Set the iteration index, access the text for forward iteration, - * and return the code point starting at or before that index. + * Set the iteration index and return the code point at that index. * Leave the iteration index at the start of the following code point. * * This function is the most efficient and convenient way to - * begin a forward iteration. + * begin a forward iteration. The results are identical to the those + * from the sequence + * \code + * utext_setIndex(); + * utext_next32(); + * \endcode * * @param ut the text to be accessed. * @param nativeIndex Iteration index, in the native units of the text provider. @@ -417,7 +506,7 @@ utext_previous32(UText *ut); * @draft ICU 3.4 */ U_DRAFT UChar32 U_EXPORT2 -utext_next32From(UText *ut, int32_t nativeIndex); +utext_next32From(UText *ut, int64_t nativeIndex); @@ -437,92 +526,118 @@ utext_next32From(UText *ut, int32_t nativeIndex); * @draft ICU 3.4 */ U_DRAFT UChar32 U_EXPORT2 -utext_previous32From(UText *ut, int32_t nativeIndex); +utext_previous32From(UText *ut, int64_t nativeIndex); /** * Get the current iterator position, which can range from 0 to * the length of the text. * The position is a native index into the input text, in whatever format it - * may have, and may not always correspond to a UChar (UTF-16) index - * into the text. The returned position will always be aligned to a - * code point boundary + * may have (possibly UTF-8 for example), and may not always be the same as + * the corresponding UChar (UTF-16) index. + * The returned position will always be aligned to a code point boundary. * * @param ut the text to be accessed. * @return the current index position, in the native units of the text provider. * @draft ICU 3.4 */ -U_DRAFT int32_t U_EXPORT2 -utext_getNativeIndex(UText *ut); +U_DRAFT int64_t U_EXPORT2 +utext_getNativeIndex(const UText *ut); /** - * Set the current iteration position to the nearest code point - * boundary at or preceding the specified index. - * The index is in the native units of the original input text. - * If the index is out of range, it will be trimmed to be within - * the range of the input text. - * <p/> - * It will usually be more efficient to begin an iteration - * using the functions utext_next32From() or utext_previous32From() - * rather than setIndex(). - * <p/> - * Moving the index position to an adjacent character is best done - * with utext_next32(), utext_previous32() or utext_moveIndex32(). - * Attempting to do direct arithmetic on the index position is - * complicated by the fact that the size (in native units) of a - * character depends on the underlying representation of the character - * (UTF-8, UTF-16, UTF-32, arbitrary codepage), and is not - * easily knowable. - * - * @param ut the text to be accessed. - * @param nativeIndex the native unit index of the new iteration position. - * @draft ICU 3.4 - */ + * Set the current iteration position to the nearest code point + * boundary at or preceding the specified index. + * The index is in the native units of the original input text. + * If the index is out of range, it will be pinned to be within + * the range of the input text. + * <p> + * It will usually be more efficient to begin an iteration + * using the functions utext_next32From() or utext_previous32From() + * rather than setIndex(). + * <p> + * Moving the index position to an adjacent character is best done + * with utext_next32(), utext_previous32() or utext_moveIndex32(). + * Attempting to do direct arithmetic on the index position is + * complicated by the fact that the size (in native units) of a + * character depends on the underlying representation of the character + * (UTF-8, UTF-16, UTF-32, arbitrary codepage), and is not + * easily knowable. + * + * @param ut the text to be accessed. + * @param nativeIndex the native unit index of the new iteration position. + * @draft ICU 3.4 + */ U_DRAFT void U_EXPORT2 -utext_setNativeIndex(UText *ut, int32_t nativeIndex); +utext_setNativeIndex(UText *ut, int64_t nativeIndex); /** - * Move the iterator postion by delta code points. The number of code points - * is a signed number; a negative delta will move the iterator backwards, - * towards the start of the text. - * <p/> - * The index is moved by <code>delta</code> code points - * forward or backward, but no further backward than to 0 and - * no further forward than to utext_nativeLength(). - * The resulting index value will be in between 0 and length, inclusive. - * <p/> - * Because the index is kept in the native units of the text provider, the - * actual numeric amount by which the index moves depends on the - * underlying text storage representation of the text provider. - * - * @param ut the text to be accessed. - * @param delta the signed number of code points to move the iteration position. - * @return TRUE if the position could be moved the requested number of positions while - * staying within the range [0 - text length]. - * @draft ICU 3.4 - */ + * Move the iterator postion by delta code points. The number of code points + * is a signed number; a negative delta will move the iterator backwards, + * towards the start of the text. + * <p> + * The index is moved by <code>delta</code> code points + * forward or backward, but no further backward than to 0 and + * no further forward than to utext_nativeLength(). + * The resulting index value will be in between 0 and length, inclusive. + * + * @param ut the text to be accessed. + * @param delta the signed number of code points to move the iteration position. + * @return TRUE if the position could be moved the requested number of positions while + * staying within the range [0 - text length]. + * @draft ICU 3.4 + */ U_DRAFT UBool U_EXPORT2 utext_moveIndex32(UText *ut, int32_t delta); +/** + * Get the native index of the character preceeding the current position. + * If the iteration position is already at the start of the text, zero + * is returned. + * The value returned is the same as that obtained from the following sequence, + * but without the side effect of changing the iteration position. + * + * \code + * UText *ut = whatever; + * ... + * utext_previous(ut) + * utext_getNativeIndex(ut); + * \endcode + * + * This function is most useful during forwards iteration, where it will get the + * native index of the character most recently returned from utext_next(). + * + * @param ut the text to be accessed + * @return the native index of the character preceeding the current index position, + * or zero if the current position is at the start of the text. + * @draft ICU 3.6 + */ +U_DRAFT int64_t U_EXPORT2 +utext_getPreviousNativeIndex(UText *ut); + /** * * Extract text from a UText into a UChar buffer. The range of text to be extracted * is specified in the native indices of the UText provider. These may not necessarily * be UTF-16 indices. - * <p/> - * The size (number of 16 bit UChars) in the data to be extracted is returned. The + * <p> + * The size (number of 16 bit UChars) of the data to be extracted is returned. The * full number of UChars is returned, even when the extracted text is truncated * because the specified buffer size is too small. - * + * <p> * The extracted string will (if you are a user) / must (if you are a text provider) * be NUL-terminated if there is sufficient space in the destination buffer. This * terminating NUL is not included in the returned length. + * <p> + * The iteration index is left at the position following the last extracted character. * * @param ut the UText from which to extract data. - * @param nativeStart the native index of the first character to extract. + * @param nativeStart the native index of the first character to extract.\ + * If the specified index is out of range, + * it will be pinned to to be within 0 <= index <= textLength * @param nativeLimit the native string index of the position following the last - * character to extract. If the specified limit is greater than the length - * of the text, the limit will be trimmed back to the text length. + * character to extract. If the specified index is out of range, + * it will be pinned to to be within 0 <= index <= textLength. + * nativeLimit must be >= nativeStart. * @param dest the UChar (UTF-16) buffer into which the extracted text is placed * @param destCapacity The size, in UChars, of the destination buffer. May be zero * for precomputing the required size. @@ -535,12 +650,12 @@ utext_moveIndex32(UText *ut, int32_t delta); */ U_DRAFT int32_t U_EXPORT2 utext_extract(UText *ut, - int32_t nativeStart, int32_t nativeLimit, + int64_t nativeStart, int64_t nativeLimit, UChar *dest, int32_t destCapacity, UErrorCode *status); - +#ifndef U_HIDE_DRAFT_API /************************************************************************************ * * #define inline versions of selected performance-critical text access functions @@ -568,8 +683,8 @@ utext_extract(UText *ut, * @draft ICU 3.4 */ #define UTEXT_NEXT32(ut) \ - ((ut)->chunk.offset < (ut)->chunk.length && ((ut)->chunk.contents)[(ut)->chunk.offset]<0xd800 ? \ - ((ut)->chunk.contents)[((ut)->chunk.offset)++] : utext_next32(ut)) + ((ut)->chunkOffset < (ut)->chunkLength && ((ut)->chunkContents)[(ut)->chunkOffset]<0xd800 ? \ + ((ut)->chunkContents)[((ut)->chunkOffset)++] : utext_next32(ut)) /** * inline version of utext_previous32(), for performance-critical situations. @@ -582,12 +697,31 @@ utext_extract(UText *ut, * @draft ICU 3.4 */ #define UTEXT_PREVIOUS32(ut) \ - ((ut)->chunk.offset > 0 && \ - (ut)->chunk.contents[(ut)->chunk.offset-1] < 0xd800 ? \ - (ut)->chunk.contents[--((ut)->chunk.offset)] : utext_previous32(ut)) + ((ut)->chunkOffset > 0 && \ + (ut)->chunkContents[(ut)->chunkOffset-1] < 0xd800 ? \ + (ut)->chunkContents[--((ut)->chunkOffset)] : utext_previous32(ut)) + +/** + * inline version of utext_getNativeIndex(), for performance-critical situations. + * + * Get the current iterator position, which can range from 0 to + * the length of the text. + * The position is a native index into the input text, in whatever format it + * may have (possibly UTF-8 for example), and may not always be the same as + * the corresponding UChar (UTF-16) index. + * The returned position will always be aligned to a code point boundary. + * + * @draft ICU 3.6 + */ +#define UTEXT_GETNATIVEINDEX(ut) \ + ((ut)->chunkOffset <= (ut)->nativeIndexingLimit? \ + (ut)->chunkNativeStart+(ut)->chunkOffset : \ + (ut)->pFuncs->mapOffsetToNative(ut)) + +#endif /************************************************************************************ * @@ -599,12 +733,20 @@ utext_extract(UText *ut, /** - * Return TRUE if the text can be written with utext_replace() or + * Return TRUE if the text can be written (modified) with utext_replace() or * utext_copy(). For the text to be writable, the text provider must - * be of a type that supports writing. + * be of a type that supports writing and the UText must not be frozen. + * + * Attempting to modify text when utext_isWriteable() is FALSE will fail - + * the text will not be modified, and an error will be returned from the function + * that attempted the modification. * * @param ut the UText to be tested. * @return TRUE if the text is modifiable. + * + * @see utext_freeze() + * @see utext_replace() + * @see utext_copy() * @draft ICU 3.4 * */ @@ -653,7 +795,7 @@ utext_hasMetaData(const UText *ut); */ U_DRAFT int32_t U_EXPORT2 utext_replace(UText *ut, - int32_t nativeStart, int32_t nativeLimit, + int64_t nativeStart, int64_t nativeLimit, const UChar *replacementText, int32_t replacementLength, UErrorCode *status); @@ -669,6 +811,9 @@ utext_replace(UText *ut, * The text to be copied or moved is inserted at destIndex; * it does not replace or overwrite any existing text. * + * The iteration position is left following the newly inserted text + * at the destination position. + * * This function is only available on UText types that support writing, * that is, ones where utext_isWritable() returns TRUE. * @@ -679,8 +824,10 @@ utext_replace(UText *ut, * * @param ut The UText representing the text to be operated on. * @param nativeStart The native index of the start of the region to be copied or moved - * @param nativeLimit The native index of the character position following the region to be copied. - * @param destIndex The native destination index to which the source substring is copied or moved. + * @param nativeLimit The native index of the character position following the region + * to be copied. + * @param destIndex The native destination index to which the source substring is + * copied or moved. * @param move If TRUE, then the substring is moved, not copied/duplicated. * @param status receives any error status. Possible errors include U_NO_WRITE_PERMISSION * @@ -688,68 +835,38 @@ utext_replace(UText *ut, */ U_DRAFT void U_EXPORT2 utext_copy(UText *ut, - int32_t nativeStart, int32_t nativeLimit, - int32_t destIndex, + int64_t nativeStart, int64_t nativeLimit, + int64_t destIndex, UBool move, UErrorCode *status); - - - -/**************************************************************************************** - * - * The following items are required by text providers implementations - - * by packages that are writing UText wrappers for additional types of text strings. - * These declarations are not needed by applications that use already existing - * UText functions for wrapping strings or accessing text data that has been - * wrapped in a UText. - * - *****************************************************************************************/ - - /** - * Descriptor of a chunk, or segment of text in UChar format. - * - * UText provider implementations surface their text in the form of UTextChunks. + * <p> + * Freeze a UText. This prevents any modification to the underlying text itself + * by means of functions operating on this UText. + * </p> + * <p> + * Once frozen, a UText can not be unfrozen. The intent is to ensure + * that a the text underlying a frozen UText wrapper cannot be modified via that UText. + * </p> + * <p> + * Caution: freezing a UText will disable changes made via the specific + * frozen UText wrapper only; it will not have any effect on the ability to + * directly modify the text by bypassing the UText. Any such backdoor modifications + * are always an error while UText access is occuring because the underlying + * text can get out of sync with UText's buffering. + * </p> * - * If the native form of the text if UTF-16, a chunk will typically refer back to the - * original native text storage. If the native format is something else, chunks - * will typically refer to a buffer maintained by the provider that contains - * some amount input that has been converted to UTF-16 (UChar) form. - * - * @draft ICU 3.4 - */ -struct UTextChunk { - /** Pointer to contents of text chunk. UChar format. */ - const UChar *contents; - - /** Index within the contents of the current iteration position. */ - int32_t offset; - - /** Number of UChars in the chunk. */ - int32_t length; - - /** (Native) text index corresponding to the start of the chunk. */ - int32_t nativeStart; - - /** (Native) text index corresponding to the end of the chunk (contents+length). */ - int32_t nativeLimit; - - /** If TRUE, then non-UTF-16 indexes are used in this chunk. */ - UBool nonUTF16Indexes; - - /** Unused. */ - UBool padding1, padding2, padding3; - - /** Unused. */ - int32_t padInt1, padInt2; - - /** Contains sizeof(UTextChunk) and allows the future addition of fields. */ - int32_t sizeOfStruct; -}; + * @param ut The UText to be frozen. + * @see utext_isWritable() + * @draft ICU 3.6 + */ +U_DRAFT void U_EXPORT2 +utext_freeze(UText *ut); +#ifndef U_HIDE_DRAFT_API /** * UText provider properties (bit field indexes). * @@ -758,12 +875,6 @@ struct UTextChunk { */ enum { /** - * The provider works with non-UTF-16 ("native") text indexes. - * For example, byte indexes into UTF-8 text or UTF-32 indexes into UTF-32 text. - * @draft ICU 3.4 - */ - UTEXT_PROVIDER_NON_UTF16_INDEXES = 0, - /** * It is potentially time consuming for the provider to determine the length of the text. * @draft ICU 3.4 */ @@ -786,8 +897,16 @@ enum { * There is meta data associated with the text. * @see Replaceable::hasMetaData() * @draft ICU 3.4 + */ + UTEXT_PROVIDER_HAS_META_DATA = 4, + /** + * Text provider owns the text storage. + * Generally occurs as the result of a deep clone of the UText. + * When closing the UText, the associated text must + * also be closed/deleted/freed/ whatever is appropriate. + * @draft ICU 3.6 */ - UTEXT_PROVIDER_HAS_META_DATA = 4 + UTEXT_PROVIDER_OWNS_TEXT = 5 }; /** @@ -839,7 +958,7 @@ UTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status); * @see UText * @draft ICU 3.4 */ -typedef int32_t U_CALLCONV +typedef int64_t U_CALLCONV UTextNativeLength(UText *ut); /** @@ -868,7 +987,7 @@ UTextNativeLength(UText *ut); * @draft ICU 3.4 */ typedef UBool U_CALLCONV -UTextAccess(UText *ut, int32_t nativeIndex, UBool forward, UTextChunk *chunk); +UTextAccess(UText *ut, int64_t nativeIndex, UBool forward); /** * Function type declaration for UText.extract(). @@ -876,10 +995,10 @@ UTextAccess(UText *ut, int32_t nativeIndex, UBool forward, UTextChunk *chunk); * Extract text from a UText into a UChar buffer. The range of text to be extracted * is specified in the native indices of the UText provider. These may not necessarily * be UTF-16 indices. - * <p/> + * <p> * The size (number of 16 bit UChars) in the data to be extracted is returned. The * full amount is returned, even when the specified buffer size is smaller. - * + * <p> * The extracted string will (if you are a user) / must (if you are a text provider) * be NUL-terminated if there is sufficient space in the destination buffer. * @@ -899,7 +1018,7 @@ UTextAccess(UText *ut, int32_t nativeIndex, UBool forward, UTextChunk *chunk); */ typedef int32_t U_CALLCONV UTextExtract(UText *ut, - int32_t nativeStart, int32_t nativeLimit, + int64_t nativeStart, int64_t nativeLimit, UChar *dest, int32_t destCapacity, UErrorCode *status); @@ -934,7 +1053,7 @@ UTextExtract(UText *ut, */ typedef int32_t U_CALLCONV UTextReplace(UText *ut, - int32_t nativeStart, int32_t nativeLimit, + int64_t nativeStart, int64_t nativeLimit, const UChar *replacementText, int32_t replacmentLength, UErrorCode *status); @@ -968,34 +1087,32 @@ UTextReplace(UText *ut, */ typedef void U_CALLCONV UTextCopy(UText *ut, - int32_t nativeStart, int32_t nativeLimit, - int32_t nativeDest, + int64_t nativeStart, int64_t nativeLimit, + int64_t nativeDest, UBool move, UErrorCode *status); /** * Function type declaration for UText.mapOffsetToNative(). - * Map from a UChar offset within the current text chunk within the UText to + * Map from the current UChar offset within the current text chunk to * the corresponding native index in the original source text. * * This is required only for text providers that do not use native UTF-16 indexes. * - * TODO: specify behavior with out-of-bounds offset? Shouldn't ever occur. - * * @param ut the UText. - * @param offset UTF-16 offset within text chunk - * 0<=offset<=chunk->length. - * @return Absolute (native) index corresponding to the specified chunk offset. + * @return Absolute (native) index corresponding to chunkOffset in the current chunk. * The returned native index should always be to a code point boundary. * * @draft ICU 3.4 */ -typedef int32_t U_CALLCONV -UTextMapOffsetToNative(UText *ut, int32_t offset); +typedef int64_t U_CALLCONV +UTextMapOffsetToNative(const UText *ut); /** * Function type declaration for UText.mapIndexToUTF16(). - * Map from a native index to a UChar offset within a text chunk + * Map from a native index to a UChar offset within a text chunk. + * Behavior is undefined if the native index does not fall within the + * current chunk. * * This function is required only for text providers that do not use native UTF-16 indexes. * @@ -1004,11 +1121,10 @@ UTextMapOffsetToNative(UText *ut, int32_t offset); * @return Chunk-relative UTF-16 offset corresponding to the specified native * index. * - * TODO: specify behavior with out-of-bounds index? Shouldn't ever occur. * @draft ICU 3.4 */ typedef int32_t U_CALLCONV -UTextMapNativeIndexToUTF16(UText *ut, int32_t nativeIndex); +UTextMapNativeIndexToUTF16(const UText *ut, int64_t nativeIndex); /** @@ -1033,102 +1149,44 @@ UTextClose(UText *ut); /** - * UText struct. Provides the interface between the generic UText access code - * and the UText provider code that works on specific kinds of - * text (UTF-8, noncontiguous UTF-16, whatever.) - * - * Applications that are using predefined types of text providers - * to pass text data to ICU services will have no need to view the - * internals of the UText structs that they open. - * - * @draft ICU 3.4 + * (public) Function dispatch table for UText. + * Conceptually very much like a C++ Virtual Function Table. + * This struct defines the organization of the table. + * Each text provider implementation must provide an + * actual table that is initialized with the appropriate functions + * for the type of text being handled. + * @draft ICU 3.6 */ -struct UText { +struct UTextFuncs { /** - * (protected) Pointer to string or wrapped object or similar. - * Not used by caller. - * @draft ICU 3.4 - */ - const void *context; - - /** - * (protected) Pointer fields available for use by the text provider. - * Not used by UText common code. - * @draft ICU 3.4 - */ - const void *p, *q, *r; - - /** - * (protected) Pointer to additional space requested by the - * text provider during the utext_open operation. - * @draft ICU 3.4 - */ - void *pExtra; - - /** - * (protected) Size in bytes of the extra space (pExtra). - * @draft ICU 3.4 - */ - int32_t extraSize; - - /** - * (private) Flags for managing the allocation and freeing of - * memory associated with this UText. - * @internal - */ - int32_t flags; - - /** - * (private) Magic. Try to detect when we are handed junk. - * utext_openXYZ() functions take an initialized, - * but not necessarily open, UText struct as an, - * optional fill-in parameter. This magic field - * is used to check for that initialization. - * Text provider close functions must NOT clear - * the magic field because that would prevent - * reuse of the UText struct. - * @internal - */ - uint32_t magic; - - - /** - * (public) sizeOfStruct=sizeof(UText) - * Allows possible backward compatible extension. + * (public) Function table size, sizeof(UTextFuncs) + * Intended for use should the table grow to accomodate added + * functions in the future, to allow tests for older format + * function tables that do not contain the extensions. * - * @draft ICU 3.4 + * Fields are placed for optimal alignment on + * 32/64/128-bit-pointer machines, by normally grouping together + * 4 32-bit fields, + * 4 pointers, + * 2 64-bit fields + * in sequence. + * @draft ICU 3.6 */ - int32_t sizeOfStruct; + int32_t tableSize; /** - * (protected) Integer fields for use by text provider. - * Not used by caller. - * @draft ICU 3.4 - */ - int32_t a, b, c; - - - /** - * Text provider properties. This set of flags is maintainted by the - * text provider implementation. - * @draft ICU 3.4 - */ - int32_t providerProperties; - - - - /** descriptor for the text chunk that includes or is adjacent to - * the current iteration position. - * @draft ICU 3.4 + * (private) Alignment padding. + * Do not use, reserved for use by the UText framework only. + * @internal */ - UTextChunk chunk; + int32_t reserved1, reserved2, reserved3; /** * (public) Function pointer for UTextClone * * @see UTextClone - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextClone *clone; @@ -1137,7 +1195,7 @@ struct UText { * May be expensive to compute! * * @see UTextLength - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextNativeLength *nativeLength; @@ -1145,7 +1203,7 @@ struct UText { * (public) Function pointer for UTextAccess. * * @see UTextAccess - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextAccess *access; @@ -1153,7 +1211,7 @@ struct UText { * (public) Function pointer for UTextExtract. * * @see UTextExtract - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextExtract *extract; @@ -1161,7 +1219,7 @@ struct UText { * (public) Function pointer for UTextReplace. * * @see UTextReplace - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextReplace *replace; @@ -1169,7 +1227,7 @@ struct UText { * (public) Function pointer for UTextCopy. * * @see UTextCopy - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextCopy *copy; @@ -1177,7 +1235,7 @@ struct UText { * (public) Function pointer for UTextMapOffsetToNative. * * @see UTextMapOffsetToNative - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextMapOffsetToNative *mapOffsetToNative; @@ -1185,7 +1243,7 @@ struct UText { * (public) Function pointer for UTextMapNativeIndexToUTF16. * * @see UTextMapNativeIndexToUTF16 - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextMapNativeIndexToUTF16 *mapNativeIndexToUTF16; @@ -1193,11 +1251,239 @@ struct UText { * (public) Function pointer for UTextClose. * * @see UTextClose - * @draft ICU 3.4 + * @draft ICU 3.6 */ UTextClose *close; + + /** + * (private) Spare function pointer + * @internal + */ + + UTextClose *spare1; + /** + * (private) Spare function pointer + * @internal + */ + UTextClose *spare2; + + /** + * (private) Spare function pointer + * @internal + */ + UTextClose *spare3; + +}; +typedef struct UTextFuncs UTextFuncs; + +#endif + +#ifndef U_HIDE_DRAFT_API + /** + * UText struct. Provides the interface between the generic UText access code + * and the UText provider code that works on specific kinds of + * text (UTF-8, noncontiguous UTF-16, whatever.) + * + * Applications that are using predefined types of text providers + * to pass text data to ICU services will have no need to view the + * internals of the UText structs that they open. + * + * @draft ICU 3.6 + */ +struct UText { + /** + * (private) Magic. Used to help detect when UText functions are handed + * invalid or unitialized UText structs. + * utext_openXYZ() functions take an initialized, + * but not necessarily open, UText struct as an + * optional fill-in parameter. This magic field + * is used to check for that initialization. + * Text provider close functions must NOT clear + * the magic field because that would prevent + * reuse of the UText struct. + * @internal + */ + uint32_t magic; + + + /** + * (private) Flags for managing the allocation and freeing of + * memory associated with this UText. + * @internal + */ + int32_t flags; + + + /** + * Text provider properties. This set of flags is maintainted by the + * text provider implementation. + * @draft ICU 3.4 + */ + int32_t providerProperties; + + /** + * (public) sizeOfStruct=sizeof(UText) + * Allows possible backward compatible extension. + * + * @draft ICU 3.4 + */ + int32_t sizeOfStruct; + + /* ------ 16 byte alignment boundary ----------- */ + + + /** + * (protected) Native index of the first character position following + * the current chunk. + * @draft ICU 3.6 + */ + int64_t chunkNativeLimit; + + /** + * (protected) Size in bytes of the extra space (pExtra). + * @draft ICU 3.4 + */ + int32_t extraSize; + + /** + * (protected) The highest chunk offset where native indexing and + * chunk (UTF-16) indexing correspond. For UTF-16 sources, value + * will be equal to chunkLength. + * + * @draft ICU 3.6 + */ + int32_t nativeIndexingLimit; + + /* ---- 16 byte alignment boundary------ */ + + /** + * (protected) Native index of the first character in the text chunk. + * @draft ICU 3.6 + */ + int64_t chunkNativeStart; + + /** + * (protected) Current iteration position within the text chunk (UTF-16 buffer). + * This is the index to the character that will be returned by utext_next32(). + * @draft ICU 3.6 + */ + int32_t chunkOffset; + + /** + * (protected) Length the text chunk (UTF-16 buffer), in UChars. + * @draft ICU 3.6 + */ + int32_t chunkLength; + + /* ---- 16 byte alignment boundary-- */ + + + /** + * (protected) pointer to a chunk of text in UTF-16 format. + * May refer either to original storage of the source of the text, or + * if conversion was required, to a buffer owned by the UText. + * @draft ICU 3.6 + */ + const UChar *chunkContents; + + /** + * (public) Pointer to Dispatch table for accessing functions for this UText. + * @draft ICU 3.6 + */ + UTextFuncs *pFuncs; + + /** + * (protected) Pointer to additional space requested by the + * text provider during the utext_open operation. + * @draft ICU 3.4 + */ + void *pExtra; + + /** + * (protected) Pointer to string or text-containin object or similar. + * This is the source of the text that this UText is wrapping, in a format + * that is known to the text provider functions. + * @draft ICU 3.4 + */ + const void *context; + + /* --- 16 byte alignment boundary--- */ + + /** + * (protected) Pointer fields available for use by the text provider. + * Not used by UText common code. + * @draft ICU 3.6 + */ + const void *p; + /** + * (protected) Pointer fields available for use by the text provider. + * Not used by UText common code. + * @draft ICU 3.6 + */ + const void *q; + /** + * (protected) Pointer fields available for use by the text provider. + * Not used by UText common code. + * @draft ICU 3.6 + */ + const void *r; + + /** + * Private field reserved for future use by the UText framework + * itself. This is not to be touched by the text providers. + * @internal ICU 3.4 + */ + void *privP; + + + /* --- 16 byte alignment boundary--- */ + + + /** + * (protected) Integer field reserved for use by the text provider. + * Not used by the UText framework, or by the client (user) of the UText. + * @draft ICU 3.4 + */ + int64_t a; + + /** + * (protected) Integer field reserved for use by the text provider. + * Not used by the UText framework, or by the client (user) of the UText. + * @draft ICU 3.4 + */ + int32_t b; + + /** + * (protected) Integer field reserved for use by the text provider. + * Not used by the UText framework, or by the client (user) of the UText. + * @draft ICU 3.4 + */ + int32_t c; + + /* ---- 16 byte alignment boundary---- */ + + + /** + * Private field reserved for future use by the UText framework + * itself. This is not to be touched by the text providers. + * @internal ICU 3.4 + */ + int64_t privA; + /** + * Private field reserved for future use by the UText framework + * itself. This is not to be touched by the text providers. + * @internal ICU 3.4 + */ + int32_t privB; + /** + * Private field reserved for future use by the UText framework + * itself. This is not to be touched by the text providers. + * @internal ICU 3.4 + */ + int32_t privC; }; +#endif /** * Common function for use by Text Provider implementations to allocate and/or initialize @@ -1220,74 +1506,47 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status); /** * @internal + * Value used to help identify correctly initialized UText structs. + * Note: must be publicly visible so that UTEXT_INITIALIZER can access it. */ enum { UTEXT_MAGIC = 0x345ad82c }; - - -/** - * Initializer for a UTextChunk - * @internal - */ -#define UTEXT_CHUNK_INIT { \ - NULL, /* contents */ \ - 0, /* offset */ \ - 0, /* length */ \ - 0, /* start */ \ - 0, /* limit */ \ - FALSE, /* nonUTF16idx */ \ - FALSE, FALSE, FALSE, /* padding1,2,3 */ \ - 0, 0, /* padInt1, 2 */ \ - sizeof(UTextChunk) \ -} - - - -/** - * Initializer for the first part of a UText struct, the part that is - * in common for all types of text providers. - * - * @internal - */ -#define UTEXT_INITIALIZER_HEAD \ - NULL, /* context */ \ - NULL, NULL, NULL, /* p, q, r */ \ - NULL, /* pExtra */ \ - 0, /* extraSize */ \ - 0, /* flags */ \ - UTEXT_MAGIC, /* magic */ \ - sizeof(UText), /* sizeOfStruct */ \ - 0, 0, 0, /* a, b, c */ \ - 0, /* providerProps */ \ - UTEXT_CHUNK_INIT /* UTextChunk */ - - +#ifndef U_HIDE_DRAFT_API /** * initializer to be used with local (stack) instances of a UText * struct. UText structs must be initialized before passing * them to one of the utext_open functions. * - * @draft ICU 3.4 + * @draft ICU 3.6 */ -#define UTEXT_INITIALIZER { \ - UTEXT_INITIALIZER_HEAD, \ - NULL, /* clone () */ \ - NULL, /* length () */ \ - NULL, /* access () */ \ - NULL, /* extract () */ \ - NULL, /* replace () */ \ - NULL, /* copy () */ \ - NULL, NULL, /* map * 2 () */ \ - NULL /* close () */ \ -} +#define UTEXT_INITIALIZER { \ + UTEXT_MAGIC, /* magic */ \ + 0, /* flags */ \ + 0, /* providerProps */ \ + sizeof(UText), /* sizeOfStruct */ \ + 0, /* chunkNativeLimit */ \ + 0, /* extraSize */ \ + 0, /* nativeIndexingLimit */ \ + 0, /* chunkNativeStart */ \ + 0, /* chunkOffset */ \ + 0, /* chunkLength */ \ + NULL, /* chunkContents */ \ + NULL, /* pFuncs */ \ + NULL, /* pExtra */ \ + NULL, /* context */ \ + NULL, NULL, NULL, /* p, q, r */ \ + NULL, /* privP */ \ + 0, 0, 0, /* a, b, c */ \ + 0, 0, 0 /* privA,B,C, */ \ + } -U_CDECL_END +#endif /* U_HIDE_DRAFT_API */ +U_CDECL_END -#endif /* U_HIDE_DRAFT_API */ #endif diff --git a/Build/source/libs/icu-xetex/common/unicode/utf.h b/Build/source/libs/icu-xetex/common/unicode/utf.h index 71abc4218dc..2dfef63d66f 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utf.h +++ b/Build/source/libs/icu-xetex/common/unicode/utf.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -63,6 +63,14 @@ * malformed sequences can be expressed unambiguously with a distinct subrange * of Unicode code points.) * + * The regular "safe" macros require that the initial, passed-in string index + * is within bounds. They only check the index when they read more than one + * code unit. This is usually done with code similar to the following loop: + * <pre>while(i<length) { + * U16_NEXT(s, i, length, c); + * // use c + * }</pre> + * * When it is safe to assume that text is well-formed UTF-16 * (does not contain single, unpaired surrogates), then one can use * U16_..._UNSAFE macros. @@ -80,6 +88,8 @@ * The unsafe UTF-8 macros are entirely implemented inside the macro definitions * and are fast, while the safe UTF-8 macros call functions for all but the * trivial (ASCII) cases. + * (ICU 3.6 optimizes U8_NEXT() and U8_APPEND() to handle most other common + * characters inline as well.) * * Unlike with UTF-16, malformed sequences cannot be expressed with distinct * code point values (0..U+10ffff). They are indicated with negative values instead. @@ -157,8 +167,6 @@ (uint32_t)(c)<=0x10ffff && \ !U_IS_UNICODE_NONCHAR(c))) -#ifndef U_HIDE_DRAFT_API - /** * Is this code point a BMP code point (U+0000..U+ffff)? * @param c 32-bit code point @@ -174,8 +182,6 @@ * @stable ICU 2.8 */ #define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c)-0x10000)<=0xfffff) - -#endif /*U_HIDE_DRAFT_API*/ /** * Is this code point a lead surrogate (U+d800..U+dbff)? diff --git a/Build/source/libs/icu-xetex/common/unicode/utf16.h b/Build/source/libs/icu-xetex/common/unicode/utf16.h index 217c27429b7..cd8c5c1ed10 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utf16.h +++ b/Build/source/libs/icu-xetex/common/unicode/utf16.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -179,7 +179,7 @@ * * @param s const UChar * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i<length + * @param i string offset, must be start<=i<length * @param length string length * @param c output UChar32 variable * @see U16_GET_UNSAFE @@ -243,7 +243,7 @@ * will be returned as the code point. * * @param s const UChar * string - * @param i string offset, i<length + * @param i string offset, must be i<length * @param length string length * @param c output UChar32 variable * @see U16_NEXT_UNSAFE @@ -292,7 +292,7 @@ * then isError is set to TRUE. * * @param s const UChar * string buffer - * @param i string offset, i<length + * @param i string offset, must be i<capacity * @param capacity size of the string buffer * @param c code point to append * @param isError output UBool set to TRUE if an error occurs, otherwise not modified @@ -332,7 +332,7 @@ * "Safe" macro, handles unpaired surrogates and checks for string boundaries. * * @param s const UChar * string - * @param i string offset, i<length + * @param i string offset, must be i<length * @param length string length * @see U16_FWD_1_UNSAFE * @stable ICU 2.4 @@ -370,7 +370,7 @@ * "Safe" macro, handles unpaired surrogates and checks for string boundaries. * * @param s const UChar * string - * @param i string offset, i<length + * @param i string offset, must be i<length * @param length string length * @param n number of code points to skip * @see U16_FWD_N_UNSAFE @@ -413,7 +413,7 @@ * * @param s const UChar * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i + * @param i string offset, must be start<=i * @see U16_SET_CP_START_UNSAFE * @stable ICU 2.4 */ @@ -468,7 +468,7 @@ * * @param s const UChar * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i + * @param i string offset, must be start<i * @param c output UChar32 variable * @see U16_PREV_UNSAFE * @stable ICU 2.4 @@ -509,7 +509,7 @@ * * @param s const UChar * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i + * @param i string offset, must be start<i * @see U16_BACK_1_UNSAFE * @stable ICU 2.4 */ @@ -549,7 +549,7 @@ * * @param s const UChar * string * @param start start of string - * @param i string offset, i<length + * @param i string offset, must be start<i * @param n number of code points to skip * @see U16_BACK_N_UNSAFE * @stable ICU 2.4 diff --git a/Build/source/libs/icu-xetex/common/unicode/utf8.h b/Build/source/libs/icu-xetex/common/unicode/utf8.h index b66ded8d6c0..ff788403048 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utf8.h +++ b/Build/source/libs/icu-xetex/common/unicode/utf8.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -48,8 +48,8 @@ * @internal */ #ifdef U_UTF8_IMPL -U_INTERNAL const uint8_t -#elif defined(U_STATIC_IMPLEMENTATION) +U_EXPORT const uint8_t +#elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) U_CFUNC const uint8_t #else U_CFUNC U_IMPORT const uint8_t /* U_IMPORT2? */ /*U_IMPORT*/ @@ -181,7 +181,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * * @param s const uint8_t * string * @param start starting string offset - * @param i string offset, start<=i<length + * @param i string offset, must be start<=i<length * @param length string length * @param c output UChar32 variable, set to <0 in case of an error * @see U8_GET_UNSAFE @@ -213,7 +213,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_NEXT_UNSAFE(s, i, c) { \ - (c)=(s)[(i)++]; \ + (c)=(uint8_t)(s)[(i)++]; \ if((uint8_t)((c)-0xc0)<0x35) { \ uint8_t __count=U8_COUNT_TRAIL_BYTES(c); \ U8_MASK_LEAD_BYTE(c, __count); \ @@ -243,16 +243,34 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * c is set to a negative value. * * @param s const uint8_t * string - * @param i string offset, i<length + * @param i string offset, must be i<length * @param length string length * @param c output UChar32 variable, set to <0 in case of an error * @see U8_NEXT_UNSAFE * @stable ICU 2.4 */ #define U8_NEXT(s, i, length, c) { \ - (c)=(s)[(i)++]; \ - if(((uint8_t)(c))>=0x80) { \ - if(U8_IS_LEAD(c)) { \ + (c)=(uint8_t)(s)[(i)++]; \ + if((c)>=0x80) { \ + uint8_t __t1, __t2; \ + if( /* handle U+1000..U+CFFF inline */ \ + (0xe0<(c) && (c)<=0xec) && \ + (((i)+1)<(length)) && \ + (__t1=(uint8_t)((s)[i]-0x80))<=0x3f && \ + (__t2=(uint8_t)((s)[(i)+1]-0x80))<= 0x3f \ + ) { \ + /* no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ \ + (c)=(UChar)(((c)<<12)|(__t1<<6)|__t2); \ + (i)+=2; \ + } else if( /* handle U+0080..U+07FF inline */ \ + ((c)<0xe0 && (c)>=0xc2) && \ + ((i)<(length)) && \ + (__t1=(uint8_t)((s)[i]-0x80))<=0x3f \ + ) { \ + (c)=(UChar)((((c)&0x1f)<<6)|__t1); \ + ++(i); \ + } else if(U8_IS_LEAD(c)) { \ + /* function call for "complicated" and error cases */ \ (c)=utf8_nextCharSafeBody((const uint8_t *)s, &(i), (int32_t)(length), c, -1); \ } else { \ (c)=U_SENTINEL; \ @@ -293,7 +311,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); } /** - * Append a code point to a string, overwriting 1 or 2 code units. + * Append a code point to a string, overwriting 1 to 4 bytes. * The offset points to the current end of the string contents * and is advanced (post-increment). * "Safe" macro, checks for a valid code point. @@ -302,18 +320,25 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * then isError is set to TRUE. * * @param s const uint8_t * string buffer - * @param i string offset, i<length - * @param length size of the string buffer + * @param i string offset, must be i<capacity + * @param capacity size of the string buffer * @param c code point to append * @param isError output UBool set to TRUE if an error occurs, otherwise not modified * @see U8_APPEND_UNSAFE * @stable ICU 2.4 */ -#define U8_APPEND(s, i, length, c, isError) { \ +#define U8_APPEND(s, i, capacity, c, isError) { \ if((uint32_t)(c)<=0x7f) { \ (s)[(i)++]=(uint8_t)(c); \ + } else if((uint32_t)(c)<=0x7ff && (i)+1<(capacity)) { \ + (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); \ + (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \ + } else if((uint32_t)(c)<=0xd7ff && (i)+2<(capacity)) { \ + (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); \ + (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); \ + (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \ } else { \ - (i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(length), c, &(isError)); \ + (i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(capacity), c, &(isError)); \ } \ } @@ -337,13 +362,13 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * "Safe" macro, checks for illegal sequences and for string boundaries. * * @param s const uint8_t * string - * @param i string offset, i<length + * @param i string offset, must be i<length * @param length string length * @see U8_FWD_1_UNSAFE * @stable ICU 2.4 */ #define U8_FWD_1(s, i, length) { \ - uint8_t __b=(s)[(i)++]; \ + uint8_t __b=(uint8_t)(s)[(i)++]; \ if(U8_IS_LEAD(__b)) { \ uint8_t __count=U8_COUNT_TRAIL_BYTES(__b); \ if((i)+__count>(length)) { \ @@ -383,7 +408,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * "Safe" macro, checks for illegal sequences and for string boundaries. * * @param s const uint8_t * string - * @param i string offset, i<length + * @param i string offset, must be i<length * @param length string length * @param n number of code points to skip * @see U8_FWD_N_UNSAFE @@ -424,7 +449,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * * @param s const uint8_t * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i + * @param i string offset, must be start<=i * @see U8_SET_CP_START_UNSAFE * @stable ICU 2.4 */ @@ -456,14 +481,14 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_PREV_UNSAFE(s, i, c) { \ - (c)=(s)[--(i)]; \ + (c)=(uint8_t)(s)[--(i)]; \ if(U8_IS_TRAIL(c)) { \ uint8_t __b, __count=1, __shift=6; \ \ /* c is a trail byte */ \ (c)&=0x3f; \ for(;;) { \ - __b=(s)[--(i)]; \ + __b=(uint8_t)(s)[--(i)]; \ if(__b>=0xc0) { \ U8_MASK_LEAD_BYTE(__b, __count); \ (c)|=(UChar32)__b<<__shift; \ @@ -492,16 +517,16 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * * @param s const uint8_t * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i + * @param i string offset, must be start<i * @param c output UChar32 variable, set to <0 in case of an error * @see U8_PREV_UNSAFE * @stable ICU 2.4 */ #define U8_PREV(s, start, i, c) { \ - (c)=(s)[--(i)]; \ + (c)=(uint8_t)(s)[--(i)]; \ if((c)>=0x80) { \ if((c)<=0xbf) { \ - (c)=utf8_prevCharSafeBody(s, start, &(i), c, -1); \ + (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -1); \ } else { \ (c)=U_SENTINEL; \ } \ @@ -531,7 +556,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * * @param s const uint8_t * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i + * @param i string offset, must be start<i * @see U8_BACK_1_UNSAFE * @stable ICU 2.4 */ @@ -571,7 +596,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * * @param s const uint8_t * string * @param start index of the start of the string - * @param i string offset, i<length + * @param i string offset, must be start<i * @param n number of code points to skip * @see U8_BACK_N_UNSAFE * @stable ICU 2.4 @@ -612,7 +637,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * * @param s const uint8_t * string * @param start starting string offset (usually 0) - * @param i string offset, start<=i<=length + * @param i string offset, must be start<=i<=length * @param length string length * @see U8_SET_CP_LIMIT_UNSAFE * @stable ICU 2.4 diff --git a/Build/source/libs/icu-xetex/common/unicode/utf_old.h b/Build/source/libs/icu-xetex/common/unicode/utf_old.h index 20bf9b0aa8d..2397889960e 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utf_old.h +++ b/Build/source/libs/icu-xetex/common/unicode/utf_old.h @@ -89,7 +89,7 @@ * accordingly. UTF-16 was the default.</p> * * <p>This concept has been abandoned. - * A lot of the ICU source code assumes UChar srings are in UTF-16. + * A lot of the ICU source code assumes UChar strings are in UTF-16. * This is especially true for low-level code like * conversion, normalization, and collation. * The utf.h header enforces the default of UTF-16. diff --git a/Build/source/libs/icu-xetex/common/unicode/utrace.h b/Build/source/libs/icu-xetex/common/unicode/utrace.h index edf50b0c2f7..bacca6df16c 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utrace.h +++ b/Build/source/libs/icu-xetex/common/unicode/utrace.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2003-2005, International Business Machines +* Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -30,8 +30,6 @@ U_CDECL_BEGIN -#ifndef U_HIDE_DRAFT_API - /** * Trace severity levels. Higher levels increase the verbosity of the trace output. * @see utrace_setLevel @@ -85,8 +83,6 @@ typedef enum UTraceFunctionNumber { UTRACE_COLLATION_LIMIT } UTraceFunctionNumber; -#endif /*U_HIDE_DRAFT_API*/ - /** * Setter for the trace level. * @param traceLevel A UTraceLevel value. diff --git a/Build/source/libs/icu-xetex/common/unicode/utypes.h b/Build/source/libs/icu-xetex/common/unicode/utypes.h index 2672c74289c..7aceb27f982 100644 --- a/Build/source/libs/icu-xetex/common/unicode/utypes.h +++ b/Build/source/libs/icu-xetex/common/unicode/utypes.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1996-2005, International Business Machines +* Copyright (C) 1996-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -54,6 +54,13 @@ #include "unicode/uobslete.h" #endif +#ifdef U_HIDE_INTERNAL_API +#include "unicode/uintrnal.h" +#endif + +#ifdef U_HIDE_SYSTEM_API +#include "unicode/usystem.h" +#endif /*! * \file @@ -190,11 +197,14 @@ * @stable ICU 2.4 */ #define U_ICUDATA_ENTRY_POINT U_DEF2_ICUDATA_ENTRY_POINT(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM) + /** + * Do not use. * @internal */ #define U_DEF2_ICUDATA_ENTRY_POINT(major, minor) U_DEF_ICUDATA_ENTRY_POINT(major, minor) /** + * Do not use. * @internal */ #define U_DEF_ICUDATA_ENTRY_POINT(major, minor) icudt##major##minor##_dat @@ -322,7 +332,7 @@ typedef void* UClassID; * \def U_DATA_API * Set to export library symbols from inside the stubdata library, * and to import them from outside. - * @draft ICU 3.0 + * @stable ICU 3.0 */ /** @@ -476,10 +486,11 @@ typedef void* UClassID; * * Note: This is currently only done on Windows because * some Linux/Unix compilers have problems with defining global new/delete. - * On Windows, WIN32 is defined, and it is _MSC_Ver>=1200 for MSVC 6.0 and higher. + * On Windows, WIN32 is defined, and it is _MSC_VER>=1200 for MSVC 6.0 and higher. */ -#if defined(XP_CPLUSPLUS) && defined(U_WINDOWS) && (_MSC_Ver>=1200) && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_USTDIO_IMPLEMENTATION)) +#if defined(XP_CPLUSPLUS) && defined(U_WINDOWS) && (_MSC_VER>=1200) && U_DEBUG && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_USTDIO_IMPLEMENTATION)) +#ifndef U_HIDE_INTERNAL_API /** * Global operator new, defined only inside ICU4C, must not be used. * Crashes intentionally. @@ -526,6 +537,7 @@ operator delete[](void * /*p*/) { *q=5; /* break it */ } +#endif /* U_HIDE_INTERNAL_API */ #endif /*===========================================================================*/ @@ -586,7 +598,7 @@ typedef enum UErrorCode { U_PARSE_ERROR = 9, /**< Equivalent to Java ParseException */ U_INVALID_CHAR_FOUND = 10, /**< Character conversion: Unmappable input sequence. In other APIs: Invalid character. */ U_TRUNCATED_CHAR_FOUND = 11, /**< Character conversion: Incomplete input sequence. */ - U_ILLEGAL_CHAR_FOUND = 12, /**< Character conversion: Illegal input sequence/combination of input units.. */ + U_ILLEGAL_CHAR_FOUND = 12, /**< Character conversion: Illegal input sequence/combination of input units. */ U_INVALID_TABLE_FORMAT = 13, /**< Conversion table file found, but corrupted */ U_INVALID_TABLE_FILE = 14, /**< Conversion table file not found */ U_BUFFER_OVERFLOW_ERROR = 15, /**< A result would not fit in the supplied buffer */ @@ -671,8 +683,8 @@ typedef enum UErrorCode { /* * the error code range 0x10200 0x102ff are reserved for Break Iterator related error */ + U_BRK_INTERNAL_ERROR=0x10200, /**< An internal error (bug) was detected. */ U_BRK_ERROR_START=0x10200, /**< Start of codes indicating Break Iterator failures */ - U_BRK_INTERNAL_ERROR, /**< An internal error (bug) was detected. */ U_BRK_HEX_DIGITS_EXPECTED, /**< Hex digits expected as part of a escaped char in a rule. */ U_BRK_SEMICOLON_EXPECTED, /**< Missing ';' at the end of a RBBI rule. */ U_BRK_RULE_SYNTAX, /**< Syntax error in RBBI rule. */ @@ -691,8 +703,8 @@ typedef enum UErrorCode { /* * The error codes in the range 0x10300-0x103ff are reserved for regular expression related errrs */ + U_REGEX_INTERNAL_ERROR=0x10300, /**< An internal error (bug) was detected. */ U_REGEX_ERROR_START=0x10300, /**< Start of codes indicating Regexp failures */ - U_REGEX_INTERNAL_ERROR, /**< An internal error (bug) was detected. */ U_REGEX_RULE_SYNTAX, /**< Syntax error in regexp pattern. */ U_REGEX_INVALID_STATE, /**< RegexMatcher in invalid state for requested operation */ U_REGEX_BAD_ESCAPE_SEQUENCE, /**< Unrecognized backslash escape sequence in pattern */ @@ -711,14 +723,15 @@ typedef enum UErrorCode { /* * The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes */ + U_IDNA_PROHIBITED_ERROR=0x10400, U_IDNA_ERROR_START=0x10400, - U_IDNA_PROHIBITED_ERROR, U_IDNA_UNASSIGNED_ERROR, U_IDNA_CHECK_BIDI_ERROR, U_IDNA_STD3_ASCII_RULES_ERROR, U_IDNA_ACE_PREFIX_ERROR, U_IDNA_VERIFICATION_ERROR, U_IDNA_LABEL_TOO_LONG_ERROR, + U_IDNA_ZERO_LENGTH_LABEL_ERROR, U_IDNA_ERROR_LIMIT, /* * Aliases for StringPrep diff --git a/Build/source/libs/icu-xetex/common/unicode/uversion.h b/Build/source/libs/icu-xetex/common/unicode/uversion.h index fdf251c2b22..156dd7fd93b 100644 --- a/Build/source/libs/icu-xetex/common/unicode/uversion.h +++ b/Build/source/libs/icu-xetex/common/unicode/uversion.h @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 2000-2005, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * @@ -67,7 +67,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 4 +#define U_ICU_VERSION_MINOR_NUM 6 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -79,20 +79,20 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _3_4 +#define U_ICU_VERSION_SUFFIX _3_6 /** The current ICU library version as a dotted-decimal string. The patchlevel * only appears in this string if it non-zero. * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "3.4" +#define U_ICU_VERSION "3.6" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "34" +#define U_ICU_VERSION_SHORT "36" /** An ICU version consists of up to 4 numbers from 0..255. * @stable ICU 2.4 @@ -119,13 +119,21 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; #define U_ICU_NAMESPACE icu namespace U_ICU_NAMESPACE { } #else -#define U_ICU_NAMESPACE icu_3_4 +#define U_ICU_NAMESPACE icu_3_6 namespace U_ICU_NAMESPACE { } namespace icu = U_ICU_NAMESPACE; #endif + +#ifndef U_USING_ICU_NAMESPACE +# define U_USING_ICU_NAMESPACE 1 +#endif + +#if U_USING_ICU_NAMESPACE U_NAMESPACE_USE #endif +#endif + /*===========================================================================*/ /* General version helper functions. Definitions in putil.c */ diff --git a/Build/source/libs/icu-xetex/common/uniset.cpp b/Build/source/libs/icu-xetex/common/uniset.cpp index e93462d7a82..50e786304eb 100644 --- a/Build/source/libs/icu-xetex/common/uniset.cpp +++ b/Build/source/libs/icu-xetex/common/uniset.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -339,24 +339,27 @@ int32_t UnicodeSet::findCodePoint(UChar32 c) const { // Return the smallest i such that c < list[i]. Assume // list[len - 1] == HIGH and that c is legal (0..HIGH-1). - if (c < list[0]) return 0; + if (c < list[0]) + return 0; // High runner test. c is often after the last range, so an // initial check for this condition pays off. - if (len >= 2 && c >= list[len-2]) return len-1; + if (len >= 2 && c >= list[len-2]) + return len-1; int32_t lo = 0; int32_t hi = len - 1; // invariant: c >= list[lo] // invariant: c < list[hi] for (;;) { int32_t i = (lo + hi) >> 1; - if (i == lo) return hi; - if (c < list[i]) { + if (i == lo) { + break; // Found! + } else if (c < list[i]) { hi = i; } else { lo = i; } } - return 0; // To make compiler happy; never reached + return hi; } /** diff --git a/Build/source/libs/icu-xetex/common/uniset_props.cpp b/Build/source/libs/icu-xetex/common/uniset_props.cpp index 2e619904f72..fe6e1291878 100644 --- a/Build/source/libs/icu-xetex/common/uniset_props.cpp +++ b/Build/source/libs/icu-xetex/common/uniset_props.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -67,11 +67,11 @@ #define UPPER_N ((UChar)78) /*N*/ #define EQUALS ((UChar)0x003D) /*=*/ -static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:" +//static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:" static const UChar POSIX_CLOSE[] = { COLON,SET_CLOSE,0 }; // ":]" -static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p" +//static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p" static const UChar PERL_CLOSE[] = { CLOSE_BRACE,0 }; // "}" -static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N" +//static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N" static const UChar HYPHEN_RIGHT_BRACE[] = {HYPHEN,SET_CLOSE,0}; /*-]*/ // Special property set IDs @@ -83,47 +83,11 @@ static const char ASSIGNED[] = "Assigned"; // [:^Cn:] #define NAME_PROP "na" #define NAME_PROP_LENGTH 2 -// TEMPORARY: Remove when deprecated category code constructor is removed. -static const UChar CATEGORY_NAMES[] = { - // Must be kept in sync with uchar.h/UCharCategory - 0x43, 0x6E, /* "Cn" */ - 0x4C, 0x75, /* "Lu" */ - 0x4C, 0x6C, /* "Ll" */ - 0x4C, 0x74, /* "Lt" */ - 0x4C, 0x6D, /* "Lm" */ - 0x4C, 0x6F, /* "Lo" */ - 0x4D, 0x6E, /* "Mn" */ - 0x4D, 0x65, /* "Me" */ - 0x4D, 0x63, /* "Mc" */ - 0x4E, 0x64, /* "Nd" */ - 0x4E, 0x6C, /* "Nl" */ - 0x4E, 0x6F, /* "No" */ - 0x5A, 0x73, /* "Zs" */ - 0x5A, 0x6C, /* "Zl" */ - 0x5A, 0x70, /* "Zp" */ - 0x43, 0x63, /* "Cc" */ - 0x43, 0x66, /* "Cf" */ - 0x43, 0x6F, /* "Co" */ - 0x43, 0x73, /* "Cs" */ - 0x50, 0x64, /* "Pd" */ - 0x50, 0x73, /* "Ps" */ - 0x50, 0x65, /* "Pe" */ - 0x50, 0x63, /* "Pc" */ - 0x50, 0x6F, /* "Po" */ - 0x53, 0x6D, /* "Sm" */ - 0x53, 0x63, /* "Sc" */ - 0x53, 0x6B, /* "Sk" */ - 0x53, 0x6F, /* "So" */ - 0x50, 0x69, /* "Pi" */ - 0x50, 0x66, /* "Pf" */ - 0x00 -}; - /** * Delimiter string used in patterns to close a category reference: * ":]". Example: "[:Lu:]". */ -static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */ +//static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */ U_NAMESPACE_BEGIN @@ -142,10 +106,10 @@ isPerlOpen(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==BACKSLASH && ((c=pattern.charAt(pos+1))==LOWER_P || c==UPPER_P); } -static inline UBool +/*static inline UBool isPerlClose(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==CLOSE_BRACE; -} +}*/ static inline UBool isNameOpen(const UnicodeString &pattern, int32_t pos) { @@ -157,10 +121,10 @@ isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==SET_OPEN && pattern.charAt(pos+1)==COLON; } -static inline UBool +/*static inline UBool isPOSIXClose(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==COLON && pattern.charAt(pos+1)==SET_CLOSE; -} +}*/ // TODO memory debugging provided inside uniset.cpp // could be made available here but probably obsolete with use of modern @@ -243,40 +207,6 @@ UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, _dbgct(this); } -#ifdef U_USE_UNICODESET_DEPRECATES -/** - * DEPRECATED Constructs a set from the given Unicode character category. - * @param category an integer indicating the character category as - * defined in uchar.h. - * @deprecated To be removed after 2002-DEC-31 - */ -UnicodeSet::UnicodeSet(int8_t category, UErrorCode& status) : - len(0), capacity(START_EXTRA), bufferCapacity(0), - list(0), buffer(0), strings(0) -{ - static const UChar OPEN[] = { 91, 58, 0 }; // "[:" - static const UChar CLOSE[]= { 58, 93, 0 }; // ":]" - if (U_SUCCESS(status)) { - if (category < 0 || category >= U_CHAR_CATEGORY_COUNT) { - status = U_ILLEGAL_ARGUMENT_ERROR; - } else { - UnicodeString pattern(FALSE, CATEGORY_NAMES + category*2, 2); - pattern.insert(0, OPEN); - pattern.append(CLOSE); - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(); - applyPattern(pattern, status); - } - } - } - _dbgct(this); -} -#endif - //---------------------------------------------------------------- // Public API //---------------------------------------------------------------- @@ -774,7 +704,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, * patterns like /[^abc]/i work. */ if ((options & USET_CASE_INSENSITIVE) != 0) { - closeOver(USET_CASE); + closeOver(USET_CASE_INSENSITIVE); } else if ((options & USET_ADD_CASE_MAPPINGS) != 0) { closeOver(USET_ADD_CASE_MAPPINGS); @@ -1360,7 +1290,7 @@ addCaseMapping(UnicodeSet &set, int32_t result, const UChar *full, UnicodeString } UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { - if (attribute & (USET_CASE | USET_ADD_CASE_MAPPINGS)) { + if (attribute & (USET_CASE_INSENSITIVE | USET_ADD_CASE_MAPPINGS)) { UErrorCode status = U_ZERO_ERROR; const UCaseProps *csp = ucase_getSingleton(&status); if (U_SUCCESS(status)) { @@ -1377,7 +1307,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { // start with input set to guarantee inclusion // USET_CASE: remove strings because the strings will actually be reduced (folded); // therefore, start with no strings and add only those needed - if (attribute & USET_CASE) { + if (attribute & USET_CASE_INSENSITIVE) { foldSet.strings->removeAllElements(); } @@ -1390,7 +1320,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { UChar32 start = getRangeStart(i); UChar32 end = getRangeEnd(i); - if (attribute & USET_CASE) { + if (attribute & USET_CASE_INSENSITIVE) { // full case closure for (UChar32 cp=start; cp<=end; ++cp) { ucase_addCaseClosure(csp, cp, &sa); @@ -1414,7 +1344,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { } } if (strings != NULL && strings->size() > 0) { - if (attribute & USET_CASE) { + if (attribute & USET_CASE_INSENSITIVE) { for (int32_t j=0; j<strings->size(); ++j) { str = *(const UnicodeString *) strings->elementAt(j); str.foldCase(); diff --git a/Build/source/libs/icu-xetex/common/unistr_cnv.cpp b/Build/source/libs/icu-xetex/common/unistr_cnv.cpp index 72afc3f4c19..adc0dda6d51 100644 --- a/Build/source/libs/icu-xetex/common/unistr_cnv.cpp +++ b/Build/source/libs/icu-xetex/common/unistr_cnv.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1999-2004, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -43,9 +43,9 @@ UnicodeString::UnicodeString(const char *codepageData, fArray(fStackBuffer), fFlags(kShortString) { - if(codepageData != 0) { - doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage); - } + if(codepageData != 0) { + doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage); + } } @@ -57,9 +57,9 @@ UnicodeString::UnicodeString(const char *codepageData, fArray(fStackBuffer), fFlags(kShortString) { - if(codepageData != 0) { - doCodepageCreate(codepageData, dataLength, codepage); - } + if(codepageData != 0) { + doCodepageCreate(codepageData, dataLength, codepage); + } } UnicodeString::UnicodeString(const char *src, int32_t srcLength, @@ -70,35 +70,35 @@ UnicodeString::UnicodeString(const char *src, int32_t srcLength, fArray(fStackBuffer), fFlags(kShortString) { - if(U_SUCCESS(errorCode)) { - // check arguments - if(src==NULL) { - // treat as an empty string, do nothing more - } else if(srcLength<-1) { - errorCode=U_ILLEGAL_ARGUMENT_ERROR; - } else { - // get input length - if(srcLength==-1) { - srcLength=(int32_t)uprv_strlen(src); - } - if(srcLength>0) { - if(cnv!=0) { - // use the provided converter - ucnv_resetToUnicode(cnv); - doCodepageCreate(src, srcLength, cnv, errorCode); + if(U_SUCCESS(errorCode)) { + // check arguments + if(src==NULL) { + // treat as an empty string, do nothing more + } else if(srcLength<-1) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; } else { - // use the default converter - cnv=u_getDefaultConverter(&errorCode); - doCodepageCreate(src, srcLength, cnv, errorCode); - u_releaseDefaultConverter(cnv); + // get input length + if(srcLength==-1) { + srcLength=(int32_t)uprv_strlen(src); + } + if(srcLength>0) { + if(cnv!=0) { + // use the provided converter + ucnv_resetToUnicode(cnv); + doCodepageCreate(src, srcLength, cnv, errorCode); + } else { + // use the default converter + cnv=u_getDefaultConverter(&errorCode); + doCodepageCreate(src, srcLength, cnv, errorCode); + u_releaseDefaultConverter(cnv); + } + } } - } - } - if(U_FAILURE(errorCode)) { - setToBogus(); + if(U_FAILURE(errorCode)) { + setToBogus(); + } } - } } //======================================== @@ -111,257 +111,260 @@ UnicodeString::extract(int32_t start, uint32_t dstSize, const char *codepage) const { - // if the arguments are illegal, then do nothing - if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { - return 0; - } - - // pin the indices to legal values - pinIndices(start, length); - - // create the converter - UConverter *converter; - UErrorCode status = U_ZERO_ERROR; - - // just write the NUL if the string length is 0 - if(length == 0) { - if(dstSize >= 0x80000000) { - // careful: dstSize is unsigned! (0xffffffff means "unlimited") - // make sure that the NUL-termination works (takes int32_t) - dstSize=0x7fffffff; - } - return u_terminateChars(target, dstSize, 0, &status); - } - - // if the codepage is the default, use our cache - // if it is an empty string, then use the "invariant character" conversion - if (codepage == 0) { - converter = u_getDefaultConverter(&status); - } else if (*codepage == 0) { - // use the "invariant characters" conversion - int32_t destLength; - // careful: dstSize is unsigned! (0xffffffff means "unlimited") - if(dstSize >= 0x80000000) { - destLength = length; - // make sure that the NUL-termination works (takes int32_t) - dstSize=0x7fffffff; - } else if(length <= (int32_t)dstSize) { - destLength = length; + // if the arguments are illegal, then do nothing + if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { + return 0; + } + + // pin the indices to legal values + pinIndices(start, length); + + // create the converter + UConverter *converter; + UErrorCode status = U_ZERO_ERROR; + + // just write the NUL if the string length is 0 + if(length == 0) { + if(dstSize >= 0x80000000) { + // careful: dstSize is unsigned! (0xffffffff means "unlimited") + // make sure that the NUL-termination works (takes int32_t) + dstSize=0x7fffffff; + } + return u_terminateChars(target, dstSize, 0, &status); + } + + // if the codepage is the default, use our cache + // if it is an empty string, then use the "invariant character" conversion + if (codepage == 0) { + converter = u_getDefaultConverter(&status); + } else if (*codepage == 0) { + // use the "invariant characters" conversion + int32_t destLength; + // careful: dstSize is unsigned! (0xffffffff means "unlimited") + if(dstSize >= 0x80000000) { + destLength = length; + // make sure that the NUL-termination works (takes int32_t) + dstSize=0x7fffffff; + } else if(length <= (int32_t)dstSize) { + destLength = length; + } else { + destLength = (int32_t)dstSize; + } + u_UCharsToChars(getArrayStart() + start, target, destLength); + return u_terminateChars(target, (int32_t)dstSize, length, &status); } else { - destLength = (int32_t)dstSize; + converter = ucnv_open(codepage, &status); } - u_UCharsToChars(getArrayStart() + start, target, destLength); - return u_terminateChars(target, (int32_t)dstSize, length, &status); - } else { - converter = ucnv_open(codepage, &status); - } - - length = doExtract(start, length, target, (int32_t)dstSize, converter, status); - - // close the converter - if (codepage == 0) { - u_releaseDefaultConverter(converter); - } else { - ucnv_close(converter); - } - - return length; + + length = doExtract(start, length, target, (int32_t)dstSize, converter, status); + + // close the converter + if (codepage == 0) { + u_releaseDefaultConverter(converter); + } else { + ucnv_close(converter); + } + + return length; } int32_t UnicodeString::extract(char *dest, int32_t destCapacity, UConverter *cnv, - UErrorCode &errorCode) const { - if(U_FAILURE(errorCode)) { - return 0; - } - - if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { - errorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - // nothing to do? - if(fLength<=0) { - return u_terminateChars(dest, destCapacity, 0, &errorCode); - } - - // get the converter - UBool isDefaultConverter; - if(cnv==0) { - isDefaultConverter=TRUE; - cnv=u_getDefaultConverter(&errorCode); + UErrorCode &errorCode) const +{ if(U_FAILURE(errorCode)) { - return 0; + return 0; } - } else { - isDefaultConverter=FALSE; - ucnv_resetFromUnicode(cnv); - } - // convert - int32_t length=doExtract(0, fLength, dest, destCapacity, cnv, errorCode); + if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - // release the converter - if(isDefaultConverter) { - u_releaseDefaultConverter(cnv); - } + // nothing to do? + if(fLength<=0) { + return u_terminateChars(dest, destCapacity, 0, &errorCode); + } - return length; + // get the converter + UBool isDefaultConverter; + if(cnv==0) { + isDefaultConverter=TRUE; + cnv=u_getDefaultConverter(&errorCode); + if(U_FAILURE(errorCode)) { + return 0; + } + } else { + isDefaultConverter=FALSE; + ucnv_resetFromUnicode(cnv); + } + + // convert + int32_t length=doExtract(0, fLength, dest, destCapacity, cnv, errorCode); + + // release the converter + if(isDefaultConverter) { + u_releaseDefaultConverter(cnv); + } + + return length; } int32_t UnicodeString::doExtract(int32_t start, int32_t length, char *dest, int32_t destCapacity, UConverter *cnv, - UErrorCode &errorCode) const { - if(U_FAILURE(errorCode)) { - if(destCapacity!=0) { - *dest=0; + UErrorCode &errorCode) const +{ + if(U_FAILURE(errorCode)) { + if(destCapacity!=0) { + *dest=0; + } + return 0; + } + + const UChar *src=fArray+start, *srcLimit=src+length; + char *originalDest=dest; + const char *destLimit; + + if(destCapacity==0) { + destLimit=dest=0; + } else if(destCapacity==-1) { + // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used. + destLimit=(char*)U_MAX_PTR(dest); + // for NUL-termination, translate into highest int32_t + destCapacity=0x7fffffff; + } else { + destLimit=dest+destCapacity; + } + + // perform the conversion + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); + length=(int32_t)(dest-originalDest); + + // if an overflow occurs, then get the preflighting length + if(errorCode==U_BUFFER_OVERFLOW_ERROR) { + char buffer[1024]; + + destLimit=buffer+sizeof(buffer); + do { + dest=buffer; + errorCode=U_ZERO_ERROR; + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); + length+=(int32_t)(dest-buffer); + } while(errorCode==U_BUFFER_OVERFLOW_ERROR); } - return 0; - } - - const UChar *src=fArray+start, *srcLimit=src+length; - char *originalDest=dest; - const char *destLimit; - - if(destCapacity==0) { - destLimit=dest=0; - } else if(destCapacity==-1) { - // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used. - destLimit=(char*)U_MAX_PTR(dest); - // for NUL-termination, translate into highest int32_t - destCapacity=0x7fffffff; - } else { - destLimit=dest+destCapacity; - } - - // perform the conversion - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); - length=(int32_t)(dest-originalDest); - - // if an overflow occurs, then get the preflighting length - if(errorCode==U_BUFFER_OVERFLOW_ERROR) { - char buffer[1024]; - - destLimit=buffer+sizeof(buffer); - do { - dest=buffer; - errorCode=U_ZERO_ERROR; - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, TRUE, &errorCode); - length+=(int32_t)(dest-buffer); - } while(errorCode==U_BUFFER_OVERFLOW_ERROR); - } - - return u_terminateChars(originalDest, destCapacity, length, &errorCode); + + return u_terminateChars(originalDest, destCapacity, length, &errorCode); } void UnicodeString::doCodepageCreate(const char *codepageData, - int32_t dataLength, - const char *codepage) + int32_t dataLength, + const char *codepage) { - // if there's nothing to convert, do nothing - if(codepageData == 0 || dataLength == 0 || dataLength < -1) { - return; - } - if(dataLength == -1) { - dataLength = (int32_t)uprv_strlen(codepageData); - } - - UErrorCode status = U_ZERO_ERROR; - - // create the converter - // if the codepage is the default, use our cache - // if it is an empty string, then use the "invariant character" conversion - UConverter *converter = (codepage == 0 ? + // if there's nothing to convert, do nothing + if(codepageData == 0 || dataLength == 0 || dataLength < -1) { + return; + } + if(dataLength == -1) { + dataLength = (int32_t)uprv_strlen(codepageData); + } + + UErrorCode status = U_ZERO_ERROR; + + // create the converter + // if the codepage is the default, use our cache + // if it is an empty string, then use the "invariant character" conversion + UConverter *converter = (codepage == 0 ? u_getDefaultConverter(&status) : *codepage == 0 ? 0 : ucnv_open(codepage, &status)); - // if we failed, set the appropriate flags and return - if(U_FAILURE(status)) { - setToBogus(); - return; - } - - // perform the conversion - if(converter == 0) { - // use the "invariant characters" conversion - if(cloneArrayIfNeeded(dataLength, dataLength, FALSE)) { - u_charsToUChars(codepageData, getArrayStart(), dataLength); - fLength = dataLength; + // if we failed, set the appropriate flags and return + if(U_FAILURE(status)) { + setToBogus(); + return; + } + + // perform the conversion + if(converter == 0) { + // use the "invariant characters" conversion + if(cloneArrayIfNeeded(dataLength, dataLength, FALSE)) { + u_charsToUChars(codepageData, getArrayStart(), dataLength); + fLength = dataLength; + } else { + setToBogus(); + } + return; + } + + // convert using the real converter + doCodepageCreate(codepageData, dataLength, converter, status); + if(U_FAILURE(status)) { + setToBogus(); + } + + // close the converter + if(codepage == 0) { + u_releaseDefaultConverter(converter); } else { - setToBogus(); + ucnv_close(converter); } - return; - } - - // convert using the real converter - doCodepageCreate(codepageData, dataLength, converter, status); - if(U_FAILURE(status)) { - setToBogus(); - } - - // close the converter - if(codepage == 0) { - u_releaseDefaultConverter(converter); - } else { - ucnv_close(converter); - } } void UnicodeString::doCodepageCreate(const char *codepageData, int32_t dataLength, UConverter *converter, - UErrorCode &status) { - if(U_FAILURE(status)) { - return; - } - - // set up the conversion parameters - const char *mySource = codepageData; - const char *mySourceEnd = mySource + dataLength; - UChar *myTarget; - - // estimate the size needed: - // 1.25 UChar's per source byte should cover most cases - int32_t arraySize = dataLength + (dataLength >> 2); - - // we do not care about the current contents - UBool doCopyArray = FALSE; - for(;;) { - if(!cloneArrayIfNeeded(arraySize, arraySize, doCopyArray)) { - setToBogus(); - break; + UErrorCode &status) +{ + if(U_FAILURE(status)) { + return; } - // perform the conversion - myTarget = fArray + fLength; - ucnv_toUnicode(converter, &myTarget, fArray + fCapacity, - &mySource, mySourceEnd, 0, TRUE, &status); + // set up the conversion parameters + const char *mySource = codepageData; + const char *mySourceEnd = mySource + dataLength; + UChar *myTarget; + + // estimate the size needed: + // 1.25 UChar's per source byte should cover most cases + int32_t arraySize = dataLength + (dataLength >> 2); + + // we do not care about the current contents + UBool doCopyArray = FALSE; + for(;;) { + if(!cloneArrayIfNeeded(arraySize, arraySize, doCopyArray)) { + setToBogus(); + break; + } - // update the conversion parameters - fLength = (int32_t)(myTarget - fArray); + // perform the conversion + myTarget = fArray + fLength; + ucnv_toUnicode(converter, &myTarget, fArray + fCapacity, + &mySource, mySourceEnd, 0, TRUE, &status); - // allocate more space and copy data, if needed - if(status == U_BUFFER_OVERFLOW_ERROR) { - // reset the error code - status = U_ZERO_ERROR; + // update the conversion parameters + fLength = (int32_t)(myTarget - fArray); - // keep the previous conversion results - doCopyArray = TRUE; + // allocate more space and copy data, if needed + if(status == U_BUFFER_OVERFLOW_ERROR) { + // reset the error code + status = U_ZERO_ERROR; - // estimate the new size needed, larger than before - // try 2 UChar's per remaining source byte - arraySize = (int32_t)(fLength + 2 * (mySourceEnd - mySource)); - } else { - break; + // keep the previous conversion results + doCopyArray = TRUE; + + // estimate the new size needed, larger than before + // try 2 UChar's per remaining source byte + arraySize = (int32_t)(fLength + 2 * (mySourceEnd - mySource)); + } else { + break; + } } - } } U_NAMESPACE_END diff --git a/Build/source/libs/icu-xetex/common/unorm.cpp b/Build/source/libs/icu-xetex/common/unorm.cpp index ee4e9fc7491..b89c3e1ffc0 100644 --- a/Build/source/libs/icu-xetex/common/unorm.cpp +++ b/Build/source/libs/icu-xetex/common/unorm.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (c) 1996-2005, International Business Machines +* Copyright (c) 1996-2006, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * File unorm.cpp @@ -148,10 +148,10 @@ isNorm32HangulOrJamo(uint32_t norm32) { * Given isNorm32HangulOrJamo(), * is this a Hangul syllable or a Jamo? */ -static inline UBool +/*static inline UBool isHangulJamoNorm32HangulOrJamoL(uint32_t norm32) { return norm32<_NORM_MIN_JAMO_V; -} +}*/ /* * Given norm32 for Jamo V or T, @@ -191,7 +191,7 @@ U_CDECL_END /* unorm_props_data.c is machine-generated by gennorm --csource */ #include "unorm_props_data.c" -static const UBool formatVersion_2_1=TRUE, formatVersion_2_2=TRUE; +static const UBool formatVersion_2_2=TRUE; #else @@ -1622,6 +1622,8 @@ _decompose(UChar *dest, int32_t destCapacity, /* avoid compiler warnings */ norm32=0; c=0; + cc=0; + trailCC=0; if(srcLength>=0) { /* string with length */ diff --git a/Build/source/libs/icu-xetex/common/unorm_props_data.c b/Build/source/libs/icu-xetex/common/unorm_props_data.c index b67d9e4e099..16047b75bdc 100644 --- a/Build/source/libs/icu-xetex/common/unorm_props_data.c +++ b/Build/source/libs/icu-xetex/common/unorm_props_data.c @@ -1,48 +1,48 @@ /* - * Copyright (C) 1999-2005, International Business Machines + * Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * * file name: unorm_props_data.c * - * machine-generated on: 2005-05-17 + * machine-generated on: 2006-06-13 */ static const UVersionInfo formatVersion={ 2,3,5,2 }; -static const UVersionInfo dataVersion={ 4,1,0,0 }; +static const UVersionInfo dataVersion={ 5,0,0,0 }; static const int32_t indexes[_NORM_INDEX_TOP]={ -0x9ef0,0x3e18,0x790,0x164,0,0x35,0x300,0xa0,0xc0,0xa0,0x29f0,0x2c00,0x1e16,0,0,0, +0xa1a0,0x3e4b,0x7a7,0x16f,0,0x36,0x300,0xa0,0xc0,0xa0,0x2b00,0x2cf8,0x1e2c,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; static const uint16_t normTrie_index[2208]={ -0,0x889,0x7eb,0x7f3,0,0x531,0x32e,0x336,0x33e,0x346,0x34e,0x356,0,0x35e,0x365,0x36d, -0x375,0x37d,0,0,0x7fa,0x539,0x540,0x548,0x4e3,0x4eb,0x16d,8,0x175,0x385,0x10,0x16, -0x38d,0x395,0x39d,0x3a5,0x802,0,0x3ad,0x3b5,0,0,0,0,0x54f,0x80a,0x812,0, -0x816,0x3bd,0x4f3,0x557,0,0,0x3c5,0x81e,0x822,0x827,0x82f,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x3cd,0x17d,0,0,0x4fb,0x185,0, -0,0x18d,0x195,0,0,0x832,0x83a,0,0,0x503,0x19d,0,0x3d5,0x50b,0x3dc,0, -0,0,0x3e3,0,0,0x83e,0x3eb,0,0,0x513,0x3f2,0,0,0,0x3f8,0, -0,0x55e,0x846,0,0,0x565,0x56c,0,0x574,0x849,0x1a5,0x1ad,0x1b5,0x1bd,0x850,0, -0,0x400,0,0,0,0,0,0x57b,0x8b2,0,0,0x51b,0,0x521,0x529,0, -0,0,0,0,0,0,0,0,0,0,0x852,0,0,0,0,0, +0,0x8b4,0x7ff,0x807,0,0x54d,0x336,0x33e,0x346,0x34e,0x356,0x35e,0,0x366,0x36d,0x375, +0x37d,0x385,0,0,0x80e,0x555,0x55c,0x564,0x4ff,0x507,0x175,8,0x17d,0x38d,0x10,0x16, +0x395,0x39d,0x3a5,0x3ad,0x816,0,0x3b5,0x3bd,0,0,0,0,0x56b,0x81e,0x826,0, +0x82a,0x3c5,0x50f,0x573,0,0,0x3cd,0x832,0x836,0x83b,0x843,0,0,0,0,0x849, +0,0,0,0,0,0,0,0,0,0x3d5,0x185,0,0,0x517,0x18d,0, +0,0x195,0x19d,0,0,0x84e,0x856,0,0,0x51f,0x1a5,0,0x3dd,0x527,0x3e4,0, +0,0,0x3eb,0,0,0x85a,0x3f3,0,0,0x52f,0x3fa,0,0,0,0x400,0, +0,0x57a,0x862,0,0,0x581,0x588,0,0x590,0x865,0x1ad,0x1b5,0x1bd,0x1c5,0x86c,0, +0,0x408,0,0,0,0,0,0x597,0x8dd,0,0,0x537,0,0x53d,0x545,0, +0,0,0,0,0,0,0,0,0,0,0x86e,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x85a,0x85a,0,0,0,0,0x860,0, -0,0,0,0,0,0x868,0,0,0,0x86b,0,0,0,0,0,0, -0x872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x1d,0x25,0x583,0x58a,0x592,0x87a,0, -0x408,0x410,0x418,0x420,0x428,0x430,0x438,0x440,0x448,0x450,0x458,0x1c5,0x460,0x1cd,0x1d5,0x1dd, -0x1e5,0x59a,0x5a2,0x5aa,0x5b2,0x2d,0x87e,0x886,0x35,0x3d,0x45,0x5ba,0x468,0x46f,0x474,0, -0x47c,0x484,0x48c,0x494,0x49c,0x4a4,0,0x4ac,0,0x1eb,0,0,0,0,0,0, -0,0,0,0x5c2,0x5ca,0x5d2,0x5da,0x5e2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x876,0x876,0,0,0,0,0x87c,0, +0,0,0,0,0,0x884,0,0,0,0x887,0,0,0,0,0,0, +0x88e,0,0,0,0,0,0,0,0x40f,0x414,0x41c,0x895,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1d,0x25,0x59f,0x5a6,0x5ae,0x89d,0x8a0, +0x424,0x42c,0x434,0x43c,0x444,0x44c,0x454,0x45c,0x464,0x46c,0x474,0x1cd,0x47c,0x1d5,0x1dd,0x1e5, +0x1ed,0x5b6,0x5be,0x5c6,0x5ce,0x2d,0x8a8,0x8b0,0x35,0x3d,0x45,0x5d6,0x484,0x48b,0x490,0, +0x498,0x4a0,0x4a8,0x4b0,0x4b8,0x4c0,0,0x4c8,0,0x1f3,0,0,0,0,0,0, +0,0,0,0x5de,0x5e6,0x5ee,0x5f6,0x5fe,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x5e7,0,0,0x5eb,0,0,0x1ee,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x5f1,0,0,0,0, -0,0,0,0,0x5f5,0,0,0x5fd,0x605,0x60d,0x615,0x61d,0x625,0x62d,0x635,0, -0x63d,0x643,0x4b3,0x4bb,0x4c3,0x4cb,0x4d3,0x4db,0,0x64a,0x652,0x65a,0x662,0,0,0, -0x66a,0x672,0x4d,0x67a,0x682,0x68a,0x55,0x692,0x69a,0x6a2,0x6aa,0x5d,0x65,0x6d,0x75,0x6b2, +0x603,0,0,0x607,0,0,0x1f6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x60d,0,0,0,0, +0,0,0,0,0x611,0,0,0x619,0x621,0x629,0x631,0x639,0x641,0x649,0x651,0, +0x659,0x65f,0x4cf,0x4d7,0x4df,0x4e7,0x4ef,0x4f7,0,0x666,0x66e,0x676,0x67e,0,0,0, +0x686,0x68e,0x4d,0x696,0x69e,0x6a6,0x55,0x6ae,0x6b6,0x6be,0x6c6,0x5d,0x65,0x6d,0x75,0x6ce, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -101,31 +101,31 @@ static const uint16_t normTrie_index[2208]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x8bc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba, -0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8ba,0x8c1,0,0, -0x8c9,0x8cc,0,0x8d2,0,0,0,0,0,0,0,0,0,0,0,0, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8ec,0,0, +0x8f4,0x8f7,0,0x8fd,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -141,540 +141,545 @@ static const uint16_t normTrie_index[2208]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1f6,0x1fe,0x206,0x20e,0x216,0x21e,0x226,0x22e, -0x236,0x23e,0x246,0x24e,0x256,0x25e,0x266,0,0x26e,0x276,0x27e,0x6ba,0x6c2,0x6ca,0x6cf,0x6d7, -0x6df,0x6e7,0x6ef,0x6f7,0x6ff,0x707,0x70f,0x717,0x71f,0x727,0x72f,0x737,0x73f,0x747,0x74f,0x753, -0x75b,0x763,0x76b,0x773,0x77b,0x783,0x78b,0x793,0x79b,0x7a3,0x7ab,0x7b3,0x7bb,0x7c3,0x7cb,0x7d3, +0,0,0,0,0,0,0,0,0x1fe,0x206,0x20e,0x216,0x21e,0x226,0x22e,0x236, +0x23e,0x246,0x24e,0x256,0x25e,0x266,0x26e,0,0x276,0x27e,0x286,0x6d6,0x6de,0x6e6,0x6eb,0x6f3, +0x6fb,0x703,0x70b,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743,0x74b,0x753,0x75b,0x763,0x76b,0x76f, +0x777,0x77f,0x787,0x78f,0x797,0x79f,0x7a7,0x7af,0x7b7,0x7bf,0x7c7,0x7cf,0x7d7,0x7df,0x7e7,0x7ef, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x896,0x89a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x286,0x28e,0x8a2,0x296,0x29e,0, -0,0,0x8aa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x8c1,0x8c5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x28e,0x296,0x8cd,0x29e,0x2a6,0, +0,0,0x8d5,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x7d,0x85,0x8d,0x95,0x9d,0xa5,0xad,0xb5,0xbd,0xc5,0xcd,0xd5,0xdd,0xe5,0xed,0xf5, -0xfd,0x105,0x10d,0x115,0x11d,0x125,0x12d,0x135,0x13d,0x145,0x14d,0x155,0x15d,0x165,0x7db,0x7e3, -0x2a6,0x2ae,0x2b6,0x2be,0x2c6,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31e, -0x326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0xfd,0x105,0x10d,0x115,0x11d,0x125,0x12d,0x135,0x13d,0x145,0x14d,0x155,0x15d,0x165,0x16d,0x7f7, +0x2ae,0x2b6,0x2be,0x2c6,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31e,0x326, +0x32e,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -static const uint32_t normTrie_data32[9064]={ +static const uint32_t normTrie_data32[9236]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xea00,0xea00,0xe900,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600, -0,0,0,0,0x60e000f,0,0,0,0,0,0x139000a,0,0,0,0x610000f,0, -0,0x3dbb0040,0,0,0,0x3d770040,0,0,0,0x3d790040,0x14a1004c,0x14a6004c,0x14aa000c,0x14ae000c,0x14b3004c,0, -0x20fd000a,0x20ff000a,0x13e004a,0x140000e,0x147000e,0x2101000a,0x2103000a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2105000a,0x2107000a,0x14e000a,0,0x2109000a,0x210b000a,0,0, -0,0x150000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x152000a,0x154000a,0x156000a,0,0x158000a,0x15a000a,0x15c000a,0x15e000a,0x160000a,0x162000a,0x164000a,0x166000a,0x168000a,0x16a000a,0x16c000a,0, -0x16e000a,0x170000a,0x172000a,0x174000a,0x176000a,0x178000a,0x17a000a,0x2136000a,0x2138000a,0x213a000a,0x213c000a,0x213e000a,0x2140000a,0x2142000a,0x2144000a,0x2146000a, -0x2148000a,0x214a000a,0,0x214c000a,0x214e000a,0x2150000a,0x2152000a,0x2154000a,0x2156000a,0x2158000a,0x215a000a,0x215c000a,0x215e000a,0x2160000a,0x2162000a,0x2164000a, -0x2166000a,0x2168000a,0x216a000a,0x216c000a,0,0,0,0,0,0,0,0,0x17c000a,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x2271000a,0x2275000a,0x17f000a,0x181000a,0,0x2279000a,0x227d000a,0x184000a,0,0x186000a,0x2281000a,0x189000a, -0x18b000a,0x18d000a,0x2283000a,0x2285000a,0x18f000a,0x191000a,0x193000a,0x2287000a,0,0x195000a,0x197000a,0,0,0x19a000a,0x19c000a,0x19e000a, -0x1a0000a,0x1a2000a,0,0,0x1a4000a,0x1a7000a,0x1ab000a,0,0x1ae000a,0,0x6f1000f,0,0x1b0000a,0,0x6f3000f,0x6f5000f, -0x1b2000a,0x1b4000a,0,0x2289000a,0x1b6000a,0x1b8000a,0,0x1ba000a,0x228b000a,0x228d000a,0x228f000a,0x2291000a,0x2293000a,0x2295000a,0,0x1bc000a, -0x2297000a,0x2299000a,0x1c0000a,0x1c2000a,0x229b000a,0,0,0,0,0x1c4000a,0x229d000a,0x229f000a,0x22a1000a,0x22a3000a,0,0, -0,0,0,0,0,0,0,0x22a5000a,0x22a9000a,0x22ad000a,0x22b1000a,0x22b5000a,0x22b9000a,0x22bd000a,0x22c1000a,0x22c5000a, -0x22c9000a,0x22cd000a,0x22d1000a,0x22d5000a,0x28ad000a,0x28b1000a,0x28b5000a,0x28b9000a,0,0,0,0,0,0,0,0, -0,0,0,0,0x1c6000a,0x28bd000a,0x28c0000a,0x28c3000a,0x28c6000a,0x28c9000a,0x28cc000a,0x28cf000a,0x28d2000a,0x28d5000a,0x28d8000a,0x28db000a, -0x28de000a,0x28e1000a,0x28e4000a,0x28e7000a,0x29cd000a,0x29d0000a,0x29d3000a,0x29d6000a,0x29d9000a,0x29dc000a,0x29df000a,0x29e2000a,0x29e5000a,0x29e8000a,0x29ec000a,0x29f0000a, -0x1ca000a,0x29f4000a,0x1cd000a,0x1d0000a,0x29f8000a,0x29fa000a,0x29fc000a,0x29fe000a,0x2a00000a,0x2a02000a,0x2a04000a,0x2a06000a,0x2a08000a,0x2a0a000a,0x2a0c000a,0x2a0e000a, -0x2a10000a,0x2a12000a,0x2a14000a,0x2a16000a,0x2c2c000a,0x2c2f000a,0x2c32000a,0x2c36000a,0x2c3a000a,0x2c3e000a,0x2c42000a,0x2c46000a,0x2c4a000a,0x2c4e000a,0x2c52000a,0x2c56000a, -0x2c5a000a,0x2c5e000a,0x2c62000a,0x2c66000a,0x2c6a000a,0x1d4000a,0x2c6e000a,0x1d8000a,0x2c71000a,0x1db000a,0x2c75000a,0x2c78000a,0x2c7b000a,0x2c7f000a,0x1de000a,0x2c83000a, -0x2c86000a,0x2c89000a,0x2c8c000a,0x2c8f000a,0x1e1000a,0x1e4000a,0x1e7000a,0x1ea000a,0x1ed000a,0x1f0000a,0x1f3000a,0x1f6000a,0x2c94000a,0x2c98000a,0x1f9000a,0x1fc000a, -0x1ff000a,0x2c9d000a,0x2ca0000a,0x2ca3000a,0x202000a,0x205000a,0x209000a,0x20d000a,0x211000a,0x2ca6000a,0x2ca9000a,0x2cac000a,0x2caf000a,0x2cb2000a,0x2cb5000a,0x2cb8000a, -0x2cbb000a,0x2cbe000a,0x2cc1000a,0x2cc4000a,0x2cc8000a,0x2ccc000a,0x2ccf000a,0x2cd3000a,0x2cd7000a,0x2cdb000a,0x2cde000a,0x2ce2000a,0x2ce6000a,0x215000a,0x218000a,0x21c000a, -0x220000a,0x2ceb000a,0x2cef000a,0x2cf5000a,0x2cfc000a,0x2cff000a,0x2d02000a,0x2d05000a,0x224000a,0x227000a,0x22a000a,0x22d000a,0x230000a,0x233000a,0x236000a,0x239000a, -0x23c000a,0x23f000a,0x242000a,0x245000a,0x248000a,0x24b000a,0x2d08000a,0x24e000a,0x2d0d000a,0x2d10000a,0x251000a,0x256000a,0x25a000a,0x25d000a,0x2d13000a,0x260000a, -0x2d16000a,0x263000a,0x266000a,0x2d19000a,0x2d1c000a,0x2d1f000a,0x2d22000a,0x2d26000a,0x2d29000a,0x2d2c000a,0x2d30000a,0x269000a,0x2d34000a,0x26c000a,0x270000a,0x2d39000a, -0x273000a,0x276000a,0x279000a,0x27d000a,0x281000a,0x283000a,0x285000a,0x287000a,0x289000a,0x28b000a,0x28d000a,0x28f000a,0x291000a,0x293000a,0x295000a,0x297000a, -0x299000a,0x29b000a,0x29d000a,0x29f000a,0x2a1000a,0x2a3000a,0x2a5000a,0x2a7000a,0x2a9000a,0x2ab000a,0x2ad000a,0x2af000a,0x2b1000a,0x2b3000a,0x38fb000a,0x38fd000a, -0x38ff000a,0x3901000a,0x3903000a,0x3905000a,0x3907000a,0x3909000a,0x390b000a,0x390d000a,0x390f000a,0x3911000a,0x3913000a,0x3915000a,0x3917000a,0x3919000a,0x391b000a,0x391d000a, -0x391f000a,0x3921000a,0x3923000a,0x3925000a,0x3927000a,0x3929000a,0x392b000a,0x392d000a,0x2b5000a,0x2b7000a,0x2b9000a,0x2bb000a,0x2bd000a,0x2bf000a,0x2c1000a,0x2c3000a, -0x2c5000a,0x2c7000a,0x2c9000a,0x2cb000a,0x2cd000a,0x2cf000a,0x2d1000a,0x2d3000a,0x2d5000a,0x2d7000a,0x2d9000a,0x2db000a,0x2dd000a,0x2df000a,0x2e1000a,0x2e3000a, -0x2e5000a,0x2e7000a,0x392f000a,0x3931000a,0x3933000a,0x3935000a,0x3937000a,0x3939000a,0x393b000a,0,0x393d000a,0x393f000a,0x3941000a,0x3943000a,0x3945000a,0x3947000a, -0x3949000a,0x394b000a,0x394d000a,0x394f000a,0x3951000a,0x3953000a,0x3955000a,0x3957000a,0x3959000a,0x395b000a,0x395d000a,0x395f000a,0x2e9000a,0x2eb000a,0x2ed000a,0x2ef000a, -0x2f1000a,0x2f3000a,0x2f5000a,0x2f7000a,0x2f9000a,0x2fb000a,0x2fd000a,0x2ff000a,0x301000a,0x303000a,0x305000a,0x307000a,0x309000a,0x30b000a,0x30d000a,0x30f000a, -0x311000a,0x313000a,0x315000a,0x317000a,0x319000a,0x31b000a,0x3961000a,0x3963000a,0x3965000a,0x3967000a,0x3969000a,0x396b000a,0x396d000a,0x396f000a,0x3971000a,0x3973000a, -0x3975000a,0x3977000a,0x3979000a,0x397b000a,0x397d000a,0x397f000a,0x3981000a,0x3983000a,0x3985000a,0x3987000a,0x3989000a,0x398b000a,0x398d000a,0x398f000a,0x3991000a,0x3993000a, -0x31d000a,0,0x31f000a,0x321000a,0,0,0x323000a,0,0,0x325000a,0x327000a,0,0,0x329000a,0x32b000a,0x32d000a, -0x32f000a,0,0x331000a,0x333000a,0x335000a,0x337000a,0x339000a,0x33b000a,0x33d000a,0x33f000a,0x3995000a,0x3997000a,0x3999000a,0x399b000a,0,0x399d000a, -0,0x399f000a,0x39a1000a,0x39a3000a,0x39a5000a,0x39a7000a,0x39a9000a,0x39ab000a,0,0x39ad000a,0x39af000a,0x39b1000a,0x39b3000a,0x39b5000a,0x39b7000a,0x39b9000a, -0x39bb000a,0x39bd000a,0x39bf000a,0x39c1000a,0x341000a,0x343000a,0x345000a,0x347000a,0x349000a,0x34b000a,0x34d000a,0x34f000a,0x351000a,0x353000a,0x355000a,0x357000a, -0x359000a,0x35b000a,0x35d000a,0x35f000a,0x361000a,0x363000a,0x365000a,0x367000a,0x369000a,0x36b000a,0x36d000a,0x36f000a,0x371000a,0x373000a,0x39c3000a,0x39c5000a, -0x39c7000a,0x39c9000a,0x39cb000a,0x39cd000a,0x39cf000a,0x39d1000a,0x39d3000a,0x39d5000a,0x39d7000a,0x39d9000a,0x39db000a,0x39dd000a,0x39df000a,0x39e1000a,0x39e3000a,0x39e5000a, -0x39e7000a,0x39e9000a,0x39eb000a,0x39ed000a,0x39ef000a,0x39f1000a,0x39f3000a,0x39f5000a,0x375000a,0x377000a,0,0x379000a,0x37b000a,0x37d000a,0x37f000a,0, -0,0x381000a,0x383000a,0x385000a,0x387000a,0x389000a,0x38b000a,0x38d000a,0x38f000a,0,0x391000a,0x393000a,0x395000a,0x397000a,0x399000a,0x39b000a, -0x39d000a,0,0x39f7000a,0x39f9000a,0x39fb000a,0x39fd000a,0x39ff000a,0x3a01000a,0x3a03000a,0x3a05000a,0x3a07000a,0x3a09000a,0x3a0b000a,0x3a0d000a,0x3a0f000a,0x3a11000a, -0x3a13000a,0x3a15000a,0x3a17000a,0x3a19000a,0x3a1b000a,0x3a1d000a,0x3a1f000a,0x3a21000a,0x3a23000a,0x3a25000a,0x3a27000a,0x3a29000a,0x39f000a,0x3a1000a,0,0x3a3000a, -0x3a5000a,0x3a7000a,0x3a9000a,0,0x3ab000a,0x3ad000a,0x3af000a,0x3b1000a,0x3b3000a,0,0x3b5000a,0,0,0,0x3b7000a,0x3b9000a, -0x3bb000a,0x3bd000a,0x3bf000a,0x3c1000a,0x3c3000a,0,0x3a2b000a,0x3a2d000a,0x3a2f000a,0x3a31000a,0x3a33000a,0x3a35000a,0x3a37000a,0x3a39000a,0x3a3b000a,0x3a3d000a, -0x3a3f000a,0x3a41000a,0x3a43000a,0x3a45000a,0x3a47000a,0x3a49000a,0x3a4b000a,0x3a4d000a,0x3a4f000a,0x3a51000a,0x3a53000a,0x3a55000a,0x3a57000a,0x3a59000a,0x3a5b000a,0x3a5d000a, -0x3c5000a,0x3c7000a,0x3c9000a,0x3cb000a,0x3cd000a,0x3cf000a,0x3d1000a,0x3d3000a,0x3d5000a,0x3d7000a,0x3d9000a,0x3db000a,0x3dd000a,0x3df000a,0x3e1000a,0x3e3000a, -0x3e5000a,0x3e7000a,0x3e9000a,0x3eb000a,0x3ed000a,0x3ef000a,0x3f1000a,0x3f3000a,0x3f5000a,0x3f7000a,0x3a5f000a,0x3a61000a,0x3a63000a,0x3a65000a,0x3a67000a,0x3a69000a, -0x3a6b000a,0x3a6d000a,0x3a6f000a,0x3a71000a,0x3a73000a,0x3a75000a,0x3a77000a,0x3a79000a,0x3a7b000a,0x3a7d000a,0x3a7f000a,0x3a81000a,0x3a83000a,0x3a85000a,0x3a87000a,0x3a89000a, -0x3a8b000a,0x3a8d000a,0x3a8f000a,0x3a91000a,0x3f9000a,0x3fb000a,0x3fd000a,0x3ff000a,0x401000a,0x403000a,0x405000a,0x407000a,0x409000a,0x40b000a,0x40d000a,0x40f000a, -0x411000a,0x413000a,0x415000a,0x417000a,0x419000a,0x41b000a,0x41d000a,0x41f000a,0x421000a,0x423000a,0x425000a,0x427000a,0x429000a,0x42b000a,0x3a93000a,0x3a95000a, -0x3a97000a,0x3a99000a,0x3a9b000a,0x3a9d000a,0x3a9f000a,0x3aa1000a,0x3aa3000a,0x3aa5000a,0x3aa7000a,0x3aa9000a,0x3aab000a,0x3aad000a,0x3aaf000a,0x3ab1000a,0x3ab3000a,0x3ab5000a, -0x3ab7000a,0x3ab9000a,0x3abb000a,0x3abd000a,0x3abf000a,0x3ac1000a,0x3ac3000a,0x3ac5000a,0x42d000a,0x42f000a,0x431000a,0x433000a,0x435000a,0x437000a,0x439000a,0x43b000a, -0x43d000a,0x43f000a,0x441000a,0x443000a,0x445000a,0x447000a,0x449000a,0x44b000a,0x44d000a,0x44f000a,0x451000a,0x453000a,0x455000a,0x457000a,0x459000a,0x45b000a, -0x45d000a,0x45f000a,0x3ac7000a,0x3ac9000a,0x3acb000a,0x3acd000a,0x3acf000a,0x3ad1000a,0x3ad3000a,0x3ad5000a,0x3ad7000a,0x3ad9000a,0x3adb000a,0x3add000a,0x3adf000a,0x3ae1000a, -0x3ae3000a,0x3ae5000a,0x3ae7000a,0x3ae9000a,0x3aeb000a,0x3aed000a,0x3aef000a,0x3af1000a,0x3af3000a,0x3af5000a,0x3af7000a,0x3af9000a,0x461000a,0x463000a,0x465000a,0x467000a, -0x469000a,0x46b000a,0x46d000a,0x46f000a,0x471000a,0x473000a,0x475000a,0x477000a,0x479000a,0x47b000a,0x47d000a,0x47f000a,0x481000a,0x483000a,0x485000a,0x487000a, -0x489000a,0x48b000a,0x48d000a,0x48f000a,0x491000a,0x493000a,0x3afb000a,0x3afd000a,0x3aff000a,0x3b01000a,0x3b03000a,0x3b05000a,0x3b07000a,0x3b09000a,0x3b0b000a,0x3b0d000a, -0x3b0f000a,0x3b11000a,0x3b13000a,0x3b15000a,0x3b17000a,0x3b19000a,0x3b1b000a,0x3b1d000a,0x3b1f000a,0x3b21000a,0x3b23000a,0x3b25000a,0x3b27000a,0x3b29000a,0x3b2b000a,0x3b2d000a, -0x495000a,0x497000a,0x499000a,0x49b000a,0x49d000a,0x49f000a,0x4a1000a,0x4a3000a,0x4a5000a,0x4a7000a,0x4a9000a,0x4ab000a,0x4ad000a,0x4af000a,0x4b1000a,0x4b3000a, -0x4b5000a,0x4b7000a,0x4b9000a,0x4bb000a,0x4bd000a,0x4bf000a,0x4c1000a,0x4c3000a,0x4c5000a,0x4c7000a,0x3b2f000a,0x3b31000a,0x3b33000a,0x3b35000a,0x3b37000a,0x3b39000a, -0x3b3b000a,0x3b3d000a,0x3b3f000a,0x3b41000a,0x3b43000a,0x3b45000a,0x3b47000a,0x3b49000a,0x3b4b000a,0x3b4d000a,0x3b4f000a,0x3b51000a,0x3b53000a,0x3b55000a,0x3b57000a,0x3b59000a, -0x3b5b000a,0x3b5d000a,0x3b5f000a,0x3b61000a,0x4c9000a,0x4cb000a,0x4cd000a,0x4cf000a,0x4d1000a,0x4d3000a,0x4d5000a,0x4d7000a,0x4d9000a,0x4db000a,0x4dd000a,0x4df000a, -0x4e1000a,0x4e3000a,0x4e5000a,0x4e7000a,0x4e9000a,0x4eb000a,0x4ed000a,0x4ef000a,0x4f1000a,0x4f3000a,0x4f5000a,0x4f7000a,0x4f9000a,0x4fb000a,0x3b63000a,0x3b65000a, -0x3b67000a,0x3b69000a,0x3b6b000a,0x3b6d000a,0x3b6f000a,0x3b71000a,0x3b73000a,0x3b75000a,0x3b77000a,0x3b79000a,0x3b7b000a,0x3b7d000a,0x3b7f000a,0x3b81000a,0x3b83000a,0x3b85000a, -0x3b87000a,0x3b89000a,0x3b8b000a,0x3b8d000a,0x3b8f000a,0x3b91000a,0x3b93000a,0x3b95000a,0x3b97000a,0x3b99000a,0,0,0x4fd000a,0x4ff000a,0x501000a,0x503000a, -0x505000a,0x507000a,0x509000a,0x50b000a,0x50d000a,0x50f000a,0x511000a,0x513000a,0x515000a,0x517000a,0x519000a,0x51b000a,0x51d000a,0x51f000a,0x521000a,0x523000a, -0x525000a,0x527000a,0x529000a,0x52b000a,0x52d000a,0x3b9b000a,0x3b9d000a,0x3b9f000a,0x3ba1000a,0x3ba3000a,0x3ba5000a,0x3ba7000a,0x3ba9000a,0x3bab000a,0x3bad000a,0x3baf000a, -0x3bb1000a,0x3bb3000a,0x3bb5000a,0x3bb7000a,0x3bb9000a,0x3bbb000a,0x3bbd000a,0x52f000a,0x3bbf000a,0x3bc1000a,0x3bc3000a,0x3bc5000a,0x3bc7000a,0x3bc9000a,0x3bcb000a,0x3bcd000a, -0x3bcf000a,0x3bd1000a,0x3bd3000a,0x3bd5000a,0x3bd7000a,0x3bd9000a,0x531000a,0x533000a,0x535000a,0x537000a,0x539000a,0x53b000a,0x53d000a,0x53f000a,0x541000a,0x543000a, -0x545000a,0x547000a,0x549000a,0x54b000a,0x54d000a,0x54f000a,0x551000a,0x553000a,0x555000a,0x557000a,0x559000a,0x55b000a,0x55d000a,0x55f000a,0x561000a,0x3bdb000a, -0x3bdd000a,0x3bdf000a,0x3be1000a,0x3be3000a,0x3be5000a,0x3be7000a,0x3be9000a,0x3beb000a,0x3bed000a,0x3bef000a,0x3bf1000a,0x3bf3000a,0x3bf5000a,0x3bf7000a,0x3bf9000a,0x3bfb000a, -0x3bfd000a,0x563000a,0x3bff000a,0x3c01000a,0x3c03000a,0x3c05000a,0x3c07000a,0x3c09000a,0x3c0b000a,0x3c0d000a,0x3c0f000a,0x3c11000a,0x3c13000a,0x3c15000a,0x3c17000a,0x3c19000a, -0x565000a,0x567000a,0x569000a,0x56b000a,0x56d000a,0x56f000a,0x571000a,0x573000a,0x575000a,0x577000a,0x579000a,0x57b000a,0x57d000a,0x57f000a,0x581000a,0x583000a, -0x585000a,0x587000a,0x589000a,0x58b000a,0x58d000a,0x58f000a,0x591000a,0x593000a,0x595000a,0x3c1b000a,0x3c1d000a,0x3c1f000a,0x3c21000a,0x3c23000a,0x3c25000a,0x3c27000a, -0x3c29000a,0x3c2b000a,0x3c2d000a,0x3c2f000a,0x3c31000a,0x3c33000a,0x3c35000a,0x3c37000a,0x3c39000a,0x3c3b000a,0x3c3d000a,0x597000a,0x3c3f000a,0x3c41000a,0x3c43000a,0x3c45000a, -0x3c47000a,0x3c49000a,0x3c4b000a,0x3c4d000a,0x3c4f000a,0x3c51000a,0x3c53000a,0x3c55000a,0x3c57000a,0x3c59000a,0x599000a,0x59b000a,0x59d000a,0x59f000a,0x5a1000a,0x5a3000a, -0x5a5000a,0x5a7000a,0x5a9000a,0x5ab000a,0x5ad000a,0x5af000a,0x5b1000a,0x5b3000a,0x5b5000a,0x5b7000a,0x5b9000a,0x5bb000a,0x5bd000a,0x5bf000a,0x5c1000a,0x5c3000a, -0x5c5000a,0x5c7000a,0x5c9000a,0x3c5b000a,0x3c5d000a,0x3c5f000a,0x3c61000a,0x3c63000a,0x3c65000a,0x3c67000a,0x3c69000a,0x3c6b000a,0x3c6d000a,0x3c6f000a,0x3c71000a,0x3c73000a, -0x3c75000a,0x3c77000a,0x3c79000a,0x3c7b000a,0x3c7d000a,0x5cb000a,0x3c7f000a,0x3c81000a,0x3c83000a,0x3c85000a,0x3c87000a,0x3c89000a,0x3c8b000a,0x3c8d000a,0x3c8f000a,0x3c91000a, -0x3c93000a,0x3c95000a,0x3c97000a,0x3c99000a,0x5cd000a,0x5cf000a,0x5d1000a,0x5d3000a,0x5d5000a,0x5d7000a,0x5d9000a,0x5db000a,0x5dd000a,0x5df000a,0x5e1000a,0x5e3000a, -0x5e5000a,0x5e7000a,0x5e9000a,0x5eb000a,0x5ed000a,0x5ef000a,0x5f1000a,0x5f3000a,0x5f5000a,0x5f7000a,0x5f9000a,0x5fb000a,0x5fd000a,0x3c9b000a,0x3c9d000a,0x3c9f000a, -0x3ca1000a,0x3ca3000a,0x3ca5000a,0x3ca7000a,0x3ca9000a,0x3cab000a,0x3cad000a,0x3caf000a,0x3cb1000a,0x3cb3000a,0x3cb5000a,0x3cb7000a,0x3cb9000a,0x3cbb000a,0x3cbd000a,0x5ff000a, -0x3cbf000a,0x3cc1000a,0x3cc3000a,0x3cc5000a,0x601e60f,0x604e60f,0x2046e6b0,0x607e60f,0x60ae60f,0x2047f0b0,0xe600,0xdc00,0xdc00,0xdc00,0xe600,0xe600, +0,0,0,0,0x612000f,0,0,0,0,0,0x13b000a,0,0,0,0x614000f,0, +0,0x3dee0040,0,0,0,0x3d9f0040,0,0,0,0x3da10040,0x14a5004c,0x14aa004c,0x14ae000c,0x14b2000c,0x14b7004c,0, +0x2123000a,0x2125000a,0x140004a,0x142000e,0x149000e,0x2127000a,0x2129000a,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x212b000a,0x212d000a,0x150000a,0,0x212f000a,0x2131000a,0,0, +0,0x152000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x154000a,0x156000a,0x158000a,0,0x15a000a,0x15c000a,0x15e000a,0x160000a,0x162000a,0x164000a,0x166000a,0x168000a,0x16a000a,0x16c000a,0x16e000a,0, +0x170000a,0x172000a,0x174000a,0x176000a,0x178000a,0x17a000a,0x17c000a,0x215c000a,0x215e000a,0x2160000a,0x2162000a,0x2164000a,0x2166000a,0x2168000a,0x216a000a,0x216c000a, +0x216e000a,0x2170000a,0,0x2172000a,0x2174000a,0x2176000a,0x2178000a,0x217a000a,0x217c000a,0x217e000a,0x2180000a,0x2182000a,0x2184000a,0x2186000a,0x2188000a,0x218a000a, +0x218c000a,0x218e000a,0x2190000a,0x2192000a,0,0,0,0,0,0,0,0,0x17e000a,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x2297000a,0x229b000a,0x181000a,0x183000a,0,0x229f000a,0x22a3000a,0x186000a,0,0x188000a,0x22a7000a,0x18b000a, +0x18d000a,0x18f000a,0x22a9000a,0x22ab000a,0x191000a,0x193000a,0x195000a,0x22ad000a,0,0x197000a,0x199000a,0,0,0x19c000a,0x19e000a,0x1a0000a, +0x1a2000a,0x1a4000a,0,0,0x1a6000a,0x1a9000a,0x1ad000a,0,0x1b0000a,0,0x6f5000f,0,0x1b2000a,0,0x6f7000f,0x6f9000f, +0x1b4000a,0x1b6000a,0,0x22af000a,0x1b8000a,0x1ba000a,0,0x1bc000a,0x22b1000a,0x22b3000a,0x22b5000a,0x22b7000a,0x22b9000a,0x22bb000a,0,0x1be000a, +0x22bd000a,0x22bf000a,0x1c2000a,0x1c4000a,0x22c1000a,0,0,0,0,0x1c6000a,0x22c3000a,0x22c5000a,0x22c7000a,0x22c9000a,0,0, +0,0,0,0,0,0,0,0x22cb000a,0x22cf000a,0x22d3000a,0x22d7000a,0x22db000a,0x22df000a,0x22e3000a,0x22e7000a,0x22eb000a, +0x22ef000a,0x22f3000a,0x22f7000a,0x22fb000a,0x28d3000a,0x28d7000a,0x28db000a,0x28df000a,0,0,0,0,0,0,0,0, +0,0,0,0,0x1c8000a,0x28e3000a,0x28e6000a,0x28e9000a,0x28ec000a,0x28ef000a,0x28f2000a,0x28f5000a,0x28f8000a,0x28fb000a,0x28fe000a,0x2901000a, +0x2904000a,0x2907000a,0x290a000a,0x290d000a,0x29f3000a,0x29f6000a,0x29f9000a,0x29fc000a,0x29ff000a,0x2a02000a,0x2a05000a,0x2a08000a,0x2a0b000a,0x2a0e000a,0x2a12000a,0x2a16000a, +0x1cc000a,0x2a1a000a,0x1cf000a,0x1d2000a,0x2a1e000a,0x2a20000a,0x2a22000a,0x2a24000a,0x2a26000a,0x2a28000a,0x2a2a000a,0x2a2c000a,0x2a2e000a,0x2a30000a,0x2a32000a,0x2a34000a, +0x2a36000a,0x2a38000a,0x2a3a000a,0x2a3c000a,0x2c52000a,0x2c55000a,0x2c58000a,0x2c5c000a,0x2c60000a,0x2c64000a,0x2c68000a,0x2c6c000a,0x2c70000a,0x2c74000a,0x2c78000a,0x2c7c000a, +0x2c80000a,0x2c84000a,0x2c88000a,0x2c8c000a,0x2c90000a,0x1d6000a,0x2c94000a,0x1da000a,0x2c97000a,0x1dd000a,0x2c9b000a,0x2c9e000a,0x2ca1000a,0x2ca5000a,0x1e0000a,0x2ca9000a, +0x2cac000a,0x2caf000a,0x2cb2000a,0x2cb5000a,0x1e3000a,0x1e6000a,0x1e9000a,0x1ec000a,0x1ef000a,0x1f2000a,0x1f5000a,0x1f8000a,0x2cba000a,0x2cbe000a,0x1fb000a,0x1fe000a, +0x201000a,0x2cc3000a,0x2cc6000a,0x2cc9000a,0x204000a,0x207000a,0x20b000a,0x20f000a,0x213000a,0x2ccc000a,0x2ccf000a,0x2cd2000a,0x2cd5000a,0x2cd8000a,0x2cdb000a,0x2cde000a, +0x2ce1000a,0x2ce4000a,0x2ce7000a,0x2cea000a,0x2cee000a,0x2cf2000a,0x2cf5000a,0x2cf9000a,0x2cfd000a,0x2d01000a,0x2d04000a,0x2d08000a,0x2d0c000a,0x217000a,0x21a000a,0x21e000a, +0x222000a,0x2d11000a,0x2d15000a,0x2d1b000a,0x2d22000a,0x2d25000a,0x2d28000a,0x2d2b000a,0x226000a,0x229000a,0x22c000a,0x22f000a,0x232000a,0x235000a,0x238000a,0x23b000a, +0x23e000a,0x241000a,0x244000a,0x247000a,0x24a000a,0x24d000a,0x2d2e000a,0x250000a,0x2d33000a,0x2d36000a,0x253000a,0x258000a,0x25c000a,0x25f000a,0x2d39000a,0x262000a, +0x2d3c000a,0x265000a,0x268000a,0x2d3f000a,0x2d42000a,0x2d45000a,0x2d48000a,0x2d4c000a,0x2d4f000a,0x2d52000a,0x2d56000a,0x26b000a,0x2d5a000a,0x26e000a,0x272000a,0x2d5f000a, +0x275000a,0x278000a,0x27b000a,0x27f000a,0x283000a,0x285000a,0x287000a,0x289000a,0x28b000a,0x28d000a,0x28f000a,0x291000a,0x293000a,0x295000a,0x297000a,0x299000a, +0x29b000a,0x29d000a,0x29f000a,0x2a1000a,0x2a3000a,0x2a5000a,0x2a7000a,0x2a9000a,0x2ab000a,0x2ad000a,0x2af000a,0x2b1000a,0x2b3000a,0x2b5000a,0x3921000a,0x3923000a, +0x3925000a,0x3927000a,0x3929000a,0x392b000a,0x392d000a,0x392f000a,0x3931000a,0x3933000a,0x3935000a,0x3937000a,0x3939000a,0x393b000a,0x393d000a,0x393f000a,0x3941000a,0x3943000a, +0x3945000a,0x3947000a,0x3949000a,0x394b000a,0x394d000a,0x394f000a,0x3951000a,0x3953000a,0x2b7000a,0x2b9000a,0x2bb000a,0x2bd000a,0x2bf000a,0x2c1000a,0x2c3000a,0x2c5000a, +0x2c7000a,0x2c9000a,0x2cb000a,0x2cd000a,0x2cf000a,0x2d1000a,0x2d3000a,0x2d5000a,0x2d7000a,0x2d9000a,0x2db000a,0x2dd000a,0x2df000a,0x2e1000a,0x2e3000a,0x2e5000a, +0x2e7000a,0x2e9000a,0x3955000a,0x3957000a,0x3959000a,0x395b000a,0x395d000a,0x395f000a,0x3961000a,0,0x3963000a,0x3965000a,0x3967000a,0x3969000a,0x396b000a,0x396d000a, +0x396f000a,0x3971000a,0x3973000a,0x3975000a,0x3977000a,0x3979000a,0x397b000a,0x397d000a,0x397f000a,0x3981000a,0x3983000a,0x3985000a,0x2eb000a,0x2ed000a,0x2ef000a,0x2f1000a, +0x2f3000a,0x2f5000a,0x2f7000a,0x2f9000a,0x2fb000a,0x2fd000a,0x2ff000a,0x301000a,0x303000a,0x305000a,0x307000a,0x309000a,0x30b000a,0x30d000a,0x30f000a,0x311000a, +0x313000a,0x315000a,0x317000a,0x319000a,0x31b000a,0x31d000a,0x3987000a,0x3989000a,0x398b000a,0x398d000a,0x398f000a,0x3991000a,0x3993000a,0x3995000a,0x3997000a,0x3999000a, +0x399b000a,0x399d000a,0x399f000a,0x39a1000a,0x39a3000a,0x39a5000a,0x39a7000a,0x39a9000a,0x39ab000a,0x39ad000a,0x39af000a,0x39b1000a,0x39b3000a,0x39b5000a,0x39b7000a,0x39b9000a, +0x31f000a,0,0x321000a,0x323000a,0,0,0x325000a,0,0,0x327000a,0x329000a,0,0,0x32b000a,0x32d000a,0x32f000a, +0x331000a,0,0x333000a,0x335000a,0x337000a,0x339000a,0x33b000a,0x33d000a,0x33f000a,0x341000a,0x39bb000a,0x39bd000a,0x39bf000a,0x39c1000a,0,0x39c3000a, +0,0x39c5000a,0x39c7000a,0x39c9000a,0x39cb000a,0x39cd000a,0x39cf000a,0x39d1000a,0,0x39d3000a,0x39d5000a,0x39d7000a,0x39d9000a,0x39db000a,0x39dd000a,0x39df000a, +0x39e1000a,0x39e3000a,0x39e5000a,0x39e7000a,0x343000a,0x345000a,0x347000a,0x349000a,0x34b000a,0x34d000a,0x34f000a,0x351000a,0x353000a,0x355000a,0x357000a,0x359000a, +0x35b000a,0x35d000a,0x35f000a,0x361000a,0x363000a,0x365000a,0x367000a,0x369000a,0x36b000a,0x36d000a,0x36f000a,0x371000a,0x373000a,0x375000a,0x39e9000a,0x39eb000a, +0x39ed000a,0x39ef000a,0x39f1000a,0x39f3000a,0x39f5000a,0x39f7000a,0x39f9000a,0x39fb000a,0x39fd000a,0x39ff000a,0x3a01000a,0x3a03000a,0x3a05000a,0x3a07000a,0x3a09000a,0x3a0b000a, +0x3a0d000a,0x3a0f000a,0x3a11000a,0x3a13000a,0x3a15000a,0x3a17000a,0x3a19000a,0x3a1b000a,0x377000a,0x379000a,0,0x37b000a,0x37d000a,0x37f000a,0x381000a,0, +0,0x383000a,0x385000a,0x387000a,0x389000a,0x38b000a,0x38d000a,0x38f000a,0x391000a,0,0x393000a,0x395000a,0x397000a,0x399000a,0x39b000a,0x39d000a, +0x39f000a,0,0x3a1d000a,0x3a1f000a,0x3a21000a,0x3a23000a,0x3a25000a,0x3a27000a,0x3a29000a,0x3a2b000a,0x3a2d000a,0x3a2f000a,0x3a31000a,0x3a33000a,0x3a35000a,0x3a37000a, +0x3a39000a,0x3a3b000a,0x3a3d000a,0x3a3f000a,0x3a41000a,0x3a43000a,0x3a45000a,0x3a47000a,0x3a49000a,0x3a4b000a,0x3a4d000a,0x3a4f000a,0x3a1000a,0x3a3000a,0,0x3a5000a, +0x3a7000a,0x3a9000a,0x3ab000a,0,0x3ad000a,0x3af000a,0x3b1000a,0x3b3000a,0x3b5000a,0,0x3b7000a,0,0,0,0x3b9000a,0x3bb000a, +0x3bd000a,0x3bf000a,0x3c1000a,0x3c3000a,0x3c5000a,0,0x3a51000a,0x3a53000a,0x3a55000a,0x3a57000a,0x3a59000a,0x3a5b000a,0x3a5d000a,0x3a5f000a,0x3a61000a,0x3a63000a, +0x3a65000a,0x3a67000a,0x3a69000a,0x3a6b000a,0x3a6d000a,0x3a6f000a,0x3a71000a,0x3a73000a,0x3a75000a,0x3a77000a,0x3a79000a,0x3a7b000a,0x3a7d000a,0x3a7f000a,0x3a81000a,0x3a83000a, +0x3c7000a,0x3c9000a,0x3cb000a,0x3cd000a,0x3cf000a,0x3d1000a,0x3d3000a,0x3d5000a,0x3d7000a,0x3d9000a,0x3db000a,0x3dd000a,0x3df000a,0x3e1000a,0x3e3000a,0x3e5000a, +0x3e7000a,0x3e9000a,0x3eb000a,0x3ed000a,0x3ef000a,0x3f1000a,0x3f3000a,0x3f5000a,0x3f7000a,0x3f9000a,0x3a85000a,0x3a87000a,0x3a89000a,0x3a8b000a,0x3a8d000a,0x3a8f000a, +0x3a91000a,0x3a93000a,0x3a95000a,0x3a97000a,0x3a99000a,0x3a9b000a,0x3a9d000a,0x3a9f000a,0x3aa1000a,0x3aa3000a,0x3aa5000a,0x3aa7000a,0x3aa9000a,0x3aab000a,0x3aad000a,0x3aaf000a, +0x3ab1000a,0x3ab3000a,0x3ab5000a,0x3ab7000a,0x3fb000a,0x3fd000a,0x3ff000a,0x401000a,0x403000a,0x405000a,0x407000a,0x409000a,0x40b000a,0x40d000a,0x40f000a,0x411000a, +0x413000a,0x415000a,0x417000a,0x419000a,0x41b000a,0x41d000a,0x41f000a,0x421000a,0x423000a,0x425000a,0x427000a,0x429000a,0x42b000a,0x42d000a,0x3ab9000a,0x3abb000a, +0x3abd000a,0x3abf000a,0x3ac1000a,0x3ac3000a,0x3ac5000a,0x3ac7000a,0x3ac9000a,0x3acb000a,0x3acd000a,0x3acf000a,0x3ad1000a,0x3ad3000a,0x3ad5000a,0x3ad7000a,0x3ad9000a,0x3adb000a, +0x3add000a,0x3adf000a,0x3ae1000a,0x3ae3000a,0x3ae5000a,0x3ae7000a,0x3ae9000a,0x3aeb000a,0x42f000a,0x431000a,0x433000a,0x435000a,0x437000a,0x439000a,0x43b000a,0x43d000a, +0x43f000a,0x441000a,0x443000a,0x445000a,0x447000a,0x449000a,0x44b000a,0x44d000a,0x44f000a,0x451000a,0x453000a,0x455000a,0x457000a,0x459000a,0x45b000a,0x45d000a, +0x45f000a,0x461000a,0x3aed000a,0x3aef000a,0x3af1000a,0x3af3000a,0x3af5000a,0x3af7000a,0x3af9000a,0x3afb000a,0x3afd000a,0x3aff000a,0x3b01000a,0x3b03000a,0x3b05000a,0x3b07000a, +0x3b09000a,0x3b0b000a,0x3b0d000a,0x3b0f000a,0x3b11000a,0x3b13000a,0x3b15000a,0x3b17000a,0x3b19000a,0x3b1b000a,0x3b1d000a,0x3b1f000a,0x463000a,0x465000a,0x467000a,0x469000a, +0x46b000a,0x46d000a,0x46f000a,0x471000a,0x473000a,0x475000a,0x477000a,0x479000a,0x47b000a,0x47d000a,0x47f000a,0x481000a,0x483000a,0x485000a,0x487000a,0x489000a, +0x48b000a,0x48d000a,0x48f000a,0x491000a,0x493000a,0x495000a,0x3b21000a,0x3b23000a,0x3b25000a,0x3b27000a,0x3b29000a,0x3b2b000a,0x3b2d000a,0x3b2f000a,0x3b31000a,0x3b33000a, +0x3b35000a,0x3b37000a,0x3b39000a,0x3b3b000a,0x3b3d000a,0x3b3f000a,0x3b41000a,0x3b43000a,0x3b45000a,0x3b47000a,0x3b49000a,0x3b4b000a,0x3b4d000a,0x3b4f000a,0x3b51000a,0x3b53000a, +0x497000a,0x499000a,0x49b000a,0x49d000a,0x49f000a,0x4a1000a,0x4a3000a,0x4a5000a,0x4a7000a,0x4a9000a,0x4ab000a,0x4ad000a,0x4af000a,0x4b1000a,0x4b3000a,0x4b5000a, +0x4b7000a,0x4b9000a,0x4bb000a,0x4bd000a,0x4bf000a,0x4c1000a,0x4c3000a,0x4c5000a,0x4c7000a,0x4c9000a,0x3b55000a,0x3b57000a,0x3b59000a,0x3b5b000a,0x3b5d000a,0x3b5f000a, +0x3b61000a,0x3b63000a,0x3b65000a,0x3b67000a,0x3b69000a,0x3b6b000a,0x3b6d000a,0x3b6f000a,0x3b71000a,0x3b73000a,0x3b75000a,0x3b77000a,0x3b79000a,0x3b7b000a,0x3b7d000a,0x3b7f000a, +0x3b81000a,0x3b83000a,0x3b85000a,0x3b87000a,0x4cb000a,0x4cd000a,0x4cf000a,0x4d1000a,0x4d3000a,0x4d5000a,0x4d7000a,0x4d9000a,0x4db000a,0x4dd000a,0x4df000a,0x4e1000a, +0x4e3000a,0x4e5000a,0x4e7000a,0x4e9000a,0x4eb000a,0x4ed000a,0x4ef000a,0x4f1000a,0x4f3000a,0x4f5000a,0x4f7000a,0x4f9000a,0x4fb000a,0x4fd000a,0x3b89000a,0x3b8b000a, +0x3b8d000a,0x3b8f000a,0x3b91000a,0x3b93000a,0x3b95000a,0x3b97000a,0x3b99000a,0x3b9b000a,0x3b9d000a,0x3b9f000a,0x3ba1000a,0x3ba3000a,0x3ba5000a,0x3ba7000a,0x3ba9000a,0x3bab000a, +0x3bad000a,0x3baf000a,0x3bb1000a,0x3bb3000a,0x3bb5000a,0x3bb7000a,0x3bb9000a,0x3bbb000a,0x3bbd000a,0x3bbf000a,0,0,0x4ff000a,0x501000a,0x503000a,0x505000a, +0x507000a,0x509000a,0x50b000a,0x50d000a,0x50f000a,0x511000a,0x513000a,0x515000a,0x517000a,0x519000a,0x51b000a,0x51d000a,0x51f000a,0x521000a,0x523000a,0x525000a, +0x527000a,0x529000a,0x52b000a,0x52d000a,0x52f000a,0x3bc1000a,0x3bc3000a,0x3bc5000a,0x3bc7000a,0x3bc9000a,0x3bcb000a,0x3bcd000a,0x3bcf000a,0x3bd1000a,0x3bd3000a,0x3bd5000a, +0x3bd7000a,0x3bd9000a,0x3bdb000a,0x3bdd000a,0x3bdf000a,0x3be1000a,0x3be3000a,0x531000a,0x3be5000a,0x3be7000a,0x3be9000a,0x3beb000a,0x3bed000a,0x3bef000a,0x3bf1000a,0x3bf3000a, +0x3bf5000a,0x3bf7000a,0x3bf9000a,0x3bfb000a,0x3bfd000a,0x3bff000a,0x533000a,0x535000a,0x537000a,0x539000a,0x53b000a,0x53d000a,0x53f000a,0x541000a,0x543000a,0x545000a, +0x547000a,0x549000a,0x54b000a,0x54d000a,0x54f000a,0x551000a,0x553000a,0x555000a,0x557000a,0x559000a,0x55b000a,0x55d000a,0x55f000a,0x561000a,0x563000a,0x3c01000a, +0x3c03000a,0x3c05000a,0x3c07000a,0x3c09000a,0x3c0b000a,0x3c0d000a,0x3c0f000a,0x3c11000a,0x3c13000a,0x3c15000a,0x3c17000a,0x3c19000a,0x3c1b000a,0x3c1d000a,0x3c1f000a,0x3c21000a, +0x3c23000a,0x565000a,0x3c25000a,0x3c27000a,0x3c29000a,0x3c2b000a,0x3c2d000a,0x3c2f000a,0x3c31000a,0x3c33000a,0x3c35000a,0x3c37000a,0x3c39000a,0x3c3b000a,0x3c3d000a,0x3c3f000a, +0x567000a,0x569000a,0x56b000a,0x56d000a,0x56f000a,0x571000a,0x573000a,0x575000a,0x577000a,0x579000a,0x57b000a,0x57d000a,0x57f000a,0x581000a,0x583000a,0x585000a, +0x587000a,0x589000a,0x58b000a,0x58d000a,0x58f000a,0x591000a,0x593000a,0x595000a,0x597000a,0x3c41000a,0x3c43000a,0x3c45000a,0x3c47000a,0x3c49000a,0x3c4b000a,0x3c4d000a, +0x3c4f000a,0x3c51000a,0x3c53000a,0x3c55000a,0x3c57000a,0x3c59000a,0x3c5b000a,0x3c5d000a,0x3c5f000a,0x3c61000a,0x3c63000a,0x599000a,0x3c65000a,0x3c67000a,0x3c69000a,0x3c6b000a, +0x3c6d000a,0x3c6f000a,0x3c71000a,0x3c73000a,0x3c75000a,0x3c77000a,0x3c79000a,0x3c7b000a,0x3c7d000a,0x3c7f000a,0x59b000a,0x59d000a,0x59f000a,0x5a1000a,0x5a3000a,0x5a5000a, +0x5a7000a,0x5a9000a,0x5ab000a,0x5ad000a,0x5af000a,0x5b1000a,0x5b3000a,0x5b5000a,0x5b7000a,0x5b9000a,0x5bb000a,0x5bd000a,0x5bf000a,0x5c1000a,0x5c3000a,0x5c5000a, +0x5c7000a,0x5c9000a,0x5cb000a,0x3c81000a,0x3c83000a,0x3c85000a,0x3c87000a,0x3c89000a,0x3c8b000a,0x3c8d000a,0x3c8f000a,0x3c91000a,0x3c93000a,0x3c95000a,0x3c97000a,0x3c99000a, +0x3c9b000a,0x3c9d000a,0x3c9f000a,0x3ca1000a,0x3ca3000a,0x5cd000a,0x3ca5000a,0x3ca7000a,0x3ca9000a,0x3cab000a,0x3cad000a,0x3caf000a,0x3cb1000a,0x3cb3000a,0x3cb5000a,0x3cb7000a, +0x3cb9000a,0x3cbb000a,0x3cbd000a,0x3cbf000a,0x5cf000a,0x5d1000a,0x5d3000a,0x5d5000a,0x5d7000a,0x5d9000a,0x5db000a,0x5dd000a,0x5df000a,0x5e1000a,0x5e3000a,0x5e5000a, +0x5e7000a,0x5e9000a,0x5eb000a,0x5ed000a,0x5ef000a,0x5f1000a,0x5f3000a,0x5f5000a,0x5f7000a,0x5f9000a,0x5fb000a,0x5fd000a,0x5ff000a,0x3cc1000a,0x3cc3000a,0x3cc5000a, +0x3cc7000a,0x3cc9000a,0x3ccb000a,0x3ccd000a,0x3ccf000a,0x3cd1000a,0x3cd3000a,0x3cd5000a,0x3cd7000a,0x3cd9000a,0x3cdb000a,0x3cdd000a,0x3cdf000a,0x3ce1000a,0x3ce3000a,0x601000a, +0x3ce5000a,0x3ce7000a,0x3ce9000a,0x3ceb000a,0x3ced000a,0x3cef000a,0x3cf1000a,0x3cf3000a,0x3cf5000a,0x3cf7000a,0x3cf9000a,0x3cfb000a,0x3cfd000a,0x3cff000a,0x603000a,0x3d01000a, +0,0,0x3d03000a,0x3d05000a,0x3d07000a,0x3d09000a,0x3d0b000a,0x3d0d000a,0x3d0f000a,0x3d11000a,0x3d13000a,0x3d15000a,0x3d17000a,0x3d19000a,0x3d1b000a,0x3d1d000a, +0x3d1f000a,0x3d21000a,0x3d23000a,0x3d25000a,0x605e60f,0x608e60f,0x206be6b0,0x60be60f,0x60ee60f,0x206cf0b0,0xe600,0xdc00,0xdc00,0xdc00,0xe600,0xe600, 0xe600,0xdc00,0xdc00,0,0xe600,0xe600,0xe600,0xdc00,0xdc00,0xdc00,0xdc00,0xe600,0xe800,0xdc00,0xdc00,0xe600, -0xe900,0xea00,0xea00,0xe900,0,0,0,0,0x20f9000a,0x1458000e,0x1460000c,0x612000f,0x1464000c,0x1468000c,0x146c000c,0, -0x1470000c,0,0x1474000c,0x1478000c,0x147c000c,0x3d6c0040,0,0,0,0x3d6d0040,0,0x3d6e0040,0,0x3d6f0040,0,0, -0,0,0,0x3d700040,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x900,0,0,0,0xe600,0xdc00,0xe600,0xe600,0,0,0,0x614000f,0x618000f,0x61c000f,0x620000f, -0x624000f,0x628000f,0x62c000f,0x630000f,0,0,0,0,0,0,0,0x3da30040,0,0,0,0x15b3000c, -0x15b6000c,0x900,0,0,0,0,0,0,0,0,0,0x204d00b0,0,0,0,0, -0x634000f,0x638000f,0,0x63c000f,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x640000f,0,0,0x644000f,0,0,0,0,0, +0xe900,0xea00,0xea00,0xe900,0,0,0,0,0x211f000a,0x145c000e,0x1464000c,0x616000f,0x1468000c,0x146c000c,0x1470000c,0, +0x1474000c,0,0x1478000c,0x147c000c,0x1480000c,0x3d940040,0,0,0,0x3d950040,0,0x3d960040,0,0x3d970040,0,0, +0,0,0,0x3d980040,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x900,0,0,0,0xe600,0xdc00,0xe600,0xe600,0,0,0,0x618000f,0x61c000f,0x620000f,0x624000f, +0x628000f,0x62c000f,0x630000f,0x634000f,0,0,0,0,0,0,0,0x3dcb0040,0,0,0,0x15b7000c, +0x15ba000c,0x900,0,0,0,0,0,0,0,0,0,0x207200b0,0,0,0,0, +0x638000f,0x63c000f,0,0x640000f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x644000f,0,0,0x648000f,0,0,0,0,0, 0x700,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x900,0,0,0,0,0,0,0,0,0,0,0,0x648000f,0x64c000f,0x650000f, -0,0,0x654000f,0,0,0,0,0,0,0,0,0x3da40040,0x15b9000c,0,0,0x15bc000c, -0x15bf000c,0x900,0,0,0,0,0,0,0,0,0x204f00b0,0x205000b0,0,0,0,0, -0x658000f,0x65c000f,0,0,0,0,0,0x660000f,0,0,0,0,0,0,0,0, -0,0x663000f,0,0,0,0,0x666000f,0,0,0,0,0x669000f,0,0,0,0, -0x66c000f,0,0,0,0,0,0,0,0,0,0,0,0,0x66f000f,0,0, -0,0,0,0,0,0x8100,0x8200,0x672000f,0x8400,0x676000f,0x67a000f,0x212a000a,0x67e000f,0x212f000a,0x8200,0x8200, -0x8200,0x8200,0,0,0x8200,0x682000f,0xe600,0xe600,0x900,0,0xe600,0xe600,0,0,0,0, -0,0,0,0,0,0,0,0x686000f,0,0,0,0,0,0,0,0, -0,0x689000f,0,0,0,0,0x68c000f,0,0,0,0,0x68f000f,0,0,0,0, -0x692000f,0,0,0,0,0,0,0,0,0,0,0,0,0x695000f,0,0, -0,0,0,0,0x1bfb004c,0x1c00004c,0x1c05004c,0x1c0b004c,0x1c11004c,0x1c17004c,0x1c1d004c,0x1c23004c,0x1c29004c,0x1c2e004c,0x1c33004c,0x1c39004c, -0x1c3f004c,0x1c45004c,0x1c4b004c,0x1c51004c,0x1c57004c,0x698000f,0x1c5b000c,0x69c000f,0x1c60004c,0x6a0000f,0x1c64000c,0x6a4000f,0x1c68000c,0x6a8000f,0x1c6c000c,0x6ac000f, -0x1c71004c,0x6b0000f,0,0,0x1d2d000c,0x1d32000c,0x1d37000c,0x1d3d000c,0x1d43000c,0x1d49000c,0x1d4f000c,0x1d55000c,0x1d5b000c,0x1d60000c,0x1d65000c,0x1d6b000c, -0x1d71000c,0x1d77000c,0x1d7d000c,0x1d83000c,0x1d89000c,0x1d8d000c,0x1d91000c,0x1d96000c,0x1d9a000c,0,0x1da0004c,0x1da4000c,0x1da9000c,0x1dad000c,0x1db1000c,0x6b4000f, -0x1db5000c,0x21d3000a,0x6b8000f,0x21d8004a,0x21dc000a,0x1db9000e,0x1dc1000c,0x1dc6000c,0x1dca000c,0,0x1dd0004c,0x1dd4000c,0x1dd9000c,0x6ba000f,0x1ddd000c,0x6be000f, -0x1de1000c,0x1de5000e,0x1ded000e,0x1df5000e,0x1dfd000c,0x1e01000c,0x1e05000c,0x6c2000f,0,0,0x1e0a000c,0x1e0e000c,0x1e13000c,0x1e17000c,0x1e1b000c,0x6c7000f, -0,0x1e1f000e,0x1e27000e,0x1e2f000e,0x1e37000c,0x1e3b000c,0x1e3f000c,0x6cb000f,0x1e44000c,0x1e48000c,0x1e4c000c,0x1e50000c,0x1e55000c,0x1e59000c,0x1e5d000c,0x6d0000f, -0x1e61000c,0x1e65000e,0x6d4000f,0x6dc000f,0,0,0x1e6d000c,0x1e72000c,0x1e76000c,0,0x1e7c004c,0x1e80000c,0x1e85000c,0x6de000f,0x1e89000c,0x6e2000f, -0x1e8d000c,0x6e6000f,0x21e1004a,0,0x6eb000f,0x6ee000f,0x21e5000a,0x21e7000a,0x21e9000a,0x21eb000a,0x21ed000a,0x21ef000a,0x21f1000a,0x21f3000a,0x21f5000a,0, -0,0,0,0,0,0x21f7000a,0,0,0,0,0,0x21f9000a,0,0,0,0, -0,0,0,0,0,0x6f9000f,0x6fb000f,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x6fd000f,0,0,0,0x701000f,0x703000f,0x705000f,0x707000f,0x709000f,0x70b000f,0x70d000f,0x70f000f, -0x711000f,0x713000f,0x715000f,0x717000f,0x719000f,0x71b000f,0x71d000f,0x71f000f,0x721000f,0x723000f,0x725000f,0x727000f,0x729000f,0x72b000f,0x72d000f,0x72f000f, -0x731000f,0x733000f,0x735000f,0x737000f,0x739000f,0x73b000f,0x73d000f,0x73f000f,0x741000f,0x743000f,0x745000f,0x747000f,0x749000f,0x74b000f,0x74d000f,0x74f000f, -0x751000f,0x753000f,0x755000f,0x757000f,0x759000f,0x75b000f,0x75d000f,0x75f000f,0x761000f,0x763000f,0x765000f,0x767000f,0x769000f,0x76b000f,0x76d000f,0x76f000f, -0x771000f,0x773000f,0x775000f,0x777000f,0x779000f,0x77b000f,0x77d000f,0x77f000f,0x781000f,0x783000f,0x785000f,0x787000f,0x789000f,0x78b000f,0x78d000f,0x78f000f, -0x791000f,0x793000f,0x795000f,0x797000f,0x799000f,0x79b000f,0x79d000f,0x79f000f,0x7a1000f,0x7a3000f,0x7a5000f,0x7a7000f,0x7a9000f,0x7ab000f,0x7ad000f,0x7af000f, -0x7b1000f,0x7b3000f,0x7b5000f,0x7b7000f,0x7b9000f,0x7bb000f,0x7bd000f,0x7bf000f,0x7c1000f,0x7c3000f,0x7c5000f,0x7c7000f,0x7c9000f,0x7cb000f,0x7cd000f,0x7cf000f, -0x7d1000f,0x7d3000f,0x7d5000f,0x7d7000f,0x7d9000f,0x7db000f,0x7dd000f,0x7df000f,0x7e1000f,0x7e3000f,0x7e5000f,0x7e7000f,0x7e9000f,0x7eb000f,0x7ed000f,0x7ef000f, -0x7f1000f,0x7f3000f,0x7f5000f,0x7f7000f,0x7f9000f,0x7fb000f,0x7fd000f,0x7ff000f,0x801000f,0x803000f,0x805000f,0x807000f,0x809000f,0x80b000f,0x80d000f,0x80f000f, -0x811000f,0x813000f,0x815000f,0x817000f,0x819000f,0x81b000f,0x81d000f,0x81f000f,0x821000f,0x823000f,0x825000f,0x827000f,0x829000f,0x82b000f,0x82d000f,0x82f000f, -0x831000f,0x833000f,0x835000f,0x837000f,0x839000f,0x83b000f,0x83d000f,0x83f000f,0x841000f,0x843000f,0x845000f,0x847000f,0x849000f,0x84b000f,0x84d000f,0x84f000f, -0x851000f,0x853000f,0x855000f,0x857000f,0x859000f,0x85b000f,0x85d000f,0x85f000f,0x861000f,0x863000f,0x865000f,0x867000f,0x869000f,0x86b000f,0x86d000f,0x86f000f, -0x871000f,0x873000f,0x875000f,0x877000f,0x879000f,0x87b000f,0x87d000f,0x87f000f,0x881000f,0x883000f,0x885000f,0x887000f,0x889000f,0x88b000f,0x88d000f,0x88f000f, -0x891000f,0x893000f,0x895000f,0x897000f,0x899000f,0x89b000f,0x89d000f,0x89f000f,0x8a1000f,0x8a3000f,0x8a5000f,0x8a7000f,0x8a9000f,0x8ab000f,0x8ad000f,0x8af000f, -0x8b1000f,0x8b3000f,0x8b5000f,0x8b7000f,0x8b9000f,0x8bb000f,0x8bd000f,0x8bf000f,0x8c1000f,0x8c3000f,0x8c5000f,0x8c7000f,0x8c9000f,0x8cb000f,0x8cd000f,0x8cf000f, -0x8d1000f,0x8d3000f,0x8d5000f,0x8d7000f,0x8d9000f,0x8db000f,0x8dd000f,0x8df000f,0x8e1000f,0x8e3000f,0x8e5000f,0x8e7000f,0x8e9000f,0x8eb000f,0x8ed000f,0x8ef000f, -0x8f1000f,0x8f3000f,0x8f5000f,0x8f7000f,0x8f9000f,0x8fb000f,0x8fd000f,0x8ff000f,0x901000f,0x903000f,0x905000f,0x907000f,0x909000f,0x90b000f,0x90d000f,0x90f000f, -0x911000f,0x913000f,0x915000f,0x917000f,0x919000f,0x91b000f,0,0,0x91d000f,0,0x91f000f,0,0,0x921000f,0x923000f,0x925000f, -0x927000f,0x929000f,0x92b000f,0x92d000f,0x92f000f,0x931000f,0x933000f,0,0x935000f,0,0x937000f,0,0,0x939000f,0x93b000f,0, -0,0,0x93d000f,0x93f000f,0x941000f,0x943000f,0,0,0x945000f,0x947000f,0x949000f,0x94b000f,0x94d000f,0x94f000f,0x951000f,0x953000f, -0x955000f,0x957000f,0x959000f,0x95b000f,0x95d000f,0x95f000f,0x961000f,0x963000f,0x965000f,0x967000f,0x969000f,0x96b000f,0x96d000f,0x96f000f,0x971000f,0x973000f, -0x975000f,0x977000f,0x979000f,0x97b000f,0x97d000f,0x97f000f,0x981000f,0x983000f,0x985000f,0x987000f,0x989000f,0x98b000f,0x98d000f,0x98f000f,0x991000f,0x993000f, -0x995000f,0x997000f,0x999000f,0x99b000f,0x99d000f,0x99f000f,0x9a1000f,0x9a3000f,0x9a5000f,0x9a7000f,0x9a9000f,0x9ab000f,0x9ad000f,0x9af000f,0x9b1000f,0x9b3000f, -0x9b5000f,0x9b7000f,0x9b9000f,0,0,0,0,0,0x9bb000f,0x9bd000f,0x9bf000f,0x9c1000f,0x9c3000f,0x9c5000f,0x9c7000f,0x9c9000f, -0x9cb000f,0x9cd000f,0x9cf000f,0x9d1000f,0x9d3000f,0x9d5000f,0x9d7000f,0x9d9000f,0x9db000f,0x9dd000f,0x9df000f,0x9e1000f,0x9e3000f,0x9e5000f,0x9e7000f,0x9e9000f, -0x9eb000f,0x9ed000f,0x9ef000f,0x9f1000f,0x9f3000f,0x9f5000f,0x9f7000f,0x9f9000f,0x9fb000f,0x9fd000f,0x9ff000f,0xa01000f,0xa03000f,0xa05000f,0xa07000f,0xa09000f, -0xa0b000f,0xa0d000f,0xa0f000f,0xa11000f,0xa13000f,0xa15000f,0xa17000f,0xa19000f,0xa1b000f,0xa1d000f,0xa1f000f,0xa21000f,0xa23000f,0xa25000f,0xa27000f,0xa29000f, -0xa2b000f,0xa2d000f,0xa2f000f,0xa31000f,0xa33000f,0xa35000f,0xa37000f,0xa39000f,0xa3b000f,0xa3d000f,0xa3f000f,0xa41000f,0xa43000f,0xa45000f,0xa47000f,0xa49000f, -0xa4b000f,0xa4d000f,0xa4f000f,0xa51000f,0xa53000f,0xa55000f,0xa57000f,0xa59000f,0xa5b000f,0xa5d000f,0xa5f000f,0xa61000f,0xa63000f,0xa65000f,0xa67000f,0xa69000f, -0xa6b000f,0xa6d000f,0xa6f000f,0xa71000f,0xa73000f,0xa75000f,0xa77000f,0xa79000f,0xa7c000f,0xa7f000f,0xa82000f,0xa84000f,0xa86000f,0xa88000f,0xa8b000f,0xa8e000f, -0xa91000f,0xa93000f,0,0,0,0,0,0,0x2db3000a,0x2db6000a,0x2db9000a,0x2dbc000a,0x2dc0000a,0x2dc4000a,0x2dc7000a,0, -0,0,0,0,0,0,0,0,0,0,0,0x2dca000a,0x2dcd000a,0x2dd0000a,0x2dd3000a,0x2dd6000a, -0,0,0,0,0,0xa95000f,0x1a00,0xa99000f,0x2dd9000a,0x2ddb000a,0x2ddd000a,0x2ddf000a,0x2de1000a,0x2de3000a,0x2de5000a,0x2de7000a, -0x2de9000a,0x2deb000a,0xa9d000f,0xaa1000f,0xaa5000f,0xaaa000f,0xaaf000f,0xab3000f,0xab7000f,0xabb000f,0xabf000f,0xac3000f,0xac7000f,0xacb000f,0xacf000f,0, -0xad3000f,0xad7000f,0xadb000f,0xadf000f,0xae3000f,0,0xae7000f,0,0xaeb000f,0xaef000f,0,0xaf3000f,0xaf7000f,0,0xafb000f,0xaff000f, -0xb03000f,0xb07000f,0xb0b000f,0xb0f000f,0xb13000f,0xb17000f,0xb1b000f,0x2ded000a,0x2df0000a,0x2df2000a,0x2df4000a,0x2df6000a,0x2df8000a,0x2dfa000a,0x2dfc000a,0x2dfe000a, -0x2e00000a,0x2e02000a,0x2e04000a,0x2e06000a,0x2e08000a,0x2e0a000a,0x2e0c000a,0x2e0e000a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1f000f,0xb25000f,0xb2b000f,0xb33000f,0xb3b000f,0xb43000f,0xb4b000f,0xd800,0xd800,0x100, +0,0x900,0,0,0,0,0,0,0,0,0,0,0,0x64c000f,0x650000f,0x654000f, +0,0,0x658000f,0,0,0,0,0,0,0,0,0x3dcc0040,0x15bd000c,0,0,0x15c0000c, +0x15c3000c,0x900,0,0,0,0,0,0,0,0,0x207400b0,0x207500b0,0,0,0,0, +0x65c000f,0x660000f,0,0,0,0,0,0x664000f,0,0,0,0,0,0,0,0, +0,0x667000f,0,0,0,0,0x66a000f,0,0,0,0,0x66d000f,0,0,0,0, +0x670000f,0,0,0,0,0,0,0,0,0,0,0,0,0x673000f,0,0, +0,0,0,0,0,0x8100,0x8200,0x676000f,0x8400,0x67a000f,0x67e000f,0x2150000a,0x682000f,0x2155000a,0x8200,0x8200, +0x8200,0x8200,0,0,0x8200,0x686000f,0xe600,0xe600,0x900,0,0xe600,0xe600,0,0,0,0, +0,0,0,0,0,0,0,0x68a000f,0,0,0,0,0,0,0,0, +0,0x68d000f,0,0,0,0,0x690000f,0,0,0,0,0x693000f,0,0,0,0, +0x696000f,0,0,0,0,0,0,0,0,0,0,0,0,0x699000f,0,0, +0,0,0,0,0x1c20004c,0x1c25004c,0x1c2a004c,0x1c30004c,0x1c36004c,0x1c3c004c,0x1c42004c,0x1c48004c,0x1c4e004c,0x1c53004c,0x1c58004c,0x1c5e004c, +0x1c64004c,0x1c6a004c,0x1c70004c,0x1c76004c,0x1c7c004c,0x69c000f,0x1c80000c,0x6a0000f,0x1c85004c,0x6a4000f,0x1c89000c,0x6a8000f,0x1c8d000c,0x6ac000f,0x1c91000c,0x6b0000f, +0x1c96004c,0x6b4000f,0,0,0x1d52000c,0x1d57000c,0x1d5c000c,0x1d62000c,0x1d68000c,0x1d6e000c,0x1d74000c,0x1d7a000c,0x1d80000c,0x1d85000c,0x1d8a000c,0x1d90000c, +0x1d96000c,0x1d9c000c,0x1da2000c,0x1da8000c,0x1dae000c,0x1db2000c,0x1db6000c,0x1dbb000c,0x1dbf000c,0,0x1dc5004c,0x1dc9000c,0x1dce000c,0x1dd2000c,0x1dd6000c,0x6b8000f, +0x1dda000c,0x21f9000a,0x6bc000f,0x21fe004a,0x2202000a,0x1dde000e,0x1de6000c,0x1deb000c,0x1def000c,0,0x1df5004c,0x1df9000c,0x1dfe000c,0x6be000f,0x1e02000c,0x6c2000f, +0x1e06000c,0x1e0a000e,0x1e12000e,0x1e1a000e,0x1e22000c,0x1e26000c,0x1e2a000c,0x6c6000f,0,0,0x1e2f000c,0x1e33000c,0x1e38000c,0x1e3c000c,0x1e40000c,0x6cb000f, +0,0x1e44000e,0x1e4c000e,0x1e54000e,0x1e5c000c,0x1e60000c,0x1e64000c,0x6cf000f,0x1e69000c,0x1e6d000c,0x1e71000c,0x1e75000c,0x1e7a000c,0x1e7e000c,0x1e82000c,0x6d4000f, +0x1e86000c,0x1e8a000e,0x6d8000f,0x6e0000f,0,0,0x1e92000c,0x1e97000c,0x1e9b000c,0,0x1ea1004c,0x1ea5000c,0x1eaa000c,0x6e2000f,0x1eae000c,0x6e6000f, +0x1eb2000c,0x6ea000f,0x2207004a,0,0x6ef000f,0x6f2000f,0x220b000a,0x220d000a,0x220f000a,0x2211000a,0x2213000a,0x2215000a,0x2217000a,0x2219000a,0x221b000a,0, +0,0,0,0,0,0x221d000a,0,0,0,0,0,0x221f000a,0,0,0,0, +0,0,0,0,0,0x6fd000f,0x6ff000f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x701000f,0,0,0,0x705000f,0x707000f,0x709000f,0x70b000f,0x70d000f,0x70f000f,0x711000f,0x713000f, +0x715000f,0x717000f,0x719000f,0x71b000f,0x71d000f,0x71f000f,0x721000f,0x723000f,0x725000f,0x727000f,0x729000f,0x72b000f,0x72d000f,0x72f000f,0x731000f,0x733000f, +0x735000f,0x737000f,0x739000f,0x73b000f,0x73d000f,0x73f000f,0x741000f,0x743000f,0x745000f,0x747000f,0x749000f,0x74b000f,0x74d000f,0x74f000f,0x751000f,0x753000f, +0x755000f,0x757000f,0x759000f,0x75b000f,0x75d000f,0x75f000f,0x761000f,0x763000f,0x765000f,0x767000f,0x769000f,0x76b000f,0x76d000f,0x76f000f,0x771000f,0x773000f, +0x775000f,0x777000f,0x779000f,0x77b000f,0x77d000f,0x77f000f,0x781000f,0x783000f,0x785000f,0x787000f,0x789000f,0x78b000f,0x78d000f,0x78f000f,0x791000f,0x793000f, +0x795000f,0x797000f,0x799000f,0x79b000f,0x79d000f,0x79f000f,0x7a1000f,0x7a3000f,0x7a5000f,0x7a7000f,0x7a9000f,0x7ab000f,0x7ad000f,0x7af000f,0x7b1000f,0x7b3000f, +0x7b5000f,0x7b7000f,0x7b9000f,0x7bb000f,0x7bd000f,0x7bf000f,0x7c1000f,0x7c3000f,0x7c5000f,0x7c7000f,0x7c9000f,0x7cb000f,0x7cd000f,0x7cf000f,0x7d1000f,0x7d3000f, +0x7d5000f,0x7d7000f,0x7d9000f,0x7db000f,0x7dd000f,0x7df000f,0x7e1000f,0x7e3000f,0x7e5000f,0x7e7000f,0x7e9000f,0x7eb000f,0x7ed000f,0x7ef000f,0x7f1000f,0x7f3000f, +0x7f5000f,0x7f7000f,0x7f9000f,0x7fb000f,0x7fd000f,0x7ff000f,0x801000f,0x803000f,0x805000f,0x807000f,0x809000f,0x80b000f,0x80d000f,0x80f000f,0x811000f,0x813000f, +0x815000f,0x817000f,0x819000f,0x81b000f,0x81d000f,0x81f000f,0x821000f,0x823000f,0x825000f,0x827000f,0x829000f,0x82b000f,0x82d000f,0x82f000f,0x831000f,0x833000f, +0x835000f,0x837000f,0x839000f,0x83b000f,0x83d000f,0x83f000f,0x841000f,0x843000f,0x845000f,0x847000f,0x849000f,0x84b000f,0x84d000f,0x84f000f,0x851000f,0x853000f, +0x855000f,0x857000f,0x859000f,0x85b000f,0x85d000f,0x85f000f,0x861000f,0x863000f,0x865000f,0x867000f,0x869000f,0x86b000f,0x86d000f,0x86f000f,0x871000f,0x873000f, +0x875000f,0x877000f,0x879000f,0x87b000f,0x87d000f,0x87f000f,0x881000f,0x883000f,0x885000f,0x887000f,0x889000f,0x88b000f,0x88d000f,0x88f000f,0x891000f,0x893000f, +0x895000f,0x897000f,0x899000f,0x89b000f,0x89d000f,0x89f000f,0x8a1000f,0x8a3000f,0x8a5000f,0x8a7000f,0x8a9000f,0x8ab000f,0x8ad000f,0x8af000f,0x8b1000f,0x8b3000f, +0x8b5000f,0x8b7000f,0x8b9000f,0x8bb000f,0x8bd000f,0x8bf000f,0x8c1000f,0x8c3000f,0x8c5000f,0x8c7000f,0x8c9000f,0x8cb000f,0x8cd000f,0x8cf000f,0x8d1000f,0x8d3000f, +0x8d5000f,0x8d7000f,0x8d9000f,0x8db000f,0x8dd000f,0x8df000f,0x8e1000f,0x8e3000f,0x8e5000f,0x8e7000f,0x8e9000f,0x8eb000f,0x8ed000f,0x8ef000f,0x8f1000f,0x8f3000f, +0x8f5000f,0x8f7000f,0x8f9000f,0x8fb000f,0x8fd000f,0x8ff000f,0x901000f,0x903000f,0x905000f,0x907000f,0x909000f,0x90b000f,0x90d000f,0x90f000f,0x911000f,0x913000f, +0x915000f,0x917000f,0x919000f,0x91b000f,0x91d000f,0x91f000f,0,0,0x921000f,0,0x923000f,0,0,0x925000f,0x927000f,0x929000f, +0x92b000f,0x92d000f,0x92f000f,0x931000f,0x933000f,0x935000f,0x937000f,0,0x939000f,0,0x93b000f,0,0,0x93d000f,0x93f000f,0, +0,0,0x941000f,0x943000f,0x945000f,0x947000f,0,0,0x949000f,0x94b000f,0x94d000f,0x94f000f,0x951000f,0x953000f,0x955000f,0x957000f, +0x959000f,0x95b000f,0x95d000f,0x95f000f,0x961000f,0x963000f,0x965000f,0x967000f,0x969000f,0x96b000f,0x96d000f,0x96f000f,0x971000f,0x973000f,0x975000f,0x977000f, +0x979000f,0x97b000f,0x97d000f,0x97f000f,0x981000f,0x983000f,0x985000f,0x987000f,0x989000f,0x98b000f,0x98d000f,0x98f000f,0x991000f,0x993000f,0x995000f,0x997000f, +0x999000f,0x99b000f,0x99d000f,0x99f000f,0x9a1000f,0x9a3000f,0x9a5000f,0x9a7000f,0x9a9000f,0x9ab000f,0x9ad000f,0x9af000f,0x9b1000f,0x9b3000f,0x9b5000f,0x9b7000f, +0x9b9000f,0x9bb000f,0x9bd000f,0,0,0,0,0,0x9bf000f,0x9c1000f,0x9c3000f,0x9c5000f,0x9c7000f,0x9c9000f,0x9cb000f,0x9cd000f, +0x9cf000f,0x9d1000f,0x9d3000f,0x9d5000f,0x9d7000f,0x9d9000f,0x9db000f,0x9dd000f,0x9df000f,0x9e1000f,0x9e3000f,0x9e5000f,0x9e7000f,0x9e9000f,0x9eb000f,0x9ed000f, +0x9ef000f,0x9f1000f,0x9f3000f,0x9f5000f,0x9f7000f,0x9f9000f,0x9fb000f,0x9fd000f,0x9ff000f,0xa01000f,0xa03000f,0xa05000f,0xa07000f,0xa09000f,0xa0b000f,0xa0d000f, +0xa0f000f,0xa11000f,0xa13000f,0xa15000f,0xa17000f,0xa19000f,0xa1b000f,0xa1d000f,0xa1f000f,0xa21000f,0xa23000f,0xa25000f,0xa27000f,0xa29000f,0xa2b000f,0xa2d000f, +0xa2f000f,0xa31000f,0xa33000f,0xa35000f,0xa37000f,0xa39000f,0xa3b000f,0xa3d000f,0xa3f000f,0xa41000f,0xa43000f,0xa45000f,0xa47000f,0xa49000f,0xa4b000f,0xa4d000f, +0xa4f000f,0xa51000f,0xa53000f,0xa55000f,0xa57000f,0xa59000f,0xa5b000f,0xa5d000f,0xa5f000f,0xa61000f,0xa63000f,0xa65000f,0xa67000f,0xa69000f,0xa6b000f,0xa6d000f, +0xa6f000f,0xa71000f,0xa73000f,0xa75000f,0xa77000f,0xa79000f,0xa7b000f,0xa7d000f,0xa80000f,0xa83000f,0xa86000f,0xa88000f,0xa8a000f,0xa8c000f,0xa8f000f,0xa92000f, +0xa95000f,0xa97000f,0,0,0,0,0,0,0x2dd9000a,0x2ddc000a,0x2ddf000a,0x2de2000a,0x2de6000a,0x2dea000a,0x2ded000a,0, +0,0,0,0,0,0,0,0,0,0,0,0x2df0000a,0x2df3000a,0x2df6000a,0x2df9000a,0x2dfc000a, +0,0,0,0,0,0xa99000f,0x1a00,0xa9d000f,0x2dff000a,0x2e01000a,0x2e03000a,0x2e05000a,0x2e07000a,0x2e09000a,0x2e0b000a,0x2e0d000a, +0x2e0f000a,0x2e11000a,0xaa1000f,0xaa5000f,0xaa9000f,0xaae000f,0xab3000f,0xab7000f,0xabb000f,0xabf000f,0xac3000f,0xac7000f,0xacb000f,0xacf000f,0xad3000f,0, +0xad7000f,0xadb000f,0xadf000f,0xae3000f,0xae7000f,0,0xaeb000f,0,0xaef000f,0xaf3000f,0,0xaf7000f,0xafb000f,0,0xaff000f,0xb03000f, +0xb07000f,0xb0b000f,0xb0f000f,0xb13000f,0xb17000f,0xb1b000f,0xb1f000f,0x2e13000a,0x2e16000a,0x2e18000a,0x2e1a000a,0x2e1c000a,0x2e1e000a,0x2e20000a,0x2e22000a,0x2e24000a, +0x2e26000a,0x2e28000a,0x2e2a000a,0x2e2c000a,0x2e2e000a,0x2e30000a,0x2e32000a,0x2e34000a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb23000f,0xb29000f,0xb2f000f,0xb37000f,0xb3f000f,0xb47000f,0xb4f000f,0xd800,0xd800,0x100, 0x100,0x100,0,0,0,0xe200,0xd800,0xd800,0xd800,0xd800,0xd800,0,0,0,0,0, 0,0,0,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0,0,0,0,0,0,0,0, 0,0,0xe600,0xe600,0xe600,0xe600,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb53000f,0xb59000f,0xb5f000f,0xb67000f,0xb6f000f,0xb77000f,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb7f000f,0xb81000f,0xb83000f,0xb85000f,0xb88000f,0xb8a000f,0xb8c000f,0xb8e000f, -0xb90000f,0xb92000f,0xb94000f,0xb96000f,0xb98000f,0xb9a000f,0xb9d000f,0xb9f000f,0xba1000f,0xba3000f,0xba5000f,0xba8000f,0xbaa000f,0xbac000f,0xbae000f,0xbb1000f, -0xbb3000f,0xbb5000f,0xbb7000f,0xbb9000f,0xbbb000f,0xbbe000f,0xbc0000f,0xbc2000f,0xbc4000f,0xbc6000f,0xbc8000f,0xbca000f,0xbcc000f,0xbce000f,0xbd0000f,0xbd2000f, -0xbd4000f,0xbd6000f,0xbd8000f,0xbda000f,0xbdc000f,0xbde000f,0xbe0000f,0xbe2000f,0xbe4000f,0xbe6000f,0xbe8000f,0xbea000f,0xbec000f,0xbef000f,0xbf1000f,0xbf3000f, -0xbf5000f,0xbf8000f,0xbfa000f,0xbfc000f,0xbfe000f,0xc00000f,0xc02000f,0xc04000f,0xc06000f,0xc08000f,0xc0a000f,0xc0c000f,0xc0e000f,0xc10000f,0xc12000f,0xc14000f, -0xc16000f,0xc18000f,0xc1a000f,0xc1c000f,0xc1e000f,0xc20000f,0xc22000f,0xc24000f,0xc26000f,0xc28000f,0xc2a000f,0xc2c000f,0xc2e000f,0xc30000f,0xc32000f,0xc34000f, -0xc36000f,0xc38000f,0xc3b000f,0xc3d000f,0xc3f000f,0xc41000f,0xc43000f,0xc45000f,0xc47000f,0xc4a000f,0xc4d000f,0xc4f000f,0xc51000f,0xc53000f,0xc55000f,0xc57000f, -0xc59000f,0xc5b000f,0xc5d000f,0xc5f000f,0xc61000f,0xc64000f,0xc66000f,0xc68000f,0xc6a000f,0xc6c000f,0xc6f000f,0xc71000f,0xc73000f,0xc75000f,0xc77000f,0xc79000f, -0xc7b000f,0xc7d000f,0xc7f000f,0xc81000f,0xc84000f,0xc86000f,0xc89000f,0xc8b000f,0xc8d000f,0xc8f000f,0xc91000f,0xc93000f,0xc95000f,0xc97000f,0xc99000f,0xc9b000f, -0xc9d000f,0xc9f000f,0xca2000f,0xca4000f,0xca6000f,0xca8000f,0xcaa000f,0xcac000f,0xcaf000f,0xcb1000f,0xcb4000f,0xcb7000f,0xcb9000f,0xcbb000f,0xcbd000f,0xcbf000f, -0xcc2000f,0xcc5000f,0xcc7000f,0xcc9000f,0xccb000f,0xccd000f,0xccf000f,0xcd1000f,0xcd3000f,0xcd5000f,0xcd7000f,0xcd9000f,0xcdb000f,0xcde000f,0xce0000f,0xce2000f, -0xce4000f,0xce6000f,0xce8000f,0xcea000f,0xcec000f,0xcee000f,0xcf0000f,0xcf2000f,0xcf4000f,0xcf6000f,0xcf8000f,0xcfa000f,0xcfc000f,0xcfe000f,0xd00000f,0xd02000f, -0xd04000f,0xd07000f,0xd09000f,0xd0b000f,0xd0d000f,0xd0f000f,0xd11000f,0xd14000f,0xd16000f,0xd18000f,0xd1a000f,0xd1c000f,0xd1e000f,0xd20000f,0xd22000f,0xd24000f, -0xd26000f,0xd28000f,0xd2a000f,0xd2d000f,0xd2f000f,0xd31000f,0xd33000f,0xd35000f,0xd37000f,0xd39000f,0xd3b000f,0xd3d000f,0xd3f000f,0xd41000f,0xd43000f,0xd45000f, -0xd47000f,0xd49000f,0xd4b000f,0xd4d000f,0xd4f000f,0xd51000f,0xd54000f,0xd56000f,0xd58000f,0xd5a000f,0xd5c000f,0xd5e000f,0xd61000f,0xd63000f,0xd65000f,0xd67000f, -0xd69000f,0xd6b000f,0xd6d000f,0xd6f000f,0xd71000f,0xd74000f,0xd76000f,0xd78000f,0xd7a000f,0xd7d000f,0xd7f000f,0xd81000f,0xd83000f,0xd85000f,0xd87000f,0xd89000f, -0xd8c000f,0xd8f000f,0xd92000f,0xd94000f,0xd97000f,0xd99000f,0xd9b000f,0xd9d000f,0xd9f000f,0xda1000f,0xda3000f,0xda5000f,0xda7000f,0xda9000f,0xdab000f,0xdae000f, -0xdb0000f,0xdb2000f,0xdb4000f,0xdb6000f,0xdb8000f,0xdba000f,0xdbd000f,0xdbf000f,0xdc1000f,0xdc4000f,0xdc7000f,0xdc9000f,0xdcb000f,0xdcd000f,0xdcf000f,0xdd1000f, -0xdd3000f,0xdd5000f,0xdd7000f,0xdd9000f,0xddc000f,0xdde000f,0xde1000f,0xde3000f,0xde6000f,0xde8000f,0xdea000f,0xdec000f,0xdef000f,0xdf1000f,0xdf3000f,0xdf6000f, -0xdf9000f,0xdfb000f,0xdfd000f,0xdff000f,0xe01000f,0xe03000f,0xe05000f,0xe07000f,0xe09000f,0xe0b000f,0xe0d000f,0xe0f000f,0xe11000f,0xe13000f,0xe16000f,0xe18000f, -0xe1b000f,0xe1d000f,0xe20000f,0xe22000f,0xe25000f,0xe28000f,0xe2b000f,0xe2d000f,0xe2f000f,0xe31000f,0xe34000f,0xe37000f,0xe3a000f,0xe3d000f,0xe3f000f,0xe41000f, -0xe43000f,0xe45000f,0xe47000f,0xe49000f,0xe4b000f,0xe4d000f,0xe50000f,0xe52000f,0xe54000f,0xe56000f,0xe58000f,0xe5b000f,0xe5d000f,0xe60000f,0xe63000f,0xe65000f, -0xe67000f,0xe69000f,0xe6b000f,0xe6d000f,0xe6f000f,0xe72000f,0xe75000f,0xe78000f,0xe7a000f,0xe7c000f,0xe7f000f,0xe81000f,0xe83000f,0xe85000f,0xe88000f,0xe8a000f, -0xe8c000f,0xe8e000f,0xe90000f,0xe92000f,0xe95000f,0xe97000f,0xe99000f,0xe9b000f,0xe9d000f,0xe9f000f,0xea1000f,0xea4000f,0xea7000f,0xea9000f,0xeac000f,0xeae000f, -0xeb1000f,0xeb3000f,0xeb5000f,0xeb7000f,0xeba000f,0xebd000f,0xebf000f,0xec2000f,0xec4000f,0xec7000f,0xec9000f,0xecb000f,0xecd000f,0xecf000f,0xed1000f,0xed3000f, -0xed6000f,0xed9000f,0xedc000f,0xedf000f,0xee1000f,0xee3000f,0xee5000f,0xee7000f,0xee9000f,0xeeb000f,0xeed000f,0xeef000f,0xef1000f,0xef3000f,0xef5000f,0xef7000f, -0xefa000f,0xefc000f,0xefe000f,0xf00000f,0xf02000f,0xf04000f,0xf06000f,0xf08000f,0xf0a000f,0xf0c000f,0xf0e000f,0xf10000f,0xf12000f,0xf15000f,0xf18000f,0xf1b000f, -0xf1d000f,0xf1f000f,0xf21000f,0xf23000f,0xf26000f,0xf28000f,0xf2b000f,0xf2d000f,0xf2f000f,0xf32000f,0xf35000f,0xf37000f,0xf39000f,0xf3b000f,0xf3d000f,0xf3f000f, -0xf41000f,0xf43000f,0xf45000f,0xf47000f,0xf49000f,0xf4b000f,0xf4d000f,0xf4f000f,0xf51000f,0xf53000f,0xf55000f,0xf57000f,0xf59000f,0xf5b000f,0xf5e000f,0xf60000f, -0xf62000f,0xf64000f,0xf66000f,0xf68000f,0xf6b000f,0xf6e000f,0xf70000f,0xf72000f,0xf74000f,0xf76000f,0xf78000f,0xf7a000f,0xf7d000f,0xf7f000f,0xf81000f,0xf83000f, -0xf85000f,0xf88000f,0xf8b000f,0xf8d000f,0xf8f000f,0xf91000f,0xf94000f,0xf96000f,0xf98000f,0xf9b000f,0xf9e000f,0xfa0000f,0xfa2000f,0xfa4000f,0xfa7000f,0xfa9000f, -0xfab000f,0xfad000f,0xfaf000f,0xfb1000f,0xfb3000f,0xfb5000f,0xfb8000f,0xfba000f,0xfbc000f,0xfbe000f,0xfc1000f,0xfc3000f,0xfc5000f,0xfc7000f,0xfc9000f,0xfcc000f, -0xfcf000f,0xfd1000f,0xfd3000f,0xfd5000f,0xfd8000f,0xfda000f,0xfdd000f,0xfdf000f,0xfe1000f,0xfe3000f,0xfe6000f,0xfe8000f,0xfea000f,0xfec000f,0xfee000f,0xff0000f, -0xff2000f,0xff4000f,0xff7000f,0xff9000f,0xffb000f,0xffd000f,0xfff000f,0x1001000f,0x1003000f,0x1006000f,0x1008000f,0x100b000f,0x100e000f,0x1011000f,0x1013000f,0x1015000f, -0x1017000f,0x1019000f,0x101b000f,0x101d000f,0x101f000f,0x1021000f,0,0,0x1024000c,0x1028000c,0x102d004c,0x1031000c,0x1036004c,0x103b004c,0x3d660040,0x1040004c, -0x1044000c,0x1048000c,0x104d004c,0x1051000c,0x1055000c,0x1059000c,0x105d000c,0x1062004c,0,0x1066000c,0x106a000c,0x106e000c,0x1073004c,0x1078004c,0x107d004c,0, -0x3d6a0040,0x1081000c,0x1085000c,0x1089000c,0x108e004c,0x1092000c,0,0,0x1096000c,0x109a000c,0x109f004c,0x10a3000c,0x10a8004c,0x10ad004c,0x3d670040,0x10b2004c, -0x10b6000c,0x10ba000c,0x10bf004c,0x10c3000c,0x10c7000c,0x10cb000c,0x10cf000c,0x10d4004c,0,0x10d8000c,0x10dc000c,0x10e0000c,0x10e5004c,0x10ea004c,0x10ef004c,0, -0x3d6b0040,0x10f3000c,0x10f7000c,0x10fb000c,0x1100004c,0x1104000c,0,0x1108000c,0x110c000c,0x1110000c,0x1115004c,0x111a004c,0x111e000c,0x1122000c,0x1126000c,0x112a000c, -0x112e000c,0x1132000c,0x1136000c,0x113a000c,0x113e000c,0x1142000c,0x1146000c,0x114a000c,0,0,0x114f004c,0x1154004c,0x1158000c,0x115c000c,0x1160000c,0x1164000c, -0x1168000c,0x116c000c,0x1170000c,0x1174000c,0x1178000c,0x117c000c,0x1180000c,0x1184000c,0x1188000c,0x118c000c,0x1190000c,0x1194000c,0x1198000c,0x119c000c,0,0, -0x11a0000c,0x11a4000c,0x11a8000c,0x11ac000c,0x11b0000c,0x11b4000c,0x11b8000c,0x11bc000c,0x11c0000c,0,0x2089000a,0x208c000a,0x11c4000c,0x11c8000c,0x11cc000c,0x11d0000c, -0,0x11d4000c,0x11d8000c,0x11dc000c,0x11e0000c,0x11e4000c,0x11e8000c,0x208f000a,0x2092000a,0,0,0x11ec000c,0x11f0000c,0x11f4000c,0x11f8000c,0x11fc000c, -0x1200000c,0x2095000a,0,0,0x1205004c,0x120a004c,0x120e000c,0x1212000c,0x1216000c,0x121a000c,0,0,0x121e000c,0x1222000c,0x1226000c,0x122a000c, -0x122e000c,0x1232000c,0x1237004c,0x123c004c,0x1240000c,0x1244000c,0x1248000c,0x124c000c,0x1251004c,0x1256004c,0x125a000c,0x125e000c,0x1262000c,0x1266000c,0,0, -0x126b004c,0x1270004c,0x1275004c,0x127a004c,0x127e000c,0x1282000c,0x1286000c,0x128a000c,0x128e000c,0x1292000c,0x1296000c,0x129a000c,0x129e000c,0x12a2000c,0x12a6000c,0x12aa000c, -0x12ae000c,0x12b2000c,0x12b6000c,0x12ba000c,0x12be000c,0x12c2000c,0x12c6000c,0x2099004a,0x12cb004c,0x12d0004c,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x12d5004c,0x12da004c,0,0,0,0,0,0,0x3d680040, -0,0,0,0,0,0,0,0,0x209b000a,0x20a0000a,0x20a5000a,0x20aa000a,0x20ad000a,0x20b0000a,0x20b3000a,0x20b6000a, -0x20b9000a,0x12de000c,0x12e2000c,0x12e6000c,0x12ea000c,0x12ee000c,0x12f2000c,0x12f6000c,0x12fa000c,0x12fe000c,0x1303000c,0x1308000c,0x130d000c,0x1312000c,0x1317000c,0x131c000c, -0x1321000c,0,0x1326000c,0x132b000c,0x1330000c,0x1335000c,0x133a000c,0x133e000c,0,0,0x1342000c,0x1346000c,0x134a000c,0x134e000c,0x1353004c,0x1358004c, -0x135c000c,0x1361000c,0x1366000c,0x136a000c,0x136e000c,0x20bc000a,0x20bf000a,0x20c2000a,0x1372000c,0x1376000c,0,0,0x137a000c,0x137e000c,0x1382000c,0x1387000c, -0x138c000c,0x1390000c,0x1394000c,0x1398000c,0x139c000c,0x13a0000c,0x13a4000c,0x13a8000c,0x13ac000c,0x13b0000c,0x13b4000c,0x13b8000c,0x13bc000c,0x13c0000c,0x13c4000c,0x13c8000c, -0x13cc000c,0x13d0000c,0x13d4000c,0x13d8000c,0x13dc000c,0x13e0000c,0x13e4000c,0x13e8000c,0x13ec000c,0x13f0000c,0x13f4000c,0x13f8000c,0x13fc000c,0x1400000c,0x1404000c,0x1408000c, -0,0,0x140c000c,0x1410000c,0,0,0,0,0,0,0x1415004c,0x141a004c,0x141f004c,0x1424004c,0x1428000c,0x142d000c, -0x1432000c,0x1437000c,0x143d004c,0x1442004c,0x1446000c,0x144b000c,0x1450000c,0x1454000c,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x3dbc0040,0,0,0,0x3d710040,0,0,0,0x3d720040,0x1481000c,0x1485000c, -0x148a004c,0x148e000c,0x1493004c,0x1497000c,0x149b000c,0x3d730040,0,0,0,0x3d740040,0,0x3d750040,0,0x3d760040,0,0, -0,0,0,0x3d780040,0x14b7000c,0x14bb000c,0,0x14bf000c,0,0,0x3d7c0040,0x14c3000c,0,0,0,0, -0x14c7000c,0x14cb000c,0x14cf000c,0,0x3d8a0040,0,0,0x3d7b0040,0,0x3d7a0040,0x3d880040,0x3d8e0040,0x3d7e0040,0x14d3000c,0x3d7d0040,0, -0,0,0x3d900040,0,0,0,0,0x3d7f0040,0,0,0,0x3d960040,0,0,0,0x3d980040, -0,0x3d940040,0,0,0x3d8b0040,0,0,0x3d820040,0,0x3d810040,0x3d890040,0x3d8f0040,0x3d800040,0x14d7000c,0x3d840040,0, -0,0,0x3d910040,0,0,0,0,0x3d850040,0,0,0,0x3d970040,0,0,0,0x3d990040, -0,0x3d950040,0,0,0x14db000c,0x14df000c,0,0x14e3000c,0,0,0x3d830040,0x14e7000c,0,0,0,0, -0x14eb000c,0x14ef000c,0x14f3000c,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3d860040,0x3d870040,0x14f7000c,0x14fb000c,0,0,0,0, -0,0,0,0,0,0x14ff000c,0x1503000c,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1507000c,0x150b000c,0x150f000c,0x1513000c,0,0,0x1517000c,0x151b000c,0x3d8c0040,0x3d8d0040,0x151f000c,0x1523000c, -0x1527000c,0x152b000c,0x152f000c,0x1533000c,0,0,0x1537000c,0x153b000c,0x153f000c,0x1543000c,0x1547000c,0x154b000c,0x3d920040,0x3d930040,0x154f000c,0x1553000c, -0x1557000c,0x155b000c,0x155f000c,0x1563000c,0x1567000c,0x156b000c,0x156f000c,0x1573000c,0x1577000c,0x157b000c,0,0,0x157f000c,0x1583000c,0,0, -0,0,0,0,0,0,0x1587000c,0x158b000c,0x158f000c,0x1593000c,0x1597000c,0x3d9a0040,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x159b000c,0x3d9e0040,0x159f000c,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x3d9f0040,0x15a3000c,0,0x3d9d0040,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600, -0xe600,0,0,0xe600,0,0,0,0,0,0,0,0,0x3da00040,0x15a7000c,0,0, -0,0,0,0,0x3da10040,0x15ab000c,0,0x3da20040,0x15af000c,0,0,0,0,0,0,0, -0x204b07b0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x3da50040,0,0x15c2000c,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x3da60040,0x3da70040,0,0,0x15c5000c,0x15c8000c,0x15cb000c,0x900,0,0, -0,0,0,0,0,0,0,0x205200b0,0,0,0,0,0,0,0,0, -0,0,0x3da80040,0,0x15ce000c,0,0,0,0,0x900,0,0,0,0,0,0, -0,0x5400,0x20535bb0,0,0,0,0,0,0,0,0,0,0x15d2000c,0,0x205400b0,0, -0,0,0x3daa0040,0x15d5000c,0x15d8000c,0,0x15dc004c,0x15df000c,0,0x900,0,0,0,0,0,0, -0,0x205500b0,0x205600b0,0,0,0,0,0,0,0,0,0,0,0,0x3dab0040,0x3dac0040, -0,0,0x15e3000c,0x15e6000c,0x15e9000c,0x900,0,0,0,0,0,0,0,0,0,0x205800b0, -0,0,0,0,0,0,0,0,0,0,0x205909b0,0,0,0,0,0x205a00b0, -0,0,0,0,0,0,0,0,0,0x3dad0040,0x15ec000c,0,0x15f1004c,0x15f4000c,0x15f9000c,0x205b00b0, -0,0,0,0,0,0x3dae0040,0x15fc000c,0,0,0,0,0,0,0,0x205c00b0,0, +0,0,0,0xb57000f,0xb5d000f,0xb63000f,0xb6b000f,0xb73000f,0xb7b000f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb83000f,0xb85000f,0xb87000f,0xb89000f,0xb8c000f,0xb8e000f,0xb90000f,0xb92000f, +0xb94000f,0xb96000f,0xb98000f,0xb9a000f,0xb9c000f,0xb9e000f,0xba1000f,0xba3000f,0xba5000f,0xba7000f,0xba9000f,0xbac000f,0xbae000f,0xbb0000f,0xbb2000f,0xbb5000f, +0xbb7000f,0xbb9000f,0xbbb000f,0xbbd000f,0xbbf000f,0xbc2000f,0xbc4000f,0xbc6000f,0xbc8000f,0xbca000f,0xbcc000f,0xbce000f,0xbd0000f,0xbd2000f,0xbd4000f,0xbd6000f, +0xbd8000f,0xbda000f,0xbdc000f,0xbde000f,0xbe0000f,0xbe2000f,0xbe4000f,0xbe6000f,0xbe8000f,0xbea000f,0xbec000f,0xbee000f,0xbf0000f,0xbf3000f,0xbf5000f,0xbf7000f, +0xbf9000f,0xbfc000f,0xbfe000f,0xc00000f,0xc02000f,0xc04000f,0xc06000f,0xc08000f,0xc0a000f,0xc0c000f,0xc0e000f,0xc10000f,0xc12000f,0xc14000f,0xc16000f,0xc18000f, +0xc1a000f,0xc1c000f,0xc1e000f,0xc20000f,0xc22000f,0xc24000f,0xc26000f,0xc28000f,0xc2a000f,0xc2c000f,0xc2e000f,0xc30000f,0xc32000f,0xc34000f,0xc36000f,0xc38000f, +0xc3a000f,0xc3c000f,0xc3f000f,0xc41000f,0xc43000f,0xc45000f,0xc47000f,0xc49000f,0xc4b000f,0xc4e000f,0xc51000f,0xc53000f,0xc55000f,0xc57000f,0xc59000f,0xc5b000f, +0xc5d000f,0xc5f000f,0xc61000f,0xc63000f,0xc65000f,0xc68000f,0xc6a000f,0xc6c000f,0xc6e000f,0xc70000f,0xc73000f,0xc75000f,0xc77000f,0xc79000f,0xc7b000f,0xc7d000f, +0xc7f000f,0xc81000f,0xc83000f,0xc85000f,0xc88000f,0xc8a000f,0xc8d000f,0xc8f000f,0xc91000f,0xc93000f,0xc95000f,0xc97000f,0xc99000f,0xc9b000f,0xc9d000f,0xc9f000f, +0xca1000f,0xca3000f,0xca6000f,0xca8000f,0xcaa000f,0xcac000f,0xcae000f,0xcb0000f,0xcb3000f,0xcb5000f,0xcb8000f,0xcbb000f,0xcbd000f,0xcbf000f,0xcc1000f,0xcc3000f, +0xcc6000f,0xcc9000f,0xccb000f,0xccd000f,0xccf000f,0xcd1000f,0xcd3000f,0xcd5000f,0xcd7000f,0xcd9000f,0xcdb000f,0xcdd000f,0xcdf000f,0xce2000f,0xce4000f,0xce6000f, +0xce8000f,0xcea000f,0xcec000f,0xcee000f,0xcf0000f,0xcf2000f,0xcf4000f,0xcf6000f,0xcf8000f,0xcfa000f,0xcfc000f,0xcfe000f,0xd00000f,0xd02000f,0xd04000f,0xd06000f, +0xd08000f,0xd0b000f,0xd0d000f,0xd0f000f,0xd11000f,0xd13000f,0xd15000f,0xd18000f,0xd1a000f,0xd1c000f,0xd1e000f,0xd20000f,0xd22000f,0xd24000f,0xd26000f,0xd28000f, +0xd2a000f,0xd2c000f,0xd2e000f,0xd31000f,0xd33000f,0xd35000f,0xd37000f,0xd39000f,0xd3b000f,0xd3d000f,0xd3f000f,0xd41000f,0xd43000f,0xd45000f,0xd47000f,0xd49000f, +0xd4b000f,0xd4d000f,0xd4f000f,0xd51000f,0xd53000f,0xd55000f,0xd58000f,0xd5a000f,0xd5c000f,0xd5e000f,0xd60000f,0xd62000f,0xd65000f,0xd67000f,0xd69000f,0xd6b000f, +0xd6d000f,0xd6f000f,0xd71000f,0xd73000f,0xd75000f,0xd78000f,0xd7a000f,0xd7c000f,0xd7e000f,0xd81000f,0xd83000f,0xd85000f,0xd87000f,0xd89000f,0xd8b000f,0xd8d000f, +0xd90000f,0xd93000f,0xd96000f,0xd98000f,0xd9b000f,0xd9d000f,0xd9f000f,0xda1000f,0xda3000f,0xda5000f,0xda7000f,0xda9000f,0xdab000f,0xdad000f,0xdaf000f,0xdb2000f, +0xdb4000f,0xdb6000f,0xdb8000f,0xdba000f,0xdbc000f,0xdbe000f,0xdc1000f,0xdc3000f,0xdc5000f,0xdc8000f,0xdcb000f,0xdcd000f,0xdcf000f,0xdd1000f,0xdd3000f,0xdd5000f, +0xdd7000f,0xdd9000f,0xddb000f,0xddd000f,0xde0000f,0xde2000f,0xde5000f,0xde7000f,0xdea000f,0xdec000f,0xdee000f,0xdf0000f,0xdf3000f,0xdf5000f,0xdf7000f,0xdfa000f, +0xdfd000f,0xdff000f,0xe01000f,0xe03000f,0xe05000f,0xe07000f,0xe09000f,0xe0b000f,0xe0d000f,0xe0f000f,0xe11000f,0xe13000f,0xe15000f,0xe17000f,0xe1a000f,0xe1c000f, +0xe1f000f,0xe21000f,0xe24000f,0xe26000f,0xe29000f,0xe2c000f,0xe2f000f,0xe31000f,0xe33000f,0xe35000f,0xe38000f,0xe3b000f,0xe3e000f,0xe41000f,0xe43000f,0xe45000f, +0xe47000f,0xe49000f,0xe4b000f,0xe4d000f,0xe4f000f,0xe51000f,0xe54000f,0xe56000f,0xe58000f,0xe5a000f,0xe5c000f,0xe5f000f,0xe61000f,0xe64000f,0xe67000f,0xe69000f, +0xe6b000f,0xe6d000f,0xe6f000f,0xe71000f,0xe73000f,0xe76000f,0xe79000f,0xe7c000f,0xe7e000f,0xe80000f,0xe83000f,0xe85000f,0xe87000f,0xe89000f,0xe8c000f,0xe8e000f, +0xe90000f,0xe92000f,0xe94000f,0xe96000f,0xe99000f,0xe9b000f,0xe9d000f,0xe9f000f,0xea1000f,0xea3000f,0xea5000f,0xea8000f,0xeab000f,0xead000f,0xeb0000f,0xeb2000f, +0xeb5000f,0xeb7000f,0xeb9000f,0xebb000f,0xebe000f,0xec1000f,0xec3000f,0xec6000f,0xec8000f,0xecb000f,0xecd000f,0xecf000f,0xed1000f,0xed3000f,0xed5000f,0xed7000f, +0xeda000f,0xedd000f,0xee0000f,0xee3000f,0xee5000f,0xee7000f,0xee9000f,0xeeb000f,0xeed000f,0xeef000f,0xef1000f,0xef3000f,0xef5000f,0xef7000f,0xef9000f,0xefb000f, +0xefe000f,0xf00000f,0xf02000f,0xf04000f,0xf06000f,0xf08000f,0xf0a000f,0xf0c000f,0xf0e000f,0xf10000f,0xf12000f,0xf14000f,0xf16000f,0xf19000f,0xf1c000f,0xf1f000f, +0xf21000f,0xf23000f,0xf25000f,0xf27000f,0xf2a000f,0xf2c000f,0xf2f000f,0xf31000f,0xf33000f,0xf36000f,0xf39000f,0xf3b000f,0xf3d000f,0xf3f000f,0xf41000f,0xf43000f, +0xf45000f,0xf47000f,0xf49000f,0xf4b000f,0xf4d000f,0xf4f000f,0xf51000f,0xf53000f,0xf55000f,0xf57000f,0xf59000f,0xf5b000f,0xf5d000f,0xf5f000f,0xf62000f,0xf64000f, +0xf66000f,0xf68000f,0xf6a000f,0xf6c000f,0xf6f000f,0xf72000f,0xf74000f,0xf76000f,0xf78000f,0xf7a000f,0xf7c000f,0xf7e000f,0xf81000f,0xf83000f,0xf85000f,0xf87000f, +0xf89000f,0xf8c000f,0xf8f000f,0xf91000f,0xf93000f,0xf95000f,0xf98000f,0xf9a000f,0xf9c000f,0xf9f000f,0xfa2000f,0xfa4000f,0xfa6000f,0xfa8000f,0xfab000f,0xfad000f, +0xfaf000f,0xfb1000f,0xfb3000f,0xfb5000f,0xfb7000f,0xfb9000f,0xfbc000f,0xfbe000f,0xfc0000f,0xfc2000f,0xfc5000f,0xfc7000f,0xfc9000f,0xfcb000f,0xfcd000f,0xfd0000f, +0xfd3000f,0xfd5000f,0xfd7000f,0xfd9000f,0xfdc000f,0xfde000f,0xfe1000f,0xfe3000f,0xfe5000f,0xfe7000f,0xfea000f,0xfec000f,0xfee000f,0xff0000f,0xff2000f,0xff4000f, +0xff6000f,0xff8000f,0xffb000f,0xffd000f,0xfff000f,0x1001000f,0x1003000f,0x1005000f,0x1007000f,0x100a000f,0x100c000f,0x100f000f,0x1012000f,0x1015000f,0x1017000f,0x1019000f, +0x101b000f,0x101d000f,0x101f000f,0x1021000f,0x1023000f,0x1025000f,0,0,0x1028000c,0x102c000c,0x1031004c,0x1035000c,0x103a004c,0x103f004c,0x3d8e0040,0x1044004c, +0x1048000c,0x104c000c,0x1051004c,0x1055000c,0x1059000c,0x105d000c,0x1061000c,0x1066004c,0,0x106a000c,0x106e000c,0x1072000c,0x1077004c,0x107c004c,0x1081004c,0, +0x3d920040,0x1085000c,0x1089000c,0x108d000c,0x1092004c,0x1096000c,0,0,0x109a000c,0x109e000c,0x10a3004c,0x10a7000c,0x10ac004c,0x10b1004c,0x3d8f0040,0x10b6004c, +0x10ba000c,0x10be000c,0x10c3004c,0x10c7000c,0x10cb000c,0x10cf000c,0x10d3000c,0x10d8004c,0,0x10dc000c,0x10e0000c,0x10e4000c,0x10e9004c,0x10ee004c,0x10f3004c,0, +0x3d930040,0x10f7000c,0x10fb000c,0x10ff000c,0x1104004c,0x1108000c,0,0x110c000c,0x1110000c,0x1114000c,0x1119004c,0x111e004c,0x1122000c,0x1126000c,0x112a000c,0x112e000c, +0x1132000c,0x1136000c,0x113a000c,0x113e000c,0x1142000c,0x1146000c,0x114a000c,0x114e000c,0,0,0x1153004c,0x1158004c,0x115c000c,0x1160000c,0x1164000c,0x1168000c, +0x116c000c,0x1170000c,0x1174000c,0x1178000c,0x117c000c,0x1180000c,0x1184000c,0x1188000c,0x118c000c,0x1190000c,0x1194000c,0x1198000c,0x119c000c,0x11a0000c,0,0, +0x11a4000c,0x11a8000c,0x11ac000c,0x11b0000c,0x11b4000c,0x11b8000c,0x11bc000c,0x11c0000c,0x11c4000c,0,0x20af000a,0x20b2000a,0x11c8000c,0x11cc000c,0x11d0000c,0x11d4000c, +0,0x11d8000c,0x11dc000c,0x11e0000c,0x11e4000c,0x11e8000c,0x11ec000c,0x20b5000a,0x20b8000a,0,0,0x11f0000c,0x11f4000c,0x11f8000c,0x11fc000c,0x1200000c, +0x1204000c,0x20bb000a,0,0,0x1209004c,0x120e004c,0x1212000c,0x1216000c,0x121a000c,0x121e000c,0,0,0x1222000c,0x1226000c,0x122a000c,0x122e000c, +0x1232000c,0x1236000c,0x123b004c,0x1240004c,0x1244000c,0x1248000c,0x124c000c,0x1250000c,0x1255004c,0x125a004c,0x125e000c,0x1262000c,0x1266000c,0x126a000c,0,0, +0x126f004c,0x1274004c,0x1279004c,0x127e004c,0x1282000c,0x1286000c,0x128a000c,0x128e000c,0x1292000c,0x1296000c,0x129a000c,0x129e000c,0x12a2000c,0x12a6000c,0x12aa000c,0x12ae000c, +0x12b2000c,0x12b6000c,0x12ba000c,0x12be000c,0x12c2000c,0x12c6000c,0x12ca000c,0x20bf004a,0x12cf004c,0x12d4004c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x12d9004c,0x12de004c,0,0,0,0,0,0,0x3d900040, +0,0,0,0,0,0,0,0,0x20c1000a,0x20c6000a,0x20cb000a,0x20d0000a,0x20d3000a,0x20d6000a,0x20d9000a,0x20dc000a, +0x20df000a,0x12e2000c,0x12e6000c,0x12ea000c,0x12ee000c,0x12f2000c,0x12f6000c,0x12fa000c,0x12fe000c,0x1302000c,0x1307000c,0x130c000c,0x1311000c,0x1316000c,0x131b000c,0x1320000c, +0x1325000c,0,0x132a000c,0x132f000c,0x1334000c,0x1339000c,0x133e000c,0x1342000c,0,0,0x1346000c,0x134a000c,0x134e000c,0x1352000c,0x1357004c,0x135c004c, +0x1360000c,0x1365000c,0x136a000c,0x136e000c,0x1372000c,0x20e2000a,0x20e5000a,0x20e8000a,0x1376000c,0x137a000c,0,0,0x137e000c,0x1382000c,0x1386000c,0x138b000c, +0x1390000c,0x1394000c,0x1398000c,0x139c000c,0x13a0000c,0x13a4000c,0x13a8000c,0x13ac000c,0x13b0000c,0x13b4000c,0x13b8000c,0x13bc000c,0x13c0000c,0x13c4000c,0x13c8000c,0x13cc000c, +0x13d0000c,0x13d4000c,0x13d8000c,0x13dc000c,0x13e0000c,0x13e4000c,0x13e8000c,0x13ec000c,0x13f0000c,0x13f4000c,0x13f8000c,0x13fc000c,0x1400000c,0x1404000c,0x1408000c,0x140c000c, +0,0,0x1410000c,0x1414000c,0,0,0,0,0,0,0x1419004c,0x141e004c,0x1423004c,0x1428004c,0x142c000c,0x1431000c, +0x1436000c,0x143b000c,0x1441004c,0x1446004c,0x144a000c,0x144f000c,0x1454000c,0x1458000c,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x3def0040,0,0,0,0x3d990040,0,0,0,0x3d9a0040,0x1485000c,0x1489000c, +0x148e004c,0x1492000c,0x1497004c,0x149b000c,0x149f000c,0x3d9b0040,0,0,0,0x3d9c0040,0,0x3d9d0040,0,0x3d9e0040,0,0, +0,0,0,0x3da00040,0x14bb000c,0x14bf000c,0,0x14c3000c,0,0,0x3da40040,0x14c7000c,0,0,0,0, +0x14cb000c,0x14cf000c,0x14d3000c,0,0x3db20040,0,0,0x3da30040,0,0x3da20040,0x3db00040,0x3db60040,0x3da60040,0x14d7000c,0x3da50040,0, +0,0,0x3db80040,0,0,0,0,0x3da70040,0,0,0,0x3dbe0040,0,0,0,0x3dc00040, +0,0x3dbc0040,0,0,0x3db30040,0,0,0x3daa0040,0,0x3da90040,0x3db10040,0x3db70040,0x3da80040,0x14db000c,0x3dac0040,0, +0,0,0x3db90040,0,0,0,0,0x3dad0040,0,0,0,0x3dbf0040,0,0,0,0x3dc10040, +0,0x3dbd0040,0,0,0x14df000c,0x14e3000c,0,0x14e7000c,0,0,0x3dab0040,0x14eb000c,0,0,0,0, +0x14ef000c,0x14f3000c,0x14f7000c,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3dae0040,0x3daf0040,0x14fb000c,0x14ff000c,0,0,0,0, +0,0,0,0,0,0x1503000c,0x1507000c,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x150b000c,0x150f000c,0x1513000c,0x1517000c,0,0,0x151b000c,0x151f000c,0x3db40040,0x3db50040,0x1523000c,0x1527000c, +0x152b000c,0x152f000c,0x1533000c,0x1537000c,0,0,0x153b000c,0x153f000c,0x1543000c,0x1547000c,0x154b000c,0x154f000c,0x3dba0040,0x3dbb0040,0x1553000c,0x1557000c, +0x155b000c,0x155f000c,0x1563000c,0x1567000c,0x156b000c,0x156f000c,0x1573000c,0x1577000c,0x157b000c,0x157f000c,0,0,0x1583000c,0x1587000c,0,0, +0,0,0,0,0,0,0x158b000c,0x158f000c,0x1593000c,0x1597000c,0x159b000c,0x3dc20040,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x159f000c,0x3dc60040,0x15a3000c,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x3dc70040,0x15a7000c,0,0x3dc50040,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600, +0xe600,0,0,0xe600,0,0,0,0,0,0,0,0,0x3dc80040,0x15ab000c,0,0, +0,0,0,0,0x3dc90040,0x15af000c,0,0x3dca0040,0x15b3000c,0,0,0,0,0,0,0, +0x207007b0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x3dcd0040,0,0x15c6000c,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x3dce0040,0x3dcf0040,0,0,0x15c9000c,0x15cc000c,0x15cf000c,0x900,0,0, +0,0,0,0,0,0,0,0x207700b0,0,0,0,0,0,0,0,0, +0,0,0x3dd00040,0,0x15d2000c,0,0,0,0,0x900,0,0,0,0,0,0, +0,0x5400,0x20785bb0,0,0,0,0,0,0,0,0,0,0x15d6000c,0,0x207900b0,0, +0,0,0x3dd20040,0x15d9000c,0x15dc000c,0,0x15e0004c,0x15e3000c,0,0x900,0,0,0,0,0,0, +0,0x207a00b0,0x207b00b0,0,0,0,0,0,0,0,0,0,0,0,0x3dd30040,0x3dd40040, +0,0,0x15e7000c,0x15ea000c,0x15ed000c,0x900,0,0,0,0,0,0,0,0,0,0x207d00b0, +0,0,0,0,0,0,0,0,0,0,0x207e09b0,0,0,0,0,0x207f00b0, +0,0,0,0,0,0,0,0,0,0x3dd50040,0x15f0000c,0,0x15f5004c,0x15f8000c,0x15fd000c,0x208000b0, +0,0,0,0,0,0x3dd60040,0x1600000c,0,0,0,0,0,0,0,0x208100b0,0, 0,0,0,0,0,0,0,0x700,0,0x900,0,0,0,0,0,0, -0x15ff000c,0x1603000c,0x1607000c,0x160b000c,0x160f000c,0x1613000c,0x1617000c,0x161b000c,0x161f000c,0x1624000c,0x1629000c,0x162d000c,0x1631000c,0x1635000c,0x1639000c,0x163d000c, -0x1641000c,0x1645000c,0x1649000c,0x164d000c,0x1651000c,0x1656000c,0x165b000c,0x1660000c,0x1665000c,0x1669000c,0x166d000c,0x1671000c,0x1675000c,0x167a000c,0x167f000c,0x1683000c, -0x1687000c,0x168b000c,0x168f000c,0x1693000c,0x1697000c,0x169b000c,0x169f000c,0x16a3000c,0x16a7000c,0x16ab000c,0x16af000c,0x16b3000c,0x16b7000c,0x16bb000c,0x16bf000c,0x16c4000c, -0x16c9000c,0x16cd000c,0x16d1000c,0x16d5000c,0x16d9000c,0x16dd000c,0x16e2004c,0x16e7004c,0x16eb000c,0x16f0000c,0x16f5000c,0x16f9000c,0x16fd000c,0x1701000c,0x1705000c,0x1709000c, -0x170d000c,0x1711000c,0x1715000c,0x1719000c,0x171d000c,0x1721000c,0x1725000c,0x1729000c,0x172d000c,0x1731000c,0x1735000c,0x1739000c,0x173d000c,0x1742000c,0x1747000c,0x174c000c, -0x1751000c,0x1756000c,0x175b000c,0x1760000c,0x1765000c,0x1769000c,0x176d000c,0x1771000c,0x1775000c,0x1779000c,0x177e004c,0x1783004c,0x1787000c,0x178c000c,0x1791000c,0x1795000c, -0x1799000c,0x179d000c,0x17a2004c,0x17a7004c,0x17ab000c,0x17b0000c,0x17b5000c,0x17ba000c,0x17bf000c,0x17c4000c,0x17c9000c,0x17cd000c,0x17d1000c,0x17d5000c,0x17d9000c,0x17dd000c, -0x17e1000c,0x17e5000c,0x17e9000c,0x17ed000c,0x17f1000c,0x17f5000c,0x17f9000c,0x17fd000c,0x1801000c,0x1806000c,0x180b000c,0x1810000c,0x1815000c,0x1819000c,0x181d000c,0x1821000c, -0x1825000c,0x1829000c,0x182d000c,0x1831000c,0x1835000c,0x1839000c,0x183d000c,0x1841000c,0x1845000c,0x1849000c,0x184d000c,0x1851000c,0x1855000c,0x1859000c,0x185d000c,0x1861000c, -0x1865000c,0x1869000c,0x186d000c,0x1871000c,0x1875000c,0x1879000c,0x187d000c,0x1881000c,0x1885000c,0x1889000c,0x21d0000a,0x188d000e,0,0,0,0, -0x1895004c,0x189a004c,0x189e000c,0x18a2000c,0x18a6000c,0x18ab000c,0x18b0000c,0x18b5000c,0x18ba000c,0x18bf000c,0x18c4000c,0x18c9000c,0x18ce000c,0x18d3000c,0x18d8000c,0x18dd000c, -0x18e2000c,0x18e7000c,0x18ec000c,0x18f1000c,0x18f6000c,0x18fb000c,0x1900000c,0x1905000c,0x190b004c,0x1910004c,0x1914000c,0x1918000c,0x191c000c,0x1920000c,0x1924000c,0x1929000c, -0x192e000c,0x1933000c,0x1938000c,0x193d000c,0x1942000c,0x1947000c,0x194c000c,0x1951000c,0x1956000c,0x195a000c,0x195e000c,0x1962000c,0x1967004c,0x196c004c,0x1970000c,0x1974000c, -0x1978000c,0x197d000c,0x1982000c,0x1987000c,0x198c000c,0x1991000c,0x1996000c,0x199b000c,0x19a0000c,0x19a5000c,0x19aa000c,0x19af000c,0x19b4000c,0x19b9000c,0x19be000c,0x19c3000c, -0x19c8000c,0x19cd000c,0x19d2000c,0x19d7000c,0x19dc000c,0x19e0000c,0x19e4000c,0x19e8000c,0x19ec000c,0x19f1000c,0x19f6000c,0x19fb000c,0x1a00000c,0x1a05000c,0x1a0a000c,0x1a0f000c, -0x1a14000c,0x1a19000c,0x1a1e000c,0x1a22000c,0x1a26000c,0x1a2a000c,0x1a2e000c,0x1a32000c,0x1a36000c,0x1a3a000c,0,0,0,0,0,0, -0x1a3f004c,0x1a44004c,0x1a49004c,0x1a4f004c,0x1a55004c,0x1a5b004c,0x1a61004c,0x1a67004c,0x1a6d004c,0x1a72004c,0x1a77004c,0x1a7d004c,0x1a83004c,0x1a89004c,0x1a8f004c,0x1a95004c, -0x1a9b004c,0x1aa0004c,0x1aa4000c,0x1aa9000c,0x1aae000c,0x1ab3000c,0,0,0x1ab9004c,0x1abe004c,0x1ac2000c,0x1ac7000c,0x1acc000c,0x1ad1000c,0,0, -0x1ad7004c,0x1adc004c,0x1ae1004c,0x1ae7004c,0x1aed004c,0x1af3004c,0x1af9004c,0x1aff004c,0x1b05004c,0x1b0a004c,0x1b0f004c,0x1b15004c,0x1b1b004c,0x1b21004c,0x1b27004c,0x1b2d004c, -0x1b33004c,0x1b38004c,0x1b3c000c,0x1b41000c,0x1b46000c,0x1b4b000c,0x1b50000c,0x1b55000c,0x1b5b004c,0x1b60004c,0x1b64000c,0x1b69000c,0x1b6e000c,0x1b73000c,0x1b78000c,0x1b7d000c, -0x1b83004c,0x1b88004c,0x1b8c000c,0x1b91000c,0x1b96000c,0x1b9b000c,0,0,0x1ba1004c,0x1ba6004c,0x1baa000c,0x1baf000c,0x1bb4000c,0x1bb9000c,0,0, -0x1bbf004c,0x1bc4004c,0x1bc8000c,0x1bcd000c,0x1bd2000c,0x1bd7000c,0x1bdc000c,0x1be1000c,0,0x1be7004c,0,0x1beb000c,0,0x1bf0000c,0,0x1bf5000c, -0x1c75000c,0x1c7a000c,0x1c7f000c,0x1c85000c,0x1c8b000c,0x1c91000c,0x1c97000c,0x1c9d000c,0x1ca3000c,0x1ca8000c,0x1cad000c,0x1cb3000c,0x1cb9000c,0x1cbf000c,0x1cc5000c,0x1ccb000c, -0x1cd1000c,0x1cd6000c,0x1cdb000c,0x1ce1000c,0x1ce7000c,0x1ced000c,0x1cf3000c,0x1cf9000c,0x1cff000c,0x1d04000c,0x1d09000c,0x1d0f000c,0x1d15000c,0x1d1b000c,0x1d21000c,0x1d27000c, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x3dbd0040,0,0x3dbe0040,0,0x3dbf0040,0,0,0,0,0,0x1e91000c,0x1e95000c,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x1e99000c,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e9d000c,0x1ea1000c,0x1ea5000c, -0x3dc00040,0,0x3dc20040,0,0x3dc10040,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x3dc30040,0x1ea9000c,0,0,0,0x3dc40040,0x1ead000c,0,0x3dc50040,0x1eb1000c,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x3dc60040,0x1eb5000c,0x3dc70040,0x1eb9000c,0,0,0,0,0,0x2334000a,0x2337000a,0,0x233b000a, -0x233e000a,0,0,0,0,0,0,0,0,0,0,0,0x3dc80040,0,0,0, -0,0x1ebd000c,0,0x3dc90040,0x1ec1000c,0x3dca0040,0,0x1ec5000c,0x3dcb0040,0x1ec9000c,0,0,0,0x3dce0040,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1ecd000c,0x3dcd0040,0x1ed1000c,0,0x3dd10040,0x3dd20040,0,0,0,0,0,0,0,0x1ed5000c,0x1ed9000c,0x1edd000c, -0x1ee1000c,0x1ee5000c,0x3dd30040,0x3dd40040,0x1ee9000c,0x1eed000c,0x3dd50040,0x3dd60040,0x1ef1000c,0x1ef5000c,0x3dd70040,0x3dd80040,0x3de10040,0x3de20040,0,0, -0x1ef9000c,0x1efd000c,0x3dd90040,0x3dda0040,0x1f01000c,0x1f05000c,0x3ddb0040,0x3ddc0040,0x1f09000c,0x1f0d000c,0,0,0,0,0,0, -0,0x3de30040,0x3de40040,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x3ddd0040,0,0,0,0,0,0x3dde0040,0x3ddf0040,0,0x3de00040,0x1f11000c,0x1f15000c,0x1f19000c,0x1f1d000c, -0,0,0x3de50040,0x3de60040,0x3de70040,0x3de80040,0,0,0,0,0,0,0,0,0,0, -0x1f21000c,0x1f25000c,0x1f29000c,0x1f2d000c,0,0,0,0,0,0,0x1f31000c,0x1f35000c,0x1f39000c,0x1f3d000c,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x3dfd0040,0,0,0,0,0x3de90040,0x1f41000c,0x3dea0040,0x1f45000c,0x3deb0040,0x1f49000c,0x3dec0040,0x1f4d000c,0x3ded0040, -0x1f51000c,0x3dee0040,0x1f55000c,0x3def0040,0x1f59000c,0x3df00040,0x1f5d000c,0x3df10040,0x1f61000c,0x3df20040,0x1f65000c,0x3df30040,0x1f69000c,0x3df40040,0x1f6d000c,0, -0x3df50040,0x1f71000c,0x3df60040,0x1f75000c,0x3df70040,0x1f79000c,0,0,0,0,0,0x3df80040,0x1f7d000c,0x1f81000c,0x3df90040,0x1f85000c, -0x1f89000c,0x3dfa0040,0x1f8d000c,0x1f91000c,0x3dfb0040,0x1f95000c,0x1f99000c,0x3dfc0040,0x1f9d000c,0x1fa1000c,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1fa5000c,0,0,0,0,0x205d08b0,0x205e08b0,0x26b5000a,0x26b9000a,0x3dfe0040,0x1fa9000c,0x26bd000a,0,0,0,0, -0,0,0x3e130040,0,0,0,0,0x3dff0040,0x1fad000c,0x3e000040,0x1fb1000c,0x3e010040,0x1fb5000c,0x3e020040,0x1fb9000c,0x3e030040, -0x1fbd000c,0x3e040040,0x1fc1000c,0x3e050040,0x1fc5000c,0x3e060040,0x1fc9000c,0x3e070040,0x1fcd000c,0x3e080040,0x1fd1000c,0x3e090040,0x1fd5000c,0x3e0a0040,0x1fd9000c,0, -0x3e0b0040,0x1fdd000c,0x3e0c0040,0x1fe1000c,0x3e0d0040,0x1fe5000c,0,0,0,0,0,0x3e0e0040,0x1fe9000c,0x1fed000c,0x3e0f0040,0x1ff1000c, -0x1ff5000c,0x3e100040,0x1ff9000c,0x1ffd000c,0x3e110040,0x2001000c,0x2005000c,0x3e120040,0x2009000c,0x200d000c,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x3e140040,0x3e150040,0x3e160040,0x3e170040,0, -0x2011000c,0,0,0x2015000c,0x2019000c,0x201d000c,0x2021000c,0,0,0x3e180040,0x2025000c,0x26c0000a,0x202ae6b0,0x202be6b0,0x202ce6b0,0x202de6b0, -0x202ee6b0,0xe600,0x202fe6b0,0x2030e6b0,0x2031e6b0,0x2032e6b0,0x2033e6b0,0x2034e6b0,0x2035e6b0,0xe600,0xe600,0x2036e6b0,0xe600,0x2037e6b0,0xe600,0x2038e6b0, -0x2039e6b0,0xe800,0xdc00,0xdc00,0xdc00,0xdc00,0xe800,0x203ad8b0,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0xca00,0xca00,0x203bdcb0, -0x203cdcb0,0x203ddcb0,0x203edcb0,0x203fcab0,0x2040cab0,0xdc00,0xdc00,0xdc00,0xdc00,0x2041dcb0,0x2042dcb0,0xdc00,0x2043dcb0,0x2044dcb0,0xdc00,0xdc00, -0x100,0x100,0x100,0x100,0x204501b0,0xdc00,0xdc00,0xdc00,0xdc00,0xe600,0xe600,0xe600,0,0,0,0, -0,0,0,0,0x3d9b0040,0,0x3d9c0040,0x1b00,0x1c00,0x1d00,0x1e00,0x1f00,0x2000,0x2100,0x2200,0x2048e6b0, -0x2049e6b0,0x204adcb0,0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xe600,0xe600,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x700,0,0x204c00b0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x700,0,0x204e00b0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x205100b0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x205700b0,0,0,0xfff200b0,0xfff200b0,0xfff200b0, +0,0x3dd70040,0x1603000c,0x3dd80040,0x1606000c,0x3dd90040,0x1609000c,0x3dda0040,0x160c000c,0x3ddb0040,0x160f000c,0,0,0x3ddc0040,0x1612000c,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x700,0x208200b0,0,0,0,0,0x3ddd0040,0x1615000c,0x3dde0040,0x1618000c,0x3ddf0040,0x3de00040, +0x161b000c,0x161e000c,0x3de10040,0x1621000c,0x900,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1624000c,0x1628000c,0x162c000c,0x1630000c,0x1634000c,0x1638000c,0x163c000c,0x1640000c,0x1644000c,0x1649000c,0x164e000c,0x1652000c,0x1656000c,0x165a000c,0x165e000c,0x1662000c, +0x1666000c,0x166a000c,0x166e000c,0x1672000c,0x1676000c,0x167b000c,0x1680000c,0x1685000c,0x168a000c,0x168e000c,0x1692000c,0x1696000c,0x169a000c,0x169f000c,0x16a4000c,0x16a8000c, +0x16ac000c,0x16b0000c,0x16b4000c,0x16b8000c,0x16bc000c,0x16c0000c,0x16c4000c,0x16c8000c,0x16cc000c,0x16d0000c,0x16d4000c,0x16d8000c,0x16dc000c,0x16e0000c,0x16e4000c,0x16e9000c, +0x16ee000c,0x16f2000c,0x16f6000c,0x16fa000c,0x16fe000c,0x1702000c,0x1707004c,0x170c004c,0x1710000c,0x1715000c,0x171a000c,0x171e000c,0x1722000c,0x1726000c,0x172a000c,0x172e000c, +0x1732000c,0x1736000c,0x173a000c,0x173e000c,0x1742000c,0x1746000c,0x174a000c,0x174e000c,0x1752000c,0x1756000c,0x175a000c,0x175e000c,0x1762000c,0x1767000c,0x176c000c,0x1771000c, +0x1776000c,0x177b000c,0x1780000c,0x1785000c,0x178a000c,0x178e000c,0x1792000c,0x1796000c,0x179a000c,0x179e000c,0x17a3004c,0x17a8004c,0x17ac000c,0x17b1000c,0x17b6000c,0x17ba000c, +0x17be000c,0x17c2000c,0x17c7004c,0x17cc004c,0x17d0000c,0x17d5000c,0x17da000c,0x17df000c,0x17e4000c,0x17e9000c,0x17ee000c,0x17f2000c,0x17f6000c,0x17fa000c,0x17fe000c,0x1802000c, +0x1806000c,0x180a000c,0x180e000c,0x1812000c,0x1816000c,0x181a000c,0x181e000c,0x1822000c,0x1826000c,0x182b000c,0x1830000c,0x1835000c,0x183a000c,0x183e000c,0x1842000c,0x1846000c, +0x184a000c,0x184e000c,0x1852000c,0x1856000c,0x185a000c,0x185e000c,0x1862000c,0x1866000c,0x186a000c,0x186e000c,0x1872000c,0x1876000c,0x187a000c,0x187e000c,0x1882000c,0x1886000c, +0x188a000c,0x188e000c,0x1892000c,0x1896000c,0x189a000c,0x189e000c,0x18a2000c,0x18a6000c,0x18aa000c,0x18ae000c,0x21f6000a,0x18b2000e,0,0,0,0, +0x18ba004c,0x18bf004c,0x18c3000c,0x18c7000c,0x18cb000c,0x18d0000c,0x18d5000c,0x18da000c,0x18df000c,0x18e4000c,0x18e9000c,0x18ee000c,0x18f3000c,0x18f8000c,0x18fd000c,0x1902000c, +0x1907000c,0x190c000c,0x1911000c,0x1916000c,0x191b000c,0x1920000c,0x1925000c,0x192a000c,0x1930004c,0x1935004c,0x1939000c,0x193d000c,0x1941000c,0x1945000c,0x1949000c,0x194e000c, +0x1953000c,0x1958000c,0x195d000c,0x1962000c,0x1967000c,0x196c000c,0x1971000c,0x1976000c,0x197b000c,0x197f000c,0x1983000c,0x1987000c,0x198c004c,0x1991004c,0x1995000c,0x1999000c, +0x199d000c,0x19a2000c,0x19a7000c,0x19ac000c,0x19b1000c,0x19b6000c,0x19bb000c,0x19c0000c,0x19c5000c,0x19ca000c,0x19cf000c,0x19d4000c,0x19d9000c,0x19de000c,0x19e3000c,0x19e8000c, +0x19ed000c,0x19f2000c,0x19f7000c,0x19fc000c,0x1a01000c,0x1a05000c,0x1a09000c,0x1a0d000c,0x1a11000c,0x1a16000c,0x1a1b000c,0x1a20000c,0x1a25000c,0x1a2a000c,0x1a2f000c,0x1a34000c, +0x1a39000c,0x1a3e000c,0x1a43000c,0x1a47000c,0x1a4b000c,0x1a4f000c,0x1a53000c,0x1a57000c,0x1a5b000c,0x1a5f000c,0,0,0,0,0,0, +0x1a64004c,0x1a69004c,0x1a6e004c,0x1a74004c,0x1a7a004c,0x1a80004c,0x1a86004c,0x1a8c004c,0x1a92004c,0x1a97004c,0x1a9c004c,0x1aa2004c,0x1aa8004c,0x1aae004c,0x1ab4004c,0x1aba004c, +0x1ac0004c,0x1ac5004c,0x1ac9000c,0x1ace000c,0x1ad3000c,0x1ad8000c,0,0,0x1ade004c,0x1ae3004c,0x1ae7000c,0x1aec000c,0x1af1000c,0x1af6000c,0,0, +0x1afc004c,0x1b01004c,0x1b06004c,0x1b0c004c,0x1b12004c,0x1b18004c,0x1b1e004c,0x1b24004c,0x1b2a004c,0x1b2f004c,0x1b34004c,0x1b3a004c,0x1b40004c,0x1b46004c,0x1b4c004c,0x1b52004c, +0x1b58004c,0x1b5d004c,0x1b61000c,0x1b66000c,0x1b6b000c,0x1b70000c,0x1b75000c,0x1b7a000c,0x1b80004c,0x1b85004c,0x1b89000c,0x1b8e000c,0x1b93000c,0x1b98000c,0x1b9d000c,0x1ba2000c, +0x1ba8004c,0x1bad004c,0x1bb1000c,0x1bb6000c,0x1bbb000c,0x1bc0000c,0,0,0x1bc6004c,0x1bcb004c,0x1bcf000c,0x1bd4000c,0x1bd9000c,0x1bde000c,0,0, +0x1be4004c,0x1be9004c,0x1bed000c,0x1bf2000c,0x1bf7000c,0x1bfc000c,0x1c01000c,0x1c06000c,0,0x1c0c004c,0,0x1c10000c,0,0x1c15000c,0,0x1c1a000c, +0x1c9a000c,0x1c9f000c,0x1ca4000c,0x1caa000c,0x1cb0000c,0x1cb6000c,0x1cbc000c,0x1cc2000c,0x1cc8000c,0x1ccd000c,0x1cd2000c,0x1cd8000c,0x1cde000c,0x1ce4000c,0x1cea000c,0x1cf0000c, +0x1cf6000c,0x1cfb000c,0x1d00000c,0x1d06000c,0x1d0c000c,0x1d12000c,0x1d18000c,0x1d1e000c,0x1d24000c,0x1d29000c,0x1d2e000c,0x1d34000c,0x1d3a000c,0x1d40000c,0x1d46000c,0x1d4c000c, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x3df00040,0,0x3df10040,0,0x3df20040,0,0,0,0,0,0x1eb6000c,0x1eba000c,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x1ebe000c,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x1ec2000c,0x1ec6000c,0x1eca000c, +0x3df30040,0,0x3df50040,0,0x3df40040,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x3df60040,0x1ece000c,0,0,0,0x3df70040,0x1ed2000c,0,0x3df80040,0x1ed6000c,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x3df90040,0x1eda000c,0x3dfa0040,0x1ede000c,0,0,0,0,0,0x235a000a,0x235d000a,0,0x2361000a, +0x2364000a,0,0,0,0,0,0,0,0,0,0,0,0x3dfb0040,0,0,0, +0,0x1ee2000c,0,0x3dfc0040,0x1ee6000c,0x3dfd0040,0,0x1eea000c,0x3dfe0040,0x1eee000c,0,0,0,0x3e010040,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1ef2000c,0x3e000040,0x1ef6000c,0,0x3e040040,0x3e050040,0,0,0,0,0,0,0,0x1efa000c,0x1efe000c,0x1f02000c, +0x1f06000c,0x1f0a000c,0x3e060040,0x3e070040,0x1f0e000c,0x1f12000c,0x3e080040,0x3e090040,0x1f16000c,0x1f1a000c,0x3e0a0040,0x3e0b0040,0x3e140040,0x3e150040,0,0, +0x1f1e000c,0x1f22000c,0x3e0c0040,0x3e0d0040,0x1f26000c,0x1f2a000c,0x3e0e0040,0x3e0f0040,0x1f2e000c,0x1f32000c,0,0,0,0,0,0, +0,0x3e160040,0x3e170040,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x3e100040,0,0,0,0,0,0x3e110040,0x3e120040,0,0x3e130040,0x1f36000c,0x1f3a000c,0x1f3e000c,0x1f42000c, +0,0,0x3e180040,0x3e190040,0x3e1a0040,0x3e1b0040,0,0,0,0,0,0,0,0,0,0, +0x1f46000c,0x1f4a000c,0x1f4e000c,0x1f52000c,0,0,0,0,0,0,0x1f56000c,0x1f5a000c,0x1f5e000c,0x1f62000c,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x3e300040,0,0,0,0,0x3e1c0040,0x1f66000c,0x3e1d0040,0x1f6a000c,0x3e1e0040,0x1f6e000c,0x3e1f0040,0x1f72000c,0x3e200040, +0x1f76000c,0x3e210040,0x1f7a000c,0x3e220040,0x1f7e000c,0x3e230040,0x1f82000c,0x3e240040,0x1f86000c,0x3e250040,0x1f8a000c,0x3e260040,0x1f8e000c,0x3e270040,0x1f92000c,0, +0x3e280040,0x1f96000c,0x3e290040,0x1f9a000c,0x3e2a0040,0x1f9e000c,0,0,0,0,0,0x3e2b0040,0x1fa2000c,0x1fa6000c,0x3e2c0040,0x1faa000c, +0x1fae000c,0x3e2d0040,0x1fb2000c,0x1fb6000c,0x3e2e0040,0x1fba000c,0x1fbe000c,0x3e2f0040,0x1fc2000c,0x1fc6000c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1fca000c,0,0,0,0,0x208308b0,0x208408b0,0x26db000a,0x26df000a,0x3e310040,0x1fce000c,0x26e3000a,0,0,0,0, +0,0,0x3e460040,0,0,0,0,0x3e320040,0x1fd2000c,0x3e330040,0x1fd6000c,0x3e340040,0x1fda000c,0x3e350040,0x1fde000c,0x3e360040, +0x1fe2000c,0x3e370040,0x1fe6000c,0x3e380040,0x1fea000c,0x3e390040,0x1fee000c,0x3e3a0040,0x1ff2000c,0x3e3b0040,0x1ff6000c,0x3e3c0040,0x1ffa000c,0x3e3d0040,0x1ffe000c,0, +0x3e3e0040,0x2002000c,0x3e3f0040,0x2006000c,0x3e400040,0x200a000c,0,0,0,0,0,0x3e410040,0x200e000c,0x2012000c,0x3e420040,0x2016000c, +0x201a000c,0x3e430040,0x201e000c,0x2022000c,0x3e440040,0x2026000c,0x202a000c,0x3e450040,0x202e000c,0x2032000c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x3e470040,0x3e480040,0x3e490040,0x3e4a0040,0, +0x2036000c,0,0,0x203a000c,0x203e000c,0x2042000c,0x2046000c,0,0,0x3e4b0040,0x204a000c,0x26e6000a,0x204fe6b0,0x2050e6b0,0x2051e6b0,0x2052e6b0, +0x2053e6b0,0xe600,0x2054e6b0,0x2055e6b0,0x2056e6b0,0x2057e6b0,0x2058e6b0,0x2059e6b0,0x205ae6b0,0xe600,0xe600,0x205be6b0,0xe600,0x205ce6b0,0xe600,0x205de6b0, +0x205ee6b0,0xe800,0xdc00,0xdc00,0xdc00,0xdc00,0xe800,0x205fd8b0,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0xca00,0xca00,0x2060dcb0, +0x2061dcb0,0x2062dcb0,0x2063dcb0,0x2064cab0,0x2065cab0,0xdc00,0xdc00,0xdc00,0xdc00,0x2066dcb0,0x2067dcb0,0xdc00,0x2068dcb0,0x2069dcb0,0xdc00,0xdc00, +0x100,0x100,0x100,0x100,0x206a01b0,0xdc00,0xdc00,0xdc00,0xdc00,0xe600,0xe600,0xe600,0,0,0,0, +0,0,0,0,0x3dc30040,0,0x3dc40040,0x1b00,0x1c00,0x1d00,0x1e00,0x1f00,0x2000,0x2100,0x2200,0x206de6b0, +0x206ee6b0,0x206fdcb0,0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xe600,0xe600,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x700,0,0x207100b0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x700,0,0x207300b0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x207600b0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x207c00b0,0,0,0xfff200b0,0xfff200b0,0xfff200b0, 0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0,0xfff200b0, 0xfff200b0,0xfff200b0,0,0,0,0,0,0,0,0,0,0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0, 0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0, 0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0xfff300b0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x205e000a,0,0,0,0,0,0,0,0x2061004a,0,0x2065000a,0, -0,0,0,0x2067000a,0,0,0x206b000a,0x206d000a,0x206f000a,0x2073000a,0,0,0x2075000a,0x2079000a,0x207b000a,0, -0x207d000a,0x2081000a,0x2085000a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x20c5000a,0x20c7000a,0x20c9000a,0x20cb000a,0x20cd000a,0x20cf000a,0x20d1000a,0x20d3000a,0x20d5000a,0,0,0, +0,0,0,0,0x2084000a,0,0,0,0,0,0,0,0x2087004a,0,0x208b000a,0, +0,0,0,0x208d000a,0,0,0x2091000a,0x2093000a,0x2095000a,0x2099000a,0,0,0x209b000a,0x209f000a,0x20a1000a,0, +0x20a3000a,0x20a7000a,0x20ab000a,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x20eb000a,0x20ed000a,0x20ef000a,0x20f1000a,0x20f3000a,0x20f5000a,0x20f7000a,0x20f9000a,0x20fb000a,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x20d7000a,0x20db000a,0x20df000a,0x20e3000a,0x20e7000a,0x20eb000a,0,0, -0x20ef000a,0x20f1000a,0x20f3000a,0x20f5000a,0x20f7000a,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x20fd000a,0x2101000a,0x2105000a,0x2109000a,0x210d000a,0x2111000a,0,0, +0x2115000a,0x2117000a,0x2119000a,0x211b000a,0x211d000a,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x210d000a,0,0,0,0,0,0,0,0,0,0xdc00,0xe600,0xe600, +0,0,0,0x2133000a,0,0,0,0,0,0,0,0,0,0xdc00,0xe600,0xe600, 0xe600,0xe600,0xdc00,0xe600,0xe600,0xe600,0xde00,0xdc00,0xe600,0xe600,0xe600,0xe600,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0x2300,0,0,0, -0,0x2110000a,0x2113000a,0x2116000a,0x2119000a,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x211c000a,0,0,0,0, +0,0x2136000a,0x2139000a,0x213c000a,0x213f000a,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x2142000a,0,0,0,0, 0x6700,0x6700,0x900,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x211f000a,0,0,0,0,0x7600,0x7600,0,0, +0,0,0,0,0,0,0,0x2145000a,0,0,0,0,0x7600,0x7600,0,0, 0,0,0,0,0,0,0,0,0x7a00,0x7a00,0x7a00,0x7a00,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x2122000a,0x2125000a,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x2128000a,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x2148000a,0x214b000a,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x214e000a,0,0,0, 0,0,0,0,0,0,0,0,0xdc00,0xdc00,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2134000a,0,0,0,0x216e000a,0x2170000a,0x2172000a,0x2174000a, -0x2176000a,0x2178000a,0x217a000a,0x217c000a,0x217e000a,0x2180000a,0x2182000a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x2184000a,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x2186000a,0x2188000a,0x218a000a,0x218c000a,0x218e000a,0x2190000a,0x2192000a,0x2194000a,0x2196000a,0x2198000a,0x219a000a,0x219c000a,0x219e000a, -0x21a0000a,0x21a2000a,0x21a4000a,0x21a6000a,0x21a8000a,0x21aa000a,0x21ac000a,0x21ae000a,0x21b0000a,0x21b2000a,0x21b4000a,0x21b6000a,0x21b8000a,0x21ba000a,0x21bc000a,0x21be000a, -0x21c0000a,0x21c2000a,0x21c4000a,0x21c6000a,0x21c8000a,0x21ca000a,0x21cc000a,0x21ce000a,0,0,0,0,0x21fd000a,0x21ff000a,0x2202000a,0, -0,0,0,0,0,0,0,0x2206000a,0,0,0,0x2208000a,0x220b000a,0,0x220f000a,0x2212000a, -0,0,0,0,0x2216000a,0,0x2219000a,0,0,0,0,0,0,0,0,0x221d000a, -0x2220000a,0x2223000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2226000a, -0,0,0,0,0,0,0,0x222b000a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x222d000a,0x222f000a,0,0,0x2231000a,0x2233000a,0x2235000a,0x2237000a, -0x2239000a,0x223b000a,0x223d000a,0x223f000a,0x2241000a,0x2243000a,0x2245000a,0x2247000a,0x2249000a,0x224b000a,0x224d000a,0x224f000a,0x2251000a,0x2253000a,0x2255000a,0x2257000a, -0x2259000a,0x225b000a,0x225d000a,0x225f000a,0x2261000a,0x2263000a,0x2265000a,0,0x2267000a,0x2269000a,0x226b000a,0x226d000a,0x226f000a,0,0,0, -0,0,0,0,0,0,0,0,0x22d8000a,0x22da000a,0x22dd000a,0x22e1000a,0x22e4000a,0x22e6000a,0x22e9000a,0x22ed000a, -0x22f2000a,0x22f5000a,0x22f7000a,0x22fa000a,0x22fe000a,0x2300000a,0x2302000a,0x2304000a,0x2306000a,0x2308000a,0x230b000a,0x230f000a,0x2312000a,0x2314000a,0x2317000a,0x231b000a, -0x2320000a,0x2323000a,0x2325000a,0x2328000a,0x232c000a,0x232e000a,0x2330000a,0x2332000a,0x2342000a,0x2344000a,0x2346000a,0x2348000a,0x234a000a,0x234c000a,0x234e000a,0x2350000a, -0x2352000a,0x2354000a,0x2357000a,0x235a000a,0x235d000a,0x2360000a,0x2363000a,0x2366000a,0x2369000a,0x236c000a,0x236f000a,0x2372000a,0x2375000a,0x2379000a,0x237d000a,0x2381000a, -0x2385000a,0x2389000a,0x238d000a,0x2391000a,0x2395000a,0x2399000a,0x239e000a,0x23a3000a,0x23a8000a,0x23ad000a,0x23b2000a,0x23b7000a,0x23bc000a,0x23c1000a,0x23c6000a,0x23cb000a, -0x23d0000a,0x23d3000a,0x23d6000a,0x23d9000a,0x23dc000a,0x23df000a,0x23e2000a,0x23e5000a,0x23e8000a,0x23eb000a,0x23ef000a,0x23f3000a,0x23f7000a,0x23fb000a,0x23ff000a,0x2403000a, -0x2407000a,0x240b000a,0x240f000a,0x2413000a,0x2417000a,0x241b000a,0x241f000a,0x2423000a,0x2427000a,0x242b000a,0x242f000a,0x2433000a,0x2437000a,0x243b000a,0x243f000a,0x2443000a, -0x2447000a,0x244b000a,0x244f000a,0x2453000a,0x2457000a,0x245b000a,0x245f000a,0x2463000a,0x2467000a,0x246b000a,0x246f000a,0x2473000a,0x2477000a,0x247b000a,0x247f000a,0x2481000a, -0x2483000a,0x2485000a,0x2487000a,0x2489000a,0x248b000a,0x248d000a,0x248f000a,0x2491000a,0x2493000a,0x2495000a,0x2497000a,0x2499000a,0x249b000a,0x249d000a,0x249f000a,0x24a1000a, -0x24a3000a,0x24a5000a,0x24a7000a,0x24a9000a,0x24ab000a,0x24ad000a,0x24af000a,0x24b1000a,0x24b3000a,0x24b5000a,0x24b7000a,0x24b9000a,0x24bb000a,0x24bd000a,0x24bf000a,0x24c1000a, -0x24c3000a,0x24c5000a,0x24c7000a,0x24c9000a,0x24cb000a,0x24cd000a,0x24cf000a,0x24d1000a,0x24d3000a,0x24d5000a,0x24d7000a,0x24d9000a,0x24db000a,0x24dd000a,0x24df000a,0x24e1000a, -0x24e3000a,0x24e5000a,0x24e7000a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x24e9000a,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x24ee000a,0x24f2000a,0x24f5000a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x24f9000a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x24fb000a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x24fd000a,0,0,0,0,0,0,0,0, -0,0,0,0,0x24ff000a,0x2501000a,0x2503000a,0x2505000a,0x2507000a,0x2509000a,0x250b000a,0x250d000a,0x250f000a,0x2511000a,0x2513000a,0x2515000a, -0x2517000a,0x2519000a,0x251b000a,0x251d000a,0x251f000a,0x2521000a,0x2523000a,0x2525000a,0x2527000a,0x2529000a,0x252b000a,0x252d000a,0x252f000a,0x2531000a,0x2533000a,0x2535000a, -0x2537000a,0x2539000a,0x253b000a,0x253d000a,0x253f000a,0x2541000a,0x2543000a,0x2545000a,0x2547000a,0x2549000a,0x254b000a,0x254d000a,0x254f000a,0x2551000a,0x2553000a,0x2555000a, -0x2557000a,0x2559000a,0x255b000a,0x255d000a,0x255f000a,0x2561000a,0x2563000a,0x2565000a,0x2567000a,0x2569000a,0x256b000a,0x256d000a,0x256f000a,0x2571000a,0x2573000a,0x2575000a, -0x2577000a,0x2579000a,0x257b000a,0x257d000a,0x257f000a,0x2581000a,0x2583000a,0x2585000a,0x2587000a,0x2589000a,0x258b000a,0x258d000a,0x258f000a,0x2591000a,0x2593000a,0x2595000a, -0x2597000a,0x2599000a,0x259b000a,0x259d000a,0x259f000a,0x25a1000a,0x25a3000a,0x25a5000a,0x25a7000a,0x25a9000a,0x25ab000a,0x25ad000a,0x25af000a,0x25b1000a,0x25b3000a,0x25b5000a, -0x25b7000a,0x25b9000a,0x25bb000a,0x25bd000a,0x25bf000a,0x25c1000a,0x25c3000a,0x25c5000a,0x25c7000a,0x25c9000a,0x25cb000a,0x25cd000a,0x25cf000a,0x25d1000a,0x25d3000a,0x25d5000a, -0x25d7000a,0x25d9000a,0x25db000a,0x25dd000a,0x25df000a,0x25e1000a,0x25e3000a,0x25e5000a,0x25e7000a,0x25e9000a,0x25eb000a,0x25ed000a,0x25ef000a,0x25f1000a,0x25f3000a,0x25f5000a, -0x25f7000a,0x25f9000a,0x25fb000a,0x25fd000a,0x25ff000a,0x2601000a,0x2603000a,0x2605000a,0x2607000a,0x2609000a,0x260b000a,0x260d000a,0x260f000a,0x2611000a,0x2613000a,0x2615000a, -0x2617000a,0x2619000a,0x261b000a,0x261d000a,0x261f000a,0x2621000a,0x2623000a,0x2625000a,0x2627000a,0x2629000a,0x262b000a,0x262d000a,0x262f000a,0x2631000a,0x2633000a,0x2635000a, -0x2637000a,0x2639000a,0x263b000a,0x263d000a,0x263f000a,0x2641000a,0x2643000a,0x2645000a,0x2647000a,0x2649000a,0x264b000a,0x264d000a,0x264f000a,0x2651000a,0x2653000a,0x2655000a, -0x2657000a,0x2659000a,0x265b000a,0x265d000a,0x265f000a,0x2661000a,0x2663000a,0x2665000a,0x2667000a,0x2669000a,0x266b000a,0x266d000a,0x266f000a,0x2671000a,0x2673000a,0x2675000a, -0x2677000a,0x2679000a,0x267b000a,0x267d000a,0x267f000a,0x2681000a,0x2683000a,0x2685000a,0x2687000a,0x2689000a,0x268b000a,0x268d000a,0x268f000a,0x2691000a,0x2693000a,0x2695000a, -0x2697000a,0x2699000a,0x269b000a,0x269d000a,0x269f000a,0x26a1000a,0x26a3000a,0x26a5000a,0x26a7000a,0x26a9000a,0,0,0,0,0,0, -0,0,0,0,0x26ab000a,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x215a000a,0,0,0,0x2194000a,0x2196000a,0x2198000a,0x219a000a, +0x219c000a,0x219e000a,0x21a0000a,0x21a2000a,0x21a4000a,0x21a6000a,0x21a8000a,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x21aa000a,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x21ac000a,0x21ae000a,0x21b0000a,0x21b2000a,0x21b4000a,0x21b6000a,0x21b8000a,0x21ba000a,0x21bc000a,0x21be000a,0x21c0000a,0x21c2000a,0x21c4000a, +0x21c6000a,0x21c8000a,0x21ca000a,0x21cc000a,0x21ce000a,0x21d0000a,0x21d2000a,0x21d4000a,0x21d6000a,0x21d8000a,0x21da000a,0x21dc000a,0x21de000a,0x21e0000a,0x21e2000a,0x21e4000a, +0x21e6000a,0x21e8000a,0x21ea000a,0x21ec000a,0x21ee000a,0x21f0000a,0x21f2000a,0x21f4000a,0,0,0,0,0x2223000a,0x2225000a,0x2228000a,0, +0,0,0,0,0,0,0,0x222c000a,0,0,0,0x222e000a,0x2231000a,0,0x2235000a,0x2238000a, +0,0,0,0,0x223c000a,0,0x223f000a,0,0,0,0,0,0,0,0,0x2243000a, +0x2246000a,0x2249000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0x224c000a, +0,0,0,0,0,0,0,0x2251000a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x2253000a,0x2255000a,0,0,0x2257000a,0x2259000a,0x225b000a,0x225d000a, +0x225f000a,0x2261000a,0x2263000a,0x2265000a,0x2267000a,0x2269000a,0x226b000a,0x226d000a,0x226f000a,0x2271000a,0x2273000a,0x2275000a,0x2277000a,0x2279000a,0x227b000a,0x227d000a, +0x227f000a,0x2281000a,0x2283000a,0x2285000a,0x2287000a,0x2289000a,0x228b000a,0,0x228d000a,0x228f000a,0x2291000a,0x2293000a,0x2295000a,0,0,0, +0,0,0,0,0,0,0,0,0x22fe000a,0x2300000a,0x2303000a,0x2307000a,0x230a000a,0x230c000a,0x230f000a,0x2313000a, +0x2318000a,0x231b000a,0x231d000a,0x2320000a,0x2324000a,0x2326000a,0x2328000a,0x232a000a,0x232c000a,0x232e000a,0x2331000a,0x2335000a,0x2338000a,0x233a000a,0x233d000a,0x2341000a, +0x2346000a,0x2349000a,0x234b000a,0x234e000a,0x2352000a,0x2354000a,0x2356000a,0x2358000a,0x2368000a,0x236a000a,0x236c000a,0x236e000a,0x2370000a,0x2372000a,0x2374000a,0x2376000a, +0x2378000a,0x237a000a,0x237d000a,0x2380000a,0x2383000a,0x2386000a,0x2389000a,0x238c000a,0x238f000a,0x2392000a,0x2395000a,0x2398000a,0x239b000a,0x239f000a,0x23a3000a,0x23a7000a, +0x23ab000a,0x23af000a,0x23b3000a,0x23b7000a,0x23bb000a,0x23bf000a,0x23c4000a,0x23c9000a,0x23ce000a,0x23d3000a,0x23d8000a,0x23dd000a,0x23e2000a,0x23e7000a,0x23ec000a,0x23f1000a, +0x23f6000a,0x23f9000a,0x23fc000a,0x23ff000a,0x2402000a,0x2405000a,0x2408000a,0x240b000a,0x240e000a,0x2411000a,0x2415000a,0x2419000a,0x241d000a,0x2421000a,0x2425000a,0x2429000a, +0x242d000a,0x2431000a,0x2435000a,0x2439000a,0x243d000a,0x2441000a,0x2445000a,0x2449000a,0x244d000a,0x2451000a,0x2455000a,0x2459000a,0x245d000a,0x2461000a,0x2465000a,0x2469000a, +0x246d000a,0x2471000a,0x2475000a,0x2479000a,0x247d000a,0x2481000a,0x2485000a,0x2489000a,0x248d000a,0x2491000a,0x2495000a,0x2499000a,0x249d000a,0x24a1000a,0x24a5000a,0x24a7000a, +0x24a9000a,0x24ab000a,0x24ad000a,0x24af000a,0x24b1000a,0x24b3000a,0x24b5000a,0x24b7000a,0x24b9000a,0x24bb000a,0x24bd000a,0x24bf000a,0x24c1000a,0x24c3000a,0x24c5000a,0x24c7000a, +0x24c9000a,0x24cb000a,0x24cd000a,0x24cf000a,0x24d1000a,0x24d3000a,0x24d5000a,0x24d7000a,0x24d9000a,0x24db000a,0x24dd000a,0x24df000a,0x24e1000a,0x24e3000a,0x24e5000a,0x24e7000a, +0x24e9000a,0x24eb000a,0x24ed000a,0x24ef000a,0x24f1000a,0x24f3000a,0x24f5000a,0x24f7000a,0x24f9000a,0x24fb000a,0x24fd000a,0x24ff000a,0x2501000a,0x2503000a,0x2505000a,0x2507000a, +0x2509000a,0x250b000a,0x250d000a,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x250f000a,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x2514000a,0x2518000a,0x251b000a,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x251f000a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x2521000a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x2523000a,0,0,0,0,0,0,0,0, +0,0,0,0,0x2525000a,0x2527000a,0x2529000a,0x252b000a,0x252d000a,0x252f000a,0x2531000a,0x2533000a,0x2535000a,0x2537000a,0x2539000a,0x253b000a, +0x253d000a,0x253f000a,0x2541000a,0x2543000a,0x2545000a,0x2547000a,0x2549000a,0x254b000a,0x254d000a,0x254f000a,0x2551000a,0x2553000a,0x2555000a,0x2557000a,0x2559000a,0x255b000a, +0x255d000a,0x255f000a,0x2561000a,0x2563000a,0x2565000a,0x2567000a,0x2569000a,0x256b000a,0x256d000a,0x256f000a,0x2571000a,0x2573000a,0x2575000a,0x2577000a,0x2579000a,0x257b000a, +0x257d000a,0x257f000a,0x2581000a,0x2583000a,0x2585000a,0x2587000a,0x2589000a,0x258b000a,0x258d000a,0x258f000a,0x2591000a,0x2593000a,0x2595000a,0x2597000a,0x2599000a,0x259b000a, +0x259d000a,0x259f000a,0x25a1000a,0x25a3000a,0x25a5000a,0x25a7000a,0x25a9000a,0x25ab000a,0x25ad000a,0x25af000a,0x25b1000a,0x25b3000a,0x25b5000a,0x25b7000a,0x25b9000a,0x25bb000a, +0x25bd000a,0x25bf000a,0x25c1000a,0x25c3000a,0x25c5000a,0x25c7000a,0x25c9000a,0x25cb000a,0x25cd000a,0x25cf000a,0x25d1000a,0x25d3000a,0x25d5000a,0x25d7000a,0x25d9000a,0x25db000a, +0x25dd000a,0x25df000a,0x25e1000a,0x25e3000a,0x25e5000a,0x25e7000a,0x25e9000a,0x25eb000a,0x25ed000a,0x25ef000a,0x25f1000a,0x25f3000a,0x25f5000a,0x25f7000a,0x25f9000a,0x25fb000a, +0x25fd000a,0x25ff000a,0x2601000a,0x2603000a,0x2605000a,0x2607000a,0x2609000a,0x260b000a,0x260d000a,0x260f000a,0x2611000a,0x2613000a,0x2615000a,0x2617000a,0x2619000a,0x261b000a, +0x261d000a,0x261f000a,0x2621000a,0x2623000a,0x2625000a,0x2627000a,0x2629000a,0x262b000a,0x262d000a,0x262f000a,0x2631000a,0x2633000a,0x2635000a,0x2637000a,0x2639000a,0x263b000a, +0x263d000a,0x263f000a,0x2641000a,0x2643000a,0x2645000a,0x2647000a,0x2649000a,0x264b000a,0x264d000a,0x264f000a,0x2651000a,0x2653000a,0x2655000a,0x2657000a,0x2659000a,0x265b000a, +0x265d000a,0x265f000a,0x2661000a,0x2663000a,0x2665000a,0x2667000a,0x2669000a,0x266b000a,0x266d000a,0x266f000a,0x2671000a,0x2673000a,0x2675000a,0x2677000a,0x2679000a,0x267b000a, +0x267d000a,0x267f000a,0x2681000a,0x2683000a,0x2685000a,0x2687000a,0x2689000a,0x268b000a,0x268d000a,0x268f000a,0x2691000a,0x2693000a,0x2695000a,0x2697000a,0x2699000a,0x269b000a, +0x269d000a,0x269f000a,0x26a1000a,0x26a3000a,0x26a5000a,0x26a7000a,0x26a9000a,0x26ab000a,0x26ad000a,0x26af000a,0x26b1000a,0x26b3000a,0x26b5000a,0x26b7000a,0x26b9000a,0x26bb000a, +0x26bd000a,0x26bf000a,0x26c1000a,0x26c3000a,0x26c5000a,0x26c7000a,0x26c9000a,0x26cb000a,0x26cd000a,0x26cf000a,0,0,0,0,0,0, +0,0,0,0,0x26d1000a,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xda00,0xe400,0xe800,0xde00,0xe000,0xe000,0,0,0,0, -0,0,0x26ad000a,0,0x26af000a,0x26b1000a,0x26b3000a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x26c3000a,0x26c5000a,0x26c7000a,0x26c9000a,0x26cb000a,0x26cd000a,0x26cf000a, -0x26d1000a,0x26d3000a,0x26d5000a,0x26d7000a,0x26d9000a,0x26db000a,0x26dd000a,0x26df000a,0x26e1000a,0x26e3000a,0x26e5000a,0x26e7000a,0x26e9000a,0x26eb000a,0x26ed000a,0x26ef000a, -0x26f1000a,0x26f3000a,0x26f5000a,0x26f7000a,0x26f9000a,0x26fb000a,0x26fd000a,0x26ff000a,0x2701000a,0x2703000a,0x2705000a,0x2707000a,0x2709000a,0x270b000a,0x270d000a,0x270f000a, -0x2711000a,0x2713000a,0x2715000a,0x2717000a,0x2719000a,0x271b000a,0x271d000a,0x271f000a,0x2721000a,0x2723000a,0x2725000a,0x2727000a,0x2729000a,0x272b000a,0x272d000a,0x272f000a, -0x2731000a,0x2733000a,0x2735000a,0x2737000a,0x2739000a,0x273b000a,0x273d000a,0x273f000a,0x2741000a,0x2743000a,0x2745000a,0x2747000a,0x2749000a,0x274b000a,0x274d000a,0x274f000a, -0x2751000a,0x2753000a,0x2755000a,0x2757000a,0x2759000a,0x275b000a,0x275d000a,0x275f000a,0x2761000a,0x2763000a,0x2765000a,0x2767000a,0x2769000a,0x276b000a,0x276d000a,0x276f000a, -0x2771000a,0x2773000a,0x2775000a,0x2777000a,0x2779000a,0x277b000a,0x277d000a,0,0,0,0x277f000a,0x2781000a,0x2783000a,0x2785000a,0x2787000a,0x2789000a, -0x278b000a,0x278d000a,0x278f000a,0x2791000a,0x2793000a,0x2795000a,0x2797000a,0x2799000a,0x279b000a,0x279f000a,0x27a3000a,0x27a7000a,0x27ab000a,0x27af000a,0x27b3000a,0x27b7000a, -0x27bb000a,0x27bf000a,0x27c3000a,0x27c7000a,0x27cb000a,0x27cf000a,0x27d3000a,0x27d8000a,0x27dd000a,0x27e2000a,0x27e7000a,0x27ec000a,0x27f1000a,0x27f6000a,0x27fb000a,0x2800000a, -0x2805000a,0x280a000a,0x280f000a,0x2814000a,0x2819000a,0x281e000a,0x2826000a,0,0x282d000a,0x2831000a,0x2835000a,0x2839000a,0x283d000a,0x2841000a,0x2845000a,0x2849000a, -0x284d000a,0x2851000a,0x2855000a,0x2859000a,0x285d000a,0x2861000a,0x2865000a,0x2869000a,0x286d000a,0x2871000a,0x2875000a,0x2879000a,0x287d000a,0x2881000a,0x2885000a,0x2889000a, -0x288d000a,0x2891000a,0x2895000a,0x2899000a,0x289d000a,0x28a1000a,0x28a5000a,0x28a9000a,0x28ea000a,0x28ec000a,0x28ee000a,0x28f0000a,0x28f2000a,0x28f4000a,0x28f6000a,0x28f8000a, -0x28fa000a,0x28fc000a,0x28fe000a,0x2900000a,0x2902000a,0x2904000a,0x2906000a,0x2909000a,0x290c000a,0x290f000a,0x2912000a,0x2915000a,0x2918000a,0x291b000a,0x291e000a,0x2921000a, -0x2924000a,0x2927000a,0x292a000a,0x292d000a,0x2930000a,0x2936000a,0x293b000a,0,0x293e000a,0x2940000a,0x2942000a,0x2944000a,0x2946000a,0x2948000a,0x294a000a,0x294c000a, -0x294e000a,0x2950000a,0x2952000a,0x2954000a,0x2956000a,0x2958000a,0x295a000a,0x295c000a,0x295e000a,0x2960000a,0x2962000a,0x2964000a,0x2966000a,0x2968000a,0x296a000a,0x296c000a, -0x296e000a,0x2970000a,0x2972000a,0x2974000a,0x2976000a,0x2978000a,0x297a000a,0x297c000a,0x297e000a,0x2980000a,0x2982000a,0x2984000a,0x2986000a,0x2988000a,0x298a000a,0x298c000a, -0x298e000a,0x2990000a,0x2992000a,0x2994000a,0x2996000a,0x2998000a,0x299a000a,0x299c000a,0x299e000a,0x29a0000a,0x29a3000a,0x29a6000a,0x29a9000a,0x29ac000a,0x29af000a,0x29b2000a, -0x29b5000a,0x29b8000a,0x29bb000a,0x29be000a,0x29c1000a,0x29c4000a,0x29c7000a,0x29ca000a,0x2a18000a,0x2a1a000a,0x2a1c000a,0x2a1e000a,0x2a20000a,0x2a22000a,0x2a24000a,0x2a26000a, -0x2a28000a,0x2a2a000a,0x2a2c000a,0x2a2e000a,0x2a30000a,0x2a32000a,0x2a34000a,0x2a36000a,0x2a38000a,0x2a3a000a,0x2a3c000a,0x2a3e000a,0x2a40000a,0x2a42000a,0x2a44000a,0x2a46000a, -0x2a48000a,0x2a4a000a,0x2a4c000a,0x2a4e000a,0x2a50000a,0x2a52000a,0x2a54000a,0,0x2a56000a,0x2a5c000a,0x2a61000a,0x2a67000a,0x2a6b000a,0x2a72000a,0x2a76000a,0x2a7a000a, -0x2a82000a,0x2a87000a,0x2a8b000a,0x2a8f000a,0x2a93000a,0x2a98000a,0x2a9d000a,0x2aa2000a,0x2aa7000a,0x2aad000a,0x2ab2000a,0x2ab7000a,0x2abe000a,0x2ac1000a,0x2ac8000a,0x2acf000a, -0x2ad5000a,0x2ada000a,0x2ae1000a,0x2ae8000a,0x2aed000a,0x2af1000a,0x2af5000a,0x2afb000a,0x2b00000a,0x2b06000a,0x2b0d000a,0x2b11000a,0x2b15000a,0x2b1a000a,0x2b1e000a,0x2b22000a, -0x2b25000a,0x2b28000a,0x2b2c000a,0x2b30000a,0x2b37000a,0x2b3c000a,0x2b42000a,0x2b49000a,0x2b4e000a,0x2b52000a,0x2b56000a,0x2b5e000a,0x2b63000a,0x2b6a000a,0x2b6e000a,0x2b74000a, -0x2b78000a,0x2b7d000a,0x2b81000a,0x2b86000a,0x2b8d000a,0x2b92000a,0x2b98000a,0x2b9d000a,0x2ba0000a,0x2ba7000a,0x2bab000a,0x2baf000a,0x2bb4000a,0x2bb8000a,0x2bbc000a,0x2bc0000a, -0x2bc6000a,0x2bcb000a,0x2bce000a,0x2bd5000a,0x2bda000a,0x2be0000a,0x2be5000a,0x2beb000a,0x2bef000a,0x2bf3000a,0x2bf8000a,0x2bfb000a,0x2c00000a,0x2c06000a,0x2c09000a,0x2c10000a, -0x2c14000a,0x2c17000a,0x2c1a000a,0x2c1d000a,0x2c20000a,0x2c23000a,0x2c26000a,0x2c29000a,0x2d3c000a,0x2d3f000a,0x2d42000a,0x2d45000a,0x2d48000a,0x2d4b000a,0x2d4e000a,0x2d51000a, -0x2d54000a,0x2d57000a,0x2d5b000a,0x2d5f000a,0x2d63000a,0x2d67000a,0x2d6b000a,0x2d6f000a,0x2d73000a,0x2d77000a,0x2d7b000a,0x2d7f000a,0x2d83000a,0x2d87000a,0x2d8b000a,0x2d8f000a, -0x2d93000a,0x2d97000a,0x2d9b000a,0x2d9f000a,0x2da3000a,0x2da7000a,0x2dab000a,0x2daf000a,0x2e10000a,0x2e12000a,0x2e14000a,0x2e16000a,0x2e18000a,0x2e1a000a,0x2e1c000a,0x2e1e000a, -0x2e20000a,0x2e22000a,0x2e24000a,0x2e26000a,0x2e28000a,0x2e2a000a,0x2e2c000a,0x2e2e000a,0x2e30000a,0x2e32000a,0x2e34000a,0x2e36000a,0x2e38000a,0x2e3a000a,0x2e3c000a,0x2e3e000a, -0x2e40000a,0x2e42000a,0x2e44000a,0x2e46000a,0x2e48000a,0x2e4a000a,0x2e4c000a,0x2e4e000a,0x2e50000a,0x2e52000a,0x2e54000a,0x2e56000a,0x2e58000a,0x2e5a000a,0x2e5c000a,0x2e5e000a, -0x2e60000a,0x2e62000a,0x2e64000a,0x2e66000a,0x2e68000a,0x2e6a000a,0x2e6c000a,0x2e6e000a,0x2e70000a,0x2e72000a,0x2e74000a,0x2e76000a,0x2e78000a,0x2e7a000a,0x2e7c000a,0x2e7e000a, -0x2e80000a,0x2e82000a,0x2e84000a,0x2e86000a,0x2e88000a,0x2e8a000a,0x2e8c000a,0x2e8e000a,0x2e90000a,0x2e92000a,0x2e94000a,0x2e96000a,0x2e98000a,0x2e9c000a,0x2ea0000a,0x2ea2000a, -0x2ea4000a,0x2ea6000a,0x2ea8000a,0x2eaa000a,0x2eac000a,0x2eae000a,0x2eb0000a,0x2eb2000a,0x2eb4000a,0x2eb8000a,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2ebc000a, -0x2ebe000a,0x2ec0000a,0x2ec2000a,0x2ec4000a,0x2ec6000a,0x2ec8000a,0x2eca000a,0x2ecc000a,0x2ece000a,0x2ed0000a,0x2ed3000a,0x2ed5000a,0x2ed7000a,0x2ed9000a,0x2edb000a,0x2edd000a, -0x2edf000a,0x2ee1000a,0x2ee3000a,0x2ee5000a,0x2ee7000a,0x2ee9000a,0x2eeb000a,0x2eef000a,0x2ef3000a,0x2ef7000a,0x2efb000a,0x2eff000a,0x2f03000a,0x2f07000a,0x2f0b000a,0x2f0f000a, -0x2f13000a,0x2f17000a,0x2f1b000a,0x2f1f000a,0x2f23000a,0x2f27000a,0x2f2b000a,0x2f2f000a,0x2f33000a,0x2f35000a,0x2f37000a,0x2f39000a,0x2f3b000a,0x2f3f000a,0x2f43000a,0x2f47000a, -0x2f4b000a,0x2f4f000a,0x2f52000a,0x2f55000a,0x2f58000a,0x2f5b000a,0x2f5e000a,0x2f61000a,0x2f64000a,0x2f67000a,0x2f6a000a,0x2f6d000a,0x2f70000a,0x2f73000a,0x2f76000a,0x2f79000a, -0x2f7c000a,0x2f7f000a,0x2f82000a,0x2f85000a,0x2f88000a,0x2f8b000a,0x2f8e000a,0x2f91000a,0x2f94000a,0x2f97000a,0x2f9a000a,0x2f9d000a,0x2fa0000a,0x2fa3000a,0x2fa6000a,0x2fa9000a, -0x2fac000a,0x2faf000a,0x2fb2000a,0x2fb5000a,0x2fb8000a,0x2fbb000a,0x2fbe000a,0x2fc1000a,0x2fc4000a,0x2fc7000a,0x2fca000a,0x2fcd000a,0x2fd0000a,0x2fd3000a,0x2fd6000a,0x2fd9000a, -0x2fdc000a,0x2fdf000a,0x2fe2000a,0x2fe5000a,0x2fe8000a,0x2feb000a,0x2fee000a,0x2ff1000a,0x2ff4000a,0x2ff7000a,0x2ffa000a,0x2ffd000a,0x3000000a,0x3003000a,0x3006000a,0x3009000a, -0x300c000a,0x300f000a,0x3012000a,0x3015000a,0x3018000a,0x301b000a,0x301e000a,0x3021000a,0x3024000a,0x3027000a,0x302a000a,0x302d000a,0x3030000a,0x3033000a,0x3036000a,0x3039000a, -0x303c000a,0x303f000a,0x3042000a,0x3045000a,0x3048000a,0x304b000a,0x304e000a,0x3051000a,0x3055000a,0x3059000a,0x305d000a,0x3062000a,0x3067000a,0x306c000a,0x3071000a,0x3076000a, -0x307b000a,0x307f000a,0x3083000a,0x3087000a,0x308b000a,0x308f000a,0x3093000a,0x3096000a,0x3099000a,0x309c000a,0x309f000a,0x30a2000a,0x30a5000a,0x30a8000a,0x30ab000a,0x30ae000a, -0x30b1000a,0x30b4000a,0x30b7000a,0x30ba000a,0x30bd000a,0x30c0000a,0x30c3000a,0x30c6000a,0x30c9000a,0x30cc000a,0x30cf000a,0x30d2000a,0x30d5000a,0x30d8000a,0x30db000a,0x30de000a, -0x30e1000a,0x30e4000a,0x30e7000a,0x30ea000a,0x30ed000a,0x30f0000a,0x30f3000a,0x30f6000a,0x30f9000a,0x30fc000a,0x30ff000a,0x3102000a,0x3105000a,0x3109000a,0x310c000a,0x310f000a, -0x3112000a,0x3115000a,0x3118000a,0x311b000a,0x311f000a,0x3123000a,0x3127000a,0x312b000a,0x312f000a,0x3132000a,0x3135000a,0x3138000a,0x313b000a,0x313e000a,0x3141000a,0x3144000a, -0x3147000a,0x314a000a,0x314d000a,0x3150000a,0x3153000a,0x3156000a,0x3159000a,0x315c000a,0x315f000a,0x3162000a,0x3165000a,0x3168000a,0x316b000a,0x316e000a,0x3171000a,0x3174000a, -0x3177000a,0x317a000a,0x317d000a,0x3180000a,0x3183000a,0x3186000a,0x3189000a,0x318c000a,0x318f000a,0x3192000a,0x3195000a,0x3198000a,0x319b000a,0x319e000a,0x31a1000a,0x31a4000a, -0x31a7000a,0x31aa000a,0x31ad000a,0x31b0000a,0x31b3000a,0x31b6000a,0x31b9000a,0x31bc000a,0x31bf000a,0x31c2000a,0x31c5000a,0x31c8000a,0x31cb000a,0x31ce000a,0x31d1000a,0x31d4000a, -0x31d7000a,0x31da000a,0x31dd000a,0x31e0000a,0x31e3000a,0x31e6000a,0x31ea000a,0x31ed000a,0x31f0000a,0x31f3000a,0x31f6000a,0x31f9000a,0x31fd000a,0x3201000a,0x3204000a,0x3207000a, -0x320a000a,0x320d000a,0x3210000a,0x3213000a,0x3216000a,0x3219000a,0x321c000a,0x321f000a,0x3222000a,0x3225000a,0x3228000a,0x322b000a,0x322e000a,0x3231000a,0x3234000a,0x3239000a, -0x323e000a,0x3243000a,0x3246000a,0x3249000a,0x324c000a,0x324f000a,0x3252000a,0x3255000a,0x3258000a,0x325b000a,0x325e000a,0x3261000a,0x3264000a,0x3267000a,0x326a000a,0x326d000a, -0x3270000a,0x3273000a,0x3276000a,0x3279000a,0x327c000a,0x327f000a,0x3282000a,0x3285000a,0x3288000a,0x328b000a,0x328e000a,0x3291000a,0x3294000a,0x3297000a,0x329a000a,0x329d000a, -0x32a0000a,0x32a3000a,0x32a6000a,0x32a9000a,0x32ac000a,0x32af000a,0x32b2000a,0x32b5000a,0x32b8000a,0x32bb000a,0x32be000a,0x32c1000a,0x32c4000a,0x32c7000a,0x32ca000a,0x32cd000a, -0x32d0000a,0x32d3000a,0x32d6000a,0x32d9000a,0x32dc000a,0x32df000a,0x32e2000a,0x32e5000a,0x32e8000a,0x32eb000a,0x32ee000a,0x32f1000a,0x32f4000a,0x32f7000a,0x32fa000a,0x32fd000a, -0x3300000a,0x3303000a,0x3306000a,0x3309000a,0x330c000a,0x330f000a,0x3312000a,0x3315000a,0x3318000a,0x331c000a,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x3320000a,0x3324000a,0x3328000a,0x332c000a, -0x3330000a,0x3334000a,0x3338000a,0x333c000a,0x3340000a,0x3344000a,0x3348000a,0x334c000a,0x3350000a,0x3354000a,0x3358000a,0x335c000a,0x3360000a,0x3364000a,0x3368000a,0x336c000a, -0x3370000a,0x3374000a,0x3378000a,0x337c000a,0x3380000a,0x3384000a,0x3388000a,0x338c000a,0x3390000a,0x3394000a,0x3398000a,0x339c000a,0x33a0000a,0x33a4000a,0x33a8000a,0x33ac000a, -0x33b0000a,0x33b4000a,0x33b8000a,0x33bc000a,0x33c0000a,0x33c4000a,0x33c8000a,0x33cc000a,0x33d0000a,0x33d4000a,0x33d8000a,0x33dc000a,0x33e0000a,0x33e4000a,0x33e8000a,0x33ec000a, -0x33f0000a,0x33f4000a,0x33f8000a,0x33fc000a,0x3400000a,0x3404000a,0x3408000a,0x340c000a,0x3410000a,0x3414000a,0x3418000a,0x341c000a,0,0,0x3420000a,0x3424000a, -0x3428000a,0x342c000a,0x3430000a,0x3434000a,0x3438000a,0x343c000a,0x3440000a,0x3444000a,0x3448000a,0x344c000a,0x3450000a,0x3454000a,0x3458000a,0x345c000a,0x3460000a,0x3464000a, -0x3468000a,0x346c000a,0x3470000a,0x3474000a,0x3478000a,0x347c000a,0x3480000a,0x3484000a,0x3488000a,0x348c000a,0x3490000a,0x3494000a,0x3498000a,0x349c000a,0x34a0000a,0x34a4000a, -0x34a8000a,0x34ac000a,0x34b0000a,0x34b4000a,0x34b8000a,0x34bc000a,0x34c0000a,0x34c4000a,0x34c8000a,0x34cc000a,0x34d0000a,0x34d4000a,0x34d8000a,0x34dc000a,0x34e0000a,0x34e4000a, -0x34e8000a,0x34ec000a,0x34f0000a,0x34f4000a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x34f8000a,0x34fc000a,0x3500000a,0x3505000a, -0x350a000a,0x350f000a,0x3514000a,0x3519000a,0x351e000a,0x3523000a,0x3527000a,0x353a000a,0x3543000a,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x3548000a,0x354a000a,0x354c000a,0x354e000a, -0x3550000a,0x3552000a,0x3554000a,0x3556000a,0x3558000a,0x355a000a,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600, -0,0,0,0,0,0,0,0,0,0,0,0,0x355e000a,0x3561000a,0x3563000a,0x3565000a, -0x3567000a,0x3569000a,0x356b000a,0x356d000a,0x356f000a,0x3571000a,0x3573000a,0x3575000a,0x3577000a,0x3579000a,0x357b000a,0x357d000a,0x357f000a,0x3581000a,0x3583000a,0x3585000a, -0x3587000a,0,0,0x3589000a,0x358b000a,0x358d000a,0x3591000a,0x3595000a,0x3599000a,0x359d000a,0x359f000a,0x35a1000a,0x35a3000a,0x35a5000a,0x35a7000a,0, -0x35a9000a,0x35ab000a,0x35ad000a,0x35af000a,0x35b1000a,0x35b3000a,0x35b5000a,0x35b7000a,0x35b9000a,0x35bb000a,0x35bd000a,0x35bf000a,0x35c1000a,0x35c3000a,0x35c5000a,0x35c7000a, -0x35c9000a,0x35cb000a,0x35cd000a,0,0x35cf000a,0x35d1000a,0x35d3000a,0x35d5000a,0,0,0,0,0x35d7000a,0x35db000a,0x35df000a,0, -0x35e3000a,0,0x35e7000a,0x35eb000a,0x35ef000a,0x35f3000a,0x35f7000a,0x35fb000a,0x35ff000a,0x3603000a,0x3607000a,0x360b000a,0x360f000a,0x3611000a,0x3615000a,0x3619000a, -0x361d000a,0x3621000a,0x3625000a,0x3629000a,0x362d000a,0x3631000a,0x3635000a,0x3639000a,0x363d000a,0x3641000a,0x3643000a,0x3645000a,0x3647000a,0x3649000a,0x364b000a,0x364d000a, -0x364f000a,0x3651000a,0x3653000a,0x3655000a,0x3657000a,0x3659000a,0x365b000a,0x365d000a,0x365f000a,0x3661000a,0x3663000a,0x3665000a,0x3667000a,0x3669000a,0x366b000a,0x366d000a, -0x366f000a,0x3671000a,0x3673000a,0x3675000a,0x3677000a,0x3679000a,0x367b000a,0x367d000a,0x367f000a,0x3681000a,0x3683000a,0x3685000a,0x3687000a,0x3689000a,0x368b000a,0x368d000a, -0x368f000a,0x3691000a,0x3693000a,0x3695000a,0x3697000a,0x3699000a,0x369b000a,0x369d000a,0x369f000a,0x36a1000a,0x36a3000a,0x36a5000a,0x36a7000a,0x36a9000a,0x36ab000a,0x36ad000a, -0x36af000a,0x36b1000a,0x36b3000a,0x36b5000a,0x36b7000a,0x36b9000a,0x36bb000a,0x36bd000a,0x36bf000a,0x36c1000a,0x36c3000a,0x36c5000a,0x36c7000a,0x36c9000a,0x36cb000a,0x36cd000a, -0x36cf000a,0x36d1000a,0x36d3000a,0x36d5000a,0x36d7000a,0x36d9000a,0x36db000a,0x36dd000a,0x36df000a,0x36e1000a,0x36e3000a,0x36e5000a,0x36e7000a,0x36e9000a,0x36eb000a,0x36ed000a, -0x36ef000a,0x36f1000a,0x36f3000a,0x36f5000a,0x36f7000a,0x36f9000a,0x36fb000a,0x36fd000a,0x36ff000a,0x3701000a,0x3703000a,0x3705000a,0x3707000a,0x3709000a,0x370b000a,0x370d000a, -0x370f000a,0x3711000a,0x3716000a,0x371b000a,0x3720000a,0x3725000a,0x372a000a,0x372f000a,0x3732000a,0,0,0,0,0x3735000a,0x3737000a,0x3739000a, -0x373b000a,0x373d000a,0x373f000a,0x3741000a,0x3743000a,0x3745000a,0x3747000a,0x3749000a,0x374b000a,0x374d000a,0x374f000a,0x3751000a,0x3753000a,0x3755000a,0x3757000a,0x3759000a, -0x375b000a,0x375d000a,0x375f000a,0x3761000a,0x3763000a,0x3765000a,0x3767000a,0x3769000a,0x376b000a,0x376d000a,0x376f000a,0x3771000a,0x3773000a,0x3775000a,0x3777000a,0x3779000a, -0x377b000a,0x377d000a,0x377f000a,0x3781000a,0x3783000a,0x3785000a,0x3787000a,0x3789000a,0x378b000a,0x378d000a,0x378f000a,0x3791000a,0x3793000a,0x3795000a,0x3797000a,0x3799000a, -0x379b000a,0x379d000a,0x379f000a,0x37a1000a,0x37a3000a,0x37a5000a,0x37a7000a,0x37a9000a,0x37ab000a,0x37ad000a,0x37af000a,0x37b1000a,0x37b3000a,0x37b5000a,0x37b7000a,0x37b9000a, -0x37bb000a,0x37bd000a,0x37bf000a,0x37c1000a,0x37c3000a,0x37c5000a,0x37c7000a,0x37c9000a,0x37cb000a,0x37cd000a,0x37cf000a,0x37d1000a,0x37d3000a,0x37d5000a,0x37d7000a,0x37d9000a, -0x37db000a,0x37dd000a,0x37df000a,0x37e1000a,0x37e3000a,0x37e5000a,0x37e7000a,0x37e9000a,0x37eb000a,0x37ed000a,0x37ef000a,0x37f1000a,0x37f3000a,0x37f5000a,0x37f7000a,0x37f9000a, -0x37fb000a,0x37fd000a,0x37ff000a,0x3801000a,0x3803000a,0x3805000a,0x3807000a,0x3809000a,0x380b000a,0x380d000a,0x380f000a,0x3811000a,0x3813000a,0x3815000a,0x3817000a,0x3819000a, -0x381b000a,0x381d000a,0x381f000a,0x3821000a,0x3823000a,0x3825000a,0x3827000a,0x3829000a,0x382b000a,0x382d000a,0x382f000a,0x3831000a,0x3833000a,0x3835000a,0x3837000a,0x3839000a, -0x383b000a,0x383d000a,0x383f000a,0x3841000a,0x3843000a,0x3845000a,0x3847000a,0x3849000a,0x384b000a,0x384d000a,0x384f000a,0x3851000a,0x3853000a,0x3855000a,0x3857000a,0x3859000a, -0x385b000a,0x385d000a,0x385f000a,0x3861000a,0x3863000a,0x3865000a,0x3867000a,0x3869000a,0x386b000a,0x386d000a,0x386f000a,0x3872000a,0x3875000a,0x3877000a,0x3879000a,0x387b000a, -0x387d000a,0x387f000a,0x3881000a,0x3883000a,0x3885000a,0x3887000a,0x3889000a,0x388b000a,0x388d000a,0x388f000a,0x3891000a,0x3893000a,0x3895000a,0x3897000a,0x3899000a,0x389b000a, -0x389d000a,0x389f000a,0x38a1000a,0x38a3000a,0x38a5000a,0x38a7000a,0x38a9000a,0x38ab000a,0x38ad000a,0x38af000a,0x38b1000a,0,0,0,0x38b3000a,0x38b5000a, -0x38b7000a,0x38b9000a,0x38bb000a,0x38bd000a,0,0,0x38bf000a,0x38c1000a,0x38c3000a,0x38c5000a,0x38c7000a,0x38c9000a,0,0,0x38cb000a,0x38cd000a, -0x38cf000a,0x38d1000a,0x38d3000a,0x38d5000a,0,0,0x38d7000a,0x38d9000a,0x38db000a,0,0,0,0x38dd000a,0x38df000a,0x38e1000a,0x38e3000a, -0x38e7000a,0x38e9000a,0x38eb000a,0,0x38ed000a,0x38ef000a,0x38f1000a,0x38f3000a,0x38f5000a,0x38f7000a,0x38f9000a,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x3cc7000a,0x3cc9000a,0x3ccb000a,0x3ccd000a, -0x3ccf000a,0x3cd1000a,0x3cd3000a,0x3cd5000a,0x3cd7000a,0x3cd9000a,0,0,0,0,0x3cdb000a,0x3cdd000a,0x3cdf000a,0x3ce1000a,0x3ce3000a,0x3ce5000a, -0x3ce7000a,0x3ce9000a,0x3ceb000a,0x3ced000a,0x3cef000a,0x3cf1000a,0x3cf3000a,0x3cf5000a,0x3cf7000a,0x3cf9000a,0x3cfb000a,0x3cfd000a,0x3cff000a,0x3d01000a,0x3d03000a,0x3d05000a, -0x3d07000a,0x3d09000a,0x3d0b000a,0x3d0d000a,0x3d0f000a,0x3d11000a,0x3d13000a,0x3d15000a,0x3d17000a,0x3d19000a,0x3d1b000a,0x3d1d000a,0x3d1f000a,0x3d21000a,0x3d23000a,0x3d25000a, -0x3d27000a,0x3d29000a,0x3d2b000a,0x3d2d000a,0x3d2f000a,0x3d31000a,0x3d33000a,0x3d35000a,0x3d37000a,0x3d39000a,0x3d3b000a,0x3d3d000a,0,0x3d400040,0x3daf0040,0x3d410040, -0x3d500040,0x3d420040,0x3db10040,0x3d520040,0x3d540040,0x3d430040,0x3d560040,0x3d580040,0x3d5a0040,0x3db30040,0x3d440040,0x3d450040,0x3db50040,0,0x3d5c0040,0x3d5e0040, -0x3d600040,0x3d460040,0x3db70040,0x3d620040,0x3db90040,0x3d470040,0x3d640040,0,0,0,0,0,0,0x3d480040,0x3db00040,0x3d490040, -0x3d510040,0x3d4a0040,0x3db20040,0x3d530040,0x3d550040,0x3d4b0040,0x3d570040,0x3d590040,0x3d5b0040,0x3db40040,0x3d4c0040,0x3d4d0040,0x3db60040,0,0x3d5d0040,0x3d5f0040, -0x3d610040,0x3d4e0040,0x3db80040,0x3d630040,0x3dba0040,0x3d4f0040,0x3d650040,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x3d690040,0,0,0,0,0, +0,0,0x26d3000a,0,0x26d5000a,0x26d7000a,0x26d9000a,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x26e9000a,0x26eb000a,0x26ed000a,0x26ef000a,0x26f1000a,0x26f3000a,0x26f5000a, +0x26f7000a,0x26f9000a,0x26fb000a,0x26fd000a,0x26ff000a,0x2701000a,0x2703000a,0x2705000a,0x2707000a,0x2709000a,0x270b000a,0x270d000a,0x270f000a,0x2711000a,0x2713000a,0x2715000a, +0x2717000a,0x2719000a,0x271b000a,0x271d000a,0x271f000a,0x2721000a,0x2723000a,0x2725000a,0x2727000a,0x2729000a,0x272b000a,0x272d000a,0x272f000a,0x2731000a,0x2733000a,0x2735000a, +0x2737000a,0x2739000a,0x273b000a,0x273d000a,0x273f000a,0x2741000a,0x2743000a,0x2745000a,0x2747000a,0x2749000a,0x274b000a,0x274d000a,0x274f000a,0x2751000a,0x2753000a,0x2755000a, +0x2757000a,0x2759000a,0x275b000a,0x275d000a,0x275f000a,0x2761000a,0x2763000a,0x2765000a,0x2767000a,0x2769000a,0x276b000a,0x276d000a,0x276f000a,0x2771000a,0x2773000a,0x2775000a, +0x2777000a,0x2779000a,0x277b000a,0x277d000a,0x277f000a,0x2781000a,0x2783000a,0x2785000a,0x2787000a,0x2789000a,0x278b000a,0x278d000a,0x278f000a,0x2791000a,0x2793000a,0x2795000a, +0x2797000a,0x2799000a,0x279b000a,0x279d000a,0x279f000a,0x27a1000a,0x27a3000a,0,0,0,0x27a5000a,0x27a7000a,0x27a9000a,0x27ab000a,0x27ad000a,0x27af000a, +0x27b1000a,0x27b3000a,0x27b5000a,0x27b7000a,0x27b9000a,0x27bb000a,0x27bd000a,0x27bf000a,0x27c1000a,0x27c5000a,0x27c9000a,0x27cd000a,0x27d1000a,0x27d5000a,0x27d9000a,0x27dd000a, +0x27e1000a,0x27e5000a,0x27e9000a,0x27ed000a,0x27f1000a,0x27f5000a,0x27f9000a,0x27fe000a,0x2803000a,0x2808000a,0x280d000a,0x2812000a,0x2817000a,0x281c000a,0x2821000a,0x2826000a, +0x282b000a,0x2830000a,0x2835000a,0x283a000a,0x283f000a,0x2844000a,0x284c000a,0,0x2853000a,0x2857000a,0x285b000a,0x285f000a,0x2863000a,0x2867000a,0x286b000a,0x286f000a, +0x2873000a,0x2877000a,0x287b000a,0x287f000a,0x2883000a,0x2887000a,0x288b000a,0x288f000a,0x2893000a,0x2897000a,0x289b000a,0x289f000a,0x28a3000a,0x28a7000a,0x28ab000a,0x28af000a, +0x28b3000a,0x28b7000a,0x28bb000a,0x28bf000a,0x28c3000a,0x28c7000a,0x28cb000a,0x28cf000a,0x2910000a,0x2912000a,0x2914000a,0x2916000a,0x2918000a,0x291a000a,0x291c000a,0x291e000a, +0x2920000a,0x2922000a,0x2924000a,0x2926000a,0x2928000a,0x292a000a,0x292c000a,0x292f000a,0x2932000a,0x2935000a,0x2938000a,0x293b000a,0x293e000a,0x2941000a,0x2944000a,0x2947000a, +0x294a000a,0x294d000a,0x2950000a,0x2953000a,0x2956000a,0x295c000a,0x2961000a,0,0x2964000a,0x2966000a,0x2968000a,0x296a000a,0x296c000a,0x296e000a,0x2970000a,0x2972000a, +0x2974000a,0x2976000a,0x2978000a,0x297a000a,0x297c000a,0x297e000a,0x2980000a,0x2982000a,0x2984000a,0x2986000a,0x2988000a,0x298a000a,0x298c000a,0x298e000a,0x2990000a,0x2992000a, +0x2994000a,0x2996000a,0x2998000a,0x299a000a,0x299c000a,0x299e000a,0x29a0000a,0x29a2000a,0x29a4000a,0x29a6000a,0x29a8000a,0x29aa000a,0x29ac000a,0x29ae000a,0x29b0000a,0x29b2000a, +0x29b4000a,0x29b6000a,0x29b8000a,0x29ba000a,0x29bc000a,0x29be000a,0x29c0000a,0x29c2000a,0x29c4000a,0x29c6000a,0x29c9000a,0x29cc000a,0x29cf000a,0x29d2000a,0x29d5000a,0x29d8000a, +0x29db000a,0x29de000a,0x29e1000a,0x29e4000a,0x29e7000a,0x29ea000a,0x29ed000a,0x29f0000a,0x2a3e000a,0x2a40000a,0x2a42000a,0x2a44000a,0x2a46000a,0x2a48000a,0x2a4a000a,0x2a4c000a, +0x2a4e000a,0x2a50000a,0x2a52000a,0x2a54000a,0x2a56000a,0x2a58000a,0x2a5a000a,0x2a5c000a,0x2a5e000a,0x2a60000a,0x2a62000a,0x2a64000a,0x2a66000a,0x2a68000a,0x2a6a000a,0x2a6c000a, +0x2a6e000a,0x2a70000a,0x2a72000a,0x2a74000a,0x2a76000a,0x2a78000a,0x2a7a000a,0,0x2a7c000a,0x2a82000a,0x2a87000a,0x2a8d000a,0x2a91000a,0x2a98000a,0x2a9c000a,0x2aa0000a, +0x2aa8000a,0x2aad000a,0x2ab1000a,0x2ab5000a,0x2ab9000a,0x2abe000a,0x2ac3000a,0x2ac8000a,0x2acd000a,0x2ad3000a,0x2ad8000a,0x2add000a,0x2ae4000a,0x2ae7000a,0x2aee000a,0x2af5000a, +0x2afb000a,0x2b00000a,0x2b07000a,0x2b0e000a,0x2b13000a,0x2b17000a,0x2b1b000a,0x2b21000a,0x2b26000a,0x2b2c000a,0x2b33000a,0x2b37000a,0x2b3b000a,0x2b40000a,0x2b44000a,0x2b48000a, +0x2b4b000a,0x2b4e000a,0x2b52000a,0x2b56000a,0x2b5d000a,0x2b62000a,0x2b68000a,0x2b6f000a,0x2b74000a,0x2b78000a,0x2b7c000a,0x2b84000a,0x2b89000a,0x2b90000a,0x2b94000a,0x2b9a000a, +0x2b9e000a,0x2ba3000a,0x2ba7000a,0x2bac000a,0x2bb3000a,0x2bb8000a,0x2bbe000a,0x2bc3000a,0x2bc6000a,0x2bcd000a,0x2bd1000a,0x2bd5000a,0x2bda000a,0x2bde000a,0x2be2000a,0x2be6000a, +0x2bec000a,0x2bf1000a,0x2bf4000a,0x2bfb000a,0x2c00000a,0x2c06000a,0x2c0b000a,0x2c11000a,0x2c15000a,0x2c19000a,0x2c1e000a,0x2c21000a,0x2c26000a,0x2c2c000a,0x2c2f000a,0x2c36000a, +0x2c3a000a,0x2c3d000a,0x2c40000a,0x2c43000a,0x2c46000a,0x2c49000a,0x2c4c000a,0x2c4f000a,0x2d62000a,0x2d65000a,0x2d68000a,0x2d6b000a,0x2d6e000a,0x2d71000a,0x2d74000a,0x2d77000a, +0x2d7a000a,0x2d7d000a,0x2d81000a,0x2d85000a,0x2d89000a,0x2d8d000a,0x2d91000a,0x2d95000a,0x2d99000a,0x2d9d000a,0x2da1000a,0x2da5000a,0x2da9000a,0x2dad000a,0x2db1000a,0x2db5000a, +0x2db9000a,0x2dbd000a,0x2dc1000a,0x2dc5000a,0x2dc9000a,0x2dcd000a,0x2dd1000a,0x2dd5000a,0x2e36000a,0x2e38000a,0x2e3a000a,0x2e3c000a,0x2e3e000a,0x2e40000a,0x2e42000a,0x2e44000a, +0x2e46000a,0x2e48000a,0x2e4a000a,0x2e4c000a,0x2e4e000a,0x2e50000a,0x2e52000a,0x2e54000a,0x2e56000a,0x2e58000a,0x2e5a000a,0x2e5c000a,0x2e5e000a,0x2e60000a,0x2e62000a,0x2e64000a, +0x2e66000a,0x2e68000a,0x2e6a000a,0x2e6c000a,0x2e6e000a,0x2e70000a,0x2e72000a,0x2e74000a,0x2e76000a,0x2e78000a,0x2e7a000a,0x2e7c000a,0x2e7e000a,0x2e80000a,0x2e82000a,0x2e84000a, +0x2e86000a,0x2e88000a,0x2e8a000a,0x2e8c000a,0x2e8e000a,0x2e90000a,0x2e92000a,0x2e94000a,0x2e96000a,0x2e98000a,0x2e9a000a,0x2e9c000a,0x2e9e000a,0x2ea0000a,0x2ea2000a,0x2ea4000a, +0x2ea6000a,0x2ea8000a,0x2eaa000a,0x2eac000a,0x2eae000a,0x2eb0000a,0x2eb2000a,0x2eb4000a,0x2eb6000a,0x2eb8000a,0x2eba000a,0x2ebc000a,0x2ebe000a,0x2ec2000a,0x2ec6000a,0x2ec8000a, +0x2eca000a,0x2ecc000a,0x2ece000a,0x2ed0000a,0x2ed2000a,0x2ed4000a,0x2ed6000a,0x2ed8000a,0x2eda000a,0x2ede000a,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2ee2000a, +0x2ee4000a,0x2ee6000a,0x2ee8000a,0x2eea000a,0x2eec000a,0x2eee000a,0x2ef0000a,0x2ef2000a,0x2ef4000a,0x2ef6000a,0x2ef9000a,0x2efb000a,0x2efd000a,0x2eff000a,0x2f01000a,0x2f03000a, +0x2f05000a,0x2f07000a,0x2f09000a,0x2f0b000a,0x2f0d000a,0x2f0f000a,0x2f11000a,0x2f15000a,0x2f19000a,0x2f1d000a,0x2f21000a,0x2f25000a,0x2f29000a,0x2f2d000a,0x2f31000a,0x2f35000a, +0x2f39000a,0x2f3d000a,0x2f41000a,0x2f45000a,0x2f49000a,0x2f4d000a,0x2f51000a,0x2f55000a,0x2f59000a,0x2f5b000a,0x2f5d000a,0x2f5f000a,0x2f61000a,0x2f65000a,0x2f69000a,0x2f6d000a, +0x2f71000a,0x2f75000a,0x2f78000a,0x2f7b000a,0x2f7e000a,0x2f81000a,0x2f84000a,0x2f87000a,0x2f8a000a,0x2f8d000a,0x2f90000a,0x2f93000a,0x2f96000a,0x2f99000a,0x2f9c000a,0x2f9f000a, +0x2fa2000a,0x2fa5000a,0x2fa8000a,0x2fab000a,0x2fae000a,0x2fb1000a,0x2fb4000a,0x2fb7000a,0x2fba000a,0x2fbd000a,0x2fc0000a,0x2fc3000a,0x2fc6000a,0x2fc9000a,0x2fcc000a,0x2fcf000a, +0x2fd2000a,0x2fd5000a,0x2fd8000a,0x2fdb000a,0x2fde000a,0x2fe1000a,0x2fe4000a,0x2fe7000a,0x2fea000a,0x2fed000a,0x2ff0000a,0x2ff3000a,0x2ff6000a,0x2ff9000a,0x2ffc000a,0x2fff000a, +0x3002000a,0x3005000a,0x3008000a,0x300b000a,0x300e000a,0x3011000a,0x3014000a,0x3017000a,0x301a000a,0x301d000a,0x3020000a,0x3023000a,0x3026000a,0x3029000a,0x302c000a,0x302f000a, +0x3032000a,0x3035000a,0x3038000a,0x303b000a,0x303e000a,0x3041000a,0x3044000a,0x3047000a,0x304a000a,0x304d000a,0x3050000a,0x3053000a,0x3056000a,0x3059000a,0x305c000a,0x305f000a, +0x3062000a,0x3065000a,0x3068000a,0x306b000a,0x306e000a,0x3071000a,0x3074000a,0x3077000a,0x307b000a,0x307f000a,0x3083000a,0x3088000a,0x308d000a,0x3092000a,0x3097000a,0x309c000a, +0x30a1000a,0x30a5000a,0x30a9000a,0x30ad000a,0x30b1000a,0x30b5000a,0x30b9000a,0x30bc000a,0x30bf000a,0x30c2000a,0x30c5000a,0x30c8000a,0x30cb000a,0x30ce000a,0x30d1000a,0x30d4000a, +0x30d7000a,0x30da000a,0x30dd000a,0x30e0000a,0x30e3000a,0x30e6000a,0x30e9000a,0x30ec000a,0x30ef000a,0x30f2000a,0x30f5000a,0x30f8000a,0x30fb000a,0x30fe000a,0x3101000a,0x3104000a, +0x3107000a,0x310a000a,0x310d000a,0x3110000a,0x3113000a,0x3116000a,0x3119000a,0x311c000a,0x311f000a,0x3122000a,0x3125000a,0x3128000a,0x312b000a,0x312f000a,0x3132000a,0x3135000a, +0x3138000a,0x313b000a,0x313e000a,0x3141000a,0x3145000a,0x3149000a,0x314d000a,0x3151000a,0x3155000a,0x3158000a,0x315b000a,0x315e000a,0x3161000a,0x3164000a,0x3167000a,0x316a000a, +0x316d000a,0x3170000a,0x3173000a,0x3176000a,0x3179000a,0x317c000a,0x317f000a,0x3182000a,0x3185000a,0x3188000a,0x318b000a,0x318e000a,0x3191000a,0x3194000a,0x3197000a,0x319a000a, +0x319d000a,0x31a0000a,0x31a3000a,0x31a6000a,0x31a9000a,0x31ac000a,0x31af000a,0x31b2000a,0x31b5000a,0x31b8000a,0x31bb000a,0x31be000a,0x31c1000a,0x31c4000a,0x31c7000a,0x31ca000a, +0x31cd000a,0x31d0000a,0x31d3000a,0x31d6000a,0x31d9000a,0x31dc000a,0x31df000a,0x31e2000a,0x31e5000a,0x31e8000a,0x31eb000a,0x31ee000a,0x31f1000a,0x31f4000a,0x31f7000a,0x31fa000a, +0x31fd000a,0x3200000a,0x3203000a,0x3206000a,0x3209000a,0x320c000a,0x3210000a,0x3213000a,0x3216000a,0x3219000a,0x321c000a,0x321f000a,0x3223000a,0x3227000a,0x322a000a,0x322d000a, +0x3230000a,0x3233000a,0x3236000a,0x3239000a,0x323c000a,0x323f000a,0x3242000a,0x3245000a,0x3248000a,0x324b000a,0x324e000a,0x3251000a,0x3254000a,0x3257000a,0x325a000a,0x325f000a, +0x3264000a,0x3269000a,0x326c000a,0x326f000a,0x3272000a,0x3275000a,0x3278000a,0x327b000a,0x327e000a,0x3281000a,0x3284000a,0x3287000a,0x328a000a,0x328d000a,0x3290000a,0x3293000a, +0x3296000a,0x3299000a,0x329c000a,0x329f000a,0x32a2000a,0x32a5000a,0x32a8000a,0x32ab000a,0x32ae000a,0x32b1000a,0x32b4000a,0x32b7000a,0x32ba000a,0x32bd000a,0x32c0000a,0x32c3000a, +0x32c6000a,0x32c9000a,0x32cc000a,0x32cf000a,0x32d2000a,0x32d5000a,0x32d8000a,0x32db000a,0x32de000a,0x32e1000a,0x32e4000a,0x32e7000a,0x32ea000a,0x32ed000a,0x32f0000a,0x32f3000a, +0x32f6000a,0x32f9000a,0x32fc000a,0x32ff000a,0x3302000a,0x3305000a,0x3308000a,0x330b000a,0x330e000a,0x3311000a,0x3314000a,0x3317000a,0x331a000a,0x331d000a,0x3320000a,0x3323000a, +0x3326000a,0x3329000a,0x332c000a,0x332f000a,0x3332000a,0x3335000a,0x3338000a,0x333b000a,0x333e000a,0x3342000a,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x3346000a,0x334a000a,0x334e000a,0x3352000a, +0x3356000a,0x335a000a,0x335e000a,0x3362000a,0x3366000a,0x336a000a,0x336e000a,0x3372000a,0x3376000a,0x337a000a,0x337e000a,0x3382000a,0x3386000a,0x338a000a,0x338e000a,0x3392000a, +0x3396000a,0x339a000a,0x339e000a,0x33a2000a,0x33a6000a,0x33aa000a,0x33ae000a,0x33b2000a,0x33b6000a,0x33ba000a,0x33be000a,0x33c2000a,0x33c6000a,0x33ca000a,0x33ce000a,0x33d2000a, +0x33d6000a,0x33da000a,0x33de000a,0x33e2000a,0x33e6000a,0x33ea000a,0x33ee000a,0x33f2000a,0x33f6000a,0x33fa000a,0x33fe000a,0x3402000a,0x3406000a,0x340a000a,0x340e000a,0x3412000a, +0x3416000a,0x341a000a,0x341e000a,0x3422000a,0x3426000a,0x342a000a,0x342e000a,0x3432000a,0x3436000a,0x343a000a,0x343e000a,0x3442000a,0,0,0x3446000a,0x344a000a, +0x344e000a,0x3452000a,0x3456000a,0x345a000a,0x345e000a,0x3462000a,0x3466000a,0x346a000a,0x346e000a,0x3472000a,0x3476000a,0x347a000a,0x347e000a,0x3482000a,0x3486000a,0x348a000a, +0x348e000a,0x3492000a,0x3496000a,0x349a000a,0x349e000a,0x34a2000a,0x34a6000a,0x34aa000a,0x34ae000a,0x34b2000a,0x34b6000a,0x34ba000a,0x34be000a,0x34c2000a,0x34c6000a,0x34ca000a, +0x34ce000a,0x34d2000a,0x34d6000a,0x34da000a,0x34de000a,0x34e2000a,0x34e6000a,0x34ea000a,0x34ee000a,0x34f2000a,0x34f6000a,0x34fa000a,0x34fe000a,0x3502000a,0x3506000a,0x350a000a, +0x350e000a,0x3512000a,0x3516000a,0x351a000a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x351e000a,0x3522000a,0x3526000a,0x352b000a, +0x3530000a,0x3535000a,0x353a000a,0x353f000a,0x3544000a,0x3549000a,0x354d000a,0x3560000a,0x3569000a,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x356e000a,0x3570000a,0x3572000a,0x3574000a, +0x3576000a,0x3578000a,0x357a000a,0x357c000a,0x357e000a,0x3580000a,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600, +0,0,0,0,0,0,0,0,0,0,0,0,0x3584000a,0x3587000a,0x3589000a,0x358b000a, +0x358d000a,0x358f000a,0x3591000a,0x3593000a,0x3595000a,0x3597000a,0x3599000a,0x359b000a,0x359d000a,0x359f000a,0x35a1000a,0x35a3000a,0x35a5000a,0x35a7000a,0x35a9000a,0x35ab000a, +0x35ad000a,0,0,0x35af000a,0x35b1000a,0x35b3000a,0x35b7000a,0x35bb000a,0x35bf000a,0x35c3000a,0x35c5000a,0x35c7000a,0x35c9000a,0x35cb000a,0x35cd000a,0, +0x35cf000a,0x35d1000a,0x35d3000a,0x35d5000a,0x35d7000a,0x35d9000a,0x35db000a,0x35dd000a,0x35df000a,0x35e1000a,0x35e3000a,0x35e5000a,0x35e7000a,0x35e9000a,0x35eb000a,0x35ed000a, +0x35ef000a,0x35f1000a,0x35f3000a,0,0x35f5000a,0x35f7000a,0x35f9000a,0x35fb000a,0,0,0,0,0x35fd000a,0x3601000a,0x3605000a,0, +0x3609000a,0,0x360d000a,0x3611000a,0x3615000a,0x3619000a,0x361d000a,0x3621000a,0x3625000a,0x3629000a,0x362d000a,0x3631000a,0x3635000a,0x3637000a,0x363b000a,0x363f000a, +0x3643000a,0x3647000a,0x364b000a,0x364f000a,0x3653000a,0x3657000a,0x365b000a,0x365f000a,0x3663000a,0x3667000a,0x3669000a,0x366b000a,0x366d000a,0x366f000a,0x3671000a,0x3673000a, +0x3675000a,0x3677000a,0x3679000a,0x367b000a,0x367d000a,0x367f000a,0x3681000a,0x3683000a,0x3685000a,0x3687000a,0x3689000a,0x368b000a,0x368d000a,0x368f000a,0x3691000a,0x3693000a, +0x3695000a,0x3697000a,0x3699000a,0x369b000a,0x369d000a,0x369f000a,0x36a1000a,0x36a3000a,0x36a5000a,0x36a7000a,0x36a9000a,0x36ab000a,0x36ad000a,0x36af000a,0x36b1000a,0x36b3000a, +0x36b5000a,0x36b7000a,0x36b9000a,0x36bb000a,0x36bd000a,0x36bf000a,0x36c1000a,0x36c3000a,0x36c5000a,0x36c7000a,0x36c9000a,0x36cb000a,0x36cd000a,0x36cf000a,0x36d1000a,0x36d3000a, +0x36d5000a,0x36d7000a,0x36d9000a,0x36db000a,0x36dd000a,0x36df000a,0x36e1000a,0x36e3000a,0x36e5000a,0x36e7000a,0x36e9000a,0x36eb000a,0x36ed000a,0x36ef000a,0x36f1000a,0x36f3000a, +0x36f5000a,0x36f7000a,0x36f9000a,0x36fb000a,0x36fd000a,0x36ff000a,0x3701000a,0x3703000a,0x3705000a,0x3707000a,0x3709000a,0x370b000a,0x370d000a,0x370f000a,0x3711000a,0x3713000a, +0x3715000a,0x3717000a,0x3719000a,0x371b000a,0x371d000a,0x371f000a,0x3721000a,0x3723000a,0x3725000a,0x3727000a,0x3729000a,0x372b000a,0x372d000a,0x372f000a,0x3731000a,0x3733000a, +0x3735000a,0x3737000a,0x373c000a,0x3741000a,0x3746000a,0x374b000a,0x3750000a,0x3755000a,0x3758000a,0,0,0,0,0x375b000a,0x375d000a,0x375f000a, +0x3761000a,0x3763000a,0x3765000a,0x3767000a,0x3769000a,0x376b000a,0x376d000a,0x376f000a,0x3771000a,0x3773000a,0x3775000a,0x3777000a,0x3779000a,0x377b000a,0x377d000a,0x377f000a, +0x3781000a,0x3783000a,0x3785000a,0x3787000a,0x3789000a,0x378b000a,0x378d000a,0x378f000a,0x3791000a,0x3793000a,0x3795000a,0x3797000a,0x3799000a,0x379b000a,0x379d000a,0x379f000a, +0x37a1000a,0x37a3000a,0x37a5000a,0x37a7000a,0x37a9000a,0x37ab000a,0x37ad000a,0x37af000a,0x37b1000a,0x37b3000a,0x37b5000a,0x37b7000a,0x37b9000a,0x37bb000a,0x37bd000a,0x37bf000a, +0x37c1000a,0x37c3000a,0x37c5000a,0x37c7000a,0x37c9000a,0x37cb000a,0x37cd000a,0x37cf000a,0x37d1000a,0x37d3000a,0x37d5000a,0x37d7000a,0x37d9000a,0x37db000a,0x37dd000a,0x37df000a, +0x37e1000a,0x37e3000a,0x37e5000a,0x37e7000a,0x37e9000a,0x37eb000a,0x37ed000a,0x37ef000a,0x37f1000a,0x37f3000a,0x37f5000a,0x37f7000a,0x37f9000a,0x37fb000a,0x37fd000a,0x37ff000a, +0x3801000a,0x3803000a,0x3805000a,0x3807000a,0x3809000a,0x380b000a,0x380d000a,0x380f000a,0x3811000a,0x3813000a,0x3815000a,0x3817000a,0x3819000a,0x381b000a,0x381d000a,0x381f000a, +0x3821000a,0x3823000a,0x3825000a,0x3827000a,0x3829000a,0x382b000a,0x382d000a,0x382f000a,0x3831000a,0x3833000a,0x3835000a,0x3837000a,0x3839000a,0x383b000a,0x383d000a,0x383f000a, +0x3841000a,0x3843000a,0x3845000a,0x3847000a,0x3849000a,0x384b000a,0x384d000a,0x384f000a,0x3851000a,0x3853000a,0x3855000a,0x3857000a,0x3859000a,0x385b000a,0x385d000a,0x385f000a, +0x3861000a,0x3863000a,0x3865000a,0x3867000a,0x3869000a,0x386b000a,0x386d000a,0x386f000a,0x3871000a,0x3873000a,0x3875000a,0x3877000a,0x3879000a,0x387b000a,0x387d000a,0x387f000a, +0x3881000a,0x3883000a,0x3885000a,0x3887000a,0x3889000a,0x388b000a,0x388d000a,0x388f000a,0x3891000a,0x3893000a,0x3895000a,0x3898000a,0x389b000a,0x389d000a,0x389f000a,0x38a1000a, +0x38a3000a,0x38a5000a,0x38a7000a,0x38a9000a,0x38ab000a,0x38ad000a,0x38af000a,0x38b1000a,0x38b3000a,0x38b5000a,0x38b7000a,0x38b9000a,0x38bb000a,0x38bd000a,0x38bf000a,0x38c1000a, +0x38c3000a,0x38c5000a,0x38c7000a,0x38c9000a,0x38cb000a,0x38cd000a,0x38cf000a,0x38d1000a,0x38d3000a,0x38d5000a,0x38d7000a,0,0,0,0x38d9000a,0x38db000a, +0x38dd000a,0x38df000a,0x38e1000a,0x38e3000a,0,0,0x38e5000a,0x38e7000a,0x38e9000a,0x38eb000a,0x38ed000a,0x38ef000a,0,0,0x38f1000a,0x38f3000a, +0x38f5000a,0x38f7000a,0x38f9000a,0x38fb000a,0,0,0x38fd000a,0x38ff000a,0x3901000a,0,0,0,0x3903000a,0x3905000a,0x3907000a,0x3909000a, +0x390d000a,0x390f000a,0x3911000a,0,0x3913000a,0x3915000a,0x3917000a,0x3919000a,0x391b000a,0x391d000a,0x391f000a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x3d27000a,0x3d29000a,0x3d2b000a,0x3d2d000a, +0x3d2f000a,0x3d31000a,0x3d33000a,0x3d35000a,0x3d37000a,0x3d39000a,0x3d3b000a,0x3d3d000a,0x3d3f000a,0x3d41000a,0x3d43000a,0x3d45000a,0x3d47000a,0x3d49000a,0x3d4b000a,0x3d4d000a, +0x3d4f000a,0x3d51000a,0x3d53000a,0x3d55000a,0x3d57000a,0x3d59000a,0x3d5b000a,0x3d5d000a,0x3d5f000a,0x3d61000a,0x3d63000a,0x3d65000a,0,0x3d680040,0x3de20040,0x3d690040, +0x3d780040,0x3d6a0040,0x3de40040,0x3d7a0040,0x3d7c0040,0x3d6b0040,0x3d7e0040,0x3d800040,0x3d820040,0x3de60040,0x3d6c0040,0x3d6d0040,0x3de80040,0,0x3d840040,0x3d860040, +0x3d880040,0x3d6e0040,0x3dea0040,0x3d8a0040,0x3dec0040,0x3d6f0040,0x3d8c0040,0,0,0,0,0,0,0x3d700040,0x3de30040,0x3d710040, +0x3d790040,0x3d720040,0x3de50040,0x3d7b0040,0x3d7d0040,0x3d730040,0x3d7f0040,0x3d810040,0x3d830040,0x3de70040,0x3d740040,0x3d750040,0x3de90040,0,0x3d850040,0x3d870040, +0x3d890040,0x3d760040,0x3deb0040,0x3d8b0040,0x3ded0040,0x3d770040,0x3d8d0040,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x3d910040,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xe600,0xe600,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00,0xdc00, 0xe600,0xe600,0xdc00,0xe600,0xe600,0xde00,0xe400,0xe600,0xa00,0xb00,0xc00,0xd00,0xe00,0xf00,0x1000,0x1100, -0x1200,0x1300,0,0x1400,0x1500,0x1600,0,0x1700,0,0x1800,0x1900,0,0xe600,0xdc00,0,0x1200, +0x1200,0x1300,0x1300,0x1400,0x1500,0x1600,0,0x1700,0,0x1800,0x1900,0,0xe600,0xdc00,0,0x1200, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0,0, 0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0xdc00,0xe600,0,0,0xe600, @@ -683,11 +688,13 @@ static const uint32_t normTrie_data32[9064]={ 0,0,0,0,0,0,0,0,0,0,0,0,0xe600,0xdc00,0xe600,0xe600, 0xdc00,0xe600,0xe600,0xdc00,0xdc00,0xdc00,0xe600,0xdc00,0xdc00,0xe600,0xdc00,0xe600,0xe600,0xe600,0xdc00,0xe600, 0xdc00,0xe600,0xdc00,0xe600,0xdc00,0xe600,0xe600,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600, +0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xe600,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x700,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0x900,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x700,0,0,0x3da90040,0,0,0,0,0,0,0,0, +0,0,0,0,0x700,0,0,0x3dd10040,0,0,0,0,0,0,0,0, 0x6b00,0x6b00,0x6b00,0x6b00,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0xdc00,0,0xdc00,0,0xd800,0,0, 0,0,0,0,0,0,0xdc00,0,0,0,0,0,0,0,0,0, @@ -700,31 +707,35 @@ static const uint32_t normTrie_data32[9064]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0xde00,0xe600,0xdc00,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600, -0xdc00,0,0,0,0,0,0,0,0xe600,0xe600,0xdc00,0xe600,0,0,0,0, +0xdc00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600, +0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0,0,0,0,0,0,0,0, +0,0,0,0,0xe600,0xe600,0xdc00,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe600,0xdc00, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xe600,0xe600,0x100,0x100,0xe600,0xe600,0xe600,0xe600, -0x100,0x100,0x100,0xe600,0xe600,0,0,0,0,0xe600,0,0,0,0x100,0x100,0xe600, -0xdc00,0xe600,0x100,0x100,0,0,0,0,0,0,0,0,0,0,0,0, +0xe600,0xe600,0x100,0x100,0xe600,0xe600,0xe600,0xe600,0x100,0x100,0x100,0xe600,0xe600,0,0,0, +0,0xe600,0,0,0,0x100,0x100,0xe600,0xdc00,0xe600,0x100,0x100,0xdc00,0xdc00,0xdc00,0xdc00, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x3dcf0040,0x3dcc0040,0x3dd00040,0,0,0,0,0,0,0,0x900,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x3e020040,0x3dff0040,0x3e030040,0, +0,0,0,0,0,0,0x900,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xdc00,0,0xe600,0,0,0,0,0,0,0,0, +0,0xdc00,0,0xe600,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe600,0x100,0xdc00,0, +0,0,0,0x900,0xdc00,0xdc00,0xdc00,0,0,0xe600,0xe600,0xe600,0xe600,0xe600,0xdc00,0xdc00, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xe600,0x100,0xdc00,0,0,0,0,0x900,0xdc00,0xdc00,0xdc00,0,0,0xe600,0xe600,0xe600, -0xe600,0xe600,0xdc00,0xdc00,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xe600,0xe600,0xe600,0,0,0, +0,0,0,0,0,0,0xe600,0xe600,0xe600,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040, -0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c, +0,0,0,0,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040, +0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0xfff10040,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c, 0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c, -0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0,0,0,0,0,0,0,0, +0xfff0000c,0xfff0000c,0xfff0000c,0xfff0000c,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xfc01ff00,0,0,0,0,0,0,0,0,0, +0,0,0xfc01ff00,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xfc02ff0f,0xfc03000a,0,0,0,0,0,0,0,0,0,0, +0xfc02ff0f,0xfc03000a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xfc04000f,0 +0,0,0xfc04000f,0 }; static const UTrie normTrie={ @@ -732,13 +743,13 @@ static const UTrie normTrie={ normTrie_data32, getFoldingNormOffset, 2208, - 9064, + 9236, 0, FALSE }; -static const uint16_t extraData[15896]={ -0x139,0xff02,0x20,0x3b9,0xff01,0x3c5,0xff01,0x3cd,0xff01,0x3cb,0xff01,0x3c3,0xff01,0x61,0xff01,0xe6, +static const uint16_t extraData[15947]={ +0x13b,0xff02,0x20,0x3b9,0xff01,0x3c5,0xff01,0x3cd,0xff01,0x3cb,0xff01,0x3c3,0xff01,0x61,0xff01,0xe6, 0xff01,0x62,0xff01,0x64,0xff01,0x65,0xff01,0x1dd,0xff01,0x67,0xff01,0x68,0xff01,0x69,0xff01,0x6a, 0xff01,0x6b,0xff01,0x6c,0xff01,0x6d,0xff01,0x6e,0xff01,0x6f,0xff01,0x223,0xff01,0x70,0xff01,0x72, 0xff01,0x74,0xff01,0x75,0xff01,0x77,0xff02,0x72,0x73,0xff01,0x63,0xff02,0xb0,0x63,0xff01,0x25b, @@ -757,1133 +768,1138 @@ static const uint16_t extraData[15896]={ 0x70,0x68,0xff03,0x70,0x70,0x6d,0xff02,0x70,0x72,0xff02,0x73,0x76,0xff02,0x77,0x62,0xff03, 0x76,0x2215,0x6d,0xff03,0x61,0x2215,0x6d,0xff01,0x3b1,0xff01,0x3b2,0xff01,0x3b4,0xff01,0x3b5,0xff01, 0x3b6,0xff01,0x3b7,0xff01,0x3b8,0xff01,0x3ba,0xff01,0x3bb,0xff01,0x3bd,0xff01,0x3be,0xff01,0x3bf,0xff01, -0x3c1,0xff01,0x3c4,0xff01,0x3c6,0xff01,0x3c7,0xff01,0x3c8,0x8200,0xf0,0x20,0x345,0x3b2,0x100,0x3a5, -0x8282,0xe6,0x3d2,0x301,0xe6,0x3a5,0x301,0x8282,0xe6,0x3d2,0x308,0xe6,0x3a5,0x308,0x100,0x3c2, -0x100,0x3a3,0x100,0x41,0x100,0xc6,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x18e,0x100,0x47, -0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f, -0x100,0x222,0x100,0x50,0x100,0x52,0x100,0x54,0x100,0x55,0x100,0x57,0x200,0x52,0x73,0x100, -0x43,0x200,0xb0,0x43,0x100,0x190,0x200,0xb0,0x46,0x100,0x48,0x100,0x48,0x100,0x48,0x100, -0x49,0x100,0x49,0x100,0x4c,0x100,0x4e,0x200,0x4e,0x6f,0x100,0x50,0x100,0x51,0x100,0x52, -0x100,0x52,0x100,0x52,0x200,0x53,0x4d,0x300,0x54,0x45,0x4c,0x200,0x54,0x4d,0x100,0x5a, -0x100,0x5a,0x100,0x42,0x100,0x43,0x100,0x45,0x100,0x46,0x100,0x4d,0x300,0x46,0x41,0x58, -0x100,0x393,0x100,0x3a0,0x100,0x44,0x300,0x50,0x54,0x45,0x200,0x48,0x67,0x200,0x65,0x56, -0x300,0x4c,0x54,0x44,0x300,0x68,0x50,0x61,0x200,0x41,0x55,0x200,0x6f,0x56,0x200,0x49, -0x55,0x200,0x70,0x41,0x200,0x6e,0x41,0x200,0x3bc,0x41,0x200,0x6d,0x41,0x200,0x6b,0x41, -0x200,0x4b,0x42,0x200,0x4d,0x42,0x200,0x47,0x42,0x200,0x70,0x46,0x200,0x6e,0x46,0x200, -0x3bc,0x46,0x200,0x48,0x7a,0x300,0x6b,0x48,0x7a,0x300,0x4d,0x48,0x7a,0x300,0x47,0x48, -0x7a,0x300,0x54,0x48,0x7a,0x200,0x50,0x61,0x300,0x6b,0x50,0x61,0x300,0x4d,0x50,0x61, -0x300,0x47,0x50,0x61,0x200,0x70,0x56,0x200,0x6e,0x56,0x200,0x3bc,0x56,0x200,0x6d,0x56, -0x200,0x6b,0x56,0x200,0x4d,0x56,0x200,0x70,0x57,0x200,0x6e,0x57,0x200,0x3bc,0x57,0x200, -0x6d,0x57,0x200,0x6b,0x57,0x200,0x4d,0x57,0x200,0x6b,0x3a9,0x200,0x4d,0x3a9,0x200,0x42, -0x71,0x400,0x43,0x2215,0x6b,0x67,0x300,0x43,0x6f,0x2e,0x200,0x64,0x42,0x200,0x47,0x79, -0x200,0x48,0x50,0x200,0x4b,0x4b,0x200,0x4b,0x4d,0x200,0x50,0x48,0x300,0x50,0x50,0x4d, -0x200,0x50,0x52,0x200,0x53,0x76,0x200,0x57,0x62,0x300,0x56,0x2215,0x6d,0x300,0x41,0x2215, -0x6d,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100, -0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100, -0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100, -0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100, -0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100, -0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100, -0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100, -0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100, -0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100, -0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100, -0x43,0x100,0x44,0x100,0x47,0x100,0x4a,0x100,0x4b,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100, -0x51,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100, -0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100, -0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100, -0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100, -0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x46,0x100, -0x47,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100, -0x51,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100, -0x41,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x49,0x100,0x4a,0x100, -0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4f,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100, -0x57,0x100,0x58,0x100,0x59,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100, -0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100, -0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100, -0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100, -0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100, -0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100, -0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100, -0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100, -0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100, -0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100, -0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100, -0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100, -0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100, -0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100, -0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100, -0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100, -0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100, -0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100, -0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100, -0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x391,0x100, -0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100, -0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100, -0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100, -0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100, -0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100, -0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100, -0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100, -0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100, -0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100, -0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100, -0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100, -0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100, -0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100, -0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100, -0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100, -0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100, -0x3c2,0x81,0xe6e6,0x300,0x81,0xe6e6,0x301,0x81,0xe6e6,0x313,0x82,0xe6e6,0x308,0x301,1,0x2b9, -1,0x3b,1,0xb7,0x82,7,0x915,0x93c,0x82,7,0x916,0x93c,0x82,7,0x917,0x93c, -0x82,7,0x91c,0x93c,0x82,7,0x921,0x93c,0x82,7,0x922,0x93c,0x82,7,0x92b,0x93c, -0x82,7,0x92f,0x93c,0x82,7,0x9a1,0x9bc,0x82,7,0x9a2,0x9bc,0x82,7,0x9af,0x9bc, -0x82,7,0xa32,0xa3c,0x82,7,0xa38,0xa3c,0x82,7,0xa16,0xa3c,0x82,7,0xa17,0xa3c, -0x82,7,0xa1c,0xa3c,0x82,7,0xa2b,0xa3c,0x82,7,0xb21,0xb3c,0x82,7,0xb22,0xb3c, -2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7,2,0xf5b,0xfb7,2, -0xf40,0xfb5,0x82,0x8182,0xf71,0xf72,0x82,0x8184,0xf71,0xf74,0x82,0x82,0xfb2,0xf80,0x82,0x82, -0xfb3,0xf80,0x82,0x8182,0xf71,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7,2, -0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,0x82,0xe6,0x3b1,0x301,0x82,0xe6,0x3b5,0x301, -0x82,0xe6,0x3b7,0x301,0x82,0xe6,0x3b9,0x301,0x82,0xe6,0x3bf,0x301,0x82,0xe6,0x3c5,0x301, -0x82,0xe6,0x3c9,0x301,0x82,0xe6,0x391,0x301,1,0x3b9,0x82,0xe6,0x395,0x301,0x82,0xe6, -0x397,0x301,0x83,0xe6,0x3b9,0x308,0x301,0x82,0xe6,0x399,0x301,0x83,0xe6,0x3c5,0x308,0x301, -0x82,0xe6,0x3a5,0x301,0x8382,0xe6,0xa8,0x301,0xe6,0x20,0x308,0x301,1,0x60,0x82,0xe6, -0x39f,0x301,0x82,0xe6,0x3a9,0x301,0x8201,0xb4,0xe6,0x20,0x301,0x101,0x2002,0x20,0x101,0x2003, -0x20,1,0x3a9,1,0x4b,0x82,0xe6,0x41,0x30a,1,0x3008,1,0x3009,0x82,1,0x2add, -0x338,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,1,0x4e26,1,0x51b5,1, -0x5168,1,0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1,0x559d,1,0x5555,1, -0x5599,1,0x55e2,1,0x585a,1,0x58b3,1,0x5944,1,0x5954,1,0x5a62,1,0x5b28,1, -0x5ed2,1,0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1,0x614e,1,0x6108,1,0x618e,1, -0x6160,1,0x61f2,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1,0x6556,1,0x6674,1, -0x6717,1,0x671b,1,0x6756,1,0x6b79,1,0x6bba,1,0x6d41,1,0x6edb,1,0x6ecb,1, -0x6f22,1,0x701e,1,0x716e,1,0x77a7,1,0x7235,1,0x72af,1,0x732a,1,0x7471,1, -0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76ca,1,0x76db,1,0x76f4,1,0x774a,1, -0x7740,1,0x78cc,1,0x7ab1,1,0x7bc0,1,0x7c7b,1,0x7d5b,1,0x7df4,1,0x7f3e,1, -0x8005,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8996,1,0x8abf,1, -0x8af8,1,0x8acb,1,0x8b01,1,0x8afe,1,0x8aed,1,0x8b39,1,0x8b8a,1,0x8d08,1, -0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x96e3,1,0x9756,1,0x97db,1, -0x97ff,1,0x980b,1,0x983b,1,0x9b12,1,0x9f9c,2,0xd84a,0xdc4a,2,0xd84a,0xdc44,2, -0xd84c,0xdfd5,1,0x3b9d,1,0x4018,1,0x4039,2,0xd854,0xde49,2,0xd857,0xdcd0,2,0xd85f, -0xded3,1,0x9f43,1,0x9f8e,0x82,0xe,0x5d9,0x5b4,0x82,0x11,0x5f2,0x5b7,0x82,0x18,0x5e9, -0x5c1,0x82,0x19,0x5e9,0x5c2,0x83,0x18,0x5e9,0x5bc,0x5c1,0x83,0x19,0x5e9,0x5bc,0x5c2,0x82, -0x11,0x5d0,0x5b7,0x82,0x12,0x5d0,0x5b8,0x82,0x15,0x5d0,0x5bc,0x82,0x15,0x5d1,0x5bc,0x82, -0x15,0x5d2,0x5bc,0x82,0x15,0x5d3,0x5bc,0x82,0x15,0x5d4,0x5bc,0x82,0x15,0x5d5,0x5bc,0x82, -0x15,0x5d6,0x5bc,0x82,0x15,0x5d8,0x5bc,0x82,0x15,0x5d9,0x5bc,0x82,0x15,0x5da,0x5bc,0x82, -0x15,0x5db,0x5bc,0x82,0x15,0x5dc,0x5bc,0x82,0x15,0x5de,0x5bc,0x82,0x15,0x5e0,0x5bc,0x82, -0x15,0x5e1,0x5bc,0x82,0x15,0x5e3,0x5bc,0x82,0x15,0x5e4,0x5bc,0x82,0x15,0x5e6,0x5bc,0x82, -0x15,0x5e7,0x5bc,0x82,0x15,0x5e8,0x5bc,0x82,0x15,0x5e9,0x5bc,0x82,0x15,0x5ea,0x5bc,0x82, -0x13,0x5d5,0x5b9,0x82,0x17,0x5d1,0x5bf,0x82,0x17,0x5db,0x5bf,0x82,0x17,0x5e4,0x5bf,0x84, -0xd8,0xd834,0xdd57,0xd834,0xdd65,0x84,0xd8,0xd834,0xdd58,0xd834,0xdd65,0x86,0xd8,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0x86,0xd8,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd70,0x86,0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0x86,0xd8,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd72,0x84,0xd8,0xd834,0xddb9,0xd834,0xdd65,0x84,0xd8,0xd834,0xddba,0xd834,0xdd65,0x86, -0xd8,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6e,0x86, -0xd8,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0x86,0xd8,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6f,1, -0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60,1,0x4fae,1,0x4fbb,1,0x5002, -1,0x507a,1,0x5099,1,0x50e7,1,0x50cf,1,0x349e,2,0xd841,0xde3a,1,0x514d,1, -0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167,1,0x518d,2,0xd841, -0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,1,0x51b5,2,0xd864,0xdddf,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,2,0xd842,0xde2c,1, -0x7070,1,0x53ca,1,0x53df,2,0xd842,0xdf63,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,2,0xd845,0xdce4,1,0x58f2,1,0x58f7,1, -0x5906,1,0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8,2,0xd845,0xdeea,1,0x59ec,1, -0x5a1b,1,0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1,0x36fc,1,0x5b08,1,0x5b3e,1, -0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5be7,1,0x5bf3,2,0xd846,0xdf18,1, -0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,1,0x5c6e,1,0x5cc0,1, -0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1,0x5d6b,1,0x5d7c,1, -0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1,0x5e69,1,0x3862,2, -0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,1,0x5eca,2,0xd868,0xdf92,1, -0x5efe,2,0xd848,0xdf31,2,0xd848,0xdf31,1,0x8201,1,0x5f22,1,0x5f22,1,0x38c7,2, -0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62,1,0x5f6b,1,0x38e3,1,0x5f9a,1,0x5fcd,1, -0x5fd7,1,0x5ff9,1,0x6081,1,0x393a,1,0x391c,1,0x6094,2,0xd849,0xded4,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,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1,0x6368,1,0x6383,1, -0x63e4,2,0xd84a,0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e,1,0x6469,1,0x647e, -1,0x649d,1,0x6477,1,0x3a6c,1,0x654f,1,0x656c,2,0xd84c,0xdc0a,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,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1,0x6852,1,0x6885,2,0xd84d, -0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x3b9d,1,0x6942,1,0x69a3,1,0x69ea,1, -0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2,0xd84e,0xdca7,1,0x6b54,1, -0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bba,1,0x6bbb,2,0xd84e,0xde8d,2,0xd847,0xdd0b,2, -0xd84e,0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,0x6c67,1,0x6d16,1, -0x6d3e,1,0x6d77,1,0x6d41,1,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34, -1,0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ecb,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1, -0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,1,0x701e,1,0x701b,1, -0x3d96,1,0x704a,1,0x707d,1,0x7077,1,0x70ad,2,0xd841,0xdd25,1,0x7145,2,0xd850, -0xde63,1,0x719c,2,0xd850,0xdfab,1,0x7228,1,0x7235,1,0x7250,2,0xd851,0xde08,1, -0x7280,1,0x7295,2,0xd851,0xdf35,2,0xd852,0xdc14,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,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,1,0x7570,2,0xd848,0xdd9f, -1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc,1,0x4008,1, -0x76f4,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e,1, -0x771f,1,0x771f,1,0x774a,1,0x4039,1,0x778b,1,0x4046,1,0x4096,2,0xd855,0xdc1d, -1,0x784e,1,0x788c,1,0x78cc,1,0x40e3,2,0xd855,0xde26,1,0x7956,2,0xd855,0xde9a, -2,0xd855,0xdec5,1,0x798f,1,0x79eb,1,0x412f,1,0x7a40,1,0x7a4a,1,0x7a4f,2, -0xd856,0xdd7c,2,0xd856,0xdea7,2,0xd856,0xdea7,1,0x7aee,1,0x4202,2,0xd856,0xdfab,1, -0x7bc6,1,0x7bc9,1,0x4227,2,0xd857,0xdc80,1,0x7cd2,1,0x42a0,1,0x7ce8,1,0x7ce3, -1,0x7d00,2,0xd857,0xdf86,1,0x7d63,1,0x4301,1,0x7dc7,1,0x7e02,1,0x7e45,1, -0x4334,2,0xd858,0xde28,2,0xd858,0xde47,1,0x4359,2,0xd858,0xded9,1,0x7f7a,2,0xd858, -0xdf3e,1,0x7f95,1,0x7ffa,1,0x8005,2,0xd859,0xdcda,2,0xd859,0xdd23,1,0x8060,2, -0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2,1,0x8103,1,0x440b,1, -0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c,0xdf93,2,0xd84c,0xdf9c,1, -0x8201,1,0x8204,1,0x8f9e,1,0x446b,1,0x8291,1,0x828b,1,0x829d,1,0x52b3,1, -0x82b1,1,0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c,1,0x82e5,1,0x831d,1,0x8363, -1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,1,0x8457,1,0x8353,1,0x83ca,1,0x83cc, -1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b,0xdcd5,1,0x452b,1,0x84f1,1, -0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b,0xdf2c,1,0x455d,1,0x4561,2, -0xd85b,0xdfb1,2,0xd85c,0xdcd2,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,2,0xd85d,0xde67,1,0x88d7, -1,0x88de,1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,0xd85e,0xdd66,1,0x46be, -1,0x46c7,1,0x8aa0,1,0x8aed,1,0x8b8a,1,0x8c55,2,0xd85f,0xdca8,1,0x8cab,1, -0x8cc1,1,0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2,0xd842,0xdc04,1,0x8dcb,1,0x8dbc,1, -0x8df0,2,0xd842,0xdcde,1,0x8ed4,1,0x8f38,2,0xd861,0xddd2,2,0xd861,0xdded,1,0x9094, -1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1,0x911b,1,0x9238,1,0x92d7,1,0x92d8,1, -0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa,1,0x958b,1,0x4995,1,0x95b7,2,0xd863, -0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1,0x9723,2,0xd864,0xdd45,2,0xd864,0xde1a,1, -0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2,0xd865,0xdc96,1,0x980b,1, -0x980b,1,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929,1,0x99a7,1,0x99c2, -1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1,0x9b12,1,0x9c40,1,0x9cfd,1,0x4cce,1, -0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868,0xdd05,2,0xd868,0xde0e,2,0xd868, -0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1,0x9f05,1,0x9f0f,1,0x9f16,1, -0x9f3b,2,0xd869,0xde00,0x82,0xe6,0x41,0x300,0x82,0xe6,0x41,0x301,0x4d0,0x82,0xe6,0x41, -0x302,0x82,0xe6,0x41,0x303,0x2c8,0x82,0xe6,0x41,0x308,0x2e0,0x82,0xe6,0x41,0x30a,0x46e, -0x82,0xca,0x43,0x327,0x82,0xe6,0x45,0x300,0x82,0xe6,0x45,0x301,0x4f8,0x82,0xe6,0x45, -0x302,0x82,0xe6,0x45,0x308,0x82,0xe6,0x49,0x300,0x82,0xe6,0x49,0x301,0x82,0xe6,0x49, -0x302,0x482,0x82,0xe6,0x49,0x308,0x82,0xe6,0x4e,0x303,0x82,0xe6,0x4f,0x300,0x82,0xe6, -0x4f,0x301,0x50c,0x82,0xe6,0x4f,0x302,0x2ec,0x82,0xe6,0x4f,0x303,0x2e8,0x82,0xe6,0x4f, -0x308,0x82,0xe6,0x55,0x300,0x82,0xe6,0x55,0x301,0x82,0xe6,0x55,0x302,0x2b8,0x82,0xe6, -0x55,0x308,0x82,0xe6,0x59,0x301,0x82,0xe6,0x61,0x300,0x82,0xe6,0x61,0x301,0x4d8,0x82, -0xe6,0x61,0x302,0x82,0xe6,0x61,0x303,0x2ca,0x82,0xe6,0x61,0x308,0x2e2,0x82,0xe6,0x61, -0x30a,0x470,0x82,0xca,0x63,0x327,0x82,0xe6,0x65,0x300,0x82,0xe6,0x65,0x301,0x500,0x82, -0xe6,0x65,0x302,0x82,0xe6,0x65,0x308,0x82,0xe6,0x69,0x300,0x82,0xe6,0x69,0x301,0x82, -0xe6,0x69,0x302,0x484,0x82,0xe6,0x69,0x308,0x82,0xe6,0x6e,0x303,0x82,0xe6,0x6f,0x300, -0x82,0xe6,0x6f,0x301,0x514,0x82,0xe6,0x6f,0x302,0x2f2,0x82,0xe6,0x6f,0x303,0x2ea,0x82, -0xe6,0x6f,0x308,0x82,0xe6,0x75,0x300,0x82,0xe6,0x75,0x301,0x82,0xe6,0x75,0x302,0x2c0, -0x82,0xe6,0x75,0x308,0x82,0xe6,0x79,0x301,0x82,0xe6,0x79,0x308,0x82,0xe6,0x41,0x304, -0x82,0xe6,0x61,0x304,0x4e8,0x82,0xe6,0x41,0x306,0x4f0,0x82,0xe6,0x61,0x306,0x82,0xca, -0x41,0x328,0x82,0xca,0x61,0x328,0x82,0xe6,0x43,0x301,0x82,0xe6,0x63,0x301,0x82,0xe6, -0x43,0x302,0x82,0xe6,0x63,0x302,0x82,0xe6,0x43,0x307,0x82,0xe6,0x63,0x307,0x82,0xe6, -0x43,0x30c,0x82,0xe6,0x63,0x30c,0x82,0xe6,0x44,0x30c,0x82,0xe6,0x64,0x30c,0x472,0x82, -0xe6,0x45,0x304,0x476,0x82,0xe6,0x65,0x304,0x82,0xe6,0x45,0x306,0x82,0xe6,0x65,0x306, -0x82,0xe6,0x45,0x307,0x82,0xe6,0x65,0x307,0x82,0xca,0x45,0x328,0x82,0xca,0x65,0x328, -0x82,0xe6,0x45,0x30c,0x82,0xe6,0x65,0x30c,0x82,0xe6,0x47,0x302,0x82,0xe6,0x67,0x302, -0x82,0xe6,0x47,0x306,0x82,0xe6,0x67,0x306,0x82,0xe6,0x47,0x307,0x82,0xe6,0x67,0x307, -0x82,0xca,0x47,0x327,0x82,0xca,0x67,0x327,0x82,0xe6,0x48,0x302,0x82,0xe6,0x68,0x302, -0x82,0xe6,0x49,0x303,0x82,0xe6,0x69,0x303,0x82,0xe6,0x49,0x304,0x82,0xe6,0x69,0x304, -0x82,0xe6,0x49,0x306,0x82,0xe6,0x69,0x306,0x82,0xca,0x49,0x328,0x82,0xca,0x69,0x328, -0x82,0xe6,0x49,0x307,0x82,0xe6,0x4a,0x302,0x82,0xe6,0x6a,0x302,0x82,0xca,0x4b,0x327, -0x82,0xca,0x6b,0x327,0x82,0xe6,0x4c,0x301,0x82,0xe6,0x6c,0x301,0x82,0xca,0x4c,0x327, -0x82,0xca,0x6c,0x327,0x82,0xe6,0x4c,0x30c,0x82,0xe6,0x6c,0x30c,0x82,0xe6,0x4e,0x301, -0x82,0xe6,0x6e,0x301,0x82,0xca,0x4e,0x327,0x82,0xca,0x6e,0x327,0x82,0xe6,0x4e,0x30c, -0x82,0xe6,0x6e,0x30c,0x496,0x82,0xe6,0x4f,0x304,0x49a,0x82,0xe6,0x6f,0x304,0x82,0xe6, -0x4f,0x306,0x82,0xe6,0x6f,0x306,0x82,0xe6,0x4f,0x30b,0x82,0xe6,0x6f,0x30b,0x82,0xe6, -0x52,0x301,0x82,0xe6,0x72,0x301,0x82,0xca,0x52,0x327,0x82,0xca,0x72,0x327,0x82,0xe6, -0x52,0x30c,0x82,0xe6,0x72,0x30c,0x4aa,0x82,0xe6,0x53,0x301,0x4ac,0x82,0xe6,0x73,0x301, -0x82,0xe6,0x53,0x302,0x82,0xe6,0x73,0x302,0x82,0xca,0x53,0x327,0x82,0xca,0x73,0x327, -0x4ae,0x82,0xe6,0x53,0x30c,0x4b0,0x82,0xe6,0x73,0x30c,0x82,0xca,0x54,0x327,0x82,0xca, -0x74,0x327,0x82,0xe6,0x54,0x30c,0x82,0xe6,0x74,0x30c,0x4b6,0x82,0xe6,0x55,0x303,0x4b8, -0x82,0xe6,0x75,0x303,0x4ba,0x82,0xe6,0x55,0x304,0x4bc,0x82,0xe6,0x75,0x304,0x82,0xe6, -0x55,0x306,0x82,0xe6,0x75,0x306,0x82,0xe6,0x55,0x30a,0x82,0xe6,0x75,0x30a,0x82,0xe6, -0x55,0x30b,0x82,0xe6,0x75,0x30b,0x82,0xca,0x55,0x328,0x82,0xca,0x75,0x328,0x82,0xe6, -0x57,0x302,0x82,0xe6,0x77,0x302,0x82,0xe6,0x59,0x302,0x82,0xe6,0x79,0x302,0x82,0xe6, -0x59,0x308,0x82,0xe6,0x5a,0x301,0x82,0xe6,0x7a,0x301,0x82,0xe6,0x5a,0x307,0x82,0xe6, -0x7a,0x307,0x82,0xe6,0x5a,0x30c,0x82,0xe6,0x7a,0x30c,0x520,0x82,0xd8,0x4f,0x31b,0x52a, -0x82,0xd8,0x6f,0x31b,0x534,0x82,0xd8,0x55,0x31b,0x53e,0x82,0xd8,0x75,0x31b,0x82,0xe6, -0x41,0x30c,0x82,0xe6,0x61,0x30c,0x82,0xe6,0x49,0x30c,0x82,0xe6,0x69,0x30c,0x82,0xe6, -0x4f,0x30c,0x82,0xe6,0x6f,0x30c,0x82,0xe6,0x55,0x30c,0x82,0xe6,0x75,0x30c,0x83,0xe6, -0x55,0x308,0x304,0x83,0xe6,0x75,0x308,0x304,0x83,0xe6,0x55,0x308,0x301,0x83,0xe6,0x75, -0x308,0x301,0x83,0xe6,0x55,0x308,0x30c,0x83,0xe6,0x75,0x308,0x30c,0x83,0xe6,0x55,0x308, -0x300,0x83,0xe6,0x75,0x308,0x300,0x83,0xe6,0x41,0x308,0x304,0x83,0xe6,0x61,0x308,0x304, -0x83,0xe6,0x41,0x307,0x304,0x83,0xe6,0x61,0x307,0x304,0x82,0xe6,0xc6,0x304,0x82,0xe6, -0xe6,0x304,0x82,0xe6,0x47,0x30c,0x82,0xe6,0x67,0x30c,0x82,0xe6,0x4b,0x30c,0x82,0xe6, -0x6b,0x30c,0x2d8,0x82,0xca,0x4f,0x328,0x2da,0x82,0xca,0x6f,0x328,0x83,0xe6,0x4f,0x328, -0x304,0x83,0xe6,0x6f,0x328,0x304,0x82,0xe6,0x1b7,0x30c,0x82,0xe6,0x292,0x30c,0x82,0xe6, -0x6a,0x30c,0x82,0xe6,0x47,0x301,0x82,0xe6,0x67,0x301,0x82,0xe6,0x4e,0x300,0x82,0xe6, -0x6e,0x300,0x83,0xe6,0x41,0x30a,0x301,0x83,0xe6,0x61,0x30a,0x301,0x82,0xe6,0xc6,0x301, -0x82,0xe6,0xe6,0x301,0x82,0xe6,0xd8,0x301,0x82,0xe6,0xf8,0x301,0x82,0xe6,0x41,0x30f, -0x82,0xe6,0x61,0x30f,0x82,0xe6,0x41,0x311,0x82,0xe6,0x61,0x311,0x82,0xe6,0x45,0x30f, -0x82,0xe6,0x65,0x30f,0x82,0xe6,0x45,0x311,0x82,0xe6,0x65,0x311,0x82,0xe6,0x49,0x30f, -0x82,0xe6,0x69,0x30f,0x82,0xe6,0x49,0x311,0x82,0xe6,0x69,0x311,0x82,0xe6,0x4f,0x30f, -0x82,0xe6,0x6f,0x30f,0x82,0xe6,0x4f,0x311,0x82,0xe6,0x6f,0x311,0x82,0xe6,0x52,0x30f, -0x82,0xe6,0x72,0x30f,0x82,0xe6,0x52,0x311,0x82,0xe6,0x72,0x311,0x82,0xe6,0x55,0x30f, -0x82,0xe6,0x75,0x30f,0x82,0xe6,0x55,0x311,0x82,0xe6,0x75,0x311,0x82,0xdc,0x53,0x326, -0x82,0xdc,0x73,0x326,0x82,0xdc,0x54,0x326,0x82,0xdc,0x74,0x326,0x82,0xe6,0x48,0x30c, -0x82,0xe6,0x68,0x30c,0x2cc,0x82,0xe6,0x41,0x307,0x2ce,0x82,0xe6,0x61,0x307,0x47a,0x82, -0xca,0x45,0x327,0x47c,0x82,0xca,0x65,0x327,0x83,0xe6,0x4f,0x308,0x304,0x83,0xe6,0x6f, -0x308,0x304,0x83,0xe6,0x4f,0x303,0x304,0x83,0xe6,0x6f,0x303,0x304,0x2f8,0x82,0xe6,0x4f, -0x307,0x2fa,0x82,0xe6,0x6f,0x307,0x83,0xe6,0x4f,0x307,0x304,0x83,0xe6,0x6f,0x307,0x304, -0x82,0xe6,0x59,0x304,0x82,0xe6,0x79,0x304,0x8382,0xe6,0xa8,0x301,0xe6,0x20,0x308,0x301, -0x82,0xe6,0x391,0x301,0x82,0xe6,0x395,0x301,0x82,0xe6,0x397,0x301,0x82,0xe6,0x399,0x301, -0x82,0xe6,0x39f,0x301,0x82,0xe6,0x3a5,0x301,0x82,0xe6,0x3a9,0x301,0x83,0xe6,0x3b9,0x308, -0x301,0x82,0xe6,0x399,0x308,0x82,0xe6,0x3a5,0x308,0x63c,0x82,0xe6,0x3b1,0x301,0x82,0xe6, -0x3b5,0x301,0x642,0x82,0xe6,0x3b7,0x301,0x82,0xe6,0x3b9,0x301,0x83,0xe6,0x3c5,0x308,0x301, -0x34e,0x82,0xe6,0x3b9,0x308,0x388,0x82,0xe6,0x3c5,0x308,0x82,0xe6,0x3bf,0x301,0x82,0xe6, -0x3c5,0x301,0x65a,0x82,0xe6,0x3c9,0x301,0x82,0xe6,0x415,0x300,0x82,0xe6,0x415,0x308,0x82, -0xe6,0x413,0x301,0x82,0xe6,0x406,0x308,0x82,0xe6,0x41a,0x301,0x82,0xe6,0x418,0x300,0x82, -0xe6,0x423,0x306,0x82,0xe6,0x418,0x306,0x82,0xe6,0x438,0x306,0x82,0xe6,0x435,0x300,0x82, -0xe6,0x435,0x308,0x82,0xe6,0x433,0x301,0x82,0xe6,0x456,0x308,0x82,0xe6,0x43a,0x301,0x82, -0xe6,0x438,0x300,0x82,0xe6,0x443,0x306,0x82,0xe6,0x474,0x30f,0x82,0xe6,0x475,0x30f,0x82, -0xe6,0x416,0x306,0x82,0xe6,0x436,0x306,0x82,0xe6,0x410,0x306,0x82,0xe6,0x430,0x306,0x82, -0xe6,0x410,0x308,0x82,0xe6,0x430,0x308,0x82,0xe6,0x415,0x306,0x82,0xe6,0x435,0x306,0x82, -0xe6,0x4d8,0x308,0x82,0xe6,0x4d9,0x308,0x82,0xe6,0x416,0x308,0x82,0xe6,0x436,0x308,0x82, -0xe6,0x417,0x308,0x82,0xe6,0x437,0x308,0x82,0xe6,0x418,0x304,0x82,0xe6,0x438,0x304,0x82, -0xe6,0x418,0x308,0x82,0xe6,0x438,0x308,0x82,0xe6,0x41e,0x308,0x82,0xe6,0x43e,0x308,0x82, -0xe6,0x4e8,0x308,0x82,0xe6,0x4e9,0x308,0x82,0xe6,0x42d,0x308,0x82,0xe6,0x44d,0x308,0x82, -0xe6,0x423,0x304,0x82,0xe6,0x443,0x304,0x82,0xe6,0x423,0x308,0x82,0xe6,0x443,0x308,0x82, -0xe6,0x423,0x30b,0x82,0xe6,0x443,0x30b,0x82,0xe6,0x427,0x308,0x82,0xe6,0x447,0x308,0x82, -0xe6,0x42b,0x308,0x82,0xe6,0x44b,0x308,0x82,0xe6,0x627,0x653,0x82,0xe6,0x627,0x654,0x82, -0xe6,0x648,0x654,0x82,0xdc,0x627,0x655,0x82,0xe6,0x64a,0x654,0x82,0xe6,0x6d5,0x654,0x82, -0xe6,0x6c1,0x654,0x82,0xe6,0x6d2,0x654,0x82,7,0x928,0x93c,0x82,7,0x930,0x93c,0x82, -7,0x933,0x93c,2,0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2, -0xb47,0xb57,2,0xb92,0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x82,0x5b, -0xc46,0xc56,2,0xcbf,0xcd5,2,0xcc6,0xcd5,2,0xcc6,0xcd6,0x450,2,0xcc6,0xcc2,3, -0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47,0xd3e,2,0xd46,0xd57,0x82,9,0xdd9,0xdca, -0x45e,2,0xdd9,0xdcf,0x83,9,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,2,0x1025,0x102e,0x82, -0xdc,0x41,0x325,0x82,0xdc,0x61,0x325,0x82,0xe6,0x42,0x307,0x82,0xe6,0x62,0x307,0x82, -0xdc,0x42,0x323,0x82,0xdc,0x62,0x323,0x82,0xdc,0x42,0x331,0x82,0xdc,0x62,0x331,0x83, -0xe6,0x43,0x327,0x301,0x83,0xe6,0x63,0x327,0x301,0x82,0xe6,0x44,0x307,0x82,0xe6,0x64, -0x307,0x82,0xdc,0x44,0x323,0x82,0xdc,0x64,0x323,0x82,0xdc,0x44,0x331,0x82,0xdc,0x64, -0x331,0x82,0xca,0x44,0x327,0x82,0xca,0x64,0x327,0x82,0xdc,0x44,0x32d,0x82,0xdc,0x64, -0x32d,0x83,0xe6,0x45,0x304,0x300,0x83,0xe6,0x65,0x304,0x300,0x83,0xe6,0x45,0x304,0x301, -0x83,0xe6,0x65,0x304,0x301,0x82,0xdc,0x45,0x32d,0x82,0xdc,0x65,0x32d,0x82,0xdc,0x45, -0x330,0x82,0xdc,0x65,0x330,0x83,0xe6,0x45,0x327,0x306,0x83,0xe6,0x65,0x327,0x306,0x82, -0xe6,0x46,0x307,0x82,0xe6,0x66,0x307,0x82,0xe6,0x47,0x304,0x82,0xe6,0x67,0x304,0x82, -0xe6,0x48,0x307,0x82,0xe6,0x68,0x307,0x82,0xdc,0x48,0x323,0x82,0xdc,0x68,0x323,0x82, -0xe6,0x48,0x308,0x82,0xe6,0x68,0x308,0x82,0xca,0x48,0x327,0x82,0xca,0x68,0x327,0x82, -0xdc,0x48,0x32e,0x82,0xdc,0x68,0x32e,0x82,0xdc,0x49,0x330,0x82,0xdc,0x69,0x330,0x83, -0xe6,0x49,0x308,0x301,0x83,0xe6,0x69,0x308,0x301,0x82,0xe6,0x4b,0x301,0x82,0xe6,0x6b, -0x301,0x82,0xdc,0x4b,0x323,0x82,0xdc,0x6b,0x323,0x82,0xdc,0x4b,0x331,0x82,0xdc,0x6b, -0x331,0x486,0x82,0xdc,0x4c,0x323,0x488,0x82,0xdc,0x6c,0x323,0x83,0xe6,0x4c,0x323,0x304, -0x83,0xe6,0x6c,0x323,0x304,0x82,0xdc,0x4c,0x331,0x82,0xdc,0x6c,0x331,0x82,0xdc,0x4c, -0x32d,0x82,0xdc,0x6c,0x32d,0x82,0xe6,0x4d,0x301,0x82,0xe6,0x6d,0x301,0x82,0xe6,0x4d, -0x307,0x82,0xe6,0x6d,0x307,0x82,0xdc,0x4d,0x323,0x82,0xdc,0x6d,0x323,0x82,0xe6,0x4e, -0x307,0x82,0xe6,0x6e,0x307,0x82,0xdc,0x4e,0x323,0x82,0xdc,0x6e,0x323,0x82,0xdc,0x4e, -0x331,0x82,0xdc,0x6e,0x331,0x82,0xdc,0x4e,0x32d,0x82,0xdc,0x6e,0x32d,0x83,0xe6,0x4f, -0x303,0x301,0x83,0xe6,0x6f,0x303,0x301,0x83,0xe6,0x4f,0x303,0x308,0x83,0xe6,0x6f,0x303, -0x308,0x83,0xe6,0x4f,0x304,0x300,0x83,0xe6,0x6f,0x304,0x300,0x83,0xe6,0x4f,0x304,0x301, -0x83,0xe6,0x6f,0x304,0x301,0x82,0xe6,0x50,0x301,0x82,0xe6,0x70,0x301,0x82,0xe6,0x50, -0x307,0x82,0xe6,0x70,0x307,0x82,0xe6,0x52,0x307,0x82,0xe6,0x72,0x307,0x4a6,0x82,0xdc, -0x52,0x323,0x4a8,0x82,0xdc,0x72,0x323,0x83,0xe6,0x52,0x323,0x304,0x83,0xe6,0x72,0x323, -0x304,0x82,0xdc,0x52,0x331,0x82,0xdc,0x72,0x331,0x82,0xe6,0x53,0x307,0x82,0xe6,0x73, -0x307,0x4b2,0x82,0xdc,0x53,0x323,0x4b4,0x82,0xdc,0x73,0x323,0x83,0xe6,0x53,0x301,0x307, -0x83,0xe6,0x73,0x301,0x307,0x83,0xe6,0x53,0x30c,0x307,0x83,0xe6,0x73,0x30c,0x307,0x83, -0xe6,0x53,0x323,0x307,0x83,0xe6,0x73,0x323,0x307,0x82,0xe6,0x54,0x307,0x82,0xe6,0x74, -0x307,0x82,0xdc,0x54,0x323,0x82,0xdc,0x74,0x323,0x82,0xdc,0x54,0x331,0x82,0xdc,0x74, -0x331,0x82,0xdc,0x54,0x32d,0x82,0xdc,0x74,0x32d,0x82,0xdc,0x55,0x324,0x82,0xdc,0x75, -0x324,0x82,0xdc,0x55,0x330,0x82,0xdc,0x75,0x330,0x82,0xdc,0x55,0x32d,0x82,0xdc,0x75, -0x32d,0x83,0xe6,0x55,0x303,0x301,0x83,0xe6,0x75,0x303,0x301,0x83,0xe6,0x55,0x304,0x308, -0x83,0xe6,0x75,0x304,0x308,0x82,0xe6,0x56,0x303,0x82,0xe6,0x76,0x303,0x82,0xdc,0x56, -0x323,0x82,0xdc,0x76,0x323,0x82,0xe6,0x57,0x300,0x82,0xe6,0x77,0x300,0x82,0xe6,0x57, -0x301,0x82,0xe6,0x77,0x301,0x82,0xe6,0x57,0x308,0x82,0xe6,0x77,0x308,0x82,0xe6,0x57, -0x307,0x82,0xe6,0x77,0x307,0x82,0xdc,0x57,0x323,0x82,0xdc,0x77,0x323,0x82,0xe6,0x58, -0x307,0x82,0xe6,0x78,0x307,0x82,0xe6,0x58,0x308,0x82,0xe6,0x78,0x308,0x82,0xe6,0x59, -0x307,0x82,0xe6,0x79,0x307,0x82,0xe6,0x5a,0x302,0x82,0xe6,0x7a,0x302,0x82,0xdc,0x5a, -0x323,0x82,0xdc,0x7a,0x323,0x82,0xdc,0x5a,0x331,0x82,0xdc,0x7a,0x331,0x82,0xdc,0x68, -0x331,0x82,0xe6,0x74,0x308,0x82,0xe6,0x77,0x30a,0x82,0xe6,0x79,0x30a,0x8282,0xe6,0x17f, -0x307,0xe6,0x73,0x307,0x4e0,0x82,0xdc,0x41,0x323,0x4e4,0x82,0xdc,0x61,0x323,0x82,0xe6, -0x41,0x309,0x82,0xe6,0x61,0x309,0x83,0xe6,0x41,0x302,0x301,0x83,0xe6,0x61,0x302,0x301, -0x83,0xe6,0x41,0x302,0x300,0x83,0xe6,0x61,0x302,0x300,0x83,0xe6,0x41,0x302,0x309,0x83, -0xe6,0x61,0x302,0x309,0x83,0xe6,0x41,0x302,0x303,0x83,0xe6,0x61,0x302,0x303,0x83,0xe6, -0x41,0x323,0x302,0x83,0xe6,0x61,0x323,0x302,0x83,0xe6,0x41,0x306,0x301,0x83,0xe6,0x61, -0x306,0x301,0x83,0xe6,0x41,0x306,0x300,0x83,0xe6,0x61,0x306,0x300,0x83,0xe6,0x41,0x306, -0x309,0x83,0xe6,0x61,0x306,0x309,0x83,0xe6,0x41,0x306,0x303,0x83,0xe6,0x61,0x306,0x303, -0x83,0xe6,0x41,0x323,0x306,0x83,0xe6,0x61,0x323,0x306,0x508,0x82,0xdc,0x45,0x323,0x50a, -0x82,0xdc,0x65,0x323,0x82,0xe6,0x45,0x309,0x82,0xe6,0x65,0x309,0x82,0xe6,0x45,0x303, -0x82,0xe6,0x65,0x303,0x83,0xe6,0x45,0x302,0x301,0x83,0xe6,0x65,0x302,0x301,0x83,0xe6, -0x45,0x302,0x300,0x83,0xe6,0x65,0x302,0x300,0x83,0xe6,0x45,0x302,0x309,0x83,0xe6,0x65, -0x302,0x309,0x83,0xe6,0x45,0x302,0x303,0x83,0xe6,0x65,0x302,0x303,0x83,0xe6,0x45,0x323, -0x302,0x83,0xe6,0x65,0x323,0x302,0x82,0xe6,0x49,0x309,0x82,0xe6,0x69,0x309,0x82,0xdc, -0x49,0x323,0x82,0xdc,0x69,0x323,0x51c,0x82,0xdc,0x4f,0x323,0x51e,0x82,0xdc,0x6f,0x323, -0x82,0xe6,0x4f,0x309,0x82,0xe6,0x6f,0x309,0x83,0xe6,0x4f,0x302,0x301,0x83,0xe6,0x6f, -0x302,0x301,0x83,0xe6,0x4f,0x302,0x300,0x83,0xe6,0x6f,0x302,0x300,0x83,0xe6,0x4f,0x302, -0x309,0x83,0xe6,0x6f,0x302,0x309,0x83,0xe6,0x4f,0x302,0x303,0x83,0xe6,0x6f,0x302,0x303, -0x83,0xe6,0x4f,0x323,0x302,0x83,0xe6,0x6f,0x323,0x302,0x83,0xe6,0x4f,0x31b,0x301,0x83, -0xe6,0x6f,0x31b,0x301,0x83,0xe6,0x4f,0x31b,0x300,0x83,0xe6,0x6f,0x31b,0x300,0x83,0xe6, -0x4f,0x31b,0x309,0x83,0xe6,0x6f,0x31b,0x309,0x83,0xe6,0x4f,0x31b,0x303,0x83,0xe6,0x6f, -0x31b,0x303,0x83,0xdc,0x4f,0x31b,0x323,0x83,0xdc,0x6f,0x31b,0x323,0x82,0xdc,0x55,0x323, -0x82,0xdc,0x75,0x323,0x82,0xe6,0x55,0x309,0x82,0xe6,0x75,0x309,0x83,0xe6,0x55,0x31b, -0x301,0x83,0xe6,0x75,0x31b,0x301,0x83,0xe6,0x55,0x31b,0x300,0x83,0xe6,0x75,0x31b,0x300, -0x83,0xe6,0x55,0x31b,0x309,0x83,0xe6,0x75,0x31b,0x309,0x83,0xe6,0x55,0x31b,0x303,0x83, -0xe6,0x75,0x31b,0x303,0x83,0xdc,0x55,0x31b,0x323,0x83,0xdc,0x75,0x31b,0x323,0x82,0xe6, -0x59,0x300,0x82,0xe6,0x79,0x300,0x82,0xdc,0x59,0x323,0x82,0xdc,0x79,0x323,0x82,0xe6, -0x59,0x309,0x82,0xe6,0x79,0x309,0x82,0xe6,0x59,0x303,0x82,0xe6,0x79,0x303,0x548,0x82, -0xe6,0x3b1,0x313,0x550,0x82,0xe6,0x3b1,0x314,0x5f2,0x83,0xe6,0x3b1,0x313,0x300,0x5f4,0x83, -0xe6,0x3b1,0x314,0x300,0x5f6,0x83,0xe6,0x3b1,0x313,0x301,0x5f8,0x83,0xe6,0x3b1,0x314,0x301, -0x5fa,0x83,0xe6,0x3b1,0x313,0x342,0x5fc,0x83,0xe6,0x3b1,0x314,0x342,0x558,0x82,0xe6,0x391, -0x313,0x560,0x82,0xe6,0x391,0x314,0x5fe,0x83,0xe6,0x391,0x313,0x300,0x600,0x83,0xe6,0x391, -0x314,0x300,0x602,0x83,0xe6,0x391,0x313,0x301,0x604,0x83,0xe6,0x391,0x314,0x301,0x606,0x83, -0xe6,0x391,0x313,0x342,0x608,0x83,0xe6,0x391,0x314,0x342,0x568,0x82,0xe6,0x3b5,0x313,0x56c, -0x82,0xe6,0x3b5,0x314,0x83,0xe6,0x3b5,0x313,0x300,0x83,0xe6,0x3b5,0x314,0x300,0x83,0xe6, -0x3b5,0x313,0x301,0x83,0xe6,0x3b5,0x314,0x301,0x570,0x82,0xe6,0x395,0x313,0x574,0x82,0xe6, -0x395,0x314,0x83,0xe6,0x395,0x313,0x300,0x83,0xe6,0x395,0x314,0x300,0x83,0xe6,0x395,0x313, -0x301,0x83,0xe6,0x395,0x314,0x301,0x578,0x82,0xe6,0x3b7,0x313,0x580,0x82,0xe6,0x3b7,0x314, -0x60a,0x83,0xe6,0x3b7,0x313,0x300,0x60c,0x83,0xe6,0x3b7,0x314,0x300,0x60e,0x83,0xe6,0x3b7, -0x313,0x301,0x610,0x83,0xe6,0x3b7,0x314,0x301,0x612,0x83,0xe6,0x3b7,0x313,0x342,0x614,0x83, -0xe6,0x3b7,0x314,0x342,0x588,0x82,0xe6,0x397,0x313,0x590,0x82,0xe6,0x397,0x314,0x616,0x83, -0xe6,0x397,0x313,0x300,0x618,0x83,0xe6,0x397,0x314,0x300,0x61a,0x83,0xe6,0x397,0x313,0x301, -0x61c,0x83,0xe6,0x397,0x314,0x301,0x61e,0x83,0xe6,0x397,0x313,0x342,0x620,0x83,0xe6,0x397, -0x314,0x342,0x598,0x82,0xe6,0x3b9,0x313,0x59e,0x82,0xe6,0x3b9,0x314,0x83,0xe6,0x3b9,0x313, -0x300,0x83,0xe6,0x3b9,0x314,0x300,0x83,0xe6,0x3b9,0x313,0x301,0x83,0xe6,0x3b9,0x314,0x301, -0x83,0xe6,0x3b9,0x313,0x342,0x83,0xe6,0x3b9,0x314,0x342,0x5a4,0x82,0xe6,0x399,0x313,0x5aa, -0x82,0xe6,0x399,0x314,0x83,0xe6,0x399,0x313,0x300,0x83,0xe6,0x399,0x314,0x300,0x83,0xe6, -0x399,0x313,0x301,0x83,0xe6,0x399,0x314,0x301,0x83,0xe6,0x399,0x313,0x342,0x83,0xe6,0x399, -0x314,0x342,0x5b0,0x82,0xe6,0x3bf,0x313,0x5b4,0x82,0xe6,0x3bf,0x314,0x83,0xe6,0x3bf,0x313, -0x300,0x83,0xe6,0x3bf,0x314,0x300,0x83,0xe6,0x3bf,0x313,0x301,0x83,0xe6,0x3bf,0x314,0x301, -0x5b8,0x82,0xe6,0x39f,0x313,0x5bc,0x82,0xe6,0x39f,0x314,0x83,0xe6,0x39f,0x313,0x300,0x83, -0xe6,0x39f,0x314,0x300,0x83,0xe6,0x39f,0x313,0x301,0x83,0xe6,0x39f,0x314,0x301,0x5c0,0x82, -0xe6,0x3c5,0x313,0x5c6,0x82,0xe6,0x3c5,0x314,0x83,0xe6,0x3c5,0x313,0x300,0x83,0xe6,0x3c5, -0x314,0x300,0x83,0xe6,0x3c5,0x313,0x301,0x83,0xe6,0x3c5,0x314,0x301,0x83,0xe6,0x3c5,0x313, -0x342,0x83,0xe6,0x3c5,0x314,0x342,0x5cc,0x82,0xe6,0x3a5,0x314,0x83,0xe6,0x3a5,0x314,0x300, -0x83,0xe6,0x3a5,0x314,0x301,0x83,0xe6,0x3a5,0x314,0x342,0x5d2,0x82,0xe6,0x3c9,0x313,0x5da, -0x82,0xe6,0x3c9,0x314,0x622,0x83,0xe6,0x3c9,0x313,0x300,0x624,0x83,0xe6,0x3c9,0x314,0x300, -0x626,0x83,0xe6,0x3c9,0x313,0x301,0x628,0x83,0xe6,0x3c9,0x314,0x301,0x62a,0x83,0xe6,0x3c9, -0x313,0x342,0x62c,0x83,0xe6,0x3c9,0x314,0x342,0x5e2,0x82,0xe6,0x3a9,0x313,0x5ea,0x82,0xe6, -0x3a9,0x314,0x62e,0x83,0xe6,0x3a9,0x313,0x300,0x630,0x83,0xe6,0x3a9,0x314,0x300,0x632,0x83, -0xe6,0x3a9,0x313,0x301,0x634,0x83,0xe6,0x3a9,0x314,0x301,0x636,0x83,0xe6,0x3a9,0x313,0x342, -0x638,0x83,0xe6,0x3a9,0x314,0x342,0x63a,0x82,0xe6,0x3b1,0x300,0x82,0xe6,0x3b5,0x300,0x640, -0x82,0xe6,0x3b7,0x300,0x82,0xe6,0x3b9,0x300,0x82,0xe6,0x3bf,0x300,0x82,0xe6,0x3c5,0x300, -0x658,0x82,0xe6,0x3c9,0x300,0x83,0xf0,0x3b1,0x313,0x345,0x83,0xf0,0x3b1,0x314,0x345,0x84, -0xf0,0x3b1,0x313,0x300,0x345,0x84,0xf0,0x3b1,0x314,0x300,0x345,0x84,0xf0,0x3b1,0x313,0x301, -0x345,0x84,0xf0,0x3b1,0x314,0x301,0x345,0x84,0xf0,0x3b1,0x313,0x342,0x345,0x84,0xf0,0x3b1, -0x314,0x342,0x345,0x83,0xf0,0x391,0x313,0x345,0x83,0xf0,0x391,0x314,0x345,0x84,0xf0,0x391, -0x313,0x300,0x345,0x84,0xf0,0x391,0x314,0x300,0x345,0x84,0xf0,0x391,0x313,0x301,0x345,0x84, -0xf0,0x391,0x314,0x301,0x345,0x84,0xf0,0x391,0x313,0x342,0x345,0x84,0xf0,0x391,0x314,0x342, -0x345,0x83,0xf0,0x3b7,0x313,0x345,0x83,0xf0,0x3b7,0x314,0x345,0x84,0xf0,0x3b7,0x313,0x300, -0x345,0x84,0xf0,0x3b7,0x314,0x300,0x345,0x84,0xf0,0x3b7,0x313,0x301,0x345,0x84,0xf0,0x3b7, -0x314,0x301,0x345,0x84,0xf0,0x3b7,0x313,0x342,0x345,0x84,0xf0,0x3b7,0x314,0x342,0x345,0x83, -0xf0,0x397,0x313,0x345,0x83,0xf0,0x397,0x314,0x345,0x84,0xf0,0x397,0x313,0x300,0x345,0x84, -0xf0,0x397,0x314,0x300,0x345,0x84,0xf0,0x397,0x313,0x301,0x345,0x84,0xf0,0x397,0x314,0x301, -0x345,0x84,0xf0,0x397,0x313,0x342,0x345,0x84,0xf0,0x397,0x314,0x342,0x345,0x83,0xf0,0x3c9, -0x313,0x345,0x83,0xf0,0x3c9,0x314,0x345,0x84,0xf0,0x3c9,0x313,0x300,0x345,0x84,0xf0,0x3c9, -0x314,0x300,0x345,0x84,0xf0,0x3c9,0x313,0x301,0x345,0x84,0xf0,0x3c9,0x314,0x301,0x345,0x84, -0xf0,0x3c9,0x313,0x342,0x345,0x84,0xf0,0x3c9,0x314,0x342,0x345,0x83,0xf0,0x3a9,0x313,0x345, -0x83,0xf0,0x3a9,0x314,0x345,0x84,0xf0,0x3a9,0x313,0x300,0x345,0x84,0xf0,0x3a9,0x314,0x300, -0x345,0x84,0xf0,0x3a9,0x313,0x301,0x345,0x84,0xf0,0x3a9,0x314,0x301,0x345,0x84,0xf0,0x3a9, -0x313,0x342,0x345,0x84,0xf0,0x3a9,0x314,0x342,0x345,0x82,0xe6,0x3b1,0x306,0x82,0xe6,0x3b1, -0x304,0x83,0xf0,0x3b1,0x300,0x345,0x82,0xf0,0x3b1,0x345,0x83,0xf0,0x3b1,0x301,0x345,0x63e, -0x82,0xe6,0x3b1,0x342,0x83,0xf0,0x3b1,0x342,0x345,0x82,0xe6,0x391,0x306,0x82,0xe6,0x391, -0x304,0x82,0xe6,0x391,0x300,0x82,0xf0,0x391,0x345,0x8382,0xe6,0xa8,0x342,0xe6,0x20,0x308, -0x342,0x83,0xf0,0x3b7,0x300,0x345,0x82,0xf0,0x3b7,0x345,0x83,0xf0,0x3b7,0x301,0x345,0x644, -0x82,0xe6,0x3b7,0x342,0x83,0xf0,0x3b7,0x342,0x345,0x82,0xe6,0x395,0x300,0x82,0xe6,0x397, -0x300,0x82,0xf0,0x397,0x345,0x8382,0xe6,0x1fbf,0x300,0xe6,0x20,0x313,0x300,0x8382,0xe6,0x1fbf, -0x301,0xe6,0x20,0x313,0x301,0x8382,0xe6,0x1fbf,0x342,0xe6,0x20,0x313,0x342,0x82,0xe6,0x3b9, -0x306,0x82,0xe6,0x3b9,0x304,0x83,0xe6,0x3b9,0x308,0x300,0x82,0xe6,0x3b9,0x342,0x83,0xe6, -0x3b9,0x308,0x342,0x82,0xe6,0x399,0x306,0x82,0xe6,0x399,0x304,0x82,0xe6,0x399,0x300,0x8382, -0xe6,0x1ffe,0x300,0xe6,0x20,0x314,0x300,0x8382,0xe6,0x1ffe,0x301,0xe6,0x20,0x314,0x301,0x8382, -0xe6,0x1ffe,0x342,0xe6,0x20,0x314,0x342,0x82,0xe6,0x3c5,0x306,0x82,0xe6,0x3c5,0x304,0x83, -0xe6,0x3c5,0x308,0x300,0x82,0xe6,0x3c1,0x313,0x82,0xe6,0x3c1,0x314,0x82,0xe6,0x3c5,0x342, -0x83,0xe6,0x3c5,0x308,0x342,0x82,0xe6,0x3a5,0x306,0x82,0xe6,0x3a5,0x304,0x82,0xe6,0x3a5, -0x300,0x82,0xe6,0x3a1,0x314,0x8382,0xe6,0xa8,0x300,0xe6,0x20,0x308,0x300,0x83,0xf0,0x3c9, -0x300,0x345,0x82,0xf0,0x3c9,0x345,0x83,0xf0,0x3c9,0x301,0x345,0x65c,0x82,0xe6,0x3c9,0x342, -0x83,0xf0,0x3c9,0x342,0x345,0x82,0xe6,0x39f,0x300,0x82,0xe6,0x3a9,0x300,0x82,0xf0,0x3a9, -0x345,0x82,1,0x2190,0x338,0x82,1,0x2192,0x338,0x82,1,0x2194,0x338,0x82,1,0x21d0, -0x338,0x82,1,0x21d4,0x338,0x82,1,0x21d2,0x338,0x82,1,0x2203,0x338,0x82,1,0x2208, -0x338,0x82,1,0x220b,0x338,0x82,1,0x2223,0x338,0x82,1,0x2225,0x338,0x82,1,0x223c, -0x338,0x82,1,0x2243,0x338,0x82,1,0x2245,0x338,0x82,1,0x2248,0x338,0x82,1,0x3d, -0x338,0x82,1,0x2261,0x338,0x82,1,0x224d,0x338,0x82,1,0x3c,0x338,0x82,1,0x3e, -0x338,0x82,1,0x2264,0x338,0x82,1,0x2265,0x338,0x82,1,0x2272,0x338,0x82,1,0x2273, -0x338,0x82,1,0x2276,0x338,0x82,1,0x2277,0x338,0x82,1,0x227a,0x338,0x82,1,0x227b, -0x338,0x82,1,0x2282,0x338,0x82,1,0x2283,0x338,0x82,1,0x2286,0x338,0x82,1,0x2287, -0x338,0x82,1,0x22a2,0x338,0x82,1,0x22a8,0x338,0x82,1,0x22a9,0x338,0x82,1,0x22ab, -0x338,0x82,1,0x227c,0x338,0x82,1,0x227d,0x338,0x82,1,0x2291,0x338,0x82,1,0x2292, -0x338,0x82,1,0x22b2,0x338,0x82,1,0x22b3,0x338,0x82,1,0x22b4,0x338,0x82,1,0x22b5, -0x338,0x82,8,0x304b,0x3099,0x82,8,0x304d,0x3099,0x82,8,0x304f,0x3099,0x82,8,0x3051, -0x3099,0x82,8,0x3053,0x3099,0x82,8,0x3055,0x3099,0x82,8,0x3057,0x3099,0x82,8,0x3059, -0x3099,0x82,8,0x305b,0x3099,0x82,8,0x305d,0x3099,0x82,8,0x305f,0x3099,0x82,8,0x3061, -0x3099,0x82,8,0x3064,0x3099,0x82,8,0x3066,0x3099,0x82,8,0x3068,0x3099,0x82,8,0x306f, -0x3099,0x82,8,0x306f,0x309a,0x82,8,0x3072,0x3099,0x82,8,0x3072,0x309a,0x82,8,0x3075, -0x3099,0x82,8,0x3075,0x309a,0x82,8,0x3078,0x3099,0x82,8,0x3078,0x309a,0x82,8,0x307b, -0x3099,0x82,8,0x307b,0x309a,0x82,8,0x3046,0x3099,0x82,8,0x309d,0x3099,0x82,8,0x30ab, -0x3099,0x82,8,0x30ad,0x3099,0x82,8,0x30af,0x3099,0x82,8,0x30b1,0x3099,0x82,8,0x30b3, -0x3099,0x82,8,0x30b5,0x3099,0x82,8,0x30b7,0x3099,0x82,8,0x30b9,0x3099,0x82,8,0x30bb, -0x3099,0x82,8,0x30bd,0x3099,0x82,8,0x30bf,0x3099,0x82,8,0x30c1,0x3099,0x82,8,0x30c4, -0x3099,0x82,8,0x30c6,0x3099,0x82,8,0x30c8,0x3099,0x82,8,0x30cf,0x3099,0x82,8,0x30cf, -0x309a,0x82,8,0x30d2,0x3099,0x82,8,0x30d2,0x309a,0x82,8,0x30d5,0x3099,0x82,8,0x30d5, -0x309a,0x82,8,0x30d8,0x3099,0x82,8,0x30d8,0x309a,0x82,8,0x30db,0x3099,0x82,8,0x30db, -0x309a,0x82,8,0x30a6,0x3099,0x82,8,0x30ef,0x3099,0x82,8,0x30f0,0x3099,0x82,8,0x30f1, -0x3099,0x82,8,0x30f2,0x3099,0x82,8,0x30fd,0x3099,0x790,0x791,0x792,0x793,0x797,0x798,0x79a, -0x794,0x7bd,0x795,0x79c,0x79b,0x79e,0x79f,0x7be,0x7bf,0x79d,0x7b7,0x7bc,0x7b6,0x7a0,0x796,0x799, -0x7b9,0x7bb,0x7ba,0x7b8,0x7c2,0x7c0,0x7c1,0x7a1,0x7a2,0x7a3,0x7a4,0x7a5,0x7a6,0x7a8,0x7a7,0x7a9, -0x7ab,0x7aa,0x7ac,0x7af,0x7ad,0x7ae,0x7b0,0x7b1,0x7b2,0x7b3,0x7b4,0x7b5,0x7c3,0x7c4,0x100,0x20, -0x2fc,0x8200,0xe6,0x20,0x308,0x100,0x61,0x8200,0xe6,0x20,0x304,0x100,0x32,0x100,0x33,0x8200, -0xe6,0x20,0x301,0x100,0x3bc,0x8200,0xca,0x20,0x327,0x100,0x31,0x100,0x6f,0x300,0x31,0x2044, -0x34,0x300,0x31,0x2044,0x32,0x300,0x33,0x2044,0x34,0x200,0x49,0x4a,0x200,0x69,0x6a,0x200, -0x4c,0xb7,0x200,0x6c,0xb7,0x200,0x2bc,0x6e,0x4ce,0x100,0x73,0x8300,0xe6,0x44,0x5a,0x30c, -0x8300,0xe6,0x44,0x7a,0x30c,0x8300,0xe6,0x64,0x7a,0x30c,0x200,0x4c,0x4a,0x200,0x4c,0x6a, -0x200,0x6c,0x6a,0x200,0x4e,0x4a,0x200,0x4e,0x6a,0x200,0x6e,0x6a,0x200,0x44,0x5a,0x200, -0x44,0x7a,0x200,0x64,0x7a,0x100,0x68,0x100,0x266,0x100,0x6a,0x100,0x72,0x100,0x279,0x100, -0x27b,0x100,0x281,0x100,0x77,0x100,0x79,0x8200,0xe6,0x20,0x306,0x8200,0xe6,0x20,0x307,0x8200, -0xe6,0x20,0x30a,0x8200,0xca,0x20,0x328,0x8200,0xe6,0x20,0x303,0x8200,0xe6,0x20,0x30b,0x100, -0x263,0x100,0x6c,0x100,0x73,0x100,0x78,0x100,0x295,0x8200,0xe6,0x20,0x301,0x100,0x3b2,0x100, -0x3b8,0x100,0x3c6,0x100,0x3c0,0x100,0x3ba,0x100,0x3c1,0x100,0x398,0x100,0x3b5,0x200,0x565,0x582, -0x200,0x627,0x674,0x200,0x648,0x674,0x200,0x6c7,0x674,0x200,0x64a,0x674,0x200,0xe4d,0xe32,0x200, -0xecd,0xeb2,0x200,0xeab,0xe99,0x200,0xeab,0xea1,0x100,0xf0b,0x8300,0x82,0xfb2,0xf71,0xf80,0x8300, -0x82,0xfb3,0xf71,0xf80,0x100,0x10dc,0x100,0x61,0x100,0x250,0x100,0x251,0x100,0x1d02,0x100,0x62, -0x100,0x64,0x100,0x65,0x100,0x259,0x100,0x25b,0x100,0x25c,0x100,0x67,0x100,0x6b,0x100,0x6d, -0x100,0x14b,0x100,0x6f,0x100,0x254,0x100,0x1d16,0x100,0x1d17,0x100,0x70,0x100,0x74,0x100,0x75, -0x100,0x1d1d,0x100,0x26f,0x100,0x76,0x100,0x1d25,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3c6, -0x100,0x3c7,0x100,0x69,0x100,0x72,0x100,0x75,0x100,0x76,0x100,0x3b2,0x100,0x3b3,0x100,0x3c1, -0x100,0x3c6,0x100,0x3c7,0x100,0x43d,0x100,0x252,0x100,0x63,0x100,0x255,0x100,0xf0,0x100,0x25c, -0x100,0x66,0x100,0x25f,0x100,0x261,0x100,0x265,0x100,0x268,0x100,0x269,0x100,0x26a,0x100,0x1d7b, -0x100,0x29d,0x100,0x26d,0x100,0x1d85,0x100,0x29f,0x100,0x271,0x100,0x270,0x100,0x272,0x100,0x273, -0x100,0x274,0x100,0x275,0x100,0x278,0x100,0x282,0x100,0x283,0x100,0x1ab,0x100,0x289,0x100,0x28a, -0x100,0x1d1c,0x100,0x28b,0x100,0x28c,0x100,0x7a,0x100,0x290,0x100,0x291,0x100,0x292,0x100,0x3b8, -0x200,0x61,0x2be,0x8200,0xe6,0x20,0x313,0x646,0x8200,0xe6,0x20,0x313,0x8200,0xe6,0x20,0x342, -0x64c,0x8200,0xe6,0x20,0x314,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100, -0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x2010,0x8200,0xdc,0x20,0x333,0x100,0x2e,0x200, -0x2e,0x2e,0x300,0x2e,0x2e,0x2e,0x100,0x20,0x200,0x2032,0x2032,0x300,0x2032,0x2032,0x2032,0x200, -0x2035,0x2035,0x300,0x2035,0x2035,0x2035,0x200,0x21,0x21,0x8200,0xe6,0x20,0x305,0x200,0x3f,0x3f, -0x200,0x3f,0x21,0x200,0x21,0x3f,0x400,0x2032,0x2032,0x2032,0x2032,0x100,0x20,0x100,0x30,0x100, -0x69,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x2b,0x100, -0x2212,0x100,0x3d,0x100,0x28,0x100,0x29,0x100,0x6e,0x100,0x30,0x100,0x31,0x100,0x32,0x100, -0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x2b,0x100, -0x2212,0x100,0x3d,0x100,0x28,0x100,0x29,0x100,0x61,0x100,0x65,0x100,0x6f,0x100,0x78,0x100, -0x259,0x300,0x61,0x2f,0x63,0x300,0x61,0x2f,0x73,0x300,0x63,0x2f,0x6f,0x300,0x63,0x2f, -0x75,0x100,0x67,0x100,0x68,0x100,0x127,0x100,0x6c,0x100,0x65,0x100,0x6f,0x100,0x5d0,0x100, -0x5d1,0x100,0x5d2,0x100,0x5d3,0x100,0x69,0x100,0x3c0,0x100,0x3b3,0x100,0x2211,0x100,0x64,0x100, -0x65,0x100,0x69,0x100,0x6a,0x300,0x31,0x2044,0x33,0x300,0x32,0x2044,0x33,0x300,0x31,0x2044, -0x35,0x300,0x32,0x2044,0x35,0x300,0x33,0x2044,0x35,0x300,0x34,0x2044,0x35,0x300,0x31,0x2044, -0x36,0x300,0x35,0x2044,0x36,0x300,0x31,0x2044,0x38,0x300,0x33,0x2044,0x38,0x300,0x35,0x2044, -0x38,0x300,0x37,0x2044,0x38,0x200,0x31,0x2044,0x100,0x49,0x200,0x49,0x49,0x300,0x49,0x49, -0x49,0x200,0x49,0x56,0x100,0x56,0x200,0x56,0x49,0x300,0x56,0x49,0x49,0x400,0x56,0x49, -0x49,0x49,0x200,0x49,0x58,0x100,0x58,0x200,0x58,0x49,0x300,0x58,0x49,0x49,0x100,0x4c, -0x100,0x43,0x100,0x44,0x100,0x4d,0x100,0x69,0x200,0x69,0x69,0x300,0x69,0x69,0x69,0x200, -0x69,0x76,0x100,0x76,0x200,0x76,0x69,0x300,0x76,0x69,0x69,0x400,0x76,0x69,0x69,0x69, -0x200,0x69,0x78,0x100,0x78,0x200,0x78,0x69,0x300,0x78,0x69,0x69,0x100,0x6c,0x100,0x63, -0x100,0x64,0x100,0x6d,0x200,0x222b,0x222b,0x300,0x222b,0x222b,0x222b,0x200,0x222e,0x222e,0x300,0x222e, -0x222e,0x222e,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37, -0x100,0x38,0x100,0x39,0x200,0x31,0x30,0x200,0x31,0x31,0x200,0x31,0x32,0x200,0x31,0x33, -0x200,0x31,0x34,0x200,0x31,0x35,0x200,0x31,0x36,0x200,0x31,0x37,0x200,0x31,0x38,0x200, -0x31,0x39,0x200,0x32,0x30,0x300,0x28,0x31,0x29,0x300,0x28,0x32,0x29,0x300,0x28,0x33, -0x29,0x300,0x28,0x34,0x29,0x300,0x28,0x35,0x29,0x300,0x28,0x36,0x29,0x300,0x28,0x37, -0x29,0x300,0x28,0x38,0x29,0x300,0x28,0x39,0x29,0x400,0x28,0x31,0x30,0x29,0x400,0x28, -0x31,0x31,0x29,0x400,0x28,0x31,0x32,0x29,0x400,0x28,0x31,0x33,0x29,0x400,0x28,0x31, -0x34,0x29,0x400,0x28,0x31,0x35,0x29,0x400,0x28,0x31,0x36,0x29,0x400,0x28,0x31,0x37, -0x29,0x400,0x28,0x31,0x38,0x29,0x400,0x28,0x31,0x39,0x29,0x400,0x28,0x32,0x30,0x29, -0x200,0x31,0x2e,0x200,0x32,0x2e,0x200,0x33,0x2e,0x200,0x34,0x2e,0x200,0x35,0x2e,0x200, -0x36,0x2e,0x200,0x37,0x2e,0x200,0x38,0x2e,0x200,0x39,0x2e,0x300,0x31,0x30,0x2e,0x300, -0x31,0x31,0x2e,0x300,0x31,0x32,0x2e,0x300,0x31,0x33,0x2e,0x300,0x31,0x34,0x2e,0x300, -0x31,0x35,0x2e,0x300,0x31,0x36,0x2e,0x300,0x31,0x37,0x2e,0x300,0x31,0x38,0x2e,0x300, -0x31,0x39,0x2e,0x300,0x32,0x30,0x2e,0x300,0x28,0x61,0x29,0x300,0x28,0x62,0x29,0x300, -0x28,0x63,0x29,0x300,0x28,0x64,0x29,0x300,0x28,0x65,0x29,0x300,0x28,0x66,0x29,0x300, -0x28,0x67,0x29,0x300,0x28,0x68,0x29,0x300,0x28,0x69,0x29,0x300,0x28,0x6a,0x29,0x300, -0x28,0x6b,0x29,0x300,0x28,0x6c,0x29,0x300,0x28,0x6d,0x29,0x300,0x28,0x6e,0x29,0x300, -0x28,0x6f,0x29,0x300,0x28,0x70,0x29,0x300,0x28,0x71,0x29,0x300,0x28,0x72,0x29,0x300, -0x28,0x73,0x29,0x300,0x28,0x74,0x29,0x300,0x28,0x75,0x29,0x300,0x28,0x76,0x29,0x300, -0x28,0x77,0x29,0x300,0x28,0x78,0x29,0x300,0x28,0x79,0x29,0x300,0x28,0x7a,0x29,0x100, +0x3c1,0xff01,0x3c4,0xff01,0x3c6,0xff01,0x3c7,0xff01,0x3c8,0xff01,0x3dd,0x8200,0xf0,0x20,0x345,0x3b2, +0x100,0x3a5,0x8282,0xe6,0x3d2,0x301,0xe6,0x3a5,0x301,0x8282,0xe6,0x3d2,0x308,0xe6,0x3a5,0x308, +0x100,0x3c2,0x100,0x3a3,0x100,0x41,0x100,0xc6,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x18e, +0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e, +0x100,0x4f,0x100,0x222,0x100,0x50,0x100,0x52,0x100,0x54,0x100,0x55,0x100,0x57,0x200,0x52, +0x73,0x100,0x43,0x200,0xb0,0x43,0x100,0x190,0x200,0xb0,0x46,0x100,0x48,0x100,0x48,0x100, +0x48,0x100,0x49,0x100,0x49,0x100,0x4c,0x100,0x4e,0x200,0x4e,0x6f,0x100,0x50,0x100,0x51, +0x100,0x52,0x100,0x52,0x100,0x52,0x200,0x53,0x4d,0x300,0x54,0x45,0x4c,0x200,0x54,0x4d, +0x100,0x5a,0x100,0x5a,0x100,0x42,0x100,0x43,0x100,0x45,0x100,0x46,0x100,0x4d,0x300,0x46, +0x41,0x58,0x100,0x393,0x100,0x3a0,0x100,0x44,0x300,0x50,0x54,0x45,0x200,0x48,0x67,0x200, +0x65,0x56,0x300,0x4c,0x54,0x44,0x300,0x68,0x50,0x61,0x200,0x41,0x55,0x200,0x6f,0x56, +0x200,0x49,0x55,0x200,0x70,0x41,0x200,0x6e,0x41,0x200,0x3bc,0x41,0x200,0x6d,0x41,0x200, +0x6b,0x41,0x200,0x4b,0x42,0x200,0x4d,0x42,0x200,0x47,0x42,0x200,0x70,0x46,0x200,0x6e, +0x46,0x200,0x3bc,0x46,0x200,0x48,0x7a,0x300,0x6b,0x48,0x7a,0x300,0x4d,0x48,0x7a,0x300, +0x47,0x48,0x7a,0x300,0x54,0x48,0x7a,0x200,0x50,0x61,0x300,0x6b,0x50,0x61,0x300,0x4d, +0x50,0x61,0x300,0x47,0x50,0x61,0x200,0x70,0x56,0x200,0x6e,0x56,0x200,0x3bc,0x56,0x200, +0x6d,0x56,0x200,0x6b,0x56,0x200,0x4d,0x56,0x200,0x70,0x57,0x200,0x6e,0x57,0x200,0x3bc, +0x57,0x200,0x6d,0x57,0x200,0x6b,0x57,0x200,0x4d,0x57,0x200,0x6b,0x3a9,0x200,0x4d,0x3a9, +0x200,0x42,0x71,0x400,0x43,0x2215,0x6b,0x67,0x300,0x43,0x6f,0x2e,0x200,0x64,0x42,0x200, +0x47,0x79,0x200,0x48,0x50,0x200,0x4b,0x4b,0x200,0x4b,0x4d,0x200,0x50,0x48,0x300,0x50, +0x50,0x4d,0x200,0x50,0x52,0x200,0x53,0x76,0x200,0x57,0x62,0x300,0x56,0x2215,0x6d,0x300, +0x41,0x2215,0x6d,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100, +0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100, +0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100, +0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100, +0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100, +0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100, +0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100, +0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100, +0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100, +0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100, +0x41,0x100,0x43,0x100,0x44,0x100,0x47,0x100,0x4a,0x100,0x4b,0x100,0x4e,0x100,0x4f,0x100, +0x50,0x100,0x51,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100, +0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100, +0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100, +0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100, +0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x44,0x100,0x45,0x100, +0x46,0x100,0x47,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100, +0x50,0x100,0x51,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100, +0x59,0x100,0x41,0x100,0x42,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x49,0x100, +0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4f,0x100,0x53,0x100,0x54,0x100,0x55,0x100, +0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100, +0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100, +0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100, +0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100, +0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100, +0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100, +0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100, 0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100, 0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100, 0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100, -0x59,0x100,0x5a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100, -0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100, -0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100, -0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x30,0x400,0x222b,0x222b,0x222b,0x222b,0x300,0x3a, -0x3a,0x3d,0x200,0x3d,0x3d,0x300,0x3d,0x3d,0x3d,0x100,0x2d61,0x100,0x6bcd,0x100,0x9f9f,0x100, -0x4e00,0x100,0x4e28,0x100,0x4e36,0x100,0x4e3f,0x100,0x4e59,0x100,0x4e85,0x100,0x4e8c,0x100,0x4ea0,0x100, -0x4eba,0x100,0x513f,0x100,0x5165,0x100,0x516b,0x100,0x5182,0x100,0x5196,0x100,0x51ab,0x100,0x51e0,0x100, -0x51f5,0x100,0x5200,0x100,0x529b,0x100,0x52f9,0x100,0x5315,0x100,0x531a,0x100,0x5338,0x100,0x5341,0x100, -0x535c,0x100,0x5369,0x100,0x5382,0x100,0x53b6,0x100,0x53c8,0x100,0x53e3,0x100,0x56d7,0x100,0x571f,0x100, -0x58eb,0x100,0x5902,0x100,0x590a,0x100,0x5915,0x100,0x5927,0x100,0x5973,0x100,0x5b50,0x100,0x5b80,0x100, -0x5bf8,0x100,0x5c0f,0x100,0x5c22,0x100,0x5c38,0x100,0x5c6e,0x100,0x5c71,0x100,0x5ddb,0x100,0x5de5,0x100, -0x5df1,0x100,0x5dfe,0x100,0x5e72,0x100,0x5e7a,0x100,0x5e7f,0x100,0x5ef4,0x100,0x5efe,0x100,0x5f0b,0x100, -0x5f13,0x100,0x5f50,0x100,0x5f61,0x100,0x5f73,0x100,0x5fc3,0x100,0x6208,0x100,0x6236,0x100,0x624b,0x100, -0x652f,0x100,0x6534,0x100,0x6587,0x100,0x6597,0x100,0x65a4,0x100,0x65b9,0x100,0x65e0,0x100,0x65e5,0x100, -0x66f0,0x100,0x6708,0x100,0x6728,0x100,0x6b20,0x100,0x6b62,0x100,0x6b79,0x100,0x6bb3,0x100,0x6bcb,0x100, -0x6bd4,0x100,0x6bdb,0x100,0x6c0f,0x100,0x6c14,0x100,0x6c34,0x100,0x706b,0x100,0x722a,0x100,0x7236,0x100, -0x723b,0x100,0x723f,0x100,0x7247,0x100,0x7259,0x100,0x725b,0x100,0x72ac,0x100,0x7384,0x100,0x7389,0x100, -0x74dc,0x100,0x74e6,0x100,0x7518,0x100,0x751f,0x100,0x7528,0x100,0x7530,0x100,0x758b,0x100,0x7592,0x100, -0x7676,0x100,0x767d,0x100,0x76ae,0x100,0x76bf,0x100,0x76ee,0x100,0x77db,0x100,0x77e2,0x100,0x77f3,0x100, -0x793a,0x100,0x79b8,0x100,0x79be,0x100,0x7a74,0x100,0x7acb,0x100,0x7af9,0x100,0x7c73,0x100,0x7cf8,0x100, -0x7f36,0x100,0x7f51,0x100,0x7f8a,0x100,0x7fbd,0x100,0x8001,0x100,0x800c,0x100,0x8012,0x100,0x8033,0x100, -0x807f,0x100,0x8089,0x100,0x81e3,0x100,0x81ea,0x100,0x81f3,0x100,0x81fc,0x100,0x820c,0x100,0x821b,0x100, -0x821f,0x100,0x826e,0x100,0x8272,0x100,0x8278,0x100,0x864d,0x100,0x866b,0x100,0x8840,0x100,0x884c,0x100, -0x8863,0x100,0x897e,0x100,0x898b,0x100,0x89d2,0x100,0x8a00,0x100,0x8c37,0x100,0x8c46,0x100,0x8c55,0x100, -0x8c78,0x100,0x8c9d,0x100,0x8d64,0x100,0x8d70,0x100,0x8db3,0x100,0x8eab,0x100,0x8eca,0x100,0x8f9b,0x100, -0x8fb0,0x100,0x8fb5,0x100,0x9091,0x100,0x9149,0x100,0x91c6,0x100,0x91cc,0x100,0x91d1,0x100,0x9577,0x100, -0x9580,0x100,0x961c,0x100,0x96b6,0x100,0x96b9,0x100,0x96e8,0x100,0x9751,0x100,0x975e,0x100,0x9762,0x100, -0x9769,0x100,0x97cb,0x100,0x97ed,0x100,0x97f3,0x100,0x9801,0x100,0x98a8,0x100,0x98db,0x100,0x98df,0x100, -0x9996,0x100,0x9999,0x100,0x99ac,0x100,0x9aa8,0x100,0x9ad8,0x100,0x9adf,0x100,0x9b25,0x100,0x9b2f,0x100, -0x9b32,0x100,0x9b3c,0x100,0x9b5a,0x100,0x9ce5,0x100,0x9e75,0x100,0x9e7f,0x100,0x9ea5,0x100,0x9ebb,0x100, -0x9ec3,0x100,0x9ecd,0x100,0x9ed1,0x100,0x9ef9,0x100,0x9efd,0x100,0x9f0e,0x100,0x9f13,0x100,0x9f20,0x100, -0x9f3b,0x100,0x9f4a,0x100,0x9f52,0x100,0x9f8d,0x100,0x9f9c,0x100,0x9fa0,0x100,0x20,0x100,0x3012,0x100, -0x5341,0x100,0x5344,0x100,0x5345,0x8200,8,0x20,0x3099,0x8200,8,0x20,0x309a,0x200,0x3088,0x308a, -0x200,0x30b3,0x30c8,0x100,0x1100,0x100,0x1101,0x100,0x11aa,0x100,0x1102,0x100,0x11ac,0x100,0x11ad,0x100, -0x1103,0x100,0x1104,0x100,0x1105,0x100,0x11b0,0x100,0x11b1,0x100,0x11b2,0x100,0x11b3,0x100,0x11b4,0x100, -0x11b5,0x100,0x111a,0x100,0x1106,0x100,0x1107,0x100,0x1108,0x100,0x1121,0x100,0x1109,0x100,0x110a,0x100, -0x110b,0x100,0x110c,0x100,0x110d,0x100,0x110e,0x100,0x110f,0x100,0x1110,0x100,0x1111,0x100,0x1112,0x100, -0x1161,0x100,0x1162,0x100,0x1163,0x100,0x1164,0x100,0x1165,0x100,0x1166,0x100,0x1167,0x100,0x1168,0x100, -0x1169,0x100,0x116a,0x100,0x116b,0x100,0x116c,0x100,0x116d,0x100,0x116e,0x100,0x116f,0x100,0x1170,0x100, -0x1171,0x100,0x1172,0x100,0x1173,0x100,0x1174,0x100,0x1175,0x100,0x1160,0x100,0x1114,0x100,0x1115,0x100, -0x11c7,0x100,0x11c8,0x100,0x11cc,0x100,0x11ce,0x100,0x11d3,0x100,0x11d7,0x100,0x11d9,0x100,0x111c,0x100, -0x11dd,0x100,0x11df,0x100,0x111d,0x100,0x111e,0x100,0x1120,0x100,0x1122,0x100,0x1123,0x100,0x1127,0x100, -0x1129,0x100,0x112b,0x100,0x112c,0x100,0x112d,0x100,0x112e,0x100,0x112f,0x100,0x1132,0x100,0x1136,0x100, -0x1140,0x100,0x1147,0x100,0x114c,0x100,0x11f1,0x100,0x11f2,0x100,0x1157,0x100,0x1158,0x100,0x1159,0x100, -0x1184,0x100,0x1185,0x100,0x1188,0x100,0x1191,0x100,0x1192,0x100,0x1194,0x100,0x119e,0x100,0x11a1,0x100, -0x4e00,0x100,0x4e8c,0x100,0x4e09,0x100,0x56db,0x100,0x4e0a,0x100,0x4e2d,0x100,0x4e0b,0x100,0x7532,0x100, -0x4e59,0x100,0x4e19,0x100,0x4e01,0x100,0x5929,0x100,0x5730,0x100,0x4eba,0x300,0x28,0x1100,0x29,0x300, -0x28,0x1102,0x29,0x300,0x28,0x1103,0x29,0x300,0x28,0x1105,0x29,0x300,0x28,0x1106,0x29,0x300, -0x28,0x1107,0x29,0x300,0x28,0x1109,0x29,0x300,0x28,0x110b,0x29,0x300,0x28,0x110c,0x29,0x300, -0x28,0x110e,0x29,0x300,0x28,0x110f,0x29,0x300,0x28,0x1110,0x29,0x300,0x28,0x1111,0x29,0x300, -0x28,0x1112,0x29,0x400,0x28,0x1100,0x1161,0x29,0x400,0x28,0x1102,0x1161,0x29,0x400,0x28,0x1103, -0x1161,0x29,0x400,0x28,0x1105,0x1161,0x29,0x400,0x28,0x1106,0x1161,0x29,0x400,0x28,0x1107,0x1161, -0x29,0x400,0x28,0x1109,0x1161,0x29,0x400,0x28,0x110b,0x1161,0x29,0x400,0x28,0x110c,0x1161,0x29, -0x400,0x28,0x110e,0x1161,0x29,0x400,0x28,0x110f,0x1161,0x29,0x400,0x28,0x1110,0x1161,0x29,0x400, -0x28,0x1111,0x1161,0x29,0x400,0x28,0x1112,0x1161,0x29,0x400,0x28,0x110c,0x116e,0x29,0x700,0x28, -0x110b,0x1169,0x110c,0x1165,0x11ab,0x29,0x600,0x28,0x110b,0x1169,0x1112,0x116e,0x29,0x300,0x28,0x4e00, -0x29,0x300,0x28,0x4e8c,0x29,0x300,0x28,0x4e09,0x29,0x300,0x28,0x56db,0x29,0x300,0x28,0x4e94, -0x29,0x300,0x28,0x516d,0x29,0x300,0x28,0x4e03,0x29,0x300,0x28,0x516b,0x29,0x300,0x28,0x4e5d, -0x29,0x300,0x28,0x5341,0x29,0x300,0x28,0x6708,0x29,0x300,0x28,0x706b,0x29,0x300,0x28,0x6c34, -0x29,0x300,0x28,0x6728,0x29,0x300,0x28,0x91d1,0x29,0x300,0x28,0x571f,0x29,0x300,0x28,0x65e5, -0x29,0x300,0x28,0x682a,0x29,0x300,0x28,0x6709,0x29,0x300,0x28,0x793e,0x29,0x300,0x28,0x540d, -0x29,0x300,0x28,0x7279,0x29,0x300,0x28,0x8ca1,0x29,0x300,0x28,0x795d,0x29,0x300,0x28,0x52b4, -0x29,0x300,0x28,0x4ee3,0x29,0x300,0x28,0x547c,0x29,0x300,0x28,0x5b66,0x29,0x300,0x28,0x76e3, -0x29,0x300,0x28,0x4f01,0x29,0x300,0x28,0x8cc7,0x29,0x300,0x28,0x5354,0x29,0x300,0x28,0x796d, -0x29,0x300,0x28,0x4f11,0x29,0x300,0x28,0x81ea,0x29,0x300,0x28,0x81f3,0x29,0x200,0x32,0x31, -0x200,0x32,0x32,0x200,0x32,0x33,0x200,0x32,0x34,0x200,0x32,0x35,0x200,0x32,0x36,0x200, -0x32,0x37,0x200,0x32,0x38,0x200,0x32,0x39,0x200,0x33,0x30,0x200,0x33,0x31,0x200,0x33, -0x32,0x200,0x33,0x33,0x200,0x33,0x34,0x200,0x33,0x35,0x100,0x1100,0x100,0x1102,0x100,0x1103, -0x100,0x1105,0x100,0x1106,0x100,0x1107,0x100,0x1109,0x100,0x110b,0x100,0x110c,0x100,0x110e,0x100,0x110f, -0x100,0x1110,0x100,0x1111,0x100,0x1112,0x200,0x1100,0x1161,0x200,0x1102,0x1161,0x200,0x1103,0x1161,0x200, -0x1105,0x1161,0x200,0x1106,0x1161,0x200,0x1107,0x1161,0x200,0x1109,0x1161,0x200,0x110b,0x1161,0x200,0x110c, -0x1161,0x200,0x110e,0x1161,0x200,0x110f,0x1161,0x200,0x1110,0x1161,0x200,0x1111,0x1161,0x200,0x1112,0x1161, -0x500,0x110e,0x1161,0x11b7,0x1100,0x1169,0x400,0x110c,0x116e,0x110b,0x1174,0x200,0x110b,0x116e,0x100,0x4e00, -0x100,0x4e8c,0x100,0x4e09,0x100,0x56db,0x100,0x4e94,0x100,0x516d,0x100,0x4e03,0x100,0x516b,0x100,0x4e5d, -0x100,0x5341,0x100,0x6708,0x100,0x706b,0x100,0x6c34,0x100,0x6728,0x100,0x91d1,0x100,0x571f,0x100,0x65e5, -0x100,0x682a,0x100,0x6709,0x100,0x793e,0x100,0x540d,0x100,0x7279,0x100,0x8ca1,0x100,0x795d,0x100,0x52b4, -0x100,0x79d8,0x100,0x7537,0x100,0x5973,0x100,0x9069,0x100,0x512a,0x100,0x5370,0x100,0x6ce8,0x100,0x9805, -0x100,0x4f11,0x100,0x5199,0x100,0x6b63,0x100,0x4e0a,0x100,0x4e2d,0x100,0x4e0b,0x100,0x5de6,0x100,0x53f3, -0x100,0x533b,0x100,0x5b97,0x100,0x5b66,0x100,0x76e3,0x100,0x4f01,0x100,0x8cc7,0x100,0x5354,0x100,0x591c, -0x200,0x33,0x36,0x200,0x33,0x37,0x200,0x33,0x38,0x200,0x33,0x39,0x200,0x34,0x30,0x200, -0x34,0x31,0x200,0x34,0x32,0x200,0x34,0x33,0x200,0x34,0x34,0x200,0x34,0x35,0x200,0x34, -0x36,0x200,0x34,0x37,0x200,0x34,0x38,0x200,0x34,0x39,0x200,0x35,0x30,0x200,0x31,0x6708, -0x200,0x32,0x6708,0x200,0x33,0x6708,0x200,0x34,0x6708,0x200,0x35,0x6708,0x200,0x36,0x6708,0x200, -0x37,0x6708,0x200,0x38,0x6708,0x200,0x39,0x6708,0x300,0x31,0x30,0x6708,0x300,0x31,0x31,0x6708, -0x300,0x31,0x32,0x6708,0x300,0x65,0x72,0x67,0x100,0x30a2,0x100,0x30a4,0x100,0x30a6,0x100,0x30a8, -0x100,0x30aa,0x100,0x30ab,0x100,0x30ad,0x100,0x30af,0x100,0x30b1,0x100,0x30b3,0x100,0x30b5,0x100,0x30b7, -0x100,0x30b9,0x100,0x30bb,0x100,0x30bd,0x100,0x30bf,0x100,0x30c1,0x100,0x30c4,0x100,0x30c6,0x100,0x30c8, -0x100,0x30ca,0x100,0x30cb,0x100,0x30cc,0x100,0x30cd,0x100,0x30ce,0x100,0x30cf,0x100,0x30d2,0x100,0x30d5, -0x100,0x30d8,0x100,0x30db,0x100,0x30de,0x100,0x30df,0x100,0x30e0,0x100,0x30e1,0x100,0x30e2,0x100,0x30e4, -0x100,0x30e6,0x100,0x30e8,0x100,0x30e9,0x100,0x30ea,0x100,0x30eb,0x100,0x30ec,0x100,0x30ed,0x100,0x30ef, -0x100,0x30f0,0x100,0x30f1,0x100,0x30f2,0x500,0x30a2,0x30cf,0x309a,0x30fc,0x30c8,0x400,0x30a2,0x30eb,0x30d5, -0x30a1,0x500,0x30a2,0x30f3,0x30d8,0x309a,0x30a2,0x300,0x30a2,0x30fc,0x30eb,0x8500,8,0x30a4,0x30cb,0x30f3, -0x30af,0x3099,0x300,0x30a4,0x30f3,0x30c1,0x300,0x30a6,0x30a9,0x30f3,0x8600,8,0x30a8,0x30b9,0x30af,0x30fc, -0x30c8,0x3099,0x400,0x30a8,0x30fc,0x30ab,0x30fc,0x300,0x30aa,0x30f3,0x30b9,0x300,0x30aa,0x30fc,0x30e0,0x300, -0x30ab,0x30a4,0x30ea,0x400,0x30ab,0x30e9,0x30c3,0x30c8,0x400,0x30ab,0x30ed,0x30ea,0x30fc,0x400,0x30ab,0x3099, -0x30ed,0x30f3,0x400,0x30ab,0x3099,0x30f3,0x30de,0x8400,8,0x30ad,0x3099,0x30ab,0x3099,0x400,0x30ad,0x3099, -0x30cb,0x30fc,0x400,0x30ad,0x30e5,0x30ea,0x30fc,0x600,0x30ad,0x3099,0x30eb,0x30bf,0x3099,0x30fc,0x200,0x30ad, -0x30ed,0x600,0x30ad,0x30ed,0x30af,0x3099,0x30e9,0x30e0,0x600,0x30ad,0x30ed,0x30e1,0x30fc,0x30c8,0x30eb,0x500, -0x30ad,0x30ed,0x30ef,0x30c3,0x30c8,0x400,0x30af,0x3099,0x30e9,0x30e0,0x600,0x30af,0x3099,0x30e9,0x30e0,0x30c8, -0x30f3,0x600,0x30af,0x30eb,0x30bb,0x3099,0x30a4,0x30ed,0x400,0x30af,0x30ed,0x30fc,0x30cd,0x300,0x30b1,0x30fc, -0x30b9,0x300,0x30b3,0x30eb,0x30ca,0x8400,8,0x30b3,0x30fc,0x30db,0x309a,0x400,0x30b5,0x30a4,0x30af,0x30eb, -0x500,0x30b5,0x30f3,0x30c1,0x30fc,0x30e0,0x8500,8,0x30b7,0x30ea,0x30f3,0x30af,0x3099,0x300,0x30bb,0x30f3, -0x30c1,0x300,0x30bb,0x30f3,0x30c8,0x400,0x30bf,0x3099,0x30fc,0x30b9,0x300,0x30c6,0x3099,0x30b7,0x300,0x30c8, -0x3099,0x30eb,0x200,0x30c8,0x30f3,0x200,0x30ca,0x30ce,0x300,0x30ce,0x30c3,0x30c8,0x300,0x30cf,0x30a4,0x30c4, -0x600,0x30cf,0x309a,0x30fc,0x30bb,0x30f3,0x30c8,0x400,0x30cf,0x309a,0x30fc,0x30c4,0x500,0x30cf,0x3099,0x30fc, -0x30ec,0x30eb,0x600,0x30d2,0x309a,0x30a2,0x30b9,0x30c8,0x30eb,0x400,0x30d2,0x309a,0x30af,0x30eb,0x300,0x30d2, -0x309a,0x30b3,0x300,0x30d2,0x3099,0x30eb,0x8600,8,0x30d5,0x30a1,0x30e9,0x30c3,0x30c8,0x3099,0x400,0x30d5, -0x30a3,0x30fc,0x30c8,0x600,0x30d5,0x3099,0x30c3,0x30b7,0x30a7,0x30eb,0x300,0x30d5,0x30e9,0x30f3,0x500,0x30d8, -0x30af,0x30bf,0x30fc,0x30eb,0x300,0x30d8,0x309a,0x30bd,0x400,0x30d8,0x309a,0x30cb,0x30d2,0x300,0x30d8,0x30eb, -0x30c4,0x400,0x30d8,0x309a,0x30f3,0x30b9,0x8500,8,0x30d8,0x309a,0x30fc,0x30b7,0x3099,0x400,0x30d8,0x3099, -0x30fc,0x30bf,0x500,0x30db,0x309a,0x30a4,0x30f3,0x30c8,0x400,0x30db,0x3099,0x30eb,0x30c8,0x200,0x30db,0x30f3, -0x8500,8,0x30db,0x309a,0x30f3,0x30c8,0x3099,0x300,0x30db,0x30fc,0x30eb,0x300,0x30db,0x30fc,0x30f3,0x400, -0x30de,0x30a4,0x30af,0x30ed,0x300,0x30de,0x30a4,0x30eb,0x300,0x30de,0x30c3,0x30cf,0x300,0x30de,0x30eb,0x30af, -0x500,0x30de,0x30f3,0x30b7,0x30e7,0x30f3,0x400,0x30df,0x30af,0x30ed,0x30f3,0x200,0x30df,0x30ea,0x600,0x30df, -0x30ea,0x30cf,0x3099,0x30fc,0x30eb,0x8300,8,0x30e1,0x30ab,0x3099,0x500,0x30e1,0x30ab,0x3099,0x30c8,0x30f3, -0x400,0x30e1,0x30fc,0x30c8,0x30eb,0x8400,8,0x30e4,0x30fc,0x30c8,0x3099,0x300,0x30e4,0x30fc,0x30eb,0x300, -0x30e6,0x30a2,0x30f3,0x400,0x30ea,0x30c3,0x30c8,0x30eb,0x200,0x30ea,0x30e9,0x400,0x30eb,0x30d2,0x309a,0x30fc, -0x500,0x30eb,0x30fc,0x30d5,0x3099,0x30eb,0x200,0x30ec,0x30e0,0x600,0x30ec,0x30f3,0x30c8,0x30b1,0x3099,0x30f3, -0x300,0x30ef,0x30c3,0x30c8,0x200,0x30,0x70b9,0x200,0x31,0x70b9,0x200,0x32,0x70b9,0x200,0x33,0x70b9, -0x200,0x34,0x70b9,0x200,0x35,0x70b9,0x200,0x36,0x70b9,0x200,0x37,0x70b9,0x200,0x38,0x70b9,0x200, -0x39,0x70b9,0x300,0x31,0x30,0x70b9,0x300,0x31,0x31,0x70b9,0x300,0x31,0x32,0x70b9,0x300,0x31, -0x33,0x70b9,0x300,0x31,0x34,0x70b9,0x300,0x31,0x35,0x70b9,0x300,0x31,0x36,0x70b9,0x300,0x31, -0x37,0x70b9,0x300,0x31,0x38,0x70b9,0x300,0x31,0x39,0x70b9,0x300,0x32,0x30,0x70b9,0x300,0x32, -0x31,0x70b9,0x300,0x32,0x32,0x70b9,0x300,0x32,0x33,0x70b9,0x300,0x32,0x34,0x70b9,0x200,0x64, -0x61,0x300,0x62,0x61,0x72,0x200,0x70,0x63,0x200,0x64,0x6d,0x300,0x64,0x6d,0x32,0x300, -0x64,0x6d,0x33,0x200,0x5e73,0x6210,0x200,0x662d,0x548c,0x200,0x5927,0x6b63,0x200,0x660e,0x6cbb,0x400, -0x682a,0x5f0f,0x4f1a,0x793e,0x300,0x63,0x61,0x6c,0x400,0x6b,0x63,0x61,0x6c,0x200,0x3bc,0x67, -0x200,0x6d,0x67,0x200,0x6b,0x67,0x200,0x3bc,0x6c,0x200,0x6d,0x6c,0x200,0x64,0x6c,0x200, -0x6b,0x6c,0x200,0x66,0x6d,0x200,0x6e,0x6d,0x200,0x3bc,0x6d,0x200,0x6d,0x6d,0x200,0x63, -0x6d,0x200,0x6b,0x6d,0x300,0x6d,0x6d,0x32,0x300,0x63,0x6d,0x32,0x200,0x6d,0x32,0x300, -0x6b,0x6d,0x32,0x300,0x6d,0x6d,0x33,0x300,0x63,0x6d,0x33,0x200,0x6d,0x33,0x300,0x6b, -0x6d,0x33,0x300,0x6d,0x2215,0x73,0x400,0x6d,0x2215,0x73,0x32,0x300,0x72,0x61,0x64,0x500, -0x72,0x61,0x64,0x2215,0x73,0x600,0x72,0x61,0x64,0x2215,0x73,0x32,0x200,0x70,0x73,0x200, -0x6e,0x73,0x200,0x3bc,0x73,0x200,0x6d,0x73,0x400,0x61,0x2e,0x6d,0x2e,0x200,0x63,0x63, -0x200,0x63,0x64,0x200,0x68,0x61,0x200,0x69,0x6e,0x200,0x6b,0x74,0x200,0x6c,0x6d,0x200, -0x6c,0x6e,0x300,0x6c,0x6f,0x67,0x200,0x6c,0x78,0x200,0x6d,0x62,0x300,0x6d,0x69,0x6c, -0x300,0x6d,0x6f,0x6c,0x400,0x70,0x2e,0x6d,0x2e,0x200,0x73,0x72,0x200,0x31,0x65e5,0x200, -0x32,0x65e5,0x200,0x33,0x65e5,0x200,0x34,0x65e5,0x200,0x35,0x65e5,0x200,0x36,0x65e5,0x200,0x37, -0x65e5,0x200,0x38,0x65e5,0x200,0x39,0x65e5,0x300,0x31,0x30,0x65e5,0x300,0x31,0x31,0x65e5,0x300, -0x31,0x32,0x65e5,0x300,0x31,0x33,0x65e5,0x300,0x31,0x34,0x65e5,0x300,0x31,0x35,0x65e5,0x300, -0x31,0x36,0x65e5,0x300,0x31,0x37,0x65e5,0x300,0x31,0x38,0x65e5,0x300,0x31,0x39,0x65e5,0x300, -0x32,0x30,0x65e5,0x300,0x32,0x31,0x65e5,0x300,0x32,0x32,0x65e5,0x300,0x32,0x33,0x65e5,0x300, -0x32,0x34,0x65e5,0x300,0x32,0x35,0x65e5,0x300,0x32,0x36,0x65e5,0x300,0x32,0x37,0x65e5,0x300, -0x32,0x38,0x65e5,0x300,0x32,0x39,0x65e5,0x300,0x33,0x30,0x65e5,0x300,0x33,0x31,0x65e5,0x300, -0x67,0x61,0x6c,0x200,0x66,0x66,0x200,0x66,0x69,0x200,0x66,0x6c,0x300,0x66,0x66,0x69, -0x300,0x66,0x66,0x6c,0x200,0x73,0x74,0x200,0x73,0x74,0x200,0x574,0x576,0x200,0x574,0x565, -0x200,0x574,0x56b,0x200,0x57e,0x576,0x200,0x574,0x56d,0x100,0x5e2,0x100,0x5d0,0x100,0x5d3,0x100, -0x5d4,0x100,0x5db,0x100,0x5dc,0x100,0x5dd,0x100,0x5e8,0x100,0x5ea,0x100,0x2b,0x200,0x5d0,0x5dc, -0x100,0x671,0x100,0x671,0x100,0x67b,0x100,0x67b,0x100,0x67b,0x100,0x67b,0x100,0x67e,0x100,0x67e, -0x100,0x67e,0x100,0x67e,0x100,0x680,0x100,0x680,0x100,0x680,0x100,0x680,0x100,0x67a,0x100,0x67a, -0x100,0x67a,0x100,0x67a,0x100,0x67f,0x100,0x67f,0x100,0x67f,0x100,0x67f,0x100,0x679,0x100,0x679, -0x100,0x679,0x100,0x679,0x100,0x6a4,0x100,0x6a4,0x100,0x6a4,0x100,0x6a4,0x100,0x6a6,0x100,0x6a6, -0x100,0x6a6,0x100,0x6a6,0x100,0x684,0x100,0x684,0x100,0x684,0x100,0x684,0x100,0x683,0x100,0x683, -0x100,0x683,0x100,0x683,0x100,0x686,0x100,0x686,0x100,0x686,0x100,0x686,0x100,0x687,0x100,0x687, -0x100,0x687,0x100,0x687,0x100,0x68d,0x100,0x68d,0x100,0x68c,0x100,0x68c,0x100,0x68e,0x100,0x68e, -0x100,0x688,0x100,0x688,0x100,0x698,0x100,0x698,0x100,0x691,0x100,0x691,0x100,0x6a9,0x100,0x6a9, -0x100,0x6a9,0x100,0x6a9,0x100,0x6af,0x100,0x6af,0x100,0x6af,0x100,0x6af,0x100,0x6b3,0x100,0x6b3, -0x100,0x6b3,0x100,0x6b3,0x100,0x6b1,0x100,0x6b1,0x100,0x6b1,0x100,0x6b1,0x100,0x6ba,0x100,0x6ba, -0x100,0x6bb,0x100,0x6bb,0x100,0x6bb,0x100,0x6bb,0x8200,0xe6,0x6d5,0x654,0x8200,0xe6,0x6d5,0x654, -0x100,0x6c1,0x100,0x6c1,0x100,0x6c1,0x100,0x6c1,0x100,0x6be,0x100,0x6be,0x100,0x6be,0x100,0x6be, -0x100,0x6d2,0x100,0x6d2,0x8200,0xe6,0x6d2,0x654,0x8200,0xe6,0x6d2,0x654,0x100,0x6ad,0x100,0x6ad, -0x100,0x6ad,0x100,0x6ad,0x100,0x6c7,0x100,0x6c7,0x100,0x6c6,0x100,0x6c6,0x100,0x6c8,0x100,0x6c8, -0x200,0x6c7,0x674,0x100,0x6cb,0x100,0x6cb,0x100,0x6c5,0x100,0x6c5,0x100,0x6c9,0x100,0x6c9,0x100, -0x6d0,0x100,0x6d0,0x100,0x6d0,0x100,0x6d0,0x100,0x649,0x100,0x649,0x300,0x64a,0x654,0x627,0x300, -0x64a,0x654,0x627,0x300,0x64a,0x654,0x6d5,0x300,0x64a,0x654,0x6d5,0x300,0x64a,0x654,0x648,0x300, -0x64a,0x654,0x648,0x300,0x64a,0x654,0x6c7,0x300,0x64a,0x654,0x6c7,0x300,0x64a,0x654,0x6c6,0x300, -0x64a,0x654,0x6c6,0x300,0x64a,0x654,0x6c8,0x300,0x64a,0x654,0x6c8,0x300,0x64a,0x654,0x6d0,0x300, -0x64a,0x654,0x6d0,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654,0x649,0x300,0x64a,0x654,0x649,0x300, -0x64a,0x654,0x649,0x100,0x6cc,0x100,0x6cc,0x100,0x6cc,0x100,0x6cc,0x300,0x64a,0x654,0x62c,0x300, -0x64a,0x654,0x62d,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654,0x649,0x300,0x64a,0x654,0x64a,0x200, -0x628,0x62c,0x200,0x628,0x62d,0x200,0x628,0x62e,0x200,0x628,0x645,0x200,0x628,0x649,0x200,0x628, -0x64a,0x200,0x62a,0x62c,0x200,0x62a,0x62d,0x200,0x62a,0x62e,0x200,0x62a,0x645,0x200,0x62a,0x649, -0x200,0x62a,0x64a,0x200,0x62b,0x62c,0x200,0x62b,0x645,0x200,0x62b,0x649,0x200,0x62b,0x64a,0x200, -0x62c,0x62d,0x200,0x62c,0x645,0x200,0x62d,0x62c,0x200,0x62d,0x645,0x200,0x62e,0x62c,0x200,0x62e, -0x62d,0x200,0x62e,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633,0x62e,0x200,0x633,0x645, -0x200,0x635,0x62d,0x200,0x635,0x645,0x200,0x636,0x62c,0x200,0x636,0x62d,0x200,0x636,0x62e,0x200, -0x636,0x645,0x200,0x637,0x62d,0x200,0x637,0x645,0x200,0x638,0x645,0x200,0x639,0x62c,0x200,0x639, -0x645,0x200,0x63a,0x62c,0x200,0x63a,0x645,0x200,0x641,0x62c,0x200,0x641,0x62d,0x200,0x641,0x62e, -0x200,0x641,0x645,0x200,0x641,0x649,0x200,0x641,0x64a,0x200,0x642,0x62d,0x200,0x642,0x645,0x200, -0x642,0x649,0x200,0x642,0x64a,0x200,0x643,0x627,0x200,0x643,0x62c,0x200,0x643,0x62d,0x200,0x643, -0x62e,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x643,0x649,0x200,0x643,0x64a,0x200,0x644,0x62c, -0x200,0x644,0x62d,0x200,0x644,0x62e,0x200,0x644,0x645,0x200,0x644,0x649,0x200,0x644,0x64a,0x200, -0x645,0x62c,0x200,0x645,0x62d,0x200,0x645,0x62e,0x200,0x645,0x645,0x200,0x645,0x649,0x200,0x645, -0x64a,0x200,0x646,0x62c,0x200,0x646,0x62d,0x200,0x646,0x62e,0x200,0x646,0x645,0x200,0x646,0x649, -0x200,0x646,0x64a,0x200,0x647,0x62c,0x200,0x647,0x645,0x200,0x647,0x649,0x200,0x647,0x64a,0x200, -0x64a,0x62c,0x200,0x64a,0x62d,0x200,0x64a,0x62e,0x200,0x64a,0x645,0x200,0x64a,0x649,0x200,0x64a, -0x64a,0x8200,0x23,0x630,0x670,0x8200,0x23,0x631,0x670,0x8200,0x23,0x649,0x670,0x8300,0x21,0x20, -0x64c,0x651,0x8300,0x21,0x20,0x64d,0x651,0x8300,0x21,0x20,0x64e,0x651,0x8300,0x21,0x20,0x64f, -0x651,0x8300,0x21,0x20,0x650,0x651,0x8300,0x23,0x20,0x651,0x670,0x300,0x64a,0x654,0x631,0x300, -0x64a,0x654,0x632,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654,0x646,0x300,0x64a,0x654,0x649,0x300, -0x64a,0x654,0x64a,0x200,0x628,0x631,0x200,0x628,0x632,0x200,0x628,0x645,0x200,0x628,0x646,0x200, -0x628,0x649,0x200,0x628,0x64a,0x200,0x62a,0x631,0x200,0x62a,0x632,0x200,0x62a,0x645,0x200,0x62a, -0x646,0x200,0x62a,0x649,0x200,0x62a,0x64a,0x200,0x62b,0x631,0x200,0x62b,0x632,0x200,0x62b,0x645, -0x200,0x62b,0x646,0x200,0x62b,0x649,0x200,0x62b,0x64a,0x200,0x641,0x649,0x200,0x641,0x64a,0x200, -0x642,0x649,0x200,0x642,0x64a,0x200,0x643,0x627,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x643, -0x649,0x200,0x643,0x64a,0x200,0x644,0x645,0x200,0x644,0x649,0x200,0x644,0x64a,0x200,0x645,0x627, -0x200,0x645,0x645,0x200,0x646,0x631,0x200,0x646,0x632,0x200,0x646,0x645,0x200,0x646,0x646,0x200, -0x646,0x649,0x200,0x646,0x64a,0x8200,0x23,0x649,0x670,0x200,0x64a,0x631,0x200,0x64a,0x632,0x200, -0x64a,0x645,0x200,0x64a,0x646,0x200,0x64a,0x649,0x200,0x64a,0x64a,0x300,0x64a,0x654,0x62c,0x300, -0x64a,0x654,0x62d,0x300,0x64a,0x654,0x62e,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654,0x647,0x200, -0x628,0x62c,0x200,0x628,0x62d,0x200,0x628,0x62e,0x200,0x628,0x645,0x200,0x628,0x647,0x200,0x62a, -0x62c,0x200,0x62a,0x62d,0x200,0x62a,0x62e,0x200,0x62a,0x645,0x200,0x62a,0x647,0x200,0x62b,0x645, -0x200,0x62c,0x62d,0x200,0x62c,0x645,0x200,0x62d,0x62c,0x200,0x62d,0x645,0x200,0x62e,0x62c,0x200, -0x62e,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633,0x62e,0x200,0x633,0x645,0x200,0x635, -0x62d,0x200,0x635,0x62e,0x200,0x635,0x645,0x200,0x636,0x62c,0x200,0x636,0x62d,0x200,0x636,0x62e, -0x200,0x636,0x645,0x200,0x637,0x62d,0x200,0x638,0x645,0x200,0x639,0x62c,0x200,0x639,0x645,0x200, -0x63a,0x62c,0x200,0x63a,0x645,0x200,0x641,0x62c,0x200,0x641,0x62d,0x200,0x641,0x62e,0x200,0x641, -0x645,0x200,0x642,0x62d,0x200,0x642,0x645,0x200,0x643,0x62c,0x200,0x643,0x62d,0x200,0x643,0x62e, -0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x644,0x62c,0x200,0x644,0x62d,0x200,0x644,0x62e,0x200, -0x644,0x645,0x200,0x644,0x647,0x200,0x645,0x62c,0x200,0x645,0x62d,0x200,0x645,0x62e,0x200,0x645, -0x645,0x200,0x646,0x62c,0x200,0x646,0x62d,0x200,0x646,0x62e,0x200,0x646,0x645,0x200,0x646,0x647, -0x200,0x647,0x62c,0x200,0x647,0x645,0x8200,0x23,0x647,0x670,0x200,0x64a,0x62c,0x200,0x64a,0x62d, -0x200,0x64a,0x62e,0x200,0x64a,0x645,0x200,0x64a,0x647,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654, -0x647,0x200,0x628,0x645,0x200,0x628,0x647,0x200,0x62a,0x645,0x200,0x62a,0x647,0x200,0x62b,0x645, -0x200,0x62b,0x647,0x200,0x633,0x645,0x200,0x633,0x647,0x200,0x634,0x645,0x200,0x634,0x647,0x200, -0x643,0x644,0x200,0x643,0x645,0x200,0x644,0x645,0x200,0x646,0x645,0x200,0x646,0x647,0x200,0x64a, -0x645,0x200,0x64a,0x647,0x8300,0x21,0x640,0x64e,0x651,0x8300,0x21,0x640,0x64f,0x651,0x8300,0x21, -0x640,0x650,0x651,0x200,0x637,0x649,0x200,0x637,0x64a,0x200,0x639,0x649,0x200,0x639,0x64a,0x200, -0x63a,0x649,0x200,0x63a,0x64a,0x200,0x633,0x649,0x200,0x633,0x64a,0x200,0x634,0x649,0x200,0x634, -0x64a,0x200,0x62d,0x649,0x200,0x62d,0x64a,0x200,0x62c,0x649,0x200,0x62c,0x64a,0x200,0x62e,0x649, -0x200,0x62e,0x64a,0x200,0x635,0x649,0x200,0x635,0x64a,0x200,0x636,0x649,0x200,0x636,0x64a,0x200, -0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x634,0x645,0x200,0x634,0x631,0x200,0x633, -0x631,0x200,0x635,0x631,0x200,0x636,0x631,0x200,0x637,0x649,0x200,0x637,0x64a,0x200,0x639,0x649, -0x200,0x639,0x64a,0x200,0x63a,0x649,0x200,0x63a,0x64a,0x200,0x633,0x649,0x200,0x633,0x64a,0x200, -0x634,0x649,0x200,0x634,0x64a,0x200,0x62d,0x649,0x200,0x62d,0x64a,0x200,0x62c,0x649,0x200,0x62c, -0x64a,0x200,0x62e,0x649,0x200,0x62e,0x64a,0x200,0x635,0x649,0x200,0x635,0x64a,0x200,0x636,0x649, -0x200,0x636,0x64a,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x634,0x645,0x200, -0x634,0x631,0x200,0x633,0x631,0x200,0x635,0x631,0x200,0x636,0x631,0x200,0x634,0x62c,0x200,0x634, -0x62d,0x200,0x634,0x62e,0x200,0x634,0x645,0x200,0x633,0x647,0x200,0x634,0x647,0x200,0x637,0x645, -0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633,0x62e,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200, -0x634,0x62e,0x200,0x637,0x645,0x200,0x638,0x645,0x8200,0x1b,0x627,0x64b,0x8200,0x1b,0x627,0x64b, -0x300,0x62a,0x62c,0x645,0x300,0x62a,0x62d,0x62c,0x300,0x62a,0x62d,0x62c,0x300,0x62a,0x62d,0x645, -0x300,0x62a,0x62e,0x645,0x300,0x62a,0x645,0x62c,0x300,0x62a,0x645,0x62d,0x300,0x62a,0x645,0x62e, -0x300,0x62c,0x645,0x62d,0x300,0x62c,0x645,0x62d,0x300,0x62d,0x645,0x64a,0x300,0x62d,0x645,0x649, -0x300,0x633,0x62d,0x62c,0x300,0x633,0x62c,0x62d,0x300,0x633,0x62c,0x649,0x300,0x633,0x645,0x62d, -0x300,0x633,0x645,0x62d,0x300,0x633,0x645,0x62c,0x300,0x633,0x645,0x645,0x300,0x633,0x645,0x645, -0x300,0x635,0x62d,0x62d,0x300,0x635,0x62d,0x62d,0x300,0x635,0x645,0x645,0x300,0x634,0x62d,0x645, -0x300,0x634,0x62d,0x645,0x300,0x634,0x62c,0x64a,0x300,0x634,0x645,0x62e,0x300,0x634,0x645,0x62e, -0x300,0x634,0x645,0x645,0x300,0x634,0x645,0x645,0x300,0x636,0x62d,0x649,0x300,0x636,0x62e,0x645, -0x300,0x636,0x62e,0x645,0x300,0x637,0x645,0x62d,0x300,0x637,0x645,0x62d,0x300,0x637,0x645,0x645, -0x300,0x637,0x645,0x64a,0x300,0x639,0x62c,0x645,0x300,0x639,0x645,0x645,0x300,0x639,0x645,0x645, -0x300,0x639,0x645,0x649,0x300,0x63a,0x645,0x645,0x300,0x63a,0x645,0x64a,0x300,0x63a,0x645,0x649, -0x300,0x641,0x62e,0x645,0x300,0x641,0x62e,0x645,0x300,0x642,0x645,0x62d,0x300,0x642,0x645,0x645, -0x300,0x644,0x62d,0x645,0x300,0x644,0x62d,0x64a,0x300,0x644,0x62d,0x649,0x300,0x644,0x62c,0x62c, -0x300,0x644,0x62c,0x62c,0x300,0x644,0x62e,0x645,0x300,0x644,0x62e,0x645,0x300,0x644,0x645,0x62d, -0x300,0x644,0x645,0x62d,0x300,0x645,0x62d,0x62c,0x300,0x645,0x62d,0x645,0x300,0x645,0x62d,0x64a, -0x300,0x645,0x62c,0x62d,0x300,0x645,0x62c,0x645,0x300,0x645,0x62e,0x62c,0x300,0x645,0x62e,0x645, -0x300,0x645,0x62c,0x62e,0x300,0x647,0x645,0x62c,0x300,0x647,0x645,0x645,0x300,0x646,0x62d,0x645, -0x300,0x646,0x62d,0x649,0x300,0x646,0x62c,0x645,0x300,0x646,0x62c,0x645,0x300,0x646,0x62c,0x649, -0x300,0x646,0x645,0x64a,0x300,0x646,0x645,0x649,0x300,0x64a,0x645,0x645,0x300,0x64a,0x645,0x645, -0x300,0x628,0x62e,0x64a,0x300,0x62a,0x62c,0x64a,0x300,0x62a,0x62c,0x649,0x300,0x62a,0x62e,0x64a, -0x300,0x62a,0x62e,0x649,0x300,0x62a,0x645,0x64a,0x300,0x62a,0x645,0x649,0x300,0x62c,0x645,0x64a, -0x300,0x62c,0x62d,0x649,0x300,0x62c,0x645,0x649,0x300,0x633,0x62e,0x649,0x300,0x635,0x62d,0x64a, -0x300,0x634,0x62d,0x64a,0x300,0x636,0x62d,0x64a,0x300,0x644,0x62c,0x64a,0x300,0x644,0x645,0x64a, -0x300,0x64a,0x62d,0x64a,0x300,0x64a,0x62c,0x64a,0x300,0x64a,0x645,0x64a,0x300,0x645,0x645,0x64a, -0x300,0x642,0x645,0x64a,0x300,0x646,0x62d,0x64a,0x300,0x642,0x645,0x62d,0x300,0x644,0x62d,0x645, -0x300,0x639,0x645,0x64a,0x300,0x643,0x645,0x64a,0x300,0x646,0x62c,0x62d,0x300,0x645,0x62e,0x64a, -0x300,0x644,0x62c,0x645,0x300,0x643,0x645,0x645,0x300,0x644,0x62c,0x645,0x300,0x646,0x62c,0x62d, -0x300,0x62c,0x62d,0x64a,0x300,0x62d,0x62c,0x64a,0x300,0x645,0x62c,0x64a,0x300,0x641,0x645,0x64a, -0x300,0x628,0x62d,0x64a,0x300,0x643,0x645,0x645,0x300,0x639,0x62c,0x645,0x300,0x635,0x645,0x645, -0x300,0x633,0x62e,0x64a,0x300,0x646,0x62c,0x64a,0x300,0x635,0x644,0x6d2,0x300,0x642,0x644,0x6d2, -0x400,0x627,0x644,0x644,0x647,0x400,0x627,0x643,0x628,0x631,0x400,0x645,0x62d,0x645,0x62f,0x400, -0x635,0x644,0x639,0x645,0x400,0x631,0x633,0x648,0x644,0x400,0x639,0x644,0x64a,0x647,0x400,0x648, -0x633,0x644,0x645,0x300,0x635,0x644,0x649,0x1200,0x635,0x644,0x649,0x20,0x627,0x644,0x644,0x647, -0x20,0x639,0x644,0x64a,0x647,0x20,0x648,0x633,0x644,0x645,0x800,0x62c,0x644,0x20,0x62c,0x644, -0x627,0x644,0x647,0x400,0x631,0x6cc,0x627,0x644,0x100,0x2c,0x100,0x3001,0x100,0x3002,0x100,0x3a, -0x100,0x3b,0x100,0x21,0x100,0x3f,0x100,0x3016,0x100,0x3017,0x300,0x2e,0x2e,0x2e,0x200,0x2e, -0x2e,0x100,0x2014,0x100,0x2013,0x100,0x5f,0x100,0x5f,0x100,0x28,0x100,0x29,0x100,0x7b,0x100, -0x7d,0x100,0x3014,0x100,0x3015,0x100,0x3010,0x100,0x3011,0x100,0x300a,0x100,0x300b,0x100,0x3008,0x100, -0x3009,0x100,0x300c,0x100,0x300d,0x100,0x300e,0x100,0x300f,0x100,0x5b,0x100,0x5d,0x8200,0xe6,0x20, -0x305,0x8200,0xe6,0x20,0x305,0x8200,0xe6,0x20,0x305,0x8200,0xe6,0x20,0x305,0x100,0x5f,0x100, -0x5f,0x100,0x5f,0x100,0x2c,0x100,0x3001,0x100,0x2e,0x100,0x3b,0x100,0x3a,0x100,0x3f,0x100, -0x21,0x100,0x2014,0x100,0x28,0x100,0x29,0x100,0x7b,0x100,0x7d,0x100,0x3014,0x100,0x3015,0x100, -0x23,0x100,0x26,0x100,0x2a,0x100,0x2b,0x100,0x2d,0x100,0x3c,0x100,0x3e,0x100,0x3d,0x100, -0x5c,0x100,0x24,0x100,0x25,0x100,0x40,0x8200,0x1b,0x20,0x64b,0x8200,0x1b,0x640,0x64b,0x8200, -0x1c,0x20,0x64c,0x8200,0x1d,0x20,0x64d,0x8200,0x1e,0x20,0x64e,0x8200,0x1e,0x640,0x64e,0x8200, -0x1f,0x20,0x64f,0x8200,0x1f,0x640,0x64f,0x8200,0x20,0x20,0x650,0x8200,0x20,0x640,0x650,0x8200, -0x21,0x20,0x651,0x8200,0x21,0x640,0x651,0x8200,0x22,0x20,0x652,0x8200,0x22,0x640,0x652,0x100, -0x621,0x8200,0xe6,0x627,0x653,0x8200,0xe6,0x627,0x653,0x8200,0xe6,0x627,0x654,0x8200,0xe6,0x627, -0x654,0x8200,0xe6,0x648,0x654,0x8200,0xe6,0x648,0x654,0x8200,0xdc,0x627,0x655,0x8200,0xdc,0x627, -0x655,0x8200,0xe6,0x64a,0x654,0x8200,0xe6,0x64a,0x654,0x8200,0xe6,0x64a,0x654,0x8200,0xe6,0x64a, -0x654,0x100,0x627,0x100,0x627,0x100,0x628,0x100,0x628,0x100,0x628,0x100,0x628,0x100,0x629,0x100, -0x629,0x100,0x62a,0x100,0x62a,0x100,0x62a,0x100,0x62a,0x100,0x62b,0x100,0x62b,0x100,0x62b,0x100, -0x62b,0x100,0x62c,0x100,0x62c,0x100,0x62c,0x100,0x62c,0x100,0x62d,0x100,0x62d,0x100,0x62d,0x100, -0x62d,0x100,0x62e,0x100,0x62e,0x100,0x62e,0x100,0x62e,0x100,0x62f,0x100,0x62f,0x100,0x630,0x100, -0x630,0x100,0x631,0x100,0x631,0x100,0x632,0x100,0x632,0x100,0x633,0x100,0x633,0x100,0x633,0x100, -0x633,0x100,0x634,0x100,0x634,0x100,0x634,0x100,0x634,0x100,0x635,0x100,0x635,0x100,0x635,0x100, -0x635,0x100,0x636,0x100,0x636,0x100,0x636,0x100,0x636,0x100,0x637,0x100,0x637,0x100,0x637,0x100, -0x637,0x100,0x638,0x100,0x638,0x100,0x638,0x100,0x638,0x100,0x639,0x100,0x639,0x100,0x639,0x100, -0x639,0x100,0x63a,0x100,0x63a,0x100,0x63a,0x100,0x63a,0x100,0x641,0x100,0x641,0x100,0x641,0x100, -0x641,0x100,0x642,0x100,0x642,0x100,0x642,0x100,0x642,0x100,0x643,0x100,0x643,0x100,0x643,0x100, -0x643,0x100,0x644,0x100,0x644,0x100,0x644,0x100,0x644,0x100,0x645,0x100,0x645,0x100,0x645,0x100, -0x645,0x100,0x646,0x100,0x646,0x100,0x646,0x100,0x646,0x100,0x647,0x100,0x647,0x100,0x647,0x100, -0x647,0x100,0x648,0x100,0x648,0x100,0x649,0x100,0x649,0x100,0x64a,0x100,0x64a,0x100,0x64a,0x100, -0x64a,0x8300,0xe6,0x644,0x627,0x653,0x8300,0xe6,0x644,0x627,0x653,0x8300,0xe6,0x644,0x627,0x654, -0x8300,0xe6,0x644,0x627,0x654,0x8300,0xdc,0x644,0x627,0x655,0x8300,0xdc,0x644,0x627,0x655,0x200, -0x644,0x627,0x200,0x644,0x627,0x100,0x21,0x100,0x22,0x100,0x23,0x100,0x24,0x100,0x25,0x100, -0x26,0x100,0x27,0x100,0x28,0x100,0x29,0x100,0x2a,0x100,0x2b,0x100,0x2c,0x100,0x2d,0x100, -0x2e,0x100,0x2f,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100, -0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x3a,0x100,0x3b,0x100,0x3c,0x100,0x3d,0x100, -0x3e,0x100,0x3f,0x100,0x40,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100, +0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100, +0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100, +0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100, +0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100, +0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100, +0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100, +0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x41,0x100,0x42,0x100, +0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100, +0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100, +0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100, +0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100, +0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100, +0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100, +0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100, +0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100, +0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100, +0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100, +0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100, +0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100, +0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100,0x391,0x100,0x392,0x100, +0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100,0x399,0x100,0x39a,0x100, +0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100,0x3a1,0x100,0x398,0x100, +0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100,0x3a9,0x100,0x3c2,0x100, +0x391,0x100,0x392,0x100,0x393,0x100,0x394,0x100,0x395,0x100,0x396,0x100,0x397,0x100,0x398,0x100, +0x399,0x100,0x39a,0x100,0x39b,0x100,0x39c,0x100,0x39d,0x100,0x39e,0x100,0x39f,0x100,0x3a0,0x100, +0x3a1,0x100,0x398,0x100,0x3a3,0x100,0x3a4,0x100,0x3a5,0x100,0x3a6,0x100,0x3a7,0x100,0x3a8,0x100, +0x3a9,0x100,0x3c2,0x100,0x3dc,0x81,0xe6e6,0x300,0x81,0xe6e6,0x301,0x81,0xe6e6,0x313,0x82,0xe6e6, +0x308,0x301,1,0x2b9,1,0x3b,1,0xb7,0x82,7,0x915,0x93c,0x82,7,0x916,0x93c, +0x82,7,0x917,0x93c,0x82,7,0x91c,0x93c,0x82,7,0x921,0x93c,0x82,7,0x922,0x93c, +0x82,7,0x92b,0x93c,0x82,7,0x92f,0x93c,0x82,7,0x9a1,0x9bc,0x82,7,0x9a2,0x9bc, +0x82,7,0x9af,0x9bc,0x82,7,0xa32,0xa3c,0x82,7,0xa38,0xa3c,0x82,7,0xa16,0xa3c, +0x82,7,0xa17,0xa3c,0x82,7,0xa1c,0xa3c,0x82,7,0xa2b,0xa3c,0x82,7,0xb21,0xb3c, +0x82,7,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7, +2,0xf5b,0xfb7,2,0xf40,0xfb5,0x82,0x8182,0xf71,0xf72,0x82,0x8184,0xf71,0xf74,0x82,0x82, +0xfb2,0xf80,0x82,0x82,0xfb3,0xf80,0x82,0x8182,0xf71,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7, +2,0xfa1,0xfb7,2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,0x82,0xe6,0x3b1,0x301, +0x82,0xe6,0x3b5,0x301,0x82,0xe6,0x3b7,0x301,0x82,0xe6,0x3b9,0x301,0x82,0xe6,0x3bf,0x301, +0x82,0xe6,0x3c5,0x301,0x82,0xe6,0x3c9,0x301,0x82,0xe6,0x391,0x301,1,0x3b9,0x82,0xe6, +0x395,0x301,0x82,0xe6,0x397,0x301,0x83,0xe6,0x3b9,0x308,0x301,0x82,0xe6,0x399,0x301,0x83, +0xe6,0x3c5,0x308,0x301,0x82,0xe6,0x3a5,0x301,0x8382,0xe6,0xa8,0x301,0xe6,0x20,0x308,0x301, +1,0x60,0x82,0xe6,0x39f,0x301,0x82,0xe6,0x3a9,0x301,0x8201,0xb4,0xe6,0x20,0x301,0x101, +0x2002,0x20,0x101,0x2003,0x20,1,0x3a9,1,0x4b,0x82,0xe6,0x41,0x30a,1,0x3008,1, +0x3009,0x82,1,0x2add,0x338,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,1, +0x4e26,1,0x51b5,1,0x5168,1,0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1, +0x559d,1,0x5555,1,0x5599,1,0x55e2,1,0x585a,1,0x58b3,1,0x5944,1,0x5954,1, +0x5a62,1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1,0x614e,1, +0x6108,1,0x618e,1,0x6160,1,0x61f2,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1, +0x6556,1,0x6674,1,0x6717,1,0x671b,1,0x6756,1,0x6b79,1,0x6bba,1,0x6d41,1, +0x6edb,1,0x6ecb,1,0x6f22,1,0x701e,1,0x716e,1,0x77a7,1,0x7235,1,0x72af,1, +0x732a,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76ca,1,0x76db,1, +0x76f4,1,0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7bc0,1,0x7c7b,1,0x7d5b,1, +0x7df4,1,0x7f3e,1,0x8005,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1, +0x8996,1,0x8abf,1,0x8af8,1,0x8acb,1,0x8b01,1,0x8afe,1,0x8aed,1,0x8b39,1, +0x8b8a,1,0x8d08,1,0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x96e3,1, +0x9756,1,0x97db,1,0x97ff,1,0x980b,1,0x983b,1,0x9b12,1,0x9f9c,2,0xd84a,0xdc4a, +2,0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018,1,0x4039,2,0xd854,0xde49,2, +0xd857,0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0x82,0xe,0x5d9,0x5b4,0x82,0x11,0x5f2, +0x5b7,0x82,0x18,0x5e9,0x5c1,0x82,0x19,0x5e9,0x5c2,0x83,0x18,0x5e9,0x5bc,0x5c1,0x83,0x19, +0x5e9,0x5bc,0x5c2,0x82,0x11,0x5d0,0x5b7,0x82,0x12,0x5d0,0x5b8,0x82,0x15,0x5d0,0x5bc,0x82, +0x15,0x5d1,0x5bc,0x82,0x15,0x5d2,0x5bc,0x82,0x15,0x5d3,0x5bc,0x82,0x15,0x5d4,0x5bc,0x82, +0x15,0x5d5,0x5bc,0x82,0x15,0x5d6,0x5bc,0x82,0x15,0x5d8,0x5bc,0x82,0x15,0x5d9,0x5bc,0x82, +0x15,0x5da,0x5bc,0x82,0x15,0x5db,0x5bc,0x82,0x15,0x5dc,0x5bc,0x82,0x15,0x5de,0x5bc,0x82, +0x15,0x5e0,0x5bc,0x82,0x15,0x5e1,0x5bc,0x82,0x15,0x5e3,0x5bc,0x82,0x15,0x5e4,0x5bc,0x82, +0x15,0x5e6,0x5bc,0x82,0x15,0x5e7,0x5bc,0x82,0x15,0x5e8,0x5bc,0x82,0x15,0x5e9,0x5bc,0x82, +0x15,0x5ea,0x5bc,0x82,0x13,0x5d5,0x5b9,0x82,0x17,0x5d1,0x5bf,0x82,0x17,0x5db,0x5bf,0x82, +0x17,0x5e4,0x5bf,0x84,0xd8,0xd834,0xdd57,0xd834,0xdd65,0x84,0xd8,0xd834,0xdd58,0xd834,0xdd65,0x86, +0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0x86, +0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70,0x86,0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0x86, +0xd8,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0x84,0xd8,0xd834,0xddb9,0xd834,0xdd65,0x84,0xd8,0xd834, +0xddba,0xd834,0xdd65,0x86,0xd8,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xddba,0xd834, +0xdd65,0xd834,0xdd6e,0x86,0xd8,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0x86,0xd8,0xd834,0xddba,0xd834, +0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60,1,0x4fae, +1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50e7,1,0x50cf,1,0x349e,2,0xd841, +0xde3a,1,0x514d,1,0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167, +1,0x518d,2,0xd841,0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,1,0x51b5,2, +0xd864,0xdddf,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, +2,0xd842,0xde2c,1,0x7070,1,0x53ca,1,0x53df,2,0xd842,0xdf63,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,2,0xd845,0xdce4,1, +0x58f2,1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8,2,0xd845, +0xdeea,1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1,0x36fc,1, +0x5b08,1,0x5b3e,1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5be7,1,0x5bf3, +2,0xd846,0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,1, +0x5c6e,1,0x5cc0,1,0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1, +0x5d6b,1,0x5d7c,1,0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1, +0x5e69,1,0x3862,2,0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,1,0x5eca, +2,0xd868,0xdf92,1,0x5efe,2,0xd848,0xdf31,2,0xd848,0xdf31,1,0x8201,1,0x5f22,1, +0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62,1,0x5f6b,1,0x38e3,1, +0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9,1,0x6081,1,0x393a,1,0x391c,1,0x6094,2, +0xd849,0xded4,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,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1, +0x6368,1,0x6383,1,0x63e4,2,0xd84a,0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e, +1,0x6469,1,0x647e,1,0x649d,1,0x6477,1,0x3a6c,1,0x654f,1,0x656c,2,0xd84c, +0xdc0a,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,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1,0x6852, +1,0x6885,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x3b9d,1,0x6942,1, +0x69a3,1,0x69ea,1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2,0xd84e, +0xdca7,1,0x6b54,1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bba,1,0x6bbb,2,0xd84e,0xde8d, +2,0xd847,0xdd0b,2,0xd84e,0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1, +0x6c67,1,0x6d16,1,0x6d3e,1,0x6d77,1,0x6d41,1,0x6d69,1,0x6d78,1,0x6d85,2, +0xd84f,0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ecb,1,0x6ec7,2,0xd84f, +0xded1,1,0x6df9,1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,1, +0x701e,1,0x701b,1,0x3d96,1,0x704a,1,0x707d,1,0x7077,1,0x70ad,2,0xd841,0xdd25, +1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850,0xdfab,1,0x7228,1,0x7235,1,0x7250, +2,0xd851,0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2,0xd852,0xdc14,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,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,1, +0x7570,2,0xd848,0xdd9f,1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1, +0x3ffc,1,0x4008,1,0x76f4,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854, +0xdd33,1,0x771e,1,0x771f,1,0x771f,1,0x774a,1,0x4039,1,0x778b,1,0x4046,1, +0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x788c,1,0x78cc,1,0x40e3,2,0xd855,0xde26,1, +0x7956,2,0xd855,0xde9a,2,0xd855,0xdec5,1,0x798f,1,0x79eb,1,0x412f,1,0x7a40,1, +0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,2,0xd856,0xdea7,2,0xd856,0xdea7,1,0x7aee,1,0x4202, +2,0xd856,0xdfab,1,0x7bc6,1,0x7bc9,1,0x4227,2,0xd857,0xdc80,1,0x7cd2,1,0x42a0, +1,0x7ce8,1,0x7ce3,1,0x7d00,2,0xd857,0xdf86,1,0x7d63,1,0x4301,1,0x7dc7,1, +0x7e02,1,0x7e45,1,0x4334,2,0xd858,0xde28,2,0xd858,0xde47,1,0x4359,2,0xd858,0xded9, +1,0x7f7a,2,0xd858,0xdf3e,1,0x7f95,1,0x7ffa,1,0x8005,2,0xd859,0xdcda,2,0xd859, +0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2,1, +0x8103,1,0x440b,1,0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c,0xdf93, +2,0xd84c,0xdf9c,1,0x8201,1,0x8204,1,0x8f9e,1,0x446b,1,0x8291,1,0x828b,1, +0x829d,1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c,1,0x82e5, +1,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,1,0x8457,1,0x8353, +1,0x83ca,1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b,0xdcd5,1, +0x452b,1,0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b,0xdf2c,1, +0x455d,1,0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,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,2, +0xd85d,0xde67,1,0x88d7,1,0x88de,1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2, +0xd85e,0xdd66,1,0x46be,1,0x46c7,1,0x8aa0,1,0x8aed,1,0x8b8a,1,0x8c55,2,0xd85f, +0xdca8,1,0x8cab,1,0x8cc1,1,0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2,0xd842,0xdc04,1, +0x8dcb,1,0x8dbc,1,0x8df0,2,0xd842,0xdcde,1,0x8ed4,1,0x8f38,2,0xd861,0xddd2,2, +0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1,0x911b,1,0x9238,1, +0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa,1,0x958b,1,0x4995, +1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1,0x9723,2,0xd864,0xdd45, +2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2,0xd865, +0xdc96,1,0x980b,1,0x980b,1,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929, +1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1,0x9b12,1,0x9c40,1, +0x9cfd,1,0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868,0xdd05,2, +0xd868,0xde0e,2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1,0x9f05,1, +0x9f0f,1,0x9f16,1,0x9f3b,2,0xd869,0xde00,0x82,0xe6,0x41,0x300,0x82,0xe6,0x41,0x301, +0x4e6,0x82,0xe6,0x41,0x302,0x82,0xe6,0x41,0x303,0x2c8,0x82,0xe6,0x41,0x308,0x2e0,0x82, +0xe6,0x41,0x30a,0x484,0x82,0xca,0x43,0x327,0x82,0xe6,0x45,0x300,0x82,0xe6,0x45,0x301, +0x50e,0x82,0xe6,0x45,0x302,0x82,0xe6,0x45,0x308,0x82,0xe6,0x49,0x300,0x82,0xe6,0x49, +0x301,0x82,0xe6,0x49,0x302,0x498,0x82,0xe6,0x49,0x308,0x82,0xe6,0x4e,0x303,0x82,0xe6, +0x4f,0x300,0x82,0xe6,0x4f,0x301,0x522,0x82,0xe6,0x4f,0x302,0x2ec,0x82,0xe6,0x4f,0x303, +0x2e8,0x82,0xe6,0x4f,0x308,0x82,0xe6,0x55,0x300,0x82,0xe6,0x55,0x301,0x82,0xe6,0x55, +0x302,0x2b8,0x82,0xe6,0x55,0x308,0x82,0xe6,0x59,0x301,0x82,0xe6,0x61,0x300,0x82,0xe6, +0x61,0x301,0x4ee,0x82,0xe6,0x61,0x302,0x82,0xe6,0x61,0x303,0x2ca,0x82,0xe6,0x61,0x308, +0x2e2,0x82,0xe6,0x61,0x30a,0x486,0x82,0xca,0x63,0x327,0x82,0xe6,0x65,0x300,0x82,0xe6, +0x65,0x301,0x516,0x82,0xe6,0x65,0x302,0x82,0xe6,0x65,0x308,0x82,0xe6,0x69,0x300,0x82, +0xe6,0x69,0x301,0x82,0xe6,0x69,0x302,0x49a,0x82,0xe6,0x69,0x308,0x82,0xe6,0x6e,0x303, +0x82,0xe6,0x6f,0x300,0x82,0xe6,0x6f,0x301,0x52a,0x82,0xe6,0x6f,0x302,0x2f2,0x82,0xe6, +0x6f,0x303,0x2ea,0x82,0xe6,0x6f,0x308,0x82,0xe6,0x75,0x300,0x82,0xe6,0x75,0x301,0x82, +0xe6,0x75,0x302,0x2c0,0x82,0xe6,0x75,0x308,0x82,0xe6,0x79,0x301,0x82,0xe6,0x79,0x308, +0x82,0xe6,0x41,0x304,0x82,0xe6,0x61,0x304,0x4fe,0x82,0xe6,0x41,0x306,0x506,0x82,0xe6, +0x61,0x306,0x82,0xca,0x41,0x328,0x82,0xca,0x61,0x328,0x82,0xe6,0x43,0x301,0x82,0xe6, +0x63,0x301,0x82,0xe6,0x43,0x302,0x82,0xe6,0x63,0x302,0x82,0xe6,0x43,0x307,0x82,0xe6, +0x63,0x307,0x82,0xe6,0x43,0x30c,0x82,0xe6,0x63,0x30c,0x82,0xe6,0x44,0x30c,0x82,0xe6, +0x64,0x30c,0x488,0x82,0xe6,0x45,0x304,0x48c,0x82,0xe6,0x65,0x304,0x82,0xe6,0x45,0x306, +0x82,0xe6,0x65,0x306,0x82,0xe6,0x45,0x307,0x82,0xe6,0x65,0x307,0x82,0xca,0x45,0x328, +0x82,0xca,0x65,0x328,0x82,0xe6,0x45,0x30c,0x82,0xe6,0x65,0x30c,0x82,0xe6,0x47,0x302, +0x82,0xe6,0x67,0x302,0x82,0xe6,0x47,0x306,0x82,0xe6,0x67,0x306,0x82,0xe6,0x47,0x307, +0x82,0xe6,0x67,0x307,0x82,0xca,0x47,0x327,0x82,0xca,0x67,0x327,0x82,0xe6,0x48,0x302, +0x82,0xe6,0x68,0x302,0x82,0xe6,0x49,0x303,0x82,0xe6,0x69,0x303,0x82,0xe6,0x49,0x304, +0x82,0xe6,0x69,0x304,0x82,0xe6,0x49,0x306,0x82,0xe6,0x69,0x306,0x82,0xca,0x49,0x328, +0x82,0xca,0x69,0x328,0x82,0xe6,0x49,0x307,0x82,0xe6,0x4a,0x302,0x82,0xe6,0x6a,0x302, +0x82,0xca,0x4b,0x327,0x82,0xca,0x6b,0x327,0x82,0xe6,0x4c,0x301,0x82,0xe6,0x6c,0x301, +0x82,0xca,0x4c,0x327,0x82,0xca,0x6c,0x327,0x82,0xe6,0x4c,0x30c,0x82,0xe6,0x6c,0x30c, +0x82,0xe6,0x4e,0x301,0x82,0xe6,0x6e,0x301,0x82,0xca,0x4e,0x327,0x82,0xca,0x6e,0x327, +0x82,0xe6,0x4e,0x30c,0x82,0xe6,0x6e,0x30c,0x4ac,0x82,0xe6,0x4f,0x304,0x4b0,0x82,0xe6, +0x6f,0x304,0x82,0xe6,0x4f,0x306,0x82,0xe6,0x6f,0x306,0x82,0xe6,0x4f,0x30b,0x82,0xe6, +0x6f,0x30b,0x82,0xe6,0x52,0x301,0x82,0xe6,0x72,0x301,0x82,0xca,0x52,0x327,0x82,0xca, +0x72,0x327,0x82,0xe6,0x52,0x30c,0x82,0xe6,0x72,0x30c,0x4c0,0x82,0xe6,0x53,0x301,0x4c2, +0x82,0xe6,0x73,0x301,0x82,0xe6,0x53,0x302,0x82,0xe6,0x73,0x302,0x82,0xca,0x53,0x327, +0x82,0xca,0x73,0x327,0x4c4,0x82,0xe6,0x53,0x30c,0x4c6,0x82,0xe6,0x73,0x30c,0x82,0xca, +0x54,0x327,0x82,0xca,0x74,0x327,0x82,0xe6,0x54,0x30c,0x82,0xe6,0x74,0x30c,0x4cc,0x82, +0xe6,0x55,0x303,0x4ce,0x82,0xe6,0x75,0x303,0x4d0,0x82,0xe6,0x55,0x304,0x4d2,0x82,0xe6, +0x75,0x304,0x82,0xe6,0x55,0x306,0x82,0xe6,0x75,0x306,0x82,0xe6,0x55,0x30a,0x82,0xe6, +0x75,0x30a,0x82,0xe6,0x55,0x30b,0x82,0xe6,0x75,0x30b,0x82,0xca,0x55,0x328,0x82,0xca, +0x75,0x328,0x82,0xe6,0x57,0x302,0x82,0xe6,0x77,0x302,0x82,0xe6,0x59,0x302,0x82,0xe6, +0x79,0x302,0x82,0xe6,0x59,0x308,0x82,0xe6,0x5a,0x301,0x82,0xe6,0x7a,0x301,0x82,0xe6, +0x5a,0x307,0x82,0xe6,0x7a,0x307,0x82,0xe6,0x5a,0x30c,0x82,0xe6,0x7a,0x30c,0x536,0x82, +0xd8,0x4f,0x31b,0x540,0x82,0xd8,0x6f,0x31b,0x54a,0x82,0xd8,0x55,0x31b,0x554,0x82,0xd8, +0x75,0x31b,0x82,0xe6,0x41,0x30c,0x82,0xe6,0x61,0x30c,0x82,0xe6,0x49,0x30c,0x82,0xe6, +0x69,0x30c,0x82,0xe6,0x4f,0x30c,0x82,0xe6,0x6f,0x30c,0x82,0xe6,0x55,0x30c,0x82,0xe6, +0x75,0x30c,0x83,0xe6,0x55,0x308,0x304,0x83,0xe6,0x75,0x308,0x304,0x83,0xe6,0x55,0x308, +0x301,0x83,0xe6,0x75,0x308,0x301,0x83,0xe6,0x55,0x308,0x30c,0x83,0xe6,0x75,0x308,0x30c, +0x83,0xe6,0x55,0x308,0x300,0x83,0xe6,0x75,0x308,0x300,0x83,0xe6,0x41,0x308,0x304,0x83, +0xe6,0x61,0x308,0x304,0x83,0xe6,0x41,0x307,0x304,0x83,0xe6,0x61,0x307,0x304,0x82,0xe6, +0xc6,0x304,0x82,0xe6,0xe6,0x304,0x82,0xe6,0x47,0x30c,0x82,0xe6,0x67,0x30c,0x82,0xe6, +0x4b,0x30c,0x82,0xe6,0x6b,0x30c,0x2d8,0x82,0xca,0x4f,0x328,0x2da,0x82,0xca,0x6f,0x328, +0x83,0xe6,0x4f,0x328,0x304,0x83,0xe6,0x6f,0x328,0x304,0x82,0xe6,0x1b7,0x30c,0x82,0xe6, +0x292,0x30c,0x82,0xe6,0x6a,0x30c,0x82,0xe6,0x47,0x301,0x82,0xe6,0x67,0x301,0x82,0xe6, +0x4e,0x300,0x82,0xe6,0x6e,0x300,0x83,0xe6,0x41,0x30a,0x301,0x83,0xe6,0x61,0x30a,0x301, +0x82,0xe6,0xc6,0x301,0x82,0xe6,0xe6,0x301,0x82,0xe6,0xd8,0x301,0x82,0xe6,0xf8,0x301, +0x82,0xe6,0x41,0x30f,0x82,0xe6,0x61,0x30f,0x82,0xe6,0x41,0x311,0x82,0xe6,0x61,0x311, +0x82,0xe6,0x45,0x30f,0x82,0xe6,0x65,0x30f,0x82,0xe6,0x45,0x311,0x82,0xe6,0x65,0x311, +0x82,0xe6,0x49,0x30f,0x82,0xe6,0x69,0x30f,0x82,0xe6,0x49,0x311,0x82,0xe6,0x69,0x311, +0x82,0xe6,0x4f,0x30f,0x82,0xe6,0x6f,0x30f,0x82,0xe6,0x4f,0x311,0x82,0xe6,0x6f,0x311, +0x82,0xe6,0x52,0x30f,0x82,0xe6,0x72,0x30f,0x82,0xe6,0x52,0x311,0x82,0xe6,0x72,0x311, +0x82,0xe6,0x55,0x30f,0x82,0xe6,0x75,0x30f,0x82,0xe6,0x55,0x311,0x82,0xe6,0x75,0x311, +0x82,0xdc,0x53,0x326,0x82,0xdc,0x73,0x326,0x82,0xdc,0x54,0x326,0x82,0xdc,0x74,0x326, +0x82,0xe6,0x48,0x30c,0x82,0xe6,0x68,0x30c,0x2cc,0x82,0xe6,0x41,0x307,0x2ce,0x82,0xe6, +0x61,0x307,0x490,0x82,0xca,0x45,0x327,0x492,0x82,0xca,0x65,0x327,0x83,0xe6,0x4f,0x308, +0x304,0x83,0xe6,0x6f,0x308,0x304,0x83,0xe6,0x4f,0x303,0x304,0x83,0xe6,0x6f,0x303,0x304, +0x2f8,0x82,0xe6,0x4f,0x307,0x2fa,0x82,0xe6,0x6f,0x307,0x83,0xe6,0x4f,0x307,0x304,0x83, +0xe6,0x6f,0x307,0x304,0x82,0xe6,0x59,0x304,0x82,0xe6,0x79,0x304,0x8382,0xe6,0xa8,0x301, +0xe6,0x20,0x308,0x301,0x82,0xe6,0x391,0x301,0x82,0xe6,0x395,0x301,0x82,0xe6,0x397,0x301, +0x82,0xe6,0x399,0x301,0x82,0xe6,0x39f,0x301,0x82,0xe6,0x3a5,0x301,0x82,0xe6,0x3a9,0x301, +0x83,0xe6,0x3b9,0x308,0x301,0x82,0xe6,0x399,0x308,0x82,0xe6,0x3a5,0x308,0x652,0x82,0xe6, +0x3b1,0x301,0x82,0xe6,0x3b5,0x301,0x658,0x82,0xe6,0x3b7,0x301,0x82,0xe6,0x3b9,0x301,0x83, +0xe6,0x3c5,0x308,0x301,0x34e,0x82,0xe6,0x3b9,0x308,0x388,0x82,0xe6,0x3c5,0x308,0x82,0xe6, +0x3bf,0x301,0x82,0xe6,0x3c5,0x301,0x670,0x82,0xe6,0x3c9,0x301,0x82,0xe6,0x415,0x300,0x82, +0xe6,0x415,0x308,0x82,0xe6,0x413,0x301,0x82,0xe6,0x406,0x308,0x82,0xe6,0x41a,0x301,0x82, +0xe6,0x418,0x300,0x82,0xe6,0x423,0x306,0x82,0xe6,0x418,0x306,0x82,0xe6,0x438,0x306,0x82, +0xe6,0x435,0x300,0x82,0xe6,0x435,0x308,0x82,0xe6,0x433,0x301,0x82,0xe6,0x456,0x308,0x82, +0xe6,0x43a,0x301,0x82,0xe6,0x438,0x300,0x82,0xe6,0x443,0x306,0x82,0xe6,0x474,0x30f,0x82, +0xe6,0x475,0x30f,0x82,0xe6,0x416,0x306,0x82,0xe6,0x436,0x306,0x82,0xe6,0x410,0x306,0x82, +0xe6,0x430,0x306,0x82,0xe6,0x410,0x308,0x82,0xe6,0x430,0x308,0x82,0xe6,0x415,0x306,0x82, +0xe6,0x435,0x306,0x82,0xe6,0x4d8,0x308,0x82,0xe6,0x4d9,0x308,0x82,0xe6,0x416,0x308,0x82, +0xe6,0x436,0x308,0x82,0xe6,0x417,0x308,0x82,0xe6,0x437,0x308,0x82,0xe6,0x418,0x304,0x82, +0xe6,0x438,0x304,0x82,0xe6,0x418,0x308,0x82,0xe6,0x438,0x308,0x82,0xe6,0x41e,0x308,0x82, +0xe6,0x43e,0x308,0x82,0xe6,0x4e8,0x308,0x82,0xe6,0x4e9,0x308,0x82,0xe6,0x42d,0x308,0x82, +0xe6,0x44d,0x308,0x82,0xe6,0x423,0x304,0x82,0xe6,0x443,0x304,0x82,0xe6,0x423,0x308,0x82, +0xe6,0x443,0x308,0x82,0xe6,0x423,0x30b,0x82,0xe6,0x443,0x30b,0x82,0xe6,0x427,0x308,0x82, +0xe6,0x447,0x308,0x82,0xe6,0x42b,0x308,0x82,0xe6,0x44b,0x308,0x82,0xe6,0x627,0x653,0x82, +0xe6,0x627,0x654,0x82,0xe6,0x648,0x654,0x82,0xdc,0x627,0x655,0x82,0xe6,0x64a,0x654,0x82, +0xe6,0x6d5,0x654,0x82,0xe6,0x6c1,0x654,0x82,0xe6,0x6d2,0x654,0x82,7,0x928,0x93c,0x82, +7,0x930,0x93c,0x82,7,0x933,0x93c,2,0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56, +2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92,0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2, +0xbc6,0xbd7,0x82,0x5b,0xc46,0xc56,2,0xcbf,0xcd5,2,0xcc6,0xcd5,2,0xcc6,0xcd6,0x450, +2,0xcc6,0xcc2,3,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47,0xd3e,2,0xd46,0xd57, +0x82,9,0xdd9,0xdca,0x45e,2,0xdd9,0xdcf,0x83,9,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf, +2,0x1025,0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2, +0x1b0d,0x1b35,2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f, +0x1b35,2,0x1b42,0x1b35,0x82,0xdc,0x41,0x325,0x82,0xdc,0x61,0x325,0x82,0xe6,0x42,0x307, +0x82,0xe6,0x62,0x307,0x82,0xdc,0x42,0x323,0x82,0xdc,0x62,0x323,0x82,0xdc,0x42,0x331, +0x82,0xdc,0x62,0x331,0x83,0xe6,0x43,0x327,0x301,0x83,0xe6,0x63,0x327,0x301,0x82,0xe6, +0x44,0x307,0x82,0xe6,0x64,0x307,0x82,0xdc,0x44,0x323,0x82,0xdc,0x64,0x323,0x82,0xdc, +0x44,0x331,0x82,0xdc,0x64,0x331,0x82,0xca,0x44,0x327,0x82,0xca,0x64,0x327,0x82,0xdc, +0x44,0x32d,0x82,0xdc,0x64,0x32d,0x83,0xe6,0x45,0x304,0x300,0x83,0xe6,0x65,0x304,0x300, +0x83,0xe6,0x45,0x304,0x301,0x83,0xe6,0x65,0x304,0x301,0x82,0xdc,0x45,0x32d,0x82,0xdc, +0x65,0x32d,0x82,0xdc,0x45,0x330,0x82,0xdc,0x65,0x330,0x83,0xe6,0x45,0x327,0x306,0x83, +0xe6,0x65,0x327,0x306,0x82,0xe6,0x46,0x307,0x82,0xe6,0x66,0x307,0x82,0xe6,0x47,0x304, +0x82,0xe6,0x67,0x304,0x82,0xe6,0x48,0x307,0x82,0xe6,0x68,0x307,0x82,0xdc,0x48,0x323, +0x82,0xdc,0x68,0x323,0x82,0xe6,0x48,0x308,0x82,0xe6,0x68,0x308,0x82,0xca,0x48,0x327, +0x82,0xca,0x68,0x327,0x82,0xdc,0x48,0x32e,0x82,0xdc,0x68,0x32e,0x82,0xdc,0x49,0x330, +0x82,0xdc,0x69,0x330,0x83,0xe6,0x49,0x308,0x301,0x83,0xe6,0x69,0x308,0x301,0x82,0xe6, +0x4b,0x301,0x82,0xe6,0x6b,0x301,0x82,0xdc,0x4b,0x323,0x82,0xdc,0x6b,0x323,0x82,0xdc, +0x4b,0x331,0x82,0xdc,0x6b,0x331,0x49c,0x82,0xdc,0x4c,0x323,0x49e,0x82,0xdc,0x6c,0x323, +0x83,0xe6,0x4c,0x323,0x304,0x83,0xe6,0x6c,0x323,0x304,0x82,0xdc,0x4c,0x331,0x82,0xdc, +0x6c,0x331,0x82,0xdc,0x4c,0x32d,0x82,0xdc,0x6c,0x32d,0x82,0xe6,0x4d,0x301,0x82,0xe6, +0x6d,0x301,0x82,0xe6,0x4d,0x307,0x82,0xe6,0x6d,0x307,0x82,0xdc,0x4d,0x323,0x82,0xdc, +0x6d,0x323,0x82,0xe6,0x4e,0x307,0x82,0xe6,0x6e,0x307,0x82,0xdc,0x4e,0x323,0x82,0xdc, +0x6e,0x323,0x82,0xdc,0x4e,0x331,0x82,0xdc,0x6e,0x331,0x82,0xdc,0x4e,0x32d,0x82,0xdc, +0x6e,0x32d,0x83,0xe6,0x4f,0x303,0x301,0x83,0xe6,0x6f,0x303,0x301,0x83,0xe6,0x4f,0x303, +0x308,0x83,0xe6,0x6f,0x303,0x308,0x83,0xe6,0x4f,0x304,0x300,0x83,0xe6,0x6f,0x304,0x300, +0x83,0xe6,0x4f,0x304,0x301,0x83,0xe6,0x6f,0x304,0x301,0x82,0xe6,0x50,0x301,0x82,0xe6, +0x70,0x301,0x82,0xe6,0x50,0x307,0x82,0xe6,0x70,0x307,0x82,0xe6,0x52,0x307,0x82,0xe6, +0x72,0x307,0x4bc,0x82,0xdc,0x52,0x323,0x4be,0x82,0xdc,0x72,0x323,0x83,0xe6,0x52,0x323, +0x304,0x83,0xe6,0x72,0x323,0x304,0x82,0xdc,0x52,0x331,0x82,0xdc,0x72,0x331,0x82,0xe6, +0x53,0x307,0x82,0xe6,0x73,0x307,0x4c8,0x82,0xdc,0x53,0x323,0x4ca,0x82,0xdc,0x73,0x323, +0x83,0xe6,0x53,0x301,0x307,0x83,0xe6,0x73,0x301,0x307,0x83,0xe6,0x53,0x30c,0x307,0x83, +0xe6,0x73,0x30c,0x307,0x83,0xe6,0x53,0x323,0x307,0x83,0xe6,0x73,0x323,0x307,0x82,0xe6, +0x54,0x307,0x82,0xe6,0x74,0x307,0x82,0xdc,0x54,0x323,0x82,0xdc,0x74,0x323,0x82,0xdc, +0x54,0x331,0x82,0xdc,0x74,0x331,0x82,0xdc,0x54,0x32d,0x82,0xdc,0x74,0x32d,0x82,0xdc, +0x55,0x324,0x82,0xdc,0x75,0x324,0x82,0xdc,0x55,0x330,0x82,0xdc,0x75,0x330,0x82,0xdc, +0x55,0x32d,0x82,0xdc,0x75,0x32d,0x83,0xe6,0x55,0x303,0x301,0x83,0xe6,0x75,0x303,0x301, +0x83,0xe6,0x55,0x304,0x308,0x83,0xe6,0x75,0x304,0x308,0x82,0xe6,0x56,0x303,0x82,0xe6, +0x76,0x303,0x82,0xdc,0x56,0x323,0x82,0xdc,0x76,0x323,0x82,0xe6,0x57,0x300,0x82,0xe6, +0x77,0x300,0x82,0xe6,0x57,0x301,0x82,0xe6,0x77,0x301,0x82,0xe6,0x57,0x308,0x82,0xe6, +0x77,0x308,0x82,0xe6,0x57,0x307,0x82,0xe6,0x77,0x307,0x82,0xdc,0x57,0x323,0x82,0xdc, +0x77,0x323,0x82,0xe6,0x58,0x307,0x82,0xe6,0x78,0x307,0x82,0xe6,0x58,0x308,0x82,0xe6, +0x78,0x308,0x82,0xe6,0x59,0x307,0x82,0xe6,0x79,0x307,0x82,0xe6,0x5a,0x302,0x82,0xe6, +0x7a,0x302,0x82,0xdc,0x5a,0x323,0x82,0xdc,0x7a,0x323,0x82,0xdc,0x5a,0x331,0x82,0xdc, +0x7a,0x331,0x82,0xdc,0x68,0x331,0x82,0xe6,0x74,0x308,0x82,0xe6,0x77,0x30a,0x82,0xe6, +0x79,0x30a,0x8282,0xe6,0x17f,0x307,0xe6,0x73,0x307,0x4f6,0x82,0xdc,0x41,0x323,0x4fa,0x82, +0xdc,0x61,0x323,0x82,0xe6,0x41,0x309,0x82,0xe6,0x61,0x309,0x83,0xe6,0x41,0x302,0x301, +0x83,0xe6,0x61,0x302,0x301,0x83,0xe6,0x41,0x302,0x300,0x83,0xe6,0x61,0x302,0x300,0x83, +0xe6,0x41,0x302,0x309,0x83,0xe6,0x61,0x302,0x309,0x83,0xe6,0x41,0x302,0x303,0x83,0xe6, +0x61,0x302,0x303,0x83,0xe6,0x41,0x323,0x302,0x83,0xe6,0x61,0x323,0x302,0x83,0xe6,0x41, +0x306,0x301,0x83,0xe6,0x61,0x306,0x301,0x83,0xe6,0x41,0x306,0x300,0x83,0xe6,0x61,0x306, +0x300,0x83,0xe6,0x41,0x306,0x309,0x83,0xe6,0x61,0x306,0x309,0x83,0xe6,0x41,0x306,0x303, +0x83,0xe6,0x61,0x306,0x303,0x83,0xe6,0x41,0x323,0x306,0x83,0xe6,0x61,0x323,0x306,0x51e, +0x82,0xdc,0x45,0x323,0x520,0x82,0xdc,0x65,0x323,0x82,0xe6,0x45,0x309,0x82,0xe6,0x65, +0x309,0x82,0xe6,0x45,0x303,0x82,0xe6,0x65,0x303,0x83,0xe6,0x45,0x302,0x301,0x83,0xe6, +0x65,0x302,0x301,0x83,0xe6,0x45,0x302,0x300,0x83,0xe6,0x65,0x302,0x300,0x83,0xe6,0x45, +0x302,0x309,0x83,0xe6,0x65,0x302,0x309,0x83,0xe6,0x45,0x302,0x303,0x83,0xe6,0x65,0x302, +0x303,0x83,0xe6,0x45,0x323,0x302,0x83,0xe6,0x65,0x323,0x302,0x82,0xe6,0x49,0x309,0x82, +0xe6,0x69,0x309,0x82,0xdc,0x49,0x323,0x82,0xdc,0x69,0x323,0x532,0x82,0xdc,0x4f,0x323, +0x534,0x82,0xdc,0x6f,0x323,0x82,0xe6,0x4f,0x309,0x82,0xe6,0x6f,0x309,0x83,0xe6,0x4f, +0x302,0x301,0x83,0xe6,0x6f,0x302,0x301,0x83,0xe6,0x4f,0x302,0x300,0x83,0xe6,0x6f,0x302, +0x300,0x83,0xe6,0x4f,0x302,0x309,0x83,0xe6,0x6f,0x302,0x309,0x83,0xe6,0x4f,0x302,0x303, +0x83,0xe6,0x6f,0x302,0x303,0x83,0xe6,0x4f,0x323,0x302,0x83,0xe6,0x6f,0x323,0x302,0x83, +0xe6,0x4f,0x31b,0x301,0x83,0xe6,0x6f,0x31b,0x301,0x83,0xe6,0x4f,0x31b,0x300,0x83,0xe6, +0x6f,0x31b,0x300,0x83,0xe6,0x4f,0x31b,0x309,0x83,0xe6,0x6f,0x31b,0x309,0x83,0xe6,0x4f, +0x31b,0x303,0x83,0xe6,0x6f,0x31b,0x303,0x83,0xdc,0x4f,0x31b,0x323,0x83,0xdc,0x6f,0x31b, +0x323,0x82,0xdc,0x55,0x323,0x82,0xdc,0x75,0x323,0x82,0xe6,0x55,0x309,0x82,0xe6,0x75, +0x309,0x83,0xe6,0x55,0x31b,0x301,0x83,0xe6,0x75,0x31b,0x301,0x83,0xe6,0x55,0x31b,0x300, +0x83,0xe6,0x75,0x31b,0x300,0x83,0xe6,0x55,0x31b,0x309,0x83,0xe6,0x75,0x31b,0x309,0x83, +0xe6,0x55,0x31b,0x303,0x83,0xe6,0x75,0x31b,0x303,0x83,0xdc,0x55,0x31b,0x323,0x83,0xdc, +0x75,0x31b,0x323,0x82,0xe6,0x59,0x300,0x82,0xe6,0x79,0x300,0x82,0xdc,0x59,0x323,0x82, +0xdc,0x79,0x323,0x82,0xe6,0x59,0x309,0x82,0xe6,0x79,0x309,0x82,0xe6,0x59,0x303,0x82, +0xe6,0x79,0x303,0x55e,0x82,0xe6,0x3b1,0x313,0x566,0x82,0xe6,0x3b1,0x314,0x608,0x83,0xe6, +0x3b1,0x313,0x300,0x60a,0x83,0xe6,0x3b1,0x314,0x300,0x60c,0x83,0xe6,0x3b1,0x313,0x301,0x60e, +0x83,0xe6,0x3b1,0x314,0x301,0x610,0x83,0xe6,0x3b1,0x313,0x342,0x612,0x83,0xe6,0x3b1,0x314, +0x342,0x56e,0x82,0xe6,0x391,0x313,0x576,0x82,0xe6,0x391,0x314,0x614,0x83,0xe6,0x391,0x313, +0x300,0x616,0x83,0xe6,0x391,0x314,0x300,0x618,0x83,0xe6,0x391,0x313,0x301,0x61a,0x83,0xe6, +0x391,0x314,0x301,0x61c,0x83,0xe6,0x391,0x313,0x342,0x61e,0x83,0xe6,0x391,0x314,0x342,0x57e, +0x82,0xe6,0x3b5,0x313,0x582,0x82,0xe6,0x3b5,0x314,0x83,0xe6,0x3b5,0x313,0x300,0x83,0xe6, +0x3b5,0x314,0x300,0x83,0xe6,0x3b5,0x313,0x301,0x83,0xe6,0x3b5,0x314,0x301,0x586,0x82,0xe6, +0x395,0x313,0x58a,0x82,0xe6,0x395,0x314,0x83,0xe6,0x395,0x313,0x300,0x83,0xe6,0x395,0x314, +0x300,0x83,0xe6,0x395,0x313,0x301,0x83,0xe6,0x395,0x314,0x301,0x58e,0x82,0xe6,0x3b7,0x313, +0x596,0x82,0xe6,0x3b7,0x314,0x620,0x83,0xe6,0x3b7,0x313,0x300,0x622,0x83,0xe6,0x3b7,0x314, +0x300,0x624,0x83,0xe6,0x3b7,0x313,0x301,0x626,0x83,0xe6,0x3b7,0x314,0x301,0x628,0x83,0xe6, +0x3b7,0x313,0x342,0x62a,0x83,0xe6,0x3b7,0x314,0x342,0x59e,0x82,0xe6,0x397,0x313,0x5a6,0x82, +0xe6,0x397,0x314,0x62c,0x83,0xe6,0x397,0x313,0x300,0x62e,0x83,0xe6,0x397,0x314,0x300,0x630, +0x83,0xe6,0x397,0x313,0x301,0x632,0x83,0xe6,0x397,0x314,0x301,0x634,0x83,0xe6,0x397,0x313, +0x342,0x636,0x83,0xe6,0x397,0x314,0x342,0x5ae,0x82,0xe6,0x3b9,0x313,0x5b4,0x82,0xe6,0x3b9, +0x314,0x83,0xe6,0x3b9,0x313,0x300,0x83,0xe6,0x3b9,0x314,0x300,0x83,0xe6,0x3b9,0x313,0x301, +0x83,0xe6,0x3b9,0x314,0x301,0x83,0xe6,0x3b9,0x313,0x342,0x83,0xe6,0x3b9,0x314,0x342,0x5ba, +0x82,0xe6,0x399,0x313,0x5c0,0x82,0xe6,0x399,0x314,0x83,0xe6,0x399,0x313,0x300,0x83,0xe6, +0x399,0x314,0x300,0x83,0xe6,0x399,0x313,0x301,0x83,0xe6,0x399,0x314,0x301,0x83,0xe6,0x399, +0x313,0x342,0x83,0xe6,0x399,0x314,0x342,0x5c6,0x82,0xe6,0x3bf,0x313,0x5ca,0x82,0xe6,0x3bf, +0x314,0x83,0xe6,0x3bf,0x313,0x300,0x83,0xe6,0x3bf,0x314,0x300,0x83,0xe6,0x3bf,0x313,0x301, +0x83,0xe6,0x3bf,0x314,0x301,0x5ce,0x82,0xe6,0x39f,0x313,0x5d2,0x82,0xe6,0x39f,0x314,0x83, +0xe6,0x39f,0x313,0x300,0x83,0xe6,0x39f,0x314,0x300,0x83,0xe6,0x39f,0x313,0x301,0x83,0xe6, +0x39f,0x314,0x301,0x5d6,0x82,0xe6,0x3c5,0x313,0x5dc,0x82,0xe6,0x3c5,0x314,0x83,0xe6,0x3c5, +0x313,0x300,0x83,0xe6,0x3c5,0x314,0x300,0x83,0xe6,0x3c5,0x313,0x301,0x83,0xe6,0x3c5,0x314, +0x301,0x83,0xe6,0x3c5,0x313,0x342,0x83,0xe6,0x3c5,0x314,0x342,0x5e2,0x82,0xe6,0x3a5,0x314, +0x83,0xe6,0x3a5,0x314,0x300,0x83,0xe6,0x3a5,0x314,0x301,0x83,0xe6,0x3a5,0x314,0x342,0x5e8, +0x82,0xe6,0x3c9,0x313,0x5f0,0x82,0xe6,0x3c9,0x314,0x638,0x83,0xe6,0x3c9,0x313,0x300,0x63a, +0x83,0xe6,0x3c9,0x314,0x300,0x63c,0x83,0xe6,0x3c9,0x313,0x301,0x63e,0x83,0xe6,0x3c9,0x314, +0x301,0x640,0x83,0xe6,0x3c9,0x313,0x342,0x642,0x83,0xe6,0x3c9,0x314,0x342,0x5f8,0x82,0xe6, +0x3a9,0x313,0x600,0x82,0xe6,0x3a9,0x314,0x644,0x83,0xe6,0x3a9,0x313,0x300,0x646,0x83,0xe6, +0x3a9,0x314,0x300,0x648,0x83,0xe6,0x3a9,0x313,0x301,0x64a,0x83,0xe6,0x3a9,0x314,0x301,0x64c, +0x83,0xe6,0x3a9,0x313,0x342,0x64e,0x83,0xe6,0x3a9,0x314,0x342,0x650,0x82,0xe6,0x3b1,0x300, +0x82,0xe6,0x3b5,0x300,0x656,0x82,0xe6,0x3b7,0x300,0x82,0xe6,0x3b9,0x300,0x82,0xe6,0x3bf, +0x300,0x82,0xe6,0x3c5,0x300,0x66e,0x82,0xe6,0x3c9,0x300,0x83,0xf0,0x3b1,0x313,0x345,0x83, +0xf0,0x3b1,0x314,0x345,0x84,0xf0,0x3b1,0x313,0x300,0x345,0x84,0xf0,0x3b1,0x314,0x300,0x345, +0x84,0xf0,0x3b1,0x313,0x301,0x345,0x84,0xf0,0x3b1,0x314,0x301,0x345,0x84,0xf0,0x3b1,0x313, +0x342,0x345,0x84,0xf0,0x3b1,0x314,0x342,0x345,0x83,0xf0,0x391,0x313,0x345,0x83,0xf0,0x391, +0x314,0x345,0x84,0xf0,0x391,0x313,0x300,0x345,0x84,0xf0,0x391,0x314,0x300,0x345,0x84,0xf0, +0x391,0x313,0x301,0x345,0x84,0xf0,0x391,0x314,0x301,0x345,0x84,0xf0,0x391,0x313,0x342,0x345, +0x84,0xf0,0x391,0x314,0x342,0x345,0x83,0xf0,0x3b7,0x313,0x345,0x83,0xf0,0x3b7,0x314,0x345, +0x84,0xf0,0x3b7,0x313,0x300,0x345,0x84,0xf0,0x3b7,0x314,0x300,0x345,0x84,0xf0,0x3b7,0x313, +0x301,0x345,0x84,0xf0,0x3b7,0x314,0x301,0x345,0x84,0xf0,0x3b7,0x313,0x342,0x345,0x84,0xf0, +0x3b7,0x314,0x342,0x345,0x83,0xf0,0x397,0x313,0x345,0x83,0xf0,0x397,0x314,0x345,0x84,0xf0, +0x397,0x313,0x300,0x345,0x84,0xf0,0x397,0x314,0x300,0x345,0x84,0xf0,0x397,0x313,0x301,0x345, +0x84,0xf0,0x397,0x314,0x301,0x345,0x84,0xf0,0x397,0x313,0x342,0x345,0x84,0xf0,0x397,0x314, +0x342,0x345,0x83,0xf0,0x3c9,0x313,0x345,0x83,0xf0,0x3c9,0x314,0x345,0x84,0xf0,0x3c9,0x313, +0x300,0x345,0x84,0xf0,0x3c9,0x314,0x300,0x345,0x84,0xf0,0x3c9,0x313,0x301,0x345,0x84,0xf0, +0x3c9,0x314,0x301,0x345,0x84,0xf0,0x3c9,0x313,0x342,0x345,0x84,0xf0,0x3c9,0x314,0x342,0x345, +0x83,0xf0,0x3a9,0x313,0x345,0x83,0xf0,0x3a9,0x314,0x345,0x84,0xf0,0x3a9,0x313,0x300,0x345, +0x84,0xf0,0x3a9,0x314,0x300,0x345,0x84,0xf0,0x3a9,0x313,0x301,0x345,0x84,0xf0,0x3a9,0x314, +0x301,0x345,0x84,0xf0,0x3a9,0x313,0x342,0x345,0x84,0xf0,0x3a9,0x314,0x342,0x345,0x82,0xe6, +0x3b1,0x306,0x82,0xe6,0x3b1,0x304,0x83,0xf0,0x3b1,0x300,0x345,0x82,0xf0,0x3b1,0x345,0x83, +0xf0,0x3b1,0x301,0x345,0x654,0x82,0xe6,0x3b1,0x342,0x83,0xf0,0x3b1,0x342,0x345,0x82,0xe6, +0x391,0x306,0x82,0xe6,0x391,0x304,0x82,0xe6,0x391,0x300,0x82,0xf0,0x391,0x345,0x8382,0xe6, +0xa8,0x342,0xe6,0x20,0x308,0x342,0x83,0xf0,0x3b7,0x300,0x345,0x82,0xf0,0x3b7,0x345,0x83, +0xf0,0x3b7,0x301,0x345,0x65a,0x82,0xe6,0x3b7,0x342,0x83,0xf0,0x3b7,0x342,0x345,0x82,0xe6, +0x395,0x300,0x82,0xe6,0x397,0x300,0x82,0xf0,0x397,0x345,0x8382,0xe6,0x1fbf,0x300,0xe6,0x20, +0x313,0x300,0x8382,0xe6,0x1fbf,0x301,0xe6,0x20,0x313,0x301,0x8382,0xe6,0x1fbf,0x342,0xe6,0x20, +0x313,0x342,0x82,0xe6,0x3b9,0x306,0x82,0xe6,0x3b9,0x304,0x83,0xe6,0x3b9,0x308,0x300,0x82, +0xe6,0x3b9,0x342,0x83,0xe6,0x3b9,0x308,0x342,0x82,0xe6,0x399,0x306,0x82,0xe6,0x399,0x304, +0x82,0xe6,0x399,0x300,0x8382,0xe6,0x1ffe,0x300,0xe6,0x20,0x314,0x300,0x8382,0xe6,0x1ffe,0x301, +0xe6,0x20,0x314,0x301,0x8382,0xe6,0x1ffe,0x342,0xe6,0x20,0x314,0x342,0x82,0xe6,0x3c5,0x306, +0x82,0xe6,0x3c5,0x304,0x83,0xe6,0x3c5,0x308,0x300,0x82,0xe6,0x3c1,0x313,0x82,0xe6,0x3c1, +0x314,0x82,0xe6,0x3c5,0x342,0x83,0xe6,0x3c5,0x308,0x342,0x82,0xe6,0x3a5,0x306,0x82,0xe6, +0x3a5,0x304,0x82,0xe6,0x3a5,0x300,0x82,0xe6,0x3a1,0x314,0x8382,0xe6,0xa8,0x300,0xe6,0x20, +0x308,0x300,0x83,0xf0,0x3c9,0x300,0x345,0x82,0xf0,0x3c9,0x345,0x83,0xf0,0x3c9,0x301,0x345, +0x672,0x82,0xe6,0x3c9,0x342,0x83,0xf0,0x3c9,0x342,0x345,0x82,0xe6,0x39f,0x300,0x82,0xe6, +0x3a9,0x300,0x82,0xf0,0x3a9,0x345,0x82,1,0x2190,0x338,0x82,1,0x2192,0x338,0x82,1, +0x2194,0x338,0x82,1,0x21d0,0x338,0x82,1,0x21d4,0x338,0x82,1,0x21d2,0x338,0x82,1, +0x2203,0x338,0x82,1,0x2208,0x338,0x82,1,0x220b,0x338,0x82,1,0x2223,0x338,0x82,1, +0x2225,0x338,0x82,1,0x223c,0x338,0x82,1,0x2243,0x338,0x82,1,0x2245,0x338,0x82,1, +0x2248,0x338,0x82,1,0x3d,0x338,0x82,1,0x2261,0x338,0x82,1,0x224d,0x338,0x82,1, +0x3c,0x338,0x82,1,0x3e,0x338,0x82,1,0x2264,0x338,0x82,1,0x2265,0x338,0x82,1, +0x2272,0x338,0x82,1,0x2273,0x338,0x82,1,0x2276,0x338,0x82,1,0x2277,0x338,0x82,1, +0x227a,0x338,0x82,1,0x227b,0x338,0x82,1,0x2282,0x338,0x82,1,0x2283,0x338,0x82,1, +0x2286,0x338,0x82,1,0x2287,0x338,0x82,1,0x22a2,0x338,0x82,1,0x22a8,0x338,0x82,1, +0x22a9,0x338,0x82,1,0x22ab,0x338,0x82,1,0x227c,0x338,0x82,1,0x227d,0x338,0x82,1, +0x2291,0x338,0x82,1,0x2292,0x338,0x82,1,0x22b2,0x338,0x82,1,0x22b3,0x338,0x82,1, +0x22b4,0x338,0x82,1,0x22b5,0x338,0x82,8,0x304b,0x3099,0x82,8,0x304d,0x3099,0x82,8, +0x304f,0x3099,0x82,8,0x3051,0x3099,0x82,8,0x3053,0x3099,0x82,8,0x3055,0x3099,0x82,8, +0x3057,0x3099,0x82,8,0x3059,0x3099,0x82,8,0x305b,0x3099,0x82,8,0x305d,0x3099,0x82,8, +0x305f,0x3099,0x82,8,0x3061,0x3099,0x82,8,0x3064,0x3099,0x82,8,0x3066,0x3099,0x82,8, +0x3068,0x3099,0x82,8,0x306f,0x3099,0x82,8,0x306f,0x309a,0x82,8,0x3072,0x3099,0x82,8, +0x3072,0x309a,0x82,8,0x3075,0x3099,0x82,8,0x3075,0x309a,0x82,8,0x3078,0x3099,0x82,8, +0x3078,0x309a,0x82,8,0x307b,0x3099,0x82,8,0x307b,0x309a,0x82,8,0x3046,0x3099,0x82,8, +0x309d,0x3099,0x82,8,0x30ab,0x3099,0x82,8,0x30ad,0x3099,0x82,8,0x30af,0x3099,0x82,8, +0x30b1,0x3099,0x82,8,0x30b3,0x3099,0x82,8,0x30b5,0x3099,0x82,8,0x30b7,0x3099,0x82,8, +0x30b9,0x3099,0x82,8,0x30bb,0x3099,0x82,8,0x30bd,0x3099,0x82,8,0x30bf,0x3099,0x82,8, +0x30c1,0x3099,0x82,8,0x30c4,0x3099,0x82,8,0x30c6,0x3099,0x82,8,0x30c8,0x3099,0x82,8, +0x30cf,0x3099,0x82,8,0x30cf,0x309a,0x82,8,0x30d2,0x3099,0x82,8,0x30d2,0x309a,0x82,8, +0x30d5,0x3099,0x82,8,0x30d5,0x309a,0x82,8,0x30d8,0x3099,0x82,8,0x30d8,0x309a,0x82,8, +0x30db,0x3099,0x82,8,0x30db,0x309a,0x82,8,0x30a6,0x3099,0x82,8,0x30ef,0x3099,0x82,8, +0x30f0,0x3099,0x82,8,0x30f1,0x3099,0x82,8,0x30f2,0x3099,0x82,8,0x30fd,0x3099,0x7a6,0x7a7, +0x7a8,0x7a9,0x7ad,0x7ae,0x7b0,0x7aa,0x7d4,0x7ab,0x7b2,0x7b1,0x7b4,0x7b5,0x7d5,0x7d6,0x7b3,0x7ce, +0x7d3,0x7cd,0x7b6,0x7ac,0x7af,0x7d0,0x7d2,0x7d1,0x7cf,0x7d9,0x7d7,0x7d8,0x7b7,0x7b8,0x7b9,0x7ba, +0x7bb,0x7bc,0x7be,0x7bd,0x7bf,0x7c1,0x7c0,0x7c2,0x7c5,0x7c3,0x7c4,0x7c6,0x7c7,0x7c8,0x7c9,0x7ca, +0x7cb,0x7cc,0x7da,0x7db,0x100,0x20,0x2fc,0x8200,0xe6,0x20,0x308,0x100,0x61,0x8200,0xe6,0x20, +0x304,0x100,0x32,0x100,0x33,0x8200,0xe6,0x20,0x301,0x100,0x3bc,0x8200,0xca,0x20,0x327,0x100, +0x31,0x100,0x6f,0x300,0x31,0x2044,0x34,0x300,0x31,0x2044,0x32,0x300,0x33,0x2044,0x34,0x200, +0x49,0x4a,0x200,0x69,0x6a,0x200,0x4c,0xb7,0x200,0x6c,0xb7,0x200,0x2bc,0x6e,0x4e4,0x100, +0x73,0x8300,0xe6,0x44,0x5a,0x30c,0x8300,0xe6,0x44,0x7a,0x30c,0x8300,0xe6,0x64,0x7a,0x30c, +0x200,0x4c,0x4a,0x200,0x4c,0x6a,0x200,0x6c,0x6a,0x200,0x4e,0x4a,0x200,0x4e,0x6a,0x200, +0x6e,0x6a,0x200,0x44,0x5a,0x200,0x44,0x7a,0x200,0x64,0x7a,0x100,0x68,0x100,0x266,0x100, +0x6a,0x100,0x72,0x100,0x279,0x100,0x27b,0x100,0x281,0x100,0x77,0x100,0x79,0x8200,0xe6,0x20, +0x306,0x8200,0xe6,0x20,0x307,0x8200,0xe6,0x20,0x30a,0x8200,0xca,0x20,0x328,0x8200,0xe6,0x20, +0x303,0x8200,0xe6,0x20,0x30b,0x100,0x263,0x100,0x6c,0x100,0x73,0x100,0x78,0x100,0x295,0x8200, +0xe6,0x20,0x301,0x100,0x3b2,0x100,0x3b8,0x100,0x3c6,0x100,0x3c0,0x100,0x3ba,0x100,0x3c1,0x100, +0x398,0x100,0x3b5,0x200,0x565,0x582,0x200,0x627,0x674,0x200,0x648,0x674,0x200,0x6c7,0x674,0x200, +0x64a,0x674,0x200,0xe4d,0xe32,0x200,0xecd,0xeb2,0x200,0xeab,0xe99,0x200,0xeab,0xea1,0x100,0xf0b, +0x8300,0x82,0xfb2,0xf71,0xf80,0x8300,0x82,0xfb3,0xf71,0xf80,0x100,0x10dc,0x100,0x61,0x100,0x250, +0x100,0x251,0x100,0x1d02,0x100,0x62,0x100,0x64,0x100,0x65,0x100,0x259,0x100,0x25b,0x100,0x25c, +0x100,0x67,0x100,0x6b,0x100,0x6d,0x100,0x14b,0x100,0x6f,0x100,0x254,0x100,0x1d16,0x100,0x1d17, +0x100,0x70,0x100,0x74,0x100,0x75,0x100,0x1d1d,0x100,0x26f,0x100,0x76,0x100,0x1d25,0x100,0x3b2, +0x100,0x3b3,0x100,0x3b4,0x100,0x3c6,0x100,0x3c7,0x100,0x69,0x100,0x72,0x100,0x75,0x100,0x76, +0x100,0x3b2,0x100,0x3b3,0x100,0x3c1,0x100,0x3c6,0x100,0x3c7,0x100,0x43d,0x100,0x252,0x100,0x63, +0x100,0x255,0x100,0xf0,0x100,0x25c,0x100,0x66,0x100,0x25f,0x100,0x261,0x100,0x265,0x100,0x268, +0x100,0x269,0x100,0x26a,0x100,0x1d7b,0x100,0x29d,0x100,0x26d,0x100,0x1d85,0x100,0x29f,0x100,0x271, +0x100,0x270,0x100,0x272,0x100,0x273,0x100,0x274,0x100,0x275,0x100,0x278,0x100,0x282,0x100,0x283, +0x100,0x1ab,0x100,0x289,0x100,0x28a,0x100,0x1d1c,0x100,0x28b,0x100,0x28c,0x100,0x7a,0x100,0x290, +0x100,0x291,0x100,0x292,0x100,0x3b8,0x200,0x61,0x2be,0x8200,0xe6,0x20,0x313,0x65c,0x8200,0xe6, +0x20,0x313,0x8200,0xe6,0x20,0x342,0x662,0x8200,0xe6,0x20,0x314,0x100,0x20,0x100,0x20,0x100, +0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x20,0x100,0x2010,0x8200, +0xdc,0x20,0x333,0x100,0x2e,0x200,0x2e,0x2e,0x300,0x2e,0x2e,0x2e,0x100,0x20,0x200,0x2032, +0x2032,0x300,0x2032,0x2032,0x2032,0x200,0x2035,0x2035,0x300,0x2035,0x2035,0x2035,0x200,0x21,0x21,0x8200, +0xe6,0x20,0x305,0x200,0x3f,0x3f,0x200,0x3f,0x21,0x200,0x21,0x3f,0x400,0x2032,0x2032,0x2032, +0x2032,0x100,0x20,0x100,0x30,0x100,0x69,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100, +0x38,0x100,0x39,0x100,0x2b,0x100,0x2212,0x100,0x3d,0x100,0x28,0x100,0x29,0x100,0x6e,0x100, +0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100, +0x38,0x100,0x39,0x100,0x2b,0x100,0x2212,0x100,0x3d,0x100,0x28,0x100,0x29,0x100,0x61,0x100, +0x65,0x100,0x6f,0x100,0x78,0x100,0x259,0x300,0x61,0x2f,0x63,0x300,0x61,0x2f,0x73,0x300, +0x63,0x2f,0x6f,0x300,0x63,0x2f,0x75,0x100,0x67,0x100,0x68,0x100,0x127,0x100,0x6c,0x100, +0x65,0x100,0x6f,0x100,0x5d0,0x100,0x5d1,0x100,0x5d2,0x100,0x5d3,0x100,0x69,0x100,0x3c0,0x100, +0x3b3,0x100,0x2211,0x100,0x64,0x100,0x65,0x100,0x69,0x100,0x6a,0x300,0x31,0x2044,0x33,0x300, +0x32,0x2044,0x33,0x300,0x31,0x2044,0x35,0x300,0x32,0x2044,0x35,0x300,0x33,0x2044,0x35,0x300, +0x34,0x2044,0x35,0x300,0x31,0x2044,0x36,0x300,0x35,0x2044,0x36,0x300,0x31,0x2044,0x38,0x300, +0x33,0x2044,0x38,0x300,0x35,0x2044,0x38,0x300,0x37,0x2044,0x38,0x200,0x31,0x2044,0x100,0x49, +0x200,0x49,0x49,0x300,0x49,0x49,0x49,0x200,0x49,0x56,0x100,0x56,0x200,0x56,0x49,0x300, +0x56,0x49,0x49,0x400,0x56,0x49,0x49,0x49,0x200,0x49,0x58,0x100,0x58,0x200,0x58,0x49, +0x300,0x58,0x49,0x49,0x100,0x4c,0x100,0x43,0x100,0x44,0x100,0x4d,0x100,0x69,0x200,0x69, +0x69,0x300,0x69,0x69,0x69,0x200,0x69,0x76,0x100,0x76,0x200,0x76,0x69,0x300,0x76,0x69, +0x69,0x400,0x76,0x69,0x69,0x69,0x200,0x69,0x78,0x100,0x78,0x200,0x78,0x69,0x300,0x78, +0x69,0x69,0x100,0x6c,0x100,0x63,0x100,0x64,0x100,0x6d,0x200,0x222b,0x222b,0x300,0x222b,0x222b, +0x222b,0x200,0x222e,0x222e,0x300,0x222e,0x222e,0x222e,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34, +0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x200,0x31,0x30,0x200,0x31,0x31, +0x200,0x31,0x32,0x200,0x31,0x33,0x200,0x31,0x34,0x200,0x31,0x35,0x200,0x31,0x36,0x200, +0x31,0x37,0x200,0x31,0x38,0x200,0x31,0x39,0x200,0x32,0x30,0x300,0x28,0x31,0x29,0x300, +0x28,0x32,0x29,0x300,0x28,0x33,0x29,0x300,0x28,0x34,0x29,0x300,0x28,0x35,0x29,0x300, +0x28,0x36,0x29,0x300,0x28,0x37,0x29,0x300,0x28,0x38,0x29,0x300,0x28,0x39,0x29,0x400, +0x28,0x31,0x30,0x29,0x400,0x28,0x31,0x31,0x29,0x400,0x28,0x31,0x32,0x29,0x400,0x28, +0x31,0x33,0x29,0x400,0x28,0x31,0x34,0x29,0x400,0x28,0x31,0x35,0x29,0x400,0x28,0x31, +0x36,0x29,0x400,0x28,0x31,0x37,0x29,0x400,0x28,0x31,0x38,0x29,0x400,0x28,0x31,0x39, +0x29,0x400,0x28,0x32,0x30,0x29,0x200,0x31,0x2e,0x200,0x32,0x2e,0x200,0x33,0x2e,0x200, +0x34,0x2e,0x200,0x35,0x2e,0x200,0x36,0x2e,0x200,0x37,0x2e,0x200,0x38,0x2e,0x200,0x39, +0x2e,0x300,0x31,0x30,0x2e,0x300,0x31,0x31,0x2e,0x300,0x31,0x32,0x2e,0x300,0x31,0x33, +0x2e,0x300,0x31,0x34,0x2e,0x300,0x31,0x35,0x2e,0x300,0x31,0x36,0x2e,0x300,0x31,0x37, +0x2e,0x300,0x31,0x38,0x2e,0x300,0x31,0x39,0x2e,0x300,0x32,0x30,0x2e,0x300,0x28,0x61, +0x29,0x300,0x28,0x62,0x29,0x300,0x28,0x63,0x29,0x300,0x28,0x64,0x29,0x300,0x28,0x65, +0x29,0x300,0x28,0x66,0x29,0x300,0x28,0x67,0x29,0x300,0x28,0x68,0x29,0x300,0x28,0x69, +0x29,0x300,0x28,0x6a,0x29,0x300,0x28,0x6b,0x29,0x300,0x28,0x6c,0x29,0x300,0x28,0x6d, +0x29,0x300,0x28,0x6e,0x29,0x300,0x28,0x6f,0x29,0x300,0x28,0x70,0x29,0x300,0x28,0x71, +0x29,0x300,0x28,0x72,0x29,0x300,0x28,0x73,0x29,0x300,0x28,0x74,0x29,0x300,0x28,0x75, +0x29,0x300,0x28,0x76,0x29,0x300,0x28,0x77,0x29,0x300,0x28,0x78,0x29,0x300,0x28,0x79, +0x29,0x300,0x28,0x7a,0x29,0x100,0x41,0x100,0x42,0x100,0x43,0x100,0x44,0x100,0x45,0x100, 0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100,0x4b,0x100,0x4c,0x100,0x4d,0x100, 0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100,0x53,0x100,0x54,0x100,0x55,0x100, -0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x5b,0x100,0x5c,0x100,0x5d,0x100, -0x5e,0x100,0x5f,0x100,0x60,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100, -0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100, -0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100, -0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x7b,0x100,0x7c,0x100,0x7d,0x100, -0x7e,0x100,0x2985,0x100,0x2986,0x100,0x3002,0x100,0x300c,0x100,0x300d,0x100,0x3001,0x100,0x30fb,0x100, -0x30f2,0x100,0x30a1,0x100,0x30a3,0x100,0x30a5,0x100,0x30a7,0x100,0x30a9,0x100,0x30e3,0x100,0x30e5,0x100, -0x30e7,0x100,0x30c3,0x100,0x30fc,0x100,0x30a2,0x100,0x30a4,0x100,0x30a6,0x100,0x30a8,0x100,0x30aa,0x100, -0x30ab,0x100,0x30ad,0x100,0x30af,0x100,0x30b1,0x100,0x30b3,0x100,0x30b5,0x100,0x30b7,0x100,0x30b9,0x100, -0x30bb,0x100,0x30bd,0x100,0x30bf,0x100,0x30c1,0x100,0x30c4,0x100,0x30c6,0x100,0x30c8,0x100,0x30ca,0x100, -0x30cb,0x100,0x30cc,0x100,0x30cd,0x100,0x30ce,0x100,0x30cf,0x100,0x30d2,0x100,0x30d5,0x100,0x30d8,0x100, -0x30db,0x100,0x30de,0x100,0x30df,0x100,0x30e0,0x100,0x30e1,0x100,0x30e2,0x100,0x30e4,0x100,0x30e6,0x100, -0x30e8,0x100,0x30e9,0x100,0x30ea,0x100,0x30eb,0x100,0x30ec,0x100,0x30ed,0x100,0x30ef,0x100,0x30f3,0x8100, -0x808,0x3099,0x8100,0x808,0x309a,0x100,0x1160,0x100,0x1100,0x100,0x1101,0x100,0x11aa,0x100,0x1102,0x100, -0x11ac,0x100,0x11ad,0x100,0x1103,0x100,0x1104,0x100,0x1105,0x100,0x11b0,0x100,0x11b1,0x100,0x11b2,0x100, -0x11b3,0x100,0x11b4,0x100,0x11b5,0x100,0x111a,0x100,0x1106,0x100,0x1107,0x100,0x1108,0x100,0x1121,0x100, -0x1109,0x100,0x110a,0x100,0x110b,0x100,0x110c,0x100,0x110d,0x100,0x110e,0x100,0x110f,0x100,0x1110,0x100, -0x1111,0x100,0x1112,0x100,0x1161,0x100,0x1162,0x100,0x1163,0x100,0x1164,0x100,0x1165,0x100,0x1166,0x100, -0x1167,0x100,0x1168,0x100,0x1169,0x100,0x116a,0x100,0x116b,0x100,0x116c,0x100,0x116d,0x100,0x116e,0x100, -0x116f,0x100,0x1170,0x100,0x1171,0x100,0x1172,0x100,0x1173,0x100,0x1174,0x100,0x1175,0x100,0xa2,0x100, -0xa3,0x100,0xac,0x8200,0xe6,0x20,0x304,0x100,0xa6,0x100,0xa5,0x100,0x20a9,0x100,0x2502,0x100, -0x2190,0x100,0x2191,0x100,0x2192,0x100,0x2193,0x100,0x25a0,0x100,0x25cb,0x100,0x61,0x100,0x62,0x100, +0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100,0x61,0x100,0x62,0x100,0x63,0x100, +0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100, +0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100, +0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x30,0x400, +0x222b,0x222b,0x222b,0x222b,0x300,0x3a,0x3a,0x3d,0x200,0x3d,0x3d,0x300,0x3d,0x3d,0x3d,0x100, +0x2d61,0x100,0x6bcd,0x100,0x9f9f,0x100,0x4e00,0x100,0x4e28,0x100,0x4e36,0x100,0x4e3f,0x100,0x4e59,0x100, +0x4e85,0x100,0x4e8c,0x100,0x4ea0,0x100,0x4eba,0x100,0x513f,0x100,0x5165,0x100,0x516b,0x100,0x5182,0x100, +0x5196,0x100,0x51ab,0x100,0x51e0,0x100,0x51f5,0x100,0x5200,0x100,0x529b,0x100,0x52f9,0x100,0x5315,0x100, +0x531a,0x100,0x5338,0x100,0x5341,0x100,0x535c,0x100,0x5369,0x100,0x5382,0x100,0x53b6,0x100,0x53c8,0x100, +0x53e3,0x100,0x56d7,0x100,0x571f,0x100,0x58eb,0x100,0x5902,0x100,0x590a,0x100,0x5915,0x100,0x5927,0x100, +0x5973,0x100,0x5b50,0x100,0x5b80,0x100,0x5bf8,0x100,0x5c0f,0x100,0x5c22,0x100,0x5c38,0x100,0x5c6e,0x100, +0x5c71,0x100,0x5ddb,0x100,0x5de5,0x100,0x5df1,0x100,0x5dfe,0x100,0x5e72,0x100,0x5e7a,0x100,0x5e7f,0x100, +0x5ef4,0x100,0x5efe,0x100,0x5f0b,0x100,0x5f13,0x100,0x5f50,0x100,0x5f61,0x100,0x5f73,0x100,0x5fc3,0x100, +0x6208,0x100,0x6236,0x100,0x624b,0x100,0x652f,0x100,0x6534,0x100,0x6587,0x100,0x6597,0x100,0x65a4,0x100, +0x65b9,0x100,0x65e0,0x100,0x65e5,0x100,0x66f0,0x100,0x6708,0x100,0x6728,0x100,0x6b20,0x100,0x6b62,0x100, +0x6b79,0x100,0x6bb3,0x100,0x6bcb,0x100,0x6bd4,0x100,0x6bdb,0x100,0x6c0f,0x100,0x6c14,0x100,0x6c34,0x100, +0x706b,0x100,0x722a,0x100,0x7236,0x100,0x723b,0x100,0x723f,0x100,0x7247,0x100,0x7259,0x100,0x725b,0x100, +0x72ac,0x100,0x7384,0x100,0x7389,0x100,0x74dc,0x100,0x74e6,0x100,0x7518,0x100,0x751f,0x100,0x7528,0x100, +0x7530,0x100,0x758b,0x100,0x7592,0x100,0x7676,0x100,0x767d,0x100,0x76ae,0x100,0x76bf,0x100,0x76ee,0x100, +0x77db,0x100,0x77e2,0x100,0x77f3,0x100,0x793a,0x100,0x79b8,0x100,0x79be,0x100,0x7a74,0x100,0x7acb,0x100, +0x7af9,0x100,0x7c73,0x100,0x7cf8,0x100,0x7f36,0x100,0x7f51,0x100,0x7f8a,0x100,0x7fbd,0x100,0x8001,0x100, +0x800c,0x100,0x8012,0x100,0x8033,0x100,0x807f,0x100,0x8089,0x100,0x81e3,0x100,0x81ea,0x100,0x81f3,0x100, +0x81fc,0x100,0x820c,0x100,0x821b,0x100,0x821f,0x100,0x826e,0x100,0x8272,0x100,0x8278,0x100,0x864d,0x100, +0x866b,0x100,0x8840,0x100,0x884c,0x100,0x8863,0x100,0x897e,0x100,0x898b,0x100,0x89d2,0x100,0x8a00,0x100, +0x8c37,0x100,0x8c46,0x100,0x8c55,0x100,0x8c78,0x100,0x8c9d,0x100,0x8d64,0x100,0x8d70,0x100,0x8db3,0x100, +0x8eab,0x100,0x8eca,0x100,0x8f9b,0x100,0x8fb0,0x100,0x8fb5,0x100,0x9091,0x100,0x9149,0x100,0x91c6,0x100, +0x91cc,0x100,0x91d1,0x100,0x9577,0x100,0x9580,0x100,0x961c,0x100,0x96b6,0x100,0x96b9,0x100,0x96e8,0x100, +0x9751,0x100,0x975e,0x100,0x9762,0x100,0x9769,0x100,0x97cb,0x100,0x97ed,0x100,0x97f3,0x100,0x9801,0x100, +0x98a8,0x100,0x98db,0x100,0x98df,0x100,0x9996,0x100,0x9999,0x100,0x99ac,0x100,0x9aa8,0x100,0x9ad8,0x100, +0x9adf,0x100,0x9b25,0x100,0x9b2f,0x100,0x9b32,0x100,0x9b3c,0x100,0x9b5a,0x100,0x9ce5,0x100,0x9e75,0x100, +0x9e7f,0x100,0x9ea5,0x100,0x9ebb,0x100,0x9ec3,0x100,0x9ecd,0x100,0x9ed1,0x100,0x9ef9,0x100,0x9efd,0x100, +0x9f0e,0x100,0x9f13,0x100,0x9f20,0x100,0x9f3b,0x100,0x9f4a,0x100,0x9f52,0x100,0x9f8d,0x100,0x9f9c,0x100, +0x9fa0,0x100,0x20,0x100,0x3012,0x100,0x5341,0x100,0x5344,0x100,0x5345,0x8200,8,0x20,0x3099,0x8200, +8,0x20,0x309a,0x200,0x3088,0x308a,0x200,0x30b3,0x30c8,0x100,0x1100,0x100,0x1101,0x100,0x11aa,0x100, +0x1102,0x100,0x11ac,0x100,0x11ad,0x100,0x1103,0x100,0x1104,0x100,0x1105,0x100,0x11b0,0x100,0x11b1,0x100, +0x11b2,0x100,0x11b3,0x100,0x11b4,0x100,0x11b5,0x100,0x111a,0x100,0x1106,0x100,0x1107,0x100,0x1108,0x100, +0x1121,0x100,0x1109,0x100,0x110a,0x100,0x110b,0x100,0x110c,0x100,0x110d,0x100,0x110e,0x100,0x110f,0x100, +0x1110,0x100,0x1111,0x100,0x1112,0x100,0x1161,0x100,0x1162,0x100,0x1163,0x100,0x1164,0x100,0x1165,0x100, +0x1166,0x100,0x1167,0x100,0x1168,0x100,0x1169,0x100,0x116a,0x100,0x116b,0x100,0x116c,0x100,0x116d,0x100, +0x116e,0x100,0x116f,0x100,0x1170,0x100,0x1171,0x100,0x1172,0x100,0x1173,0x100,0x1174,0x100,0x1175,0x100, +0x1160,0x100,0x1114,0x100,0x1115,0x100,0x11c7,0x100,0x11c8,0x100,0x11cc,0x100,0x11ce,0x100,0x11d3,0x100, +0x11d7,0x100,0x11d9,0x100,0x111c,0x100,0x11dd,0x100,0x11df,0x100,0x111d,0x100,0x111e,0x100,0x1120,0x100, +0x1122,0x100,0x1123,0x100,0x1127,0x100,0x1129,0x100,0x112b,0x100,0x112c,0x100,0x112d,0x100,0x112e,0x100, +0x112f,0x100,0x1132,0x100,0x1136,0x100,0x1140,0x100,0x1147,0x100,0x114c,0x100,0x11f1,0x100,0x11f2,0x100, +0x1157,0x100,0x1158,0x100,0x1159,0x100,0x1184,0x100,0x1185,0x100,0x1188,0x100,0x1191,0x100,0x1192,0x100, +0x1194,0x100,0x119e,0x100,0x11a1,0x100,0x4e00,0x100,0x4e8c,0x100,0x4e09,0x100,0x56db,0x100,0x4e0a,0x100, +0x4e2d,0x100,0x4e0b,0x100,0x7532,0x100,0x4e59,0x100,0x4e19,0x100,0x4e01,0x100,0x5929,0x100,0x5730,0x100, +0x4eba,0x300,0x28,0x1100,0x29,0x300,0x28,0x1102,0x29,0x300,0x28,0x1103,0x29,0x300,0x28,0x1105, +0x29,0x300,0x28,0x1106,0x29,0x300,0x28,0x1107,0x29,0x300,0x28,0x1109,0x29,0x300,0x28,0x110b, +0x29,0x300,0x28,0x110c,0x29,0x300,0x28,0x110e,0x29,0x300,0x28,0x110f,0x29,0x300,0x28,0x1110, +0x29,0x300,0x28,0x1111,0x29,0x300,0x28,0x1112,0x29,0x400,0x28,0x1100,0x1161,0x29,0x400,0x28, +0x1102,0x1161,0x29,0x400,0x28,0x1103,0x1161,0x29,0x400,0x28,0x1105,0x1161,0x29,0x400,0x28,0x1106, +0x1161,0x29,0x400,0x28,0x1107,0x1161,0x29,0x400,0x28,0x1109,0x1161,0x29,0x400,0x28,0x110b,0x1161, +0x29,0x400,0x28,0x110c,0x1161,0x29,0x400,0x28,0x110e,0x1161,0x29,0x400,0x28,0x110f,0x1161,0x29, +0x400,0x28,0x1110,0x1161,0x29,0x400,0x28,0x1111,0x1161,0x29,0x400,0x28,0x1112,0x1161,0x29,0x400, +0x28,0x110c,0x116e,0x29,0x700,0x28,0x110b,0x1169,0x110c,0x1165,0x11ab,0x29,0x600,0x28,0x110b,0x1169, +0x1112,0x116e,0x29,0x300,0x28,0x4e00,0x29,0x300,0x28,0x4e8c,0x29,0x300,0x28,0x4e09,0x29,0x300, +0x28,0x56db,0x29,0x300,0x28,0x4e94,0x29,0x300,0x28,0x516d,0x29,0x300,0x28,0x4e03,0x29,0x300, +0x28,0x516b,0x29,0x300,0x28,0x4e5d,0x29,0x300,0x28,0x5341,0x29,0x300,0x28,0x6708,0x29,0x300, +0x28,0x706b,0x29,0x300,0x28,0x6c34,0x29,0x300,0x28,0x6728,0x29,0x300,0x28,0x91d1,0x29,0x300, +0x28,0x571f,0x29,0x300,0x28,0x65e5,0x29,0x300,0x28,0x682a,0x29,0x300,0x28,0x6709,0x29,0x300, +0x28,0x793e,0x29,0x300,0x28,0x540d,0x29,0x300,0x28,0x7279,0x29,0x300,0x28,0x8ca1,0x29,0x300, +0x28,0x795d,0x29,0x300,0x28,0x52b4,0x29,0x300,0x28,0x4ee3,0x29,0x300,0x28,0x547c,0x29,0x300, +0x28,0x5b66,0x29,0x300,0x28,0x76e3,0x29,0x300,0x28,0x4f01,0x29,0x300,0x28,0x8cc7,0x29,0x300, +0x28,0x5354,0x29,0x300,0x28,0x796d,0x29,0x300,0x28,0x4f11,0x29,0x300,0x28,0x81ea,0x29,0x300, +0x28,0x81f3,0x29,0x200,0x32,0x31,0x200,0x32,0x32,0x200,0x32,0x33,0x200,0x32,0x34,0x200, +0x32,0x35,0x200,0x32,0x36,0x200,0x32,0x37,0x200,0x32,0x38,0x200,0x32,0x39,0x200,0x33, +0x30,0x200,0x33,0x31,0x200,0x33,0x32,0x200,0x33,0x33,0x200,0x33,0x34,0x200,0x33,0x35, +0x100,0x1100,0x100,0x1102,0x100,0x1103,0x100,0x1105,0x100,0x1106,0x100,0x1107,0x100,0x1109,0x100,0x110b, +0x100,0x110c,0x100,0x110e,0x100,0x110f,0x100,0x1110,0x100,0x1111,0x100,0x1112,0x200,0x1100,0x1161,0x200, +0x1102,0x1161,0x200,0x1103,0x1161,0x200,0x1105,0x1161,0x200,0x1106,0x1161,0x200,0x1107,0x1161,0x200,0x1109, +0x1161,0x200,0x110b,0x1161,0x200,0x110c,0x1161,0x200,0x110e,0x1161,0x200,0x110f,0x1161,0x200,0x1110,0x1161, +0x200,0x1111,0x1161,0x200,0x1112,0x1161,0x500,0x110e,0x1161,0x11b7,0x1100,0x1169,0x400,0x110c,0x116e,0x110b, +0x1174,0x200,0x110b,0x116e,0x100,0x4e00,0x100,0x4e8c,0x100,0x4e09,0x100,0x56db,0x100,0x4e94,0x100,0x516d, +0x100,0x4e03,0x100,0x516b,0x100,0x4e5d,0x100,0x5341,0x100,0x6708,0x100,0x706b,0x100,0x6c34,0x100,0x6728, +0x100,0x91d1,0x100,0x571f,0x100,0x65e5,0x100,0x682a,0x100,0x6709,0x100,0x793e,0x100,0x540d,0x100,0x7279, +0x100,0x8ca1,0x100,0x795d,0x100,0x52b4,0x100,0x79d8,0x100,0x7537,0x100,0x5973,0x100,0x9069,0x100,0x512a, +0x100,0x5370,0x100,0x6ce8,0x100,0x9805,0x100,0x4f11,0x100,0x5199,0x100,0x6b63,0x100,0x4e0a,0x100,0x4e2d, +0x100,0x4e0b,0x100,0x5de6,0x100,0x53f3,0x100,0x533b,0x100,0x5b97,0x100,0x5b66,0x100,0x76e3,0x100,0x4f01, +0x100,0x8cc7,0x100,0x5354,0x100,0x591c,0x200,0x33,0x36,0x200,0x33,0x37,0x200,0x33,0x38,0x200, +0x33,0x39,0x200,0x34,0x30,0x200,0x34,0x31,0x200,0x34,0x32,0x200,0x34,0x33,0x200,0x34, +0x34,0x200,0x34,0x35,0x200,0x34,0x36,0x200,0x34,0x37,0x200,0x34,0x38,0x200,0x34,0x39, +0x200,0x35,0x30,0x200,0x31,0x6708,0x200,0x32,0x6708,0x200,0x33,0x6708,0x200,0x34,0x6708,0x200, +0x35,0x6708,0x200,0x36,0x6708,0x200,0x37,0x6708,0x200,0x38,0x6708,0x200,0x39,0x6708,0x300,0x31, +0x30,0x6708,0x300,0x31,0x31,0x6708,0x300,0x31,0x32,0x6708,0x300,0x65,0x72,0x67,0x100,0x30a2, +0x100,0x30a4,0x100,0x30a6,0x100,0x30a8,0x100,0x30aa,0x100,0x30ab,0x100,0x30ad,0x100,0x30af,0x100,0x30b1, +0x100,0x30b3,0x100,0x30b5,0x100,0x30b7,0x100,0x30b9,0x100,0x30bb,0x100,0x30bd,0x100,0x30bf,0x100,0x30c1, +0x100,0x30c4,0x100,0x30c6,0x100,0x30c8,0x100,0x30ca,0x100,0x30cb,0x100,0x30cc,0x100,0x30cd,0x100,0x30ce, +0x100,0x30cf,0x100,0x30d2,0x100,0x30d5,0x100,0x30d8,0x100,0x30db,0x100,0x30de,0x100,0x30df,0x100,0x30e0, +0x100,0x30e1,0x100,0x30e2,0x100,0x30e4,0x100,0x30e6,0x100,0x30e8,0x100,0x30e9,0x100,0x30ea,0x100,0x30eb, +0x100,0x30ec,0x100,0x30ed,0x100,0x30ef,0x100,0x30f0,0x100,0x30f1,0x100,0x30f2,0x500,0x30a2,0x30cf,0x309a, +0x30fc,0x30c8,0x400,0x30a2,0x30eb,0x30d5,0x30a1,0x500,0x30a2,0x30f3,0x30d8,0x309a,0x30a2,0x300,0x30a2,0x30fc, +0x30eb,0x8500,8,0x30a4,0x30cb,0x30f3,0x30af,0x3099,0x300,0x30a4,0x30f3,0x30c1,0x300,0x30a6,0x30a9,0x30f3, +0x8600,8,0x30a8,0x30b9,0x30af,0x30fc,0x30c8,0x3099,0x400,0x30a8,0x30fc,0x30ab,0x30fc,0x300,0x30aa,0x30f3, +0x30b9,0x300,0x30aa,0x30fc,0x30e0,0x300,0x30ab,0x30a4,0x30ea,0x400,0x30ab,0x30e9,0x30c3,0x30c8,0x400,0x30ab, +0x30ed,0x30ea,0x30fc,0x400,0x30ab,0x3099,0x30ed,0x30f3,0x400,0x30ab,0x3099,0x30f3,0x30de,0x8400,8,0x30ad, +0x3099,0x30ab,0x3099,0x400,0x30ad,0x3099,0x30cb,0x30fc,0x400,0x30ad,0x30e5,0x30ea,0x30fc,0x600,0x30ad,0x3099, +0x30eb,0x30bf,0x3099,0x30fc,0x200,0x30ad,0x30ed,0x600,0x30ad,0x30ed,0x30af,0x3099,0x30e9,0x30e0,0x600,0x30ad, +0x30ed,0x30e1,0x30fc,0x30c8,0x30eb,0x500,0x30ad,0x30ed,0x30ef,0x30c3,0x30c8,0x400,0x30af,0x3099,0x30e9,0x30e0, +0x600,0x30af,0x3099,0x30e9,0x30e0,0x30c8,0x30f3,0x600,0x30af,0x30eb,0x30bb,0x3099,0x30a4,0x30ed,0x400,0x30af, +0x30ed,0x30fc,0x30cd,0x300,0x30b1,0x30fc,0x30b9,0x300,0x30b3,0x30eb,0x30ca,0x8400,8,0x30b3,0x30fc,0x30db, +0x309a,0x400,0x30b5,0x30a4,0x30af,0x30eb,0x500,0x30b5,0x30f3,0x30c1,0x30fc,0x30e0,0x8500,8,0x30b7,0x30ea, +0x30f3,0x30af,0x3099,0x300,0x30bb,0x30f3,0x30c1,0x300,0x30bb,0x30f3,0x30c8,0x400,0x30bf,0x3099,0x30fc,0x30b9, +0x300,0x30c6,0x3099,0x30b7,0x300,0x30c8,0x3099,0x30eb,0x200,0x30c8,0x30f3,0x200,0x30ca,0x30ce,0x300,0x30ce, +0x30c3,0x30c8,0x300,0x30cf,0x30a4,0x30c4,0x600,0x30cf,0x309a,0x30fc,0x30bb,0x30f3,0x30c8,0x400,0x30cf,0x309a, +0x30fc,0x30c4,0x500,0x30cf,0x3099,0x30fc,0x30ec,0x30eb,0x600,0x30d2,0x309a,0x30a2,0x30b9,0x30c8,0x30eb,0x400, +0x30d2,0x309a,0x30af,0x30eb,0x300,0x30d2,0x309a,0x30b3,0x300,0x30d2,0x3099,0x30eb,0x8600,8,0x30d5,0x30a1, +0x30e9,0x30c3,0x30c8,0x3099,0x400,0x30d5,0x30a3,0x30fc,0x30c8,0x600,0x30d5,0x3099,0x30c3,0x30b7,0x30a7,0x30eb, +0x300,0x30d5,0x30e9,0x30f3,0x500,0x30d8,0x30af,0x30bf,0x30fc,0x30eb,0x300,0x30d8,0x309a,0x30bd,0x400,0x30d8, +0x309a,0x30cb,0x30d2,0x300,0x30d8,0x30eb,0x30c4,0x400,0x30d8,0x309a,0x30f3,0x30b9,0x8500,8,0x30d8,0x309a, +0x30fc,0x30b7,0x3099,0x400,0x30d8,0x3099,0x30fc,0x30bf,0x500,0x30db,0x309a,0x30a4,0x30f3,0x30c8,0x400,0x30db, +0x3099,0x30eb,0x30c8,0x200,0x30db,0x30f3,0x8500,8,0x30db,0x309a,0x30f3,0x30c8,0x3099,0x300,0x30db,0x30fc, +0x30eb,0x300,0x30db,0x30fc,0x30f3,0x400,0x30de,0x30a4,0x30af,0x30ed,0x300,0x30de,0x30a4,0x30eb,0x300,0x30de, +0x30c3,0x30cf,0x300,0x30de,0x30eb,0x30af,0x500,0x30de,0x30f3,0x30b7,0x30e7,0x30f3,0x400,0x30df,0x30af,0x30ed, +0x30f3,0x200,0x30df,0x30ea,0x600,0x30df,0x30ea,0x30cf,0x3099,0x30fc,0x30eb,0x8300,8,0x30e1,0x30ab,0x3099, +0x500,0x30e1,0x30ab,0x3099,0x30c8,0x30f3,0x400,0x30e1,0x30fc,0x30c8,0x30eb,0x8400,8,0x30e4,0x30fc,0x30c8, +0x3099,0x300,0x30e4,0x30fc,0x30eb,0x300,0x30e6,0x30a2,0x30f3,0x400,0x30ea,0x30c3,0x30c8,0x30eb,0x200,0x30ea, +0x30e9,0x400,0x30eb,0x30d2,0x309a,0x30fc,0x500,0x30eb,0x30fc,0x30d5,0x3099,0x30eb,0x200,0x30ec,0x30e0,0x600, +0x30ec,0x30f3,0x30c8,0x30b1,0x3099,0x30f3,0x300,0x30ef,0x30c3,0x30c8,0x200,0x30,0x70b9,0x200,0x31,0x70b9, +0x200,0x32,0x70b9,0x200,0x33,0x70b9,0x200,0x34,0x70b9,0x200,0x35,0x70b9,0x200,0x36,0x70b9,0x200, +0x37,0x70b9,0x200,0x38,0x70b9,0x200,0x39,0x70b9,0x300,0x31,0x30,0x70b9,0x300,0x31,0x31,0x70b9, +0x300,0x31,0x32,0x70b9,0x300,0x31,0x33,0x70b9,0x300,0x31,0x34,0x70b9,0x300,0x31,0x35,0x70b9, +0x300,0x31,0x36,0x70b9,0x300,0x31,0x37,0x70b9,0x300,0x31,0x38,0x70b9,0x300,0x31,0x39,0x70b9, +0x300,0x32,0x30,0x70b9,0x300,0x32,0x31,0x70b9,0x300,0x32,0x32,0x70b9,0x300,0x32,0x33,0x70b9, +0x300,0x32,0x34,0x70b9,0x200,0x64,0x61,0x300,0x62,0x61,0x72,0x200,0x70,0x63,0x200,0x64, +0x6d,0x300,0x64,0x6d,0x32,0x300,0x64,0x6d,0x33,0x200,0x5e73,0x6210,0x200,0x662d,0x548c,0x200, +0x5927,0x6b63,0x200,0x660e,0x6cbb,0x400,0x682a,0x5f0f,0x4f1a,0x793e,0x300,0x63,0x61,0x6c,0x400,0x6b, +0x63,0x61,0x6c,0x200,0x3bc,0x67,0x200,0x6d,0x67,0x200,0x6b,0x67,0x200,0x3bc,0x6c,0x200, +0x6d,0x6c,0x200,0x64,0x6c,0x200,0x6b,0x6c,0x200,0x66,0x6d,0x200,0x6e,0x6d,0x200,0x3bc, +0x6d,0x200,0x6d,0x6d,0x200,0x63,0x6d,0x200,0x6b,0x6d,0x300,0x6d,0x6d,0x32,0x300,0x63, +0x6d,0x32,0x200,0x6d,0x32,0x300,0x6b,0x6d,0x32,0x300,0x6d,0x6d,0x33,0x300,0x63,0x6d, +0x33,0x200,0x6d,0x33,0x300,0x6b,0x6d,0x33,0x300,0x6d,0x2215,0x73,0x400,0x6d,0x2215,0x73, +0x32,0x300,0x72,0x61,0x64,0x500,0x72,0x61,0x64,0x2215,0x73,0x600,0x72,0x61,0x64,0x2215, +0x73,0x32,0x200,0x70,0x73,0x200,0x6e,0x73,0x200,0x3bc,0x73,0x200,0x6d,0x73,0x400,0x61, +0x2e,0x6d,0x2e,0x200,0x63,0x63,0x200,0x63,0x64,0x200,0x68,0x61,0x200,0x69,0x6e,0x200, +0x6b,0x74,0x200,0x6c,0x6d,0x200,0x6c,0x6e,0x300,0x6c,0x6f,0x67,0x200,0x6c,0x78,0x200, +0x6d,0x62,0x300,0x6d,0x69,0x6c,0x300,0x6d,0x6f,0x6c,0x400,0x70,0x2e,0x6d,0x2e,0x200, +0x73,0x72,0x200,0x31,0x65e5,0x200,0x32,0x65e5,0x200,0x33,0x65e5,0x200,0x34,0x65e5,0x200,0x35, +0x65e5,0x200,0x36,0x65e5,0x200,0x37,0x65e5,0x200,0x38,0x65e5,0x200,0x39,0x65e5,0x300,0x31,0x30, +0x65e5,0x300,0x31,0x31,0x65e5,0x300,0x31,0x32,0x65e5,0x300,0x31,0x33,0x65e5,0x300,0x31,0x34, +0x65e5,0x300,0x31,0x35,0x65e5,0x300,0x31,0x36,0x65e5,0x300,0x31,0x37,0x65e5,0x300,0x31,0x38, +0x65e5,0x300,0x31,0x39,0x65e5,0x300,0x32,0x30,0x65e5,0x300,0x32,0x31,0x65e5,0x300,0x32,0x32, +0x65e5,0x300,0x32,0x33,0x65e5,0x300,0x32,0x34,0x65e5,0x300,0x32,0x35,0x65e5,0x300,0x32,0x36, +0x65e5,0x300,0x32,0x37,0x65e5,0x300,0x32,0x38,0x65e5,0x300,0x32,0x39,0x65e5,0x300,0x33,0x30, +0x65e5,0x300,0x33,0x31,0x65e5,0x300,0x67,0x61,0x6c,0x200,0x66,0x66,0x200,0x66,0x69,0x200, +0x66,0x6c,0x300,0x66,0x66,0x69,0x300,0x66,0x66,0x6c,0x200,0x73,0x74,0x200,0x73,0x74, +0x200,0x574,0x576,0x200,0x574,0x565,0x200,0x574,0x56b,0x200,0x57e,0x576,0x200,0x574,0x56d,0x100, +0x5e2,0x100,0x5d0,0x100,0x5d3,0x100,0x5d4,0x100,0x5db,0x100,0x5dc,0x100,0x5dd,0x100,0x5e8,0x100, +0x5ea,0x100,0x2b,0x200,0x5d0,0x5dc,0x100,0x671,0x100,0x671,0x100,0x67b,0x100,0x67b,0x100,0x67b, +0x100,0x67b,0x100,0x67e,0x100,0x67e,0x100,0x67e,0x100,0x67e,0x100,0x680,0x100,0x680,0x100,0x680, +0x100,0x680,0x100,0x67a,0x100,0x67a,0x100,0x67a,0x100,0x67a,0x100,0x67f,0x100,0x67f,0x100,0x67f, +0x100,0x67f,0x100,0x679,0x100,0x679,0x100,0x679,0x100,0x679,0x100,0x6a4,0x100,0x6a4,0x100,0x6a4, +0x100,0x6a4,0x100,0x6a6,0x100,0x6a6,0x100,0x6a6,0x100,0x6a6,0x100,0x684,0x100,0x684,0x100,0x684, +0x100,0x684,0x100,0x683,0x100,0x683,0x100,0x683,0x100,0x683,0x100,0x686,0x100,0x686,0x100,0x686, +0x100,0x686,0x100,0x687,0x100,0x687,0x100,0x687,0x100,0x687,0x100,0x68d,0x100,0x68d,0x100,0x68c, +0x100,0x68c,0x100,0x68e,0x100,0x68e,0x100,0x688,0x100,0x688,0x100,0x698,0x100,0x698,0x100,0x691, +0x100,0x691,0x100,0x6a9,0x100,0x6a9,0x100,0x6a9,0x100,0x6a9,0x100,0x6af,0x100,0x6af,0x100,0x6af, +0x100,0x6af,0x100,0x6b3,0x100,0x6b3,0x100,0x6b3,0x100,0x6b3,0x100,0x6b1,0x100,0x6b1,0x100,0x6b1, +0x100,0x6b1,0x100,0x6ba,0x100,0x6ba,0x100,0x6bb,0x100,0x6bb,0x100,0x6bb,0x100,0x6bb,0x8200,0xe6, +0x6d5,0x654,0x8200,0xe6,0x6d5,0x654,0x100,0x6c1,0x100,0x6c1,0x100,0x6c1,0x100,0x6c1,0x100,0x6be, +0x100,0x6be,0x100,0x6be,0x100,0x6be,0x100,0x6d2,0x100,0x6d2,0x8200,0xe6,0x6d2,0x654,0x8200,0xe6, +0x6d2,0x654,0x100,0x6ad,0x100,0x6ad,0x100,0x6ad,0x100,0x6ad,0x100,0x6c7,0x100,0x6c7,0x100,0x6c6, +0x100,0x6c6,0x100,0x6c8,0x100,0x6c8,0x200,0x6c7,0x674,0x100,0x6cb,0x100,0x6cb,0x100,0x6c5,0x100, +0x6c5,0x100,0x6c9,0x100,0x6c9,0x100,0x6d0,0x100,0x6d0,0x100,0x6d0,0x100,0x6d0,0x100,0x649,0x100, +0x649,0x300,0x64a,0x654,0x627,0x300,0x64a,0x654,0x627,0x300,0x64a,0x654,0x6d5,0x300,0x64a,0x654, +0x6d5,0x300,0x64a,0x654,0x648,0x300,0x64a,0x654,0x648,0x300,0x64a,0x654,0x6c7,0x300,0x64a,0x654, +0x6c7,0x300,0x64a,0x654,0x6c6,0x300,0x64a,0x654,0x6c6,0x300,0x64a,0x654,0x6c8,0x300,0x64a,0x654, +0x6c8,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654,0x6d0,0x300,0x64a,0x654, +0x649,0x300,0x64a,0x654,0x649,0x300,0x64a,0x654,0x649,0x100,0x6cc,0x100,0x6cc,0x100,0x6cc,0x100, +0x6cc,0x300,0x64a,0x654,0x62c,0x300,0x64a,0x654,0x62d,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654, +0x649,0x300,0x64a,0x654,0x64a,0x200,0x628,0x62c,0x200,0x628,0x62d,0x200,0x628,0x62e,0x200,0x628, +0x645,0x200,0x628,0x649,0x200,0x628,0x64a,0x200,0x62a,0x62c,0x200,0x62a,0x62d,0x200,0x62a,0x62e, +0x200,0x62a,0x645,0x200,0x62a,0x649,0x200,0x62a,0x64a,0x200,0x62b,0x62c,0x200,0x62b,0x645,0x200, +0x62b,0x649,0x200,0x62b,0x64a,0x200,0x62c,0x62d,0x200,0x62c,0x645,0x200,0x62d,0x62c,0x200,0x62d, +0x645,0x200,0x62e,0x62c,0x200,0x62e,0x62d,0x200,0x62e,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d, +0x200,0x633,0x62e,0x200,0x633,0x645,0x200,0x635,0x62d,0x200,0x635,0x645,0x200,0x636,0x62c,0x200, +0x636,0x62d,0x200,0x636,0x62e,0x200,0x636,0x645,0x200,0x637,0x62d,0x200,0x637,0x645,0x200,0x638, +0x645,0x200,0x639,0x62c,0x200,0x639,0x645,0x200,0x63a,0x62c,0x200,0x63a,0x645,0x200,0x641,0x62c, +0x200,0x641,0x62d,0x200,0x641,0x62e,0x200,0x641,0x645,0x200,0x641,0x649,0x200,0x641,0x64a,0x200, +0x642,0x62d,0x200,0x642,0x645,0x200,0x642,0x649,0x200,0x642,0x64a,0x200,0x643,0x627,0x200,0x643, +0x62c,0x200,0x643,0x62d,0x200,0x643,0x62e,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x643,0x649, +0x200,0x643,0x64a,0x200,0x644,0x62c,0x200,0x644,0x62d,0x200,0x644,0x62e,0x200,0x644,0x645,0x200, +0x644,0x649,0x200,0x644,0x64a,0x200,0x645,0x62c,0x200,0x645,0x62d,0x200,0x645,0x62e,0x200,0x645, +0x645,0x200,0x645,0x649,0x200,0x645,0x64a,0x200,0x646,0x62c,0x200,0x646,0x62d,0x200,0x646,0x62e, +0x200,0x646,0x645,0x200,0x646,0x649,0x200,0x646,0x64a,0x200,0x647,0x62c,0x200,0x647,0x645,0x200, +0x647,0x649,0x200,0x647,0x64a,0x200,0x64a,0x62c,0x200,0x64a,0x62d,0x200,0x64a,0x62e,0x200,0x64a, +0x645,0x200,0x64a,0x649,0x200,0x64a,0x64a,0x8200,0x23,0x630,0x670,0x8200,0x23,0x631,0x670,0x8200, +0x23,0x649,0x670,0x8300,0x21,0x20,0x64c,0x651,0x8300,0x21,0x20,0x64d,0x651,0x8300,0x21,0x20, +0x64e,0x651,0x8300,0x21,0x20,0x64f,0x651,0x8300,0x21,0x20,0x650,0x651,0x8300,0x23,0x20,0x651, +0x670,0x300,0x64a,0x654,0x631,0x300,0x64a,0x654,0x632,0x300,0x64a,0x654,0x645,0x300,0x64a,0x654, +0x646,0x300,0x64a,0x654,0x649,0x300,0x64a,0x654,0x64a,0x200,0x628,0x631,0x200,0x628,0x632,0x200, +0x628,0x645,0x200,0x628,0x646,0x200,0x628,0x649,0x200,0x628,0x64a,0x200,0x62a,0x631,0x200,0x62a, +0x632,0x200,0x62a,0x645,0x200,0x62a,0x646,0x200,0x62a,0x649,0x200,0x62a,0x64a,0x200,0x62b,0x631, +0x200,0x62b,0x632,0x200,0x62b,0x645,0x200,0x62b,0x646,0x200,0x62b,0x649,0x200,0x62b,0x64a,0x200, +0x641,0x649,0x200,0x641,0x64a,0x200,0x642,0x649,0x200,0x642,0x64a,0x200,0x643,0x627,0x200,0x643, +0x644,0x200,0x643,0x645,0x200,0x643,0x649,0x200,0x643,0x64a,0x200,0x644,0x645,0x200,0x644,0x649, +0x200,0x644,0x64a,0x200,0x645,0x627,0x200,0x645,0x645,0x200,0x646,0x631,0x200,0x646,0x632,0x200, +0x646,0x645,0x200,0x646,0x646,0x200,0x646,0x649,0x200,0x646,0x64a,0x8200,0x23,0x649,0x670,0x200, +0x64a,0x631,0x200,0x64a,0x632,0x200,0x64a,0x645,0x200,0x64a,0x646,0x200,0x64a,0x649,0x200,0x64a, +0x64a,0x300,0x64a,0x654,0x62c,0x300,0x64a,0x654,0x62d,0x300,0x64a,0x654,0x62e,0x300,0x64a,0x654, +0x645,0x300,0x64a,0x654,0x647,0x200,0x628,0x62c,0x200,0x628,0x62d,0x200,0x628,0x62e,0x200,0x628, +0x645,0x200,0x628,0x647,0x200,0x62a,0x62c,0x200,0x62a,0x62d,0x200,0x62a,0x62e,0x200,0x62a,0x645, +0x200,0x62a,0x647,0x200,0x62b,0x645,0x200,0x62c,0x62d,0x200,0x62c,0x645,0x200,0x62d,0x62c,0x200, +0x62d,0x645,0x200,0x62e,0x62c,0x200,0x62e,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633, +0x62e,0x200,0x633,0x645,0x200,0x635,0x62d,0x200,0x635,0x62e,0x200,0x635,0x645,0x200,0x636,0x62c, +0x200,0x636,0x62d,0x200,0x636,0x62e,0x200,0x636,0x645,0x200,0x637,0x62d,0x200,0x638,0x645,0x200, +0x639,0x62c,0x200,0x639,0x645,0x200,0x63a,0x62c,0x200,0x63a,0x645,0x200,0x641,0x62c,0x200,0x641, +0x62d,0x200,0x641,0x62e,0x200,0x641,0x645,0x200,0x642,0x62d,0x200,0x642,0x645,0x200,0x643,0x62c, +0x200,0x643,0x62d,0x200,0x643,0x62e,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x644,0x62c,0x200, +0x644,0x62d,0x200,0x644,0x62e,0x200,0x644,0x645,0x200,0x644,0x647,0x200,0x645,0x62c,0x200,0x645, +0x62d,0x200,0x645,0x62e,0x200,0x645,0x645,0x200,0x646,0x62c,0x200,0x646,0x62d,0x200,0x646,0x62e, +0x200,0x646,0x645,0x200,0x646,0x647,0x200,0x647,0x62c,0x200,0x647,0x645,0x8200,0x23,0x647,0x670, +0x200,0x64a,0x62c,0x200,0x64a,0x62d,0x200,0x64a,0x62e,0x200,0x64a,0x645,0x200,0x64a,0x647,0x300, +0x64a,0x654,0x645,0x300,0x64a,0x654,0x647,0x200,0x628,0x645,0x200,0x628,0x647,0x200,0x62a,0x645, +0x200,0x62a,0x647,0x200,0x62b,0x645,0x200,0x62b,0x647,0x200,0x633,0x645,0x200,0x633,0x647,0x200, +0x634,0x645,0x200,0x634,0x647,0x200,0x643,0x644,0x200,0x643,0x645,0x200,0x644,0x645,0x200,0x646, +0x645,0x200,0x646,0x647,0x200,0x64a,0x645,0x200,0x64a,0x647,0x8300,0x21,0x640,0x64e,0x651,0x8300, +0x21,0x640,0x64f,0x651,0x8300,0x21,0x640,0x650,0x651,0x200,0x637,0x649,0x200,0x637,0x64a,0x200, +0x639,0x649,0x200,0x639,0x64a,0x200,0x63a,0x649,0x200,0x63a,0x64a,0x200,0x633,0x649,0x200,0x633, +0x64a,0x200,0x634,0x649,0x200,0x634,0x64a,0x200,0x62d,0x649,0x200,0x62d,0x64a,0x200,0x62c,0x649, +0x200,0x62c,0x64a,0x200,0x62e,0x649,0x200,0x62e,0x64a,0x200,0x635,0x649,0x200,0x635,0x64a,0x200, +0x636,0x649,0x200,0x636,0x64a,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x634, +0x645,0x200,0x634,0x631,0x200,0x633,0x631,0x200,0x635,0x631,0x200,0x636,0x631,0x200,0x637,0x649, +0x200,0x637,0x64a,0x200,0x639,0x649,0x200,0x639,0x64a,0x200,0x63a,0x649,0x200,0x63a,0x64a,0x200, +0x633,0x649,0x200,0x633,0x64a,0x200,0x634,0x649,0x200,0x634,0x64a,0x200,0x62d,0x649,0x200,0x62d, +0x64a,0x200,0x62c,0x649,0x200,0x62c,0x64a,0x200,0x62e,0x649,0x200,0x62e,0x64a,0x200,0x635,0x649, +0x200,0x635,0x64a,0x200,0x636,0x649,0x200,0x636,0x64a,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200, +0x634,0x62e,0x200,0x634,0x645,0x200,0x634,0x631,0x200,0x633,0x631,0x200,0x635,0x631,0x200,0x636, +0x631,0x200,0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x634,0x645,0x200,0x633,0x647, +0x200,0x634,0x647,0x200,0x637,0x645,0x200,0x633,0x62c,0x200,0x633,0x62d,0x200,0x633,0x62e,0x200, +0x634,0x62c,0x200,0x634,0x62d,0x200,0x634,0x62e,0x200,0x637,0x645,0x200,0x638,0x645,0x8200,0x1b, +0x627,0x64b,0x8200,0x1b,0x627,0x64b,0x300,0x62a,0x62c,0x645,0x300,0x62a,0x62d,0x62c,0x300,0x62a, +0x62d,0x62c,0x300,0x62a,0x62d,0x645,0x300,0x62a,0x62e,0x645,0x300,0x62a,0x645,0x62c,0x300,0x62a, +0x645,0x62d,0x300,0x62a,0x645,0x62e,0x300,0x62c,0x645,0x62d,0x300,0x62c,0x645,0x62d,0x300,0x62d, +0x645,0x64a,0x300,0x62d,0x645,0x649,0x300,0x633,0x62d,0x62c,0x300,0x633,0x62c,0x62d,0x300,0x633, +0x62c,0x649,0x300,0x633,0x645,0x62d,0x300,0x633,0x645,0x62d,0x300,0x633,0x645,0x62c,0x300,0x633, +0x645,0x645,0x300,0x633,0x645,0x645,0x300,0x635,0x62d,0x62d,0x300,0x635,0x62d,0x62d,0x300,0x635, +0x645,0x645,0x300,0x634,0x62d,0x645,0x300,0x634,0x62d,0x645,0x300,0x634,0x62c,0x64a,0x300,0x634, +0x645,0x62e,0x300,0x634,0x645,0x62e,0x300,0x634,0x645,0x645,0x300,0x634,0x645,0x645,0x300,0x636, +0x62d,0x649,0x300,0x636,0x62e,0x645,0x300,0x636,0x62e,0x645,0x300,0x637,0x645,0x62d,0x300,0x637, +0x645,0x62d,0x300,0x637,0x645,0x645,0x300,0x637,0x645,0x64a,0x300,0x639,0x62c,0x645,0x300,0x639, +0x645,0x645,0x300,0x639,0x645,0x645,0x300,0x639,0x645,0x649,0x300,0x63a,0x645,0x645,0x300,0x63a, +0x645,0x64a,0x300,0x63a,0x645,0x649,0x300,0x641,0x62e,0x645,0x300,0x641,0x62e,0x645,0x300,0x642, +0x645,0x62d,0x300,0x642,0x645,0x645,0x300,0x644,0x62d,0x645,0x300,0x644,0x62d,0x64a,0x300,0x644, +0x62d,0x649,0x300,0x644,0x62c,0x62c,0x300,0x644,0x62c,0x62c,0x300,0x644,0x62e,0x645,0x300,0x644, +0x62e,0x645,0x300,0x644,0x645,0x62d,0x300,0x644,0x645,0x62d,0x300,0x645,0x62d,0x62c,0x300,0x645, +0x62d,0x645,0x300,0x645,0x62d,0x64a,0x300,0x645,0x62c,0x62d,0x300,0x645,0x62c,0x645,0x300,0x645, +0x62e,0x62c,0x300,0x645,0x62e,0x645,0x300,0x645,0x62c,0x62e,0x300,0x647,0x645,0x62c,0x300,0x647, +0x645,0x645,0x300,0x646,0x62d,0x645,0x300,0x646,0x62d,0x649,0x300,0x646,0x62c,0x645,0x300,0x646, +0x62c,0x645,0x300,0x646,0x62c,0x649,0x300,0x646,0x645,0x64a,0x300,0x646,0x645,0x649,0x300,0x64a, +0x645,0x645,0x300,0x64a,0x645,0x645,0x300,0x628,0x62e,0x64a,0x300,0x62a,0x62c,0x64a,0x300,0x62a, +0x62c,0x649,0x300,0x62a,0x62e,0x64a,0x300,0x62a,0x62e,0x649,0x300,0x62a,0x645,0x64a,0x300,0x62a, +0x645,0x649,0x300,0x62c,0x645,0x64a,0x300,0x62c,0x62d,0x649,0x300,0x62c,0x645,0x649,0x300,0x633, +0x62e,0x649,0x300,0x635,0x62d,0x64a,0x300,0x634,0x62d,0x64a,0x300,0x636,0x62d,0x64a,0x300,0x644, +0x62c,0x64a,0x300,0x644,0x645,0x64a,0x300,0x64a,0x62d,0x64a,0x300,0x64a,0x62c,0x64a,0x300,0x64a, +0x645,0x64a,0x300,0x645,0x645,0x64a,0x300,0x642,0x645,0x64a,0x300,0x646,0x62d,0x64a,0x300,0x642, +0x645,0x62d,0x300,0x644,0x62d,0x645,0x300,0x639,0x645,0x64a,0x300,0x643,0x645,0x64a,0x300,0x646, +0x62c,0x62d,0x300,0x645,0x62e,0x64a,0x300,0x644,0x62c,0x645,0x300,0x643,0x645,0x645,0x300,0x644, +0x62c,0x645,0x300,0x646,0x62c,0x62d,0x300,0x62c,0x62d,0x64a,0x300,0x62d,0x62c,0x64a,0x300,0x645, +0x62c,0x64a,0x300,0x641,0x645,0x64a,0x300,0x628,0x62d,0x64a,0x300,0x643,0x645,0x645,0x300,0x639, +0x62c,0x645,0x300,0x635,0x645,0x645,0x300,0x633,0x62e,0x64a,0x300,0x646,0x62c,0x64a,0x300,0x635, +0x644,0x6d2,0x300,0x642,0x644,0x6d2,0x400,0x627,0x644,0x644,0x647,0x400,0x627,0x643,0x628,0x631, +0x400,0x645,0x62d,0x645,0x62f,0x400,0x635,0x644,0x639,0x645,0x400,0x631,0x633,0x648,0x644,0x400, +0x639,0x644,0x64a,0x647,0x400,0x648,0x633,0x644,0x645,0x300,0x635,0x644,0x649,0x1200,0x635,0x644, +0x649,0x20,0x627,0x644,0x644,0x647,0x20,0x639,0x644,0x64a,0x647,0x20,0x648,0x633,0x644,0x645, +0x800,0x62c,0x644,0x20,0x62c,0x644,0x627,0x644,0x647,0x400,0x631,0x6cc,0x627,0x644,0x100,0x2c, +0x100,0x3001,0x100,0x3002,0x100,0x3a,0x100,0x3b,0x100,0x21,0x100,0x3f,0x100,0x3016,0x100,0x3017, +0x300,0x2e,0x2e,0x2e,0x200,0x2e,0x2e,0x100,0x2014,0x100,0x2013,0x100,0x5f,0x100,0x5f,0x100, +0x28,0x100,0x29,0x100,0x7b,0x100,0x7d,0x100,0x3014,0x100,0x3015,0x100,0x3010,0x100,0x3011,0x100, +0x300a,0x100,0x300b,0x100,0x3008,0x100,0x3009,0x100,0x300c,0x100,0x300d,0x100,0x300e,0x100,0x300f,0x100, +0x5b,0x100,0x5d,0x8200,0xe6,0x20,0x305,0x8200,0xe6,0x20,0x305,0x8200,0xe6,0x20,0x305,0x8200, +0xe6,0x20,0x305,0x100,0x5f,0x100,0x5f,0x100,0x5f,0x100,0x2c,0x100,0x3001,0x100,0x2e,0x100, +0x3b,0x100,0x3a,0x100,0x3f,0x100,0x21,0x100,0x2014,0x100,0x28,0x100,0x29,0x100,0x7b,0x100, +0x7d,0x100,0x3014,0x100,0x3015,0x100,0x23,0x100,0x26,0x100,0x2a,0x100,0x2b,0x100,0x2d,0x100, +0x3c,0x100,0x3e,0x100,0x3d,0x100,0x5c,0x100,0x24,0x100,0x25,0x100,0x40,0x8200,0x1b,0x20, +0x64b,0x8200,0x1b,0x640,0x64b,0x8200,0x1c,0x20,0x64c,0x8200,0x1d,0x20,0x64d,0x8200,0x1e,0x20, +0x64e,0x8200,0x1e,0x640,0x64e,0x8200,0x1f,0x20,0x64f,0x8200,0x1f,0x640,0x64f,0x8200,0x20,0x20, +0x650,0x8200,0x20,0x640,0x650,0x8200,0x21,0x20,0x651,0x8200,0x21,0x640,0x651,0x8200,0x22,0x20, +0x652,0x8200,0x22,0x640,0x652,0x100,0x621,0x8200,0xe6,0x627,0x653,0x8200,0xe6,0x627,0x653,0x8200, +0xe6,0x627,0x654,0x8200,0xe6,0x627,0x654,0x8200,0xe6,0x648,0x654,0x8200,0xe6,0x648,0x654,0x8200, +0xdc,0x627,0x655,0x8200,0xdc,0x627,0x655,0x8200,0xe6,0x64a,0x654,0x8200,0xe6,0x64a,0x654,0x8200, +0xe6,0x64a,0x654,0x8200,0xe6,0x64a,0x654,0x100,0x627,0x100,0x627,0x100,0x628,0x100,0x628,0x100, +0x628,0x100,0x628,0x100,0x629,0x100,0x629,0x100,0x62a,0x100,0x62a,0x100,0x62a,0x100,0x62a,0x100, +0x62b,0x100,0x62b,0x100,0x62b,0x100,0x62b,0x100,0x62c,0x100,0x62c,0x100,0x62c,0x100,0x62c,0x100, +0x62d,0x100,0x62d,0x100,0x62d,0x100,0x62d,0x100,0x62e,0x100,0x62e,0x100,0x62e,0x100,0x62e,0x100, +0x62f,0x100,0x62f,0x100,0x630,0x100,0x630,0x100,0x631,0x100,0x631,0x100,0x632,0x100,0x632,0x100, +0x633,0x100,0x633,0x100,0x633,0x100,0x633,0x100,0x634,0x100,0x634,0x100,0x634,0x100,0x634,0x100, +0x635,0x100,0x635,0x100,0x635,0x100,0x635,0x100,0x636,0x100,0x636,0x100,0x636,0x100,0x636,0x100, +0x637,0x100,0x637,0x100,0x637,0x100,0x637,0x100,0x638,0x100,0x638,0x100,0x638,0x100,0x638,0x100, +0x639,0x100,0x639,0x100,0x639,0x100,0x639,0x100,0x63a,0x100,0x63a,0x100,0x63a,0x100,0x63a,0x100, +0x641,0x100,0x641,0x100,0x641,0x100,0x641,0x100,0x642,0x100,0x642,0x100,0x642,0x100,0x642,0x100, +0x643,0x100,0x643,0x100,0x643,0x100,0x643,0x100,0x644,0x100,0x644,0x100,0x644,0x100,0x644,0x100, +0x645,0x100,0x645,0x100,0x645,0x100,0x645,0x100,0x646,0x100,0x646,0x100,0x646,0x100,0x646,0x100, +0x647,0x100,0x647,0x100,0x647,0x100,0x647,0x100,0x648,0x100,0x648,0x100,0x649,0x100,0x649,0x100, +0x64a,0x100,0x64a,0x100,0x64a,0x100,0x64a,0x8300,0xe6,0x644,0x627,0x653,0x8300,0xe6,0x644,0x627, +0x653,0x8300,0xe6,0x644,0x627,0x654,0x8300,0xe6,0x644,0x627,0x654,0x8300,0xdc,0x644,0x627,0x655, +0x8300,0xdc,0x644,0x627,0x655,0x200,0x644,0x627,0x200,0x644,0x627,0x100,0x21,0x100,0x22,0x100, +0x23,0x100,0x24,0x100,0x25,0x100,0x26,0x100,0x27,0x100,0x28,0x100,0x29,0x100,0x2a,0x100, +0x2b,0x100,0x2c,0x100,0x2d,0x100,0x2e,0x100,0x2f,0x100,0x30,0x100,0x31,0x100,0x32,0x100, +0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x3a,0x100, +0x3b,0x100,0x3c,0x100,0x3d,0x100,0x3e,0x100,0x3f,0x100,0x40,0x100,0x41,0x100,0x42,0x100, +0x43,0x100,0x44,0x100,0x45,0x100,0x46,0x100,0x47,0x100,0x48,0x100,0x49,0x100,0x4a,0x100, +0x4b,0x100,0x4c,0x100,0x4d,0x100,0x4e,0x100,0x4f,0x100,0x50,0x100,0x51,0x100,0x52,0x100, +0x53,0x100,0x54,0x100,0x55,0x100,0x56,0x100,0x57,0x100,0x58,0x100,0x59,0x100,0x5a,0x100, +0x5b,0x100,0x5c,0x100,0x5d,0x100,0x5e,0x100,0x5f,0x100,0x60,0x100,0x61,0x100,0x62,0x100, 0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100, 0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100, 0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100, -0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x69,0x100, -0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100, -0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100, -0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100, +0x7b,0x100,0x7c,0x100,0x7d,0x100,0x7e,0x100,0x2985,0x100,0x2986,0x100,0x3002,0x100,0x300c,0x100, +0x300d,0x100,0x3001,0x100,0x30fb,0x100,0x30f2,0x100,0x30a1,0x100,0x30a3,0x100,0x30a5,0x100,0x30a7,0x100, +0x30a9,0x100,0x30e3,0x100,0x30e5,0x100,0x30e7,0x100,0x30c3,0x100,0x30fc,0x100,0x30a2,0x100,0x30a4,0x100, +0x30a6,0x100,0x30a8,0x100,0x30aa,0x100,0x30ab,0x100,0x30ad,0x100,0x30af,0x100,0x30b1,0x100,0x30b3,0x100, +0x30b5,0x100,0x30b7,0x100,0x30b9,0x100,0x30bb,0x100,0x30bd,0x100,0x30bf,0x100,0x30c1,0x100,0x30c4,0x100, +0x30c6,0x100,0x30c8,0x100,0x30ca,0x100,0x30cb,0x100,0x30cc,0x100,0x30cd,0x100,0x30ce,0x100,0x30cf,0x100, +0x30d2,0x100,0x30d5,0x100,0x30d8,0x100,0x30db,0x100,0x30de,0x100,0x30df,0x100,0x30e0,0x100,0x30e1,0x100, +0x30e2,0x100,0x30e4,0x100,0x30e6,0x100,0x30e8,0x100,0x30e9,0x100,0x30ea,0x100,0x30eb,0x100,0x30ec,0x100, +0x30ed,0x100,0x30ef,0x100,0x30f3,0x8100,0x808,0x3099,0x8100,0x808,0x309a,0x100,0x1160,0x100,0x1100,0x100, +0x1101,0x100,0x11aa,0x100,0x1102,0x100,0x11ac,0x100,0x11ad,0x100,0x1103,0x100,0x1104,0x100,0x1105,0x100, +0x11b0,0x100,0x11b1,0x100,0x11b2,0x100,0x11b3,0x100,0x11b4,0x100,0x11b5,0x100,0x111a,0x100,0x1106,0x100, +0x1107,0x100,0x1108,0x100,0x1121,0x100,0x1109,0x100,0x110a,0x100,0x110b,0x100,0x110c,0x100,0x110d,0x100, +0x110e,0x100,0x110f,0x100,0x1110,0x100,0x1111,0x100,0x1112,0x100,0x1161,0x100,0x1162,0x100,0x1163,0x100, +0x1164,0x100,0x1165,0x100,0x1166,0x100,0x1167,0x100,0x1168,0x100,0x1169,0x100,0x116a,0x100,0x116b,0x100, +0x116c,0x100,0x116d,0x100,0x116e,0x100,0x116f,0x100,0x1170,0x100,0x1171,0x100,0x1172,0x100,0x1173,0x100, +0x1174,0x100,0x1175,0x100,0xa2,0x100,0xa3,0x100,0xac,0x8200,0xe6,0x20,0x304,0x100,0xa6,0x100, +0xa5,0x100,0x20a9,0x100,0x2502,0x100,0x2190,0x100,0x2191,0x100,0x2192,0x100,0x2193,0x100,0x25a0,0x100, +0x25cb,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100, 0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100, 0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100, -0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x66,0x100, -0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x70,0x100, -0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100, -0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100, -0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100, +0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100, +0x66,0x100,0x67,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100, 0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100, 0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100, 0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100, 0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100, 0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100, -0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100, -0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100, -0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100, -0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100, -0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100, -0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100, -0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100, -0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100, -0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100, -0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100, -0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100, -0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100, -0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100, -0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100, -0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100, -0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100, -0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100, -0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100, -0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100, -0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100, -0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100, -0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100, -0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x131,0x100,0x237,0x100,0x2207,0x100,0x3b1,0x100, -0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,0x3b7,0x100,0x3b8,0x100,0x3b9,0x100, -0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,0x3bf,0x100,0x3c0,0x100,0x3c1,0x100, -0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,0x3c8,0x100,0x3c9,0x100,0x2202,0x100, -0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,0x3c0,0x100,0x2207,0x100,0x3b1,0x100, -0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,0x3b7,0x100,0x3b8,0x100,0x3b9,0x100, -0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,0x3bf,0x100,0x3c0,0x100,0x3c1,0x100, -0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,0x3c8,0x100,0x3c9,0x100,0x2202,0x100, -0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,0x3c0,0x100,0x2207,0x100,0x3b1,0x100, -0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,0x3b7,0x100,0x3b8,0x100,0x3b9,0x100, -0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,0x3bf,0x100,0x3c0,0x100,0x3c1,0x100, -0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,0x3c8,0x100,0x3c9,0x100,0x2202,0x100, -0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,0x3c0,0x100,0x2207,0x100,0x3b1,0x100, -0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,0x3b7,0x100,0x3b8,0x100,0x3b9,0x100, -0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,0x3bf,0x100,0x3c0,0x100,0x3c1,0x100, -0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,0x3c8,0x100,0x3c9,0x100,0x2202,0x100, -0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,0x3c0,0x100,0x2207,0x100,0x3b1,0x100, -0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100,0x3b7,0x100,0x3b8,0x100,0x3b9,0x100, -0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100,0x3bf,0x100,0x3c0,0x100,0x3c1,0x100, -0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100,0x3c8,0x100,0x3c9,0x100,0x2202,0x100, -0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100,0x3c0,0x100,0x30,0x100,0x31,0x100, +0x63,0x100,0x64,0x100,0x66,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100, +0x6d,0x100,0x6e,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100, +0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100, +0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100, +0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100, +0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100, +0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100, +0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100, +0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100, +0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100, +0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100, +0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100, +0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100, +0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100, +0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100, +0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100, +0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100, +0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100, +0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100, +0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100, +0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100, +0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100, +0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100, +0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100, +0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100, +0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100,0x64,0x100,0x65,0x100, +0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100,0x6c,0x100,0x6d,0x100, +0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100,0x74,0x100,0x75,0x100, +0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x61,0x100,0x62,0x100,0x63,0x100, +0x64,0x100,0x65,0x100,0x66,0x100,0x67,0x100,0x68,0x100,0x69,0x100,0x6a,0x100,0x6b,0x100, +0x6c,0x100,0x6d,0x100,0x6e,0x100,0x6f,0x100,0x70,0x100,0x71,0x100,0x72,0x100,0x73,0x100, +0x74,0x100,0x75,0x100,0x76,0x100,0x77,0x100,0x78,0x100,0x79,0x100,0x7a,0x100,0x131,0x100, +0x237,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100, +0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100, +0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100, +0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100, +0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100, +0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100, +0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100, +0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100, +0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100, +0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100, +0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100, +0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100, +0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100, +0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100, +0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100, +0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100, +0x3c0,0x100,0x2207,0x100,0x3b1,0x100,0x3b2,0x100,0x3b3,0x100,0x3b4,0x100,0x3b5,0x100,0x3b6,0x100, +0x3b7,0x100,0x3b8,0x100,0x3b9,0x100,0x3ba,0x100,0x3bb,0x100,0x3bc,0x100,0x3bd,0x100,0x3be,0x100, +0x3bf,0x100,0x3c0,0x100,0x3c1,0x100,0x3c3,0x100,0x3c4,0x100,0x3c5,0x100,0x3c6,0x100,0x3c7,0x100, +0x3c8,0x100,0x3c9,0x100,0x2202,0x100,0x3b5,0x100,0x3b8,0x100,0x3ba,0x100,0x3c6,0x100,0x3c1,0x100, +0x3c0,0x100,0x3dd,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100, +0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100, +0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100, 0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100, 0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100, 0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100, -0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100,0x32,0x100,0x33,0x100, -0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0x100,0x30,0x100,0x31,0x100, -0x32,0x100,0x33,0x100,0x34,0x100,0x35,0x100,0x36,0x100,0x37,0x100,0x38,0x100,0x39,0, -0x20,0x2a,0x4c,0x6a,0x7c,0x9c,0xc2,0xd4,0xf4,0xfe,0x120,0x13c,0x14e,0x16e,0x194,0x1a8, -0x1b4,0x1c0,0x1ce,0x1dc,0x1ea,0x1fa,0x1fc,0x200,0x20a,0x214,0x220,0x22c,0x23c,0x24c,0x25a,0x268, -0x276,0x286,0x292,0x2a0,0x2ac,0x2d0,0x2d4,0x2dc,0x2de,0x2e4,0x2e6,0x302,0x310,0x318,0x322,0x330, -0x338,0x344,0x354,0x364,0x36c,0x378,0x38e,0x39e,0x3a6,0x3b6,0x3bc,0x3be,0x3c0,0x3c2,0x3ca,0x3d2, -0x3da,0x3e0,0x3e2,0x3e4,0x3e6,0x3ee,0x3f0,0x3f2,0x3f6,0x3fa,0x3fe,0x402,0x404,0x406,0x408,0x40a, -0x40c,0x40e,0x410,0x412,0x414,0x416,0x418,0x41a,0x41c,0x41e,0x424,0x426,0x428,0x42a,0x42c,0x42e, -0x430,0x432,0x434,0x438,0x43e,0x440,0x444,0x446,0x448,0x44a,0x452,0x456,0x458,0x460,0x462,0x468, -0x47e,0x480,0x48a,0x490,0x49e,0x4a2,0x4be,0x4c2,0x4c6,0x4ca,0x652,0x656,0x65e,0x661,0x664,0x667, -0x66a,0x66d,0x670,0x673,0x676,0x679,0x67c,0x67f,0x682,0x685,0x688,0x68b,0x68e,0x691,0x694,0x697, -0x69a,0x69d,0x6a0,0x6a3,0x6a6,0x6a9,0x6ac,0x6af,0x6b2,0x6b5,0x6b8,0x6bb,0x6be,0x6c1,0x6c4,0x6c7, -0x6ca,0x6cd,0x6d0,0x6d3,0x6d6,0x6d9,0x6dc,0x6df,0x6e2,0x6e5,0x6e8,0x6eb,0x6ee,0x6f1,0x6f4,0x6f7, -0x6fa,0x6fd,0x700,0x703,0x706,0x709,0x70c,0x70f,0x715,0x71b,0x721,0x727,0x72d,0x730,0x733,0x736, -0x739,0x73c,0x73f,0x742,0x745,0x748,0x74b,0x74e,0x751,0x754,0x757,0x75a,0x75d,0x760,0x766,0x76c, -0x772,0x778,0x77e,0x781,0x784,0x787,0x78a,0x78d +0x36,0x100,0x37,0x100,0x38,0x100,0x39,0,0x20,0x2a,0x4c,0x6a,0x7c,0x9c,0xc2,0xd4, +0xf4,0xfe,0x120,0x13c,0x14e,0x16e,0x194,0x1a8,0x1b4,0x1c0,0x1ce,0x1dc,0x1ea,0x1fa,0x1fc,0x200, +0x20a,0x214,0x220,0x22c,0x23c,0x24c,0x25a,0x268,0x276,0x286,0x292,0x2a0,0x2ac,0x2d0,0x2d4,0x2dc, +0x2de,0x2e4,0x2e6,0x302,0x310,0x318,0x322,0x330,0x338,0x344,0x354,0x364,0x36c,0x378,0x38e,0x39e, +0x3a6,0x3b6,0x3bc,0x3be,0x3c0,0x3c2,0x3ca,0x3d2,0x3da,0x3e0,0x3e2,0x3e4,0x3e6,0x3ee,0x3f0,0x3f2, +0x3f6,0x3fa,0x3fe,0x402,0x404,0x406,0x408,0x40a,0x40c,0x40e,0x410,0x412,0x414,0x416,0x418,0x41a, +0x41c,0x41e,0x424,0x426,0x428,0x42a,0x42c,0x42e,0x430,0x432,0x434,0x438,0x43e,0x440,0x444,0x446, +0x448,0x44a,0x452,0x456,0x458,0x460,0x462,0x464,0x466,0x468,0x46a,0x46c,0x46e,0x470,0x472,0x474, +0x476,0x478,0x47e,0x494,0x496,0x4a0,0x4a6,0x4b4,0x4b8,0x4d4,0x4d8,0x4dc,0x4e0,0x668,0x66c,0x674, +0x677,0x67a,0x67d,0x680,0x683,0x686,0x689,0x68c,0x68f,0x692,0x695,0x698,0x69b,0x69e,0x6a1,0x6a4, +0x6a7,0x6aa,0x6ad,0x6b0,0x6b3,0x6b6,0x6b9,0x6bc,0x6bf,0x6c2,0x6c5,0x6c8,0x6cb,0x6ce,0x6d1,0x6d4, +0x6d7,0x6da,0x6dd,0x6e0,0x6e3,0x6e6,0x6e9,0x6ec,0x6ef,0x6f2,0x6f5,0x6f8,0x6fb,0x6fe,0x701,0x704, +0x707,0x70a,0x70d,0x710,0x713,0x716,0x719,0x71c,0x71f,0x722,0x725,0x72b,0x731,0x737,0x73d,0x743, +0x746,0x749,0x74c,0x74f,0x752,0x755,0x758,0x75b,0x75e,0x761,0x764,0x767,0x76a,0x76d,0x770,0x773, +0x776,0x77c,0x782,0x788,0x78e,0x794,0x797,0x79a,0x79d,0x7a0,0x7a3 }; -static const uint16_t combiningTable[1936]={ -0x790,0xc0,0x791,0xc1,0x792,0x20c2,0x793,0xc3,0x794,0x20c4,0x795,0x20c5,0x797,0x100,0x798,0x2102, -0x799,0x104,0x79a,0x2226,0x79b,0x1cd,0x79e,0x200,0x79f,0x202,0x7b6,0x1e00,0x7b7,0x3ea0,0x87bd,0x1ea2, -0x791,0x106,0x792,0x108,0x796,0x20c7,0x79a,0x10a,0x879b,0x10c,0x790,0xc8,0x791,0xc9,0x792,0x20ca, -0x793,0x1ebc,0x794,0xcb,0x796,0x2228,0x797,0x2112,0x798,0x114,0x799,0x118,0x79a,0x116,0x79b,0x11a, -0x79e,0x204,0x79f,0x206,0x7b7,0x3eb8,0x7b9,0x1e18,0x7ba,0x1e1a,0x87bd,0x1eba,0x790,0xcc,0x791,0xcd, -0x792,0xce,0x793,0x128,0x794,0x20cf,0x797,0x12a,0x798,0x12c,0x799,0x12e,0x79a,0x130,0x79b,0x1cf, -0x79e,0x208,0x79f,0x20a,0x7b7,0x1eca,0x7ba,0x1e2c,0x87bd,0x1ec8,0x790,0x1f8,0x791,0x143,0x793,0xd1, -0x796,0x145,0x79a,0x1e44,0x79b,0x147,0x7b7,0x1e46,0x7b8,0x1e48,0x87b9,0x1e4a,0x790,0xd2,0x791,0xd3, -0x792,0x20d4,0x793,0x20d5,0x794,0x20d6,0x797,0x214c,0x798,0x14e,0x799,0x21ea,0x79a,0x222e,0x79b,0x1d1, -0x79c,0x150,0x79d,0x21a0,0x79e,0x20c,0x79f,0x20e,0x7b7,0x3ecc,0x87bd,0x1ece,0x790,0xd9,0x791,0xda, -0x792,0xdb,0x793,0x2168,0x794,0x20dc,0x795,0x16e,0x797,0x216a,0x798,0x16c,0x799,0x172,0x79b,0x1d3, -0x79c,0x170,0x79d,0x21af,0x79e,0x214,0x79f,0x216,0x7b7,0x1ee4,0x7b9,0x1e76,0x7ba,0x1e74,0x7bc,0x1e72, -0x87bd,0x1ee6,0x790,0x1ef2,0x791,0xdd,0x792,0x176,0x793,0x1ef8,0x794,0x178,0x797,0x232,0x79a,0x1e8e, -0x7b7,0x1ef4,0x87bd,0x1ef6,0x790,0xe0,0x791,0xe1,0x792,0x20e2,0x793,0xe3,0x794,0x20e4,0x795,0x20e5, -0x797,0x101,0x798,0x2103,0x799,0x105,0x79a,0x2227,0x79b,0x1ce,0x79e,0x201,0x79f,0x203,0x7b6,0x1e01, -0x7b7,0x3ea1,0x87bd,0x1ea3,0x791,0x107,0x792,0x109,0x796,0x20e7,0x79a,0x10b,0x879b,0x10d,0x790,0xe8, -0x791,0xe9,0x792,0x20ea,0x793,0x1ebd,0x794,0xeb,0x796,0x2229,0x797,0x2113,0x798,0x115,0x799,0x119, -0x79a,0x117,0x79b,0x11b,0x79e,0x205,0x79f,0x207,0x7b7,0x3eb9,0x7b9,0x1e19,0x7ba,0x1e1b,0x87bd,0x1ebb, -0x790,0xec,0x791,0xed,0x792,0xee,0x793,0x129,0x794,0x20ef,0x797,0x12b,0x798,0x12d,0x799,0x12f, -0x79b,0x1d0,0x79e,0x209,0x79f,0x20b,0x7b7,0x1ecb,0x7ba,0x1e2d,0x87bd,0x1ec9,0x790,0x1f9,0x791,0x144, -0x793,0xf1,0x796,0x146,0x79a,0x1e45,0x79b,0x148,0x7b7,0x1e47,0x7b8,0x1e49,0x87b9,0x1e4b,0x790,0xf2, -0x791,0xf3,0x792,0x20f4,0x793,0x20f5,0x794,0x20f6,0x797,0x214d,0x798,0x14f,0x799,0x21eb,0x79a,0x222f, -0x79b,0x1d2,0x79c,0x151,0x79d,0x21a1,0x79e,0x20d,0x79f,0x20f,0x7b7,0x3ecd,0x87bd,0x1ecf,0x790,0xf9, -0x791,0xfa,0x792,0xfb,0x793,0x2169,0x794,0x20fc,0x795,0x16f,0x797,0x216b,0x798,0x16d,0x799,0x173, -0x79b,0x1d4,0x79c,0x171,0x79d,0x21b0,0x79e,0x215,0x79f,0x217,0x7b7,0x1ee5,0x7b9,0x1e77,0x7ba,0x1e75, -0x7bc,0x1e73,0x87bd,0x1ee7,0x790,0x1ef3,0x791,0xfd,0x792,0x177,0x793,0x1ef9,0x794,0xff,0x795,0x1e99, -0x797,0x233,0x79a,0x1e8f,0x7b7,0x1ef5,0x87bd,0x1ef7,0x796,0x1e10,0x79a,0x1e0a,0x79b,0x10e,0x7b7,0x1e0c, -0x7b8,0x1e0e,0x87b9,0x1e12,0x796,0x1e11,0x79a,0x1e0b,0x79b,0x10f,0x7b7,0x1e0d,0x7b8,0x1e0f,0x87b9,0x1e13, -0x791,0x1f4,0x792,0x11c,0x796,0x122,0x797,0x1e20,0x798,0x11e,0x79a,0x120,0x879b,0x1e6,0x791,0x1f5, -0x792,0x11d,0x796,0x123,0x797,0x1e21,0x798,0x11f,0x79a,0x121,0x879b,0x1e7,0x792,0x124,0x794,0x1e26, -0x796,0x1e28,0x79a,0x1e22,0x79b,0x21e,0x7b7,0x1e24,0x87bb,0x1e2a,0x792,0x125,0x794,0x1e27,0x796,0x1e29, -0x79a,0x1e23,0x79b,0x21f,0x7b7,0x1e25,0x7b8,0x1e96,0x87bb,0x1e2b,0x8792,0x134,0x792,0x135,0x879b,0x1f0, -0x791,0x1e30,0x796,0x136,0x79b,0x1e8,0x7b7,0x1e32,0x87b8,0x1e34,0x791,0x1e31,0x796,0x137,0x79b,0x1e9, -0x7b7,0x1e33,0x87b8,0x1e35,0x791,0x139,0x796,0x13b,0x79b,0x13d,0x7b7,0x3e36,0x7b8,0x1e3a,0x87b9,0x1e3c, -0x791,0x13a,0x796,0x13c,0x79b,0x13e,0x7b7,0x3e37,0x7b8,0x1e3b,0x87b9,0x1e3d,0x791,0x154,0x796,0x156, -0x79a,0x1e58,0x79b,0x158,0x79e,0x210,0x79f,0x212,0x7b7,0x3e5a,0x87b8,0x1e5e,0x791,0x155,0x796,0x157, -0x79a,0x1e59,0x79b,0x159,0x79e,0x211,0x79f,0x213,0x7b7,0x3e5b,0x87b8,0x1e5f,0x791,0x215a,0x792,0x15c, -0x796,0x15e,0x79a,0x1e60,0x79b,0x2160,0x7a0,0x218,0x87b7,0x3e62,0x791,0x215b,0x792,0x15d,0x796,0x15f, -0x79a,0x1e61,0x79b,0x2161,0x7a0,0x219,0x87b7,0x3e63,0x796,0x162,0x79a,0x1e6a,0x79b,0x164,0x7a0,0x21a, -0x7b7,0x1e6c,0x7b8,0x1e6e,0x87b9,0x1e70,0x794,0x1e97,0x796,0x163,0x79a,0x1e6b,0x79b,0x165,0x7a0,0x21b, -0x7b7,0x1e6d,0x7b8,0x1e6f,0x87b9,0x1e71,0x790,0x1e80,0x791,0x1e82,0x792,0x174,0x794,0x1e84,0x79a,0x1e86, -0x87b7,0x1e88,0x790,0x1e81,0x791,0x1e83,0x792,0x175,0x794,0x1e85,0x795,0x1e98,0x79a,0x1e87,0x87b7,0x1e89, -0x791,0x179,0x792,0x1e90,0x79a,0x17b,0x79b,0x17d,0x7b7,0x1e92,0x87b8,0x1e94,0x791,0x17a,0x792,0x1e91, -0x79a,0x17c,0x79b,0x17e,0x7b7,0x1e93,0x87b8,0x1e95,0x790,0x1db,0x791,0x1d7,0x797,0x1d5,0x879b,0x1d9, -0x790,0x1dc,0x791,0x1d8,0x797,0x1d6,0x879b,0x1da,0x8797,0x1de,0x8797,0x1df,0x8797,0x1e0,0x8797,0x1e1, -0x791,0x1fc,0x8797,0x1e2,0x791,0x1fd,0x8797,0x1e3,0x8797,0x1ec,0x8797,0x1ed,0x879b,0x1ee,0x879b,0x1ef, -0x8791,0x1fa,0x8791,0x1fb,0x8791,0x1fe,0x8791,0x1ff,0x8797,0x22a,0x8797,0x22b,0x791,0x1e4c,0x794,0x1e4e, -0x8797,0x22c,0x791,0x1e4d,0x794,0x1e4f,0x8797,0x22d,0x8797,0x230,0x8797,0x231,0x790,0x1fed,0x791,0x385, -0x87c0,0x1fc1,0x790,0x1fba,0x791,0x386,0x797,0x1fb9,0x798,0x1fb8,0x7be,0x3f08,0x7bf,0x3f09,0x87c1,0x1fbc, -0x790,0x1fc8,0x791,0x388,0x7be,0x3f18,0x87bf,0x3f19,0x790,0x1fca,0x791,0x389,0x7be,0x3f28,0x7bf,0x3f29, -0x87c1,0x1fcc,0x790,0x1fda,0x791,0x38a,0x794,0x3aa,0x797,0x1fd9,0x798,0x1fd8,0x7be,0x3f38,0x87bf,0x3f39, -0x790,0x1ff8,0x791,0x38c,0x7be,0x3f48,0x87bf,0x3f49,0x790,0x1fea,0x791,0x38e,0x794,0x3ab,0x797,0x1fe9, -0x798,0x1fe8,0x87bf,0x3f59,0x790,0x1ffa,0x791,0x38f,0x7be,0x3f68,0x7bf,0x3f69,0x87c1,0x1ffc,0x790,0x1fd2, -0x791,0x390,0x87c0,0x1fd7,0x790,0x3f70,0x791,0x23ac,0x797,0x1fb1,0x798,0x1fb0,0x7be,0x3f00,0x7bf,0x3f01, -0x7c0,0x3fb6,0x87c1,0x1fb3,0x790,0x1f72,0x791,0x3ad,0x7be,0x3f10,0x87bf,0x3f11,0x790,0x3f74,0x791,0x23ae, -0x7be,0x3f20,0x7bf,0x3f21,0x7c0,0x3fc6,0x87c1,0x1fc3,0x790,0x1f76,0x791,0x3af,0x794,0x23ca,0x797,0x1fd1, -0x798,0x1fd0,0x7be,0x3f30,0x7bf,0x3f31,0x87c0,0x1fd6,0x790,0x1fe2,0x791,0x3b0,0x87c0,0x1fe7,0x790,0x1f7a, -0x791,0x3cd,0x794,0x23cb,0x797,0x1fe1,0x798,0x1fe0,0x7be,0x3f50,0x7bf,0x3f51,0x87c0,0x1fe6,0x790,0x1f78, -0x791,0x3cc,0x7be,0x3f40,0x87bf,0x3f41,0x790,0x3f7c,0x791,0x23ce,0x7be,0x3f60,0x7bf,0x3f61,0x7c0,0x3ff6, -0x87c1,0x1ff3,0x791,0x3d3,0x8794,0x3d4,0x790,0x400,0x794,0x401,0x8798,0x4d6,0x8791,0x403,0x8794,0x407, -0x8791,0x40c,0x790,0x40d,0x794,0x4e4,0x797,0x4e2,0x8798,0x419,0x794,0x4f0,0x797,0x4ee,0x798,0x40e, -0x879c,0x4f2,0x790,0x45d,0x794,0x4e5,0x797,0x4e3,0x8798,0x439,0x790,0x450,0x794,0x451,0x8798,0x4d7, -0x8791,0x453,0x8794,0x457,0x8791,0x45c,0x794,0x4f1,0x797,0x4ef,0x798,0x45e,0x879c,0x4f3,0x879e,0x476, -0x879e,0x477,0x794,0x4dc,0x8798,0x4c1,0x794,0x4dd,0x8798,0x4c2,0x794,0x4d2,0x8798,0x4d0,0x794,0x4d3, -0x8798,0x4d1,0x8794,0x4da,0x8794,0x4db,0x8794,0x4de,0x8794,0x4df,0x8794,0x4e6,0x8794,0x4e7,0x8794,0x4ea, -0x8794,0x4eb,0x8794,0x4ec,0x8794,0x4ed,0x8794,0x4f4,0x8794,0x4f5,0x8794,0x4f8,0x8794,0x4f9,0x7a1,0x622, -0x7a2,0x623,0x87a3,0x625,0x87a2,0x624,0x87a2,0x626,0x87a2,0x6c0,0x87a2,0x6c2,0x87a2,0x6d3,0x87a4,0x929, -0x87a4,0x931,0x87a4,0x934,0x7a5,0x9cb,0x87a6,0x9cc,0x7a7,0xb48,0x7a8,0xb4b,0x87a9,0xb4c,0x87aa,0xb94, -0x7aa,0xbcc,0x87ab,0xbca,0x87ab,0xbcb,0x87ac,0xc48,0x87ad,0xcc0,0x7ad,0xcc7,0x7ae,0xcc8,0x87af,0x2cca, -0x87ad,0xccb,0x7b0,0xd4a,0x87b1,0xd4c,0x87b0,0xd4b,0x7b2,0xdda,0x7b3,0x2ddc,0x87b4,0xdde,0x87b2,0xddd, -0x87b5,0x1026,0x79a,0x1e02,0x7b7,0x1e04,0x87b8,0x1e06,0x79a,0x1e03,0x7b7,0x1e05,0x87b8,0x1e07,0x8791,0x1e08, -0x8791,0x1e09,0x790,0x1e14,0x8791,0x1e16,0x790,0x1e15,0x8791,0x1e17,0x8798,0x1e1c,0x8798,0x1e1d,0x879a,0x1e1e, -0x879a,0x1e1f,0x8791,0x1e2e,0x8791,0x1e2f,0x8797,0x1e38,0x8797,0x1e39,0x791,0x1e3e,0x79a,0x1e40,0x87b7,0x1e42, -0x791,0x1e3f,0x79a,0x1e41,0x87b7,0x1e43,0x790,0x1e50,0x8791,0x1e52,0x790,0x1e51,0x8791,0x1e53,0x791,0x1e54, -0x879a,0x1e56,0x791,0x1e55,0x879a,0x1e57,0x8797,0x1e5c,0x8797,0x1e5d,0x879a,0x1e64,0x879a,0x1e65,0x879a,0x1e66, -0x879a,0x1e67,0x879a,0x1e68,0x879a,0x1e69,0x8791,0x1e78,0x8791,0x1e79,0x8794,0x1e7a,0x8794,0x1e7b,0x793,0x1e7c, -0x87b7,0x1e7e,0x793,0x1e7d,0x87b7,0x1e7f,0x794,0x1e8c,0x879a,0x1e8a,0x794,0x1e8d,0x879a,0x1e8b,0x879a,0x1e9b, -0x790,0x1ea6,0x791,0x1ea4,0x793,0x1eaa,0x87bd,0x1ea8,0x790,0x1ea7,0x791,0x1ea5,0x793,0x1eab,0x87bd,0x1ea9, -0x792,0x1eac,0x8798,0x1eb6,0x792,0x1ead,0x8798,0x1eb7,0x790,0x1eb0,0x791,0x1eae,0x793,0x1eb4,0x87bd,0x1eb2, -0x790,0x1eb1,0x791,0x1eaf,0x793,0x1eb5,0x87bd,0x1eb3,0x790,0x1ec0,0x791,0x1ebe,0x793,0x1ec4,0x87bd,0x1ec2, -0x790,0x1ec1,0x791,0x1ebf,0x793,0x1ec5,0x87bd,0x1ec3,0x8792,0x1ec6,0x8792,0x1ec7,0x790,0x1ed2,0x791,0x1ed0, -0x793,0x1ed6,0x87bd,0x1ed4,0x790,0x1ed3,0x791,0x1ed1,0x793,0x1ed7,0x87bd,0x1ed5,0x8792,0x1ed8,0x8792,0x1ed9, -0x790,0x1edc,0x791,0x1eda,0x793,0x1ee0,0x7b7,0x1ee2,0x87bd,0x1ede,0x790,0x1edd,0x791,0x1edb,0x793,0x1ee1, -0x7b7,0x1ee3,0x87bd,0x1edf,0x790,0x1eea,0x791,0x1ee8,0x793,0x1eee,0x7b7,0x1ef0,0x87bd,0x1eec,0x790,0x1eeb, -0x791,0x1ee9,0x793,0x1eef,0x7b7,0x1ef1,0x87bd,0x1eed,0x790,0x3f02,0x791,0x3f04,0x7c0,0x3f06,0x87c1,0x1f80, -0x790,0x3f03,0x791,0x3f05,0x7c0,0x3f07,0x87c1,0x1f81,0x790,0x3f0a,0x791,0x3f0c,0x7c0,0x3f0e,0x87c1,0x1f88, -0x790,0x3f0b,0x791,0x3f0d,0x7c0,0x3f0f,0x87c1,0x1f89,0x790,0x1f12,0x8791,0x1f14,0x790,0x1f13,0x8791,0x1f15, -0x790,0x1f1a,0x8791,0x1f1c,0x790,0x1f1b,0x8791,0x1f1d,0x790,0x3f22,0x791,0x3f24,0x7c0,0x3f26,0x87c1,0x1f90, -0x790,0x3f23,0x791,0x3f25,0x7c0,0x3f27,0x87c1,0x1f91,0x790,0x3f2a,0x791,0x3f2c,0x7c0,0x3f2e,0x87c1,0x1f98, -0x790,0x3f2b,0x791,0x3f2d,0x7c0,0x3f2f,0x87c1,0x1f99,0x790,0x1f32,0x791,0x1f34,0x87c0,0x1f36,0x790,0x1f33, -0x791,0x1f35,0x87c0,0x1f37,0x790,0x1f3a,0x791,0x1f3c,0x87c0,0x1f3e,0x790,0x1f3b,0x791,0x1f3d,0x87c0,0x1f3f, -0x790,0x1f42,0x8791,0x1f44,0x790,0x1f43,0x8791,0x1f45,0x790,0x1f4a,0x8791,0x1f4c,0x790,0x1f4b,0x8791,0x1f4d, -0x790,0x1f52,0x791,0x1f54,0x87c0,0x1f56,0x790,0x1f53,0x791,0x1f55,0x87c0,0x1f57,0x790,0x1f5b,0x791,0x1f5d, -0x87c0,0x1f5f,0x790,0x3f62,0x791,0x3f64,0x7c0,0x3f66,0x87c1,0x1fa0,0x790,0x3f63,0x791,0x3f65,0x7c0,0x3f67, -0x87c1,0x1fa1,0x790,0x3f6a,0x791,0x3f6c,0x7c0,0x3f6e,0x87c1,0x1fa8,0x790,0x3f6b,0x791,0x3f6d,0x7c0,0x3f6f, -0x87c1,0x1fa9,0x87c1,0x1f82,0x87c1,0x1f83,0x87c1,0x1f84,0x87c1,0x1f85,0x87c1,0x1f86,0x87c1,0x1f87,0x87c1,0x1f8a, -0x87c1,0x1f8b,0x87c1,0x1f8c,0x87c1,0x1f8d,0x87c1,0x1f8e,0x87c1,0x1f8f,0x87c1,0x1f92,0x87c1,0x1f93,0x87c1,0x1f94, -0x87c1,0x1f95,0x87c1,0x1f96,0x87c1,0x1f97,0x87c1,0x1f9a,0x87c1,0x1f9b,0x87c1,0x1f9c,0x87c1,0x1f9d,0x87c1,0x1f9e, -0x87c1,0x1f9f,0x87c1,0x1fa2,0x87c1,0x1fa3,0x87c1,0x1fa4,0x87c1,0x1fa5,0x87c1,0x1fa6,0x87c1,0x1fa7,0x87c1,0x1faa, -0x87c1,0x1fab,0x87c1,0x1fac,0x87c1,0x1fad,0x87c1,0x1fae,0x87c1,0x1faf,0x87c1,0x1fb2,0x87c1,0x1fb4,0x87c1,0x1fb7, -0x87c1,0x1fc2,0x87c1,0x1fc4,0x87c1,0x1fc7,0x790,0x1fcd,0x791,0x1fce,0x87c0,0x1fcf,0x790,0x1fdd,0x791,0x1fde, -0x87c0,0x1fdf,0x7be,0x1fe4,0x87bf,0x1fe5,0x87bf,0x1fec,0x87c1,0x1ff2,0x87c1,0x1ff4,0x87c1,0x1ff7,0x87c2,0x8000, -0x219a,0x87c2,0x8000,0x219b,0x87c2,0x8000,0x21ae,0x87c2,0x8000,0x21cd,0x87c2,0x8000,0x21ce,0x87c2,0x8000,0x21cf, -0x87c2,0x8000,0x2204,0x87c2,0x8000,0x2209,0x87c2,0x8000,0x220c,0x87c2,0x8000,0x2224,0x87c2,0x8000,0x2226,0x87c2, -0x8000,0x2241,0x87c2,0x8000,0x2244,0x87c2,0x8000,0x2247,0x87c2,0x8000,0x2249,0x87c2,0x8000,0x2260,0x87c2,0x8000, -0x2262,0x87c2,0x8000,0x226d,0x87c2,0x8000,0x226e,0x87c2,0x8000,0x226f,0x87c2,0x8000,0x2270,0x87c2,0x8000,0x2271, -0x87c2,0x8000,0x2274,0x87c2,0x8000,0x2275,0x87c2,0x8000,0x2278,0x87c2,0x8000,0x2279,0x87c2,0x8000,0x2280,0x87c2, -0x8000,0x2281,0x87c2,0x8000,0x2284,0x87c2,0x8000,0x2285,0x87c2,0x8000,0x2288,0x87c2,0x8000,0x2289,0x87c2,0x8000, -0x22ac,0x87c2,0x8000,0x22ad,0x87c2,0x8000,0x22ae,0x87c2,0x8000,0x22af,0x87c2,0x8000,0x22e0,0x87c2,0x8000,0x22e1, -0x87c2,0x8000,0x22e2,0x87c2,0x8000,0x22e3,0x87c2,0x8000,0x22ea,0x87c2,0x8000,0x22eb,0x87c2,0x8000,0x22ec,0x87c2, -0x8000,0x22ed,0x87c3,0x8000,0x304c,0x87c3,0x8000,0x304e,0x87c3,0x8000,0x3050,0x87c3,0x8000,0x3052,0x87c3,0x8000, -0x3054,0x87c3,0x8000,0x3056,0x87c3,0x8000,0x3058,0x87c3,0x8000,0x305a,0x87c3,0x8000,0x305c,0x87c3,0x8000,0x305e, -0x87c3,0x8000,0x3060,0x87c3,0x8000,0x3062,0x87c3,0x8000,0x3065,0x87c3,0x8000,0x3067,0x87c3,0x8000,0x3069,0x7c3, -0x8000,0x3070,0x87c4,0x8000,0x3071,0x7c3,0x8000,0x3073,0x87c4,0x8000,0x3074,0x7c3,0x8000,0x3076,0x87c4,0x8000, -0x3077,0x7c3,0x8000,0x3079,0x87c4,0x8000,0x307a,0x7c3,0x8000,0x307c,0x87c4,0x8000,0x307d,0x87c3,0x8000,0x3094, -0x87c3,0x8000,0x309e,0x87c3,0x8000,0x30ac,0x87c3,0x8000,0x30ae,0x87c3,0x8000,0x30b0,0x87c3,0x8000,0x30b2,0x87c3, -0x8000,0x30b4,0x87c3,0x8000,0x30b6,0x87c3,0x8000,0x30b8,0x87c3,0x8000,0x30ba,0x87c3,0x8000,0x30bc,0x87c3,0x8000, -0x30be,0x87c3,0x8000,0x30c0,0x87c3,0x8000,0x30c2,0x87c3,0x8000,0x30c5,0x87c3,0x8000,0x30c7,0x87c3,0x8000,0x30c9, -0x7c3,0x8000,0x30d0,0x87c4,0x8000,0x30d1,0x7c3,0x8000,0x30d3,0x87c4,0x8000,0x30d4,0x7c3,0x8000,0x30d6,0x87c4, -0x8000,0x30d7,0x7c3,0x8000,0x30d9,0x87c4,0x8000,0x30da,0x7c3,0x8000,0x30dc,0x87c4,0x8000,0x30dd,0x87c3,0x8000, -0x30f4,0x87c3,0x8000,0x30f7,0x87c3,0x8000,0x30f8,0x87c3,0x8000,0x30f9,0x87c3,0x8000,0x30fa,0x87c3,0x8000,0x30fe +static const uint16_t combiningTable[1959]={ +0x7a6,0xc0,0x7a7,0xc1,0x7a8,0x20c2,0x7a9,0xc3,0x7aa,0x20c4,0x7ab,0x20c5,0x7ad,0x100,0x7ae,0x2102, +0x7af,0x104,0x7b0,0x2226,0x7b1,0x1cd,0x7b4,0x200,0x7b5,0x202,0x7cd,0x1e00,0x7ce,0x3ea0,0x87d4,0x1ea2, +0x7a7,0x106,0x7a8,0x108,0x7ac,0x20c7,0x7b0,0x10a,0x87b1,0x10c,0x7a6,0xc8,0x7a7,0xc9,0x7a8,0x20ca, +0x7a9,0x1ebc,0x7aa,0xcb,0x7ac,0x2228,0x7ad,0x2112,0x7ae,0x114,0x7af,0x118,0x7b0,0x116,0x7b1,0x11a, +0x7b4,0x204,0x7b5,0x206,0x7ce,0x3eb8,0x7d0,0x1e18,0x7d1,0x1e1a,0x87d4,0x1eba,0x7a6,0xcc,0x7a7,0xcd, +0x7a8,0xce,0x7a9,0x128,0x7aa,0x20cf,0x7ad,0x12a,0x7ae,0x12c,0x7af,0x12e,0x7b0,0x130,0x7b1,0x1cf, +0x7b4,0x208,0x7b5,0x20a,0x7ce,0x1eca,0x7d1,0x1e2c,0x87d4,0x1ec8,0x7a6,0x1f8,0x7a7,0x143,0x7a9,0xd1, +0x7ac,0x145,0x7b0,0x1e44,0x7b1,0x147,0x7ce,0x1e46,0x7cf,0x1e48,0x87d0,0x1e4a,0x7a6,0xd2,0x7a7,0xd3, +0x7a8,0x20d4,0x7a9,0x20d5,0x7aa,0x20d6,0x7ad,0x214c,0x7ae,0x14e,0x7af,0x21ea,0x7b0,0x222e,0x7b1,0x1d1, +0x7b2,0x150,0x7b3,0x21a0,0x7b4,0x20c,0x7b5,0x20e,0x7ce,0x3ecc,0x87d4,0x1ece,0x7a6,0xd9,0x7a7,0xda, +0x7a8,0xdb,0x7a9,0x2168,0x7aa,0x20dc,0x7ab,0x16e,0x7ad,0x216a,0x7ae,0x16c,0x7af,0x172,0x7b1,0x1d3, +0x7b2,0x170,0x7b3,0x21af,0x7b4,0x214,0x7b5,0x216,0x7ce,0x1ee4,0x7d0,0x1e76,0x7d1,0x1e74,0x7d3,0x1e72, +0x87d4,0x1ee6,0x7a6,0x1ef2,0x7a7,0xdd,0x7a8,0x176,0x7a9,0x1ef8,0x7aa,0x178,0x7ad,0x232,0x7b0,0x1e8e, +0x7ce,0x1ef4,0x87d4,0x1ef6,0x7a6,0xe0,0x7a7,0xe1,0x7a8,0x20e2,0x7a9,0xe3,0x7aa,0x20e4,0x7ab,0x20e5, +0x7ad,0x101,0x7ae,0x2103,0x7af,0x105,0x7b0,0x2227,0x7b1,0x1ce,0x7b4,0x201,0x7b5,0x203,0x7cd,0x1e01, +0x7ce,0x3ea1,0x87d4,0x1ea3,0x7a7,0x107,0x7a8,0x109,0x7ac,0x20e7,0x7b0,0x10b,0x87b1,0x10d,0x7a6,0xe8, +0x7a7,0xe9,0x7a8,0x20ea,0x7a9,0x1ebd,0x7aa,0xeb,0x7ac,0x2229,0x7ad,0x2113,0x7ae,0x115,0x7af,0x119, +0x7b0,0x117,0x7b1,0x11b,0x7b4,0x205,0x7b5,0x207,0x7ce,0x3eb9,0x7d0,0x1e19,0x7d1,0x1e1b,0x87d4,0x1ebb, +0x7a6,0xec,0x7a7,0xed,0x7a8,0xee,0x7a9,0x129,0x7aa,0x20ef,0x7ad,0x12b,0x7ae,0x12d,0x7af,0x12f, +0x7b1,0x1d0,0x7b4,0x209,0x7b5,0x20b,0x7ce,0x1ecb,0x7d1,0x1e2d,0x87d4,0x1ec9,0x7a6,0x1f9,0x7a7,0x144, +0x7a9,0xf1,0x7ac,0x146,0x7b0,0x1e45,0x7b1,0x148,0x7ce,0x1e47,0x7cf,0x1e49,0x87d0,0x1e4b,0x7a6,0xf2, +0x7a7,0xf3,0x7a8,0x20f4,0x7a9,0x20f5,0x7aa,0x20f6,0x7ad,0x214d,0x7ae,0x14f,0x7af,0x21eb,0x7b0,0x222f, +0x7b1,0x1d2,0x7b2,0x151,0x7b3,0x21a1,0x7b4,0x20d,0x7b5,0x20f,0x7ce,0x3ecd,0x87d4,0x1ecf,0x7a6,0xf9, +0x7a7,0xfa,0x7a8,0xfb,0x7a9,0x2169,0x7aa,0x20fc,0x7ab,0x16f,0x7ad,0x216b,0x7ae,0x16d,0x7af,0x173, +0x7b1,0x1d4,0x7b2,0x171,0x7b3,0x21b0,0x7b4,0x215,0x7b5,0x217,0x7ce,0x1ee5,0x7d0,0x1e77,0x7d1,0x1e75, +0x7d3,0x1e73,0x87d4,0x1ee7,0x7a6,0x1ef3,0x7a7,0xfd,0x7a8,0x177,0x7a9,0x1ef9,0x7aa,0xff,0x7ab,0x1e99, +0x7ad,0x233,0x7b0,0x1e8f,0x7ce,0x1ef5,0x87d4,0x1ef7,0x7ac,0x1e10,0x7b0,0x1e0a,0x7b1,0x10e,0x7ce,0x1e0c, +0x7cf,0x1e0e,0x87d0,0x1e12,0x7ac,0x1e11,0x7b0,0x1e0b,0x7b1,0x10f,0x7ce,0x1e0d,0x7cf,0x1e0f,0x87d0,0x1e13, +0x7a7,0x1f4,0x7a8,0x11c,0x7ac,0x122,0x7ad,0x1e20,0x7ae,0x11e,0x7b0,0x120,0x87b1,0x1e6,0x7a7,0x1f5, +0x7a8,0x11d,0x7ac,0x123,0x7ad,0x1e21,0x7ae,0x11f,0x7b0,0x121,0x87b1,0x1e7,0x7a8,0x124,0x7aa,0x1e26, +0x7ac,0x1e28,0x7b0,0x1e22,0x7b1,0x21e,0x7ce,0x1e24,0x87d2,0x1e2a,0x7a8,0x125,0x7aa,0x1e27,0x7ac,0x1e29, +0x7b0,0x1e23,0x7b1,0x21f,0x7ce,0x1e25,0x7cf,0x1e96,0x87d2,0x1e2b,0x87a8,0x134,0x7a8,0x135,0x87b1,0x1f0, +0x7a7,0x1e30,0x7ac,0x136,0x7b1,0x1e8,0x7ce,0x1e32,0x87cf,0x1e34,0x7a7,0x1e31,0x7ac,0x137,0x7b1,0x1e9, +0x7ce,0x1e33,0x87cf,0x1e35,0x7a7,0x139,0x7ac,0x13b,0x7b1,0x13d,0x7ce,0x3e36,0x7cf,0x1e3a,0x87d0,0x1e3c, +0x7a7,0x13a,0x7ac,0x13c,0x7b1,0x13e,0x7ce,0x3e37,0x7cf,0x1e3b,0x87d0,0x1e3d,0x7a7,0x154,0x7ac,0x156, +0x7b0,0x1e58,0x7b1,0x158,0x7b4,0x210,0x7b5,0x212,0x7ce,0x3e5a,0x87cf,0x1e5e,0x7a7,0x155,0x7ac,0x157, +0x7b0,0x1e59,0x7b1,0x159,0x7b4,0x211,0x7b5,0x213,0x7ce,0x3e5b,0x87cf,0x1e5f,0x7a7,0x215a,0x7a8,0x15c, +0x7ac,0x15e,0x7b0,0x1e60,0x7b1,0x2160,0x7b6,0x218,0x87ce,0x3e62,0x7a7,0x215b,0x7a8,0x15d,0x7ac,0x15f, +0x7b0,0x1e61,0x7b1,0x2161,0x7b6,0x219,0x87ce,0x3e63,0x7ac,0x162,0x7b0,0x1e6a,0x7b1,0x164,0x7b6,0x21a, +0x7ce,0x1e6c,0x7cf,0x1e6e,0x87d0,0x1e70,0x7aa,0x1e97,0x7ac,0x163,0x7b0,0x1e6b,0x7b1,0x165,0x7b6,0x21b, +0x7ce,0x1e6d,0x7cf,0x1e6f,0x87d0,0x1e71,0x7a6,0x1e80,0x7a7,0x1e82,0x7a8,0x174,0x7aa,0x1e84,0x7b0,0x1e86, +0x87ce,0x1e88,0x7a6,0x1e81,0x7a7,0x1e83,0x7a8,0x175,0x7aa,0x1e85,0x7ab,0x1e98,0x7b0,0x1e87,0x87ce,0x1e89, +0x7a7,0x179,0x7a8,0x1e90,0x7b0,0x17b,0x7b1,0x17d,0x7ce,0x1e92,0x87cf,0x1e94,0x7a7,0x17a,0x7a8,0x1e91, +0x7b0,0x17c,0x7b1,0x17e,0x7ce,0x1e93,0x87cf,0x1e95,0x7a6,0x1db,0x7a7,0x1d7,0x7ad,0x1d5,0x87b1,0x1d9, +0x7a6,0x1dc,0x7a7,0x1d8,0x7ad,0x1d6,0x87b1,0x1da,0x87ad,0x1de,0x87ad,0x1df,0x87ad,0x1e0,0x87ad,0x1e1, +0x7a7,0x1fc,0x87ad,0x1e2,0x7a7,0x1fd,0x87ad,0x1e3,0x87ad,0x1ec,0x87ad,0x1ed,0x87b1,0x1ee,0x87b1,0x1ef, +0x87a7,0x1fa,0x87a7,0x1fb,0x87a7,0x1fe,0x87a7,0x1ff,0x87ad,0x22a,0x87ad,0x22b,0x7a7,0x1e4c,0x7aa,0x1e4e, +0x87ad,0x22c,0x7a7,0x1e4d,0x7aa,0x1e4f,0x87ad,0x22d,0x87ad,0x230,0x87ad,0x231,0x7a6,0x1fed,0x7a7,0x385, +0x87d7,0x1fc1,0x7a6,0x1fba,0x7a7,0x386,0x7ad,0x1fb9,0x7ae,0x1fb8,0x7d5,0x3f08,0x7d6,0x3f09,0x87d8,0x1fbc, +0x7a6,0x1fc8,0x7a7,0x388,0x7d5,0x3f18,0x87d6,0x3f19,0x7a6,0x1fca,0x7a7,0x389,0x7d5,0x3f28,0x7d6,0x3f29, +0x87d8,0x1fcc,0x7a6,0x1fda,0x7a7,0x38a,0x7aa,0x3aa,0x7ad,0x1fd9,0x7ae,0x1fd8,0x7d5,0x3f38,0x87d6,0x3f39, +0x7a6,0x1ff8,0x7a7,0x38c,0x7d5,0x3f48,0x87d6,0x3f49,0x7a6,0x1fea,0x7a7,0x38e,0x7aa,0x3ab,0x7ad,0x1fe9, +0x7ae,0x1fe8,0x87d6,0x3f59,0x7a6,0x1ffa,0x7a7,0x38f,0x7d5,0x3f68,0x7d6,0x3f69,0x87d8,0x1ffc,0x7a6,0x1fd2, +0x7a7,0x390,0x87d7,0x1fd7,0x7a6,0x3f70,0x7a7,0x23ac,0x7ad,0x1fb1,0x7ae,0x1fb0,0x7d5,0x3f00,0x7d6,0x3f01, +0x7d7,0x3fb6,0x87d8,0x1fb3,0x7a6,0x1f72,0x7a7,0x3ad,0x7d5,0x3f10,0x87d6,0x3f11,0x7a6,0x3f74,0x7a7,0x23ae, +0x7d5,0x3f20,0x7d6,0x3f21,0x7d7,0x3fc6,0x87d8,0x1fc3,0x7a6,0x1f76,0x7a7,0x3af,0x7aa,0x23ca,0x7ad,0x1fd1, +0x7ae,0x1fd0,0x7d5,0x3f30,0x7d6,0x3f31,0x87d7,0x1fd6,0x7a6,0x1fe2,0x7a7,0x3b0,0x87d7,0x1fe7,0x7a6,0x1f7a, +0x7a7,0x3cd,0x7aa,0x23cb,0x7ad,0x1fe1,0x7ae,0x1fe0,0x7d5,0x3f50,0x7d6,0x3f51,0x87d7,0x1fe6,0x7a6,0x1f78, +0x7a7,0x3cc,0x7d5,0x3f40,0x87d6,0x3f41,0x7a6,0x3f7c,0x7a7,0x23ce,0x7d5,0x3f60,0x7d6,0x3f61,0x7d7,0x3ff6, +0x87d8,0x1ff3,0x7a7,0x3d3,0x87aa,0x3d4,0x7a6,0x400,0x7aa,0x401,0x87ae,0x4d6,0x87a7,0x403,0x87aa,0x407, +0x87a7,0x40c,0x7a6,0x40d,0x7aa,0x4e4,0x7ad,0x4e2,0x87ae,0x419,0x7aa,0x4f0,0x7ad,0x4ee,0x7ae,0x40e, +0x87b2,0x4f2,0x7a6,0x45d,0x7aa,0x4e5,0x7ad,0x4e3,0x87ae,0x439,0x7a6,0x450,0x7aa,0x451,0x87ae,0x4d7, +0x87a7,0x453,0x87aa,0x457,0x87a7,0x45c,0x7aa,0x4f1,0x7ad,0x4ef,0x7ae,0x45e,0x87b2,0x4f3,0x87b4,0x476, +0x87b4,0x477,0x7aa,0x4dc,0x87ae,0x4c1,0x7aa,0x4dd,0x87ae,0x4c2,0x7aa,0x4d2,0x87ae,0x4d0,0x7aa,0x4d3, +0x87ae,0x4d1,0x87aa,0x4da,0x87aa,0x4db,0x87aa,0x4de,0x87aa,0x4df,0x87aa,0x4e6,0x87aa,0x4e7,0x87aa,0x4ea, +0x87aa,0x4eb,0x87aa,0x4ec,0x87aa,0x4ed,0x87aa,0x4f4,0x87aa,0x4f5,0x87aa,0x4f8,0x87aa,0x4f9,0x7b7,0x622, +0x7b8,0x623,0x87b9,0x625,0x87b8,0x624,0x87b8,0x626,0x87b8,0x6c0,0x87b8,0x6c2,0x87b8,0x6d3,0x87ba,0x929, +0x87ba,0x931,0x87ba,0x934,0x7bb,0x9cb,0x87bc,0x9cc,0x7bd,0xb48,0x7be,0xb4b,0x87bf,0xb4c,0x87c0,0xb94, +0x7c0,0xbcc,0x87c1,0xbca,0x87c1,0xbcb,0x87c2,0xc48,0x87c3,0xcc0,0x7c3,0xcc7,0x7c4,0xcc8,0x87c5,0x2cca, +0x87c3,0xccb,0x7c6,0xd4a,0x87c7,0xd4c,0x87c6,0xd4b,0x7c8,0xdda,0x7c9,0x2ddc,0x87ca,0xdde,0x87c8,0xddd, +0x87cb,0x1026,0x87cc,0x1b06,0x87cc,0x1b08,0x87cc,0x1b0a,0x87cc,0x1b0c,0x87cc,0x1b0e,0x87cc,0x1b12,0x87cc,0x1b3b, +0x87cc,0x1b3d,0x87cc,0x1b40,0x87cc,0x1b41,0x87cc,0x1b43,0x7b0,0x1e02,0x7ce,0x1e04,0x87cf,0x1e06,0x7b0,0x1e03, +0x7ce,0x1e05,0x87cf,0x1e07,0x87a7,0x1e08,0x87a7,0x1e09,0x7a6,0x1e14,0x87a7,0x1e16,0x7a6,0x1e15,0x87a7,0x1e17, +0x87ae,0x1e1c,0x87ae,0x1e1d,0x87b0,0x1e1e,0x87b0,0x1e1f,0x87a7,0x1e2e,0x87a7,0x1e2f,0x87ad,0x1e38,0x87ad,0x1e39, +0x7a7,0x1e3e,0x7b0,0x1e40,0x87ce,0x1e42,0x7a7,0x1e3f,0x7b0,0x1e41,0x87ce,0x1e43,0x7a6,0x1e50,0x87a7,0x1e52, +0x7a6,0x1e51,0x87a7,0x1e53,0x7a7,0x1e54,0x87b0,0x1e56,0x7a7,0x1e55,0x87b0,0x1e57,0x87ad,0x1e5c,0x87ad,0x1e5d, +0x87b0,0x1e64,0x87b0,0x1e65,0x87b0,0x1e66,0x87b0,0x1e67,0x87b0,0x1e68,0x87b0,0x1e69,0x87a7,0x1e78,0x87a7,0x1e79, +0x87aa,0x1e7a,0x87aa,0x1e7b,0x7a9,0x1e7c,0x87ce,0x1e7e,0x7a9,0x1e7d,0x87ce,0x1e7f,0x7aa,0x1e8c,0x87b0,0x1e8a, +0x7aa,0x1e8d,0x87b0,0x1e8b,0x87b0,0x1e9b,0x7a6,0x1ea6,0x7a7,0x1ea4,0x7a9,0x1eaa,0x87d4,0x1ea8,0x7a6,0x1ea7, +0x7a7,0x1ea5,0x7a9,0x1eab,0x87d4,0x1ea9,0x7a8,0x1eac,0x87ae,0x1eb6,0x7a8,0x1ead,0x87ae,0x1eb7,0x7a6,0x1eb0, +0x7a7,0x1eae,0x7a9,0x1eb4,0x87d4,0x1eb2,0x7a6,0x1eb1,0x7a7,0x1eaf,0x7a9,0x1eb5,0x87d4,0x1eb3,0x7a6,0x1ec0, +0x7a7,0x1ebe,0x7a9,0x1ec4,0x87d4,0x1ec2,0x7a6,0x1ec1,0x7a7,0x1ebf,0x7a9,0x1ec5,0x87d4,0x1ec3,0x87a8,0x1ec6, +0x87a8,0x1ec7,0x7a6,0x1ed2,0x7a7,0x1ed0,0x7a9,0x1ed6,0x87d4,0x1ed4,0x7a6,0x1ed3,0x7a7,0x1ed1,0x7a9,0x1ed7, +0x87d4,0x1ed5,0x87a8,0x1ed8,0x87a8,0x1ed9,0x7a6,0x1edc,0x7a7,0x1eda,0x7a9,0x1ee0,0x7ce,0x1ee2,0x87d4,0x1ede, +0x7a6,0x1edd,0x7a7,0x1edb,0x7a9,0x1ee1,0x7ce,0x1ee3,0x87d4,0x1edf,0x7a6,0x1eea,0x7a7,0x1ee8,0x7a9,0x1eee, +0x7ce,0x1ef0,0x87d4,0x1eec,0x7a6,0x1eeb,0x7a7,0x1ee9,0x7a9,0x1eef,0x7ce,0x1ef1,0x87d4,0x1eed,0x7a6,0x3f02, +0x7a7,0x3f04,0x7d7,0x3f06,0x87d8,0x1f80,0x7a6,0x3f03,0x7a7,0x3f05,0x7d7,0x3f07,0x87d8,0x1f81,0x7a6,0x3f0a, +0x7a7,0x3f0c,0x7d7,0x3f0e,0x87d8,0x1f88,0x7a6,0x3f0b,0x7a7,0x3f0d,0x7d7,0x3f0f,0x87d8,0x1f89,0x7a6,0x1f12, +0x87a7,0x1f14,0x7a6,0x1f13,0x87a7,0x1f15,0x7a6,0x1f1a,0x87a7,0x1f1c,0x7a6,0x1f1b,0x87a7,0x1f1d,0x7a6,0x3f22, +0x7a7,0x3f24,0x7d7,0x3f26,0x87d8,0x1f90,0x7a6,0x3f23,0x7a7,0x3f25,0x7d7,0x3f27,0x87d8,0x1f91,0x7a6,0x3f2a, +0x7a7,0x3f2c,0x7d7,0x3f2e,0x87d8,0x1f98,0x7a6,0x3f2b,0x7a7,0x3f2d,0x7d7,0x3f2f,0x87d8,0x1f99,0x7a6,0x1f32, +0x7a7,0x1f34,0x87d7,0x1f36,0x7a6,0x1f33,0x7a7,0x1f35,0x87d7,0x1f37,0x7a6,0x1f3a,0x7a7,0x1f3c,0x87d7,0x1f3e, +0x7a6,0x1f3b,0x7a7,0x1f3d,0x87d7,0x1f3f,0x7a6,0x1f42,0x87a7,0x1f44,0x7a6,0x1f43,0x87a7,0x1f45,0x7a6,0x1f4a, +0x87a7,0x1f4c,0x7a6,0x1f4b,0x87a7,0x1f4d,0x7a6,0x1f52,0x7a7,0x1f54,0x87d7,0x1f56,0x7a6,0x1f53,0x7a7,0x1f55, +0x87d7,0x1f57,0x7a6,0x1f5b,0x7a7,0x1f5d,0x87d7,0x1f5f,0x7a6,0x3f62,0x7a7,0x3f64,0x7d7,0x3f66,0x87d8,0x1fa0, +0x7a6,0x3f63,0x7a7,0x3f65,0x7d7,0x3f67,0x87d8,0x1fa1,0x7a6,0x3f6a,0x7a7,0x3f6c,0x7d7,0x3f6e,0x87d8,0x1fa8, +0x7a6,0x3f6b,0x7a7,0x3f6d,0x7d7,0x3f6f,0x87d8,0x1fa9,0x87d8,0x1f82,0x87d8,0x1f83,0x87d8,0x1f84,0x87d8,0x1f85, +0x87d8,0x1f86,0x87d8,0x1f87,0x87d8,0x1f8a,0x87d8,0x1f8b,0x87d8,0x1f8c,0x87d8,0x1f8d,0x87d8,0x1f8e,0x87d8,0x1f8f, +0x87d8,0x1f92,0x87d8,0x1f93,0x87d8,0x1f94,0x87d8,0x1f95,0x87d8,0x1f96,0x87d8,0x1f97,0x87d8,0x1f9a,0x87d8,0x1f9b, +0x87d8,0x1f9c,0x87d8,0x1f9d,0x87d8,0x1f9e,0x87d8,0x1f9f,0x87d8,0x1fa2,0x87d8,0x1fa3,0x87d8,0x1fa4,0x87d8,0x1fa5, +0x87d8,0x1fa6,0x87d8,0x1fa7,0x87d8,0x1faa,0x87d8,0x1fab,0x87d8,0x1fac,0x87d8,0x1fad,0x87d8,0x1fae,0x87d8,0x1faf, +0x87d8,0x1fb2,0x87d8,0x1fb4,0x87d8,0x1fb7,0x87d8,0x1fc2,0x87d8,0x1fc4,0x87d8,0x1fc7,0x7a6,0x1fcd,0x7a7,0x1fce, +0x87d7,0x1fcf,0x7a6,0x1fdd,0x7a7,0x1fde,0x87d7,0x1fdf,0x7d5,0x1fe4,0x87d6,0x1fe5,0x87d6,0x1fec,0x87d8,0x1ff2, +0x87d8,0x1ff4,0x87d8,0x1ff7,0x87d9,0x8000,0x219a,0x87d9,0x8000,0x219b,0x87d9,0x8000,0x21ae,0x87d9,0x8000,0x21cd, +0x87d9,0x8000,0x21ce,0x87d9,0x8000,0x21cf,0x87d9,0x8000,0x2204,0x87d9,0x8000,0x2209,0x87d9,0x8000,0x220c,0x87d9, +0x8000,0x2224,0x87d9,0x8000,0x2226,0x87d9,0x8000,0x2241,0x87d9,0x8000,0x2244,0x87d9,0x8000,0x2247,0x87d9,0x8000, +0x2249,0x87d9,0x8000,0x2260,0x87d9,0x8000,0x2262,0x87d9,0x8000,0x226d,0x87d9,0x8000,0x226e,0x87d9,0x8000,0x226f, +0x87d9,0x8000,0x2270,0x87d9,0x8000,0x2271,0x87d9,0x8000,0x2274,0x87d9,0x8000,0x2275,0x87d9,0x8000,0x2278,0x87d9, +0x8000,0x2279,0x87d9,0x8000,0x2280,0x87d9,0x8000,0x2281,0x87d9,0x8000,0x2284,0x87d9,0x8000,0x2285,0x87d9,0x8000, +0x2288,0x87d9,0x8000,0x2289,0x87d9,0x8000,0x22ac,0x87d9,0x8000,0x22ad,0x87d9,0x8000,0x22ae,0x87d9,0x8000,0x22af, +0x87d9,0x8000,0x22e0,0x87d9,0x8000,0x22e1,0x87d9,0x8000,0x22e2,0x87d9,0x8000,0x22e3,0x87d9,0x8000,0x22ea,0x87d9, +0x8000,0x22eb,0x87d9,0x8000,0x22ec,0x87d9,0x8000,0x22ed,0x87da,0x8000,0x304c,0x87da,0x8000,0x304e,0x87da,0x8000, +0x3050,0x87da,0x8000,0x3052,0x87da,0x8000,0x3054,0x87da,0x8000,0x3056,0x87da,0x8000,0x3058,0x87da,0x8000,0x305a, +0x87da,0x8000,0x305c,0x87da,0x8000,0x305e,0x87da,0x8000,0x3060,0x87da,0x8000,0x3062,0x87da,0x8000,0x3065,0x87da, +0x8000,0x3067,0x87da,0x8000,0x3069,0x7da,0x8000,0x3070,0x87db,0x8000,0x3071,0x7da,0x8000,0x3073,0x87db,0x8000, +0x3074,0x7da,0x8000,0x3076,0x87db,0x8000,0x3077,0x7da,0x8000,0x3079,0x87db,0x8000,0x307a,0x7da,0x8000,0x307c, +0x87db,0x8000,0x307d,0x87da,0x8000,0x3094,0x87da,0x8000,0x309e,0x87da,0x8000,0x30ac,0x87da,0x8000,0x30ae,0x87da, +0x8000,0x30b0,0x87da,0x8000,0x30b2,0x87da,0x8000,0x30b4,0x87da,0x8000,0x30b6,0x87da,0x8000,0x30b8,0x87da,0x8000, +0x30ba,0x87da,0x8000,0x30bc,0x87da,0x8000,0x30be,0x87da,0x8000,0x30c0,0x87da,0x8000,0x30c2,0x87da,0x8000,0x30c5, +0x87da,0x8000,0x30c7,0x87da,0x8000,0x30c9,0x7da,0x8000,0x30d0,0x87db,0x8000,0x30d1,0x7da,0x8000,0x30d3,0x87db, +0x8000,0x30d4,0x7da,0x8000,0x30d6,0x87db,0x8000,0x30d7,0x7da,0x8000,0x30d9,0x87db,0x8000,0x30da,0x7da,0x8000, +0x30dc,0x87db,0x8000,0x30dd,0x87da,0x8000,0x30f4,0x87da,0x8000,0x30f7,0x87da,0x8000,0x30f8,0x87da,0x8000,0x30f9, +0x87da,0x8000,0x30fa,0x87da,0x8000,0x30fe,0x1234 }; -static const uint16_t fcdTrie_index[5360]={ +static const uint16_t fcdTrie_index[5496]={ 0x218,0x218,0x218,0x218,0x218,0x218,0x2d5,0x2dd,0x2e5,0x2ed,0x2f5,0x2fc,0x218,0x304,0x309,0x311, -0x317,0x31f,0x218,0x218,0x218,0x218,0x218,0x218,0x448,0x450,0x234,0x220,0x23c,0x325,0x226,0x218, -0x32d,0x334,0x33b,0x343,0x49d,0x218,0x34b,0x351,0x218,0x218,0x218,0x218,0x468,0x4a5,0x4ad,0x218, -0x4b1,0x359,0x458,0x470,0x218,0x218,0x361,0x4b9,0x4bd,0x4c2,0x4ca,0x218,0x218,0x218,0x218,0x218, -0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x369,0x241,0x218,0x218,0x460,0x249,0x218, -0x218,0x251,0x259,0x218,0x218,0x460,0x371,0x218,0x218,0x460,0x261,0x218,0x218,0x218,0x371,0x218, -0x218,0x218,0x377,0x218,0x218,0x460,0x371,0x218,0x218,0x218,0x371,0x218,0x218,0x218,0x37d,0x218, -0x218,0x475,0x4d0,0x218,0x218,0x47c,0x483,0x218,0x486,0x4d3,0x218,0x269,0x271,0x218,0x4da,0x218, +0x317,0x31f,0x218,0x218,0x218,0x218,0x218,0x218,0x456,0x45e,0x234,0x220,0x23c,0x325,0x226,0x218, +0x32d,0x334,0x33b,0x343,0x4ab,0x218,0x34b,0x351,0x218,0x218,0x218,0x218,0x476,0x4b3,0x4bb,0x218, +0x4bf,0x359,0x466,0x47e,0x218,0x218,0x361,0x4c7,0x4cb,0x4d0,0x4d8,0x218,0x218,0x218,0x218,0x4de, +0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x369,0x241,0x218,0x218,0x46e,0x249,0x218, +0x218,0x251,0x259,0x218,0x218,0x46e,0x371,0x218,0x218,0x46e,0x261,0x218,0x218,0x218,0x371,0x218, +0x218,0x218,0x377,0x218,0x218,0x46e,0x371,0x218,0x218,0x218,0x371,0x218,0x218,0x218,0x37d,0x218, +0x218,0x483,0x4e4,0x218,0x218,0x48a,0x491,0x218,0x494,0x4e7,0x218,0x269,0x271,0x218,0x4ee,0x218, 0x218,0x385,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x496,0x218,0x218,0x218,0x218,0x218, +0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x4a4,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x4dd,0x4dd,0x218,0x218,0x218,0x218,0x4e3,0x218, -0x218,0x218,0x218,0x218,0x218,0x4eb,0x218,0x218,0x218,0x4ee,0x218,0x218,0x218,0x218,0x218,0x218, -0x4f5,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x4fd,0x218, -0x38d,0x394,0x39c,0x3a3,0x3ab,0x3b3,0x3ba,0x3c2,0x3ca,0x3d2,0x3d9,0x279,0x3e1,0x281,0x289,0x291, -0x218,0x218,0x218,0x218,0x218,0x218,0x501,0x509,0x218,0x22c,0x218,0x218,0x3e9,0x3f0,0x3f5,0x218, -0x3fc,0x403,0x40b,0x413,0x417,0x41c,0x218,0x424,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x4f1,0x4f1,0x218,0x218,0x218,0x218,0x4f7,0x218, +0x218,0x218,0x218,0x218,0x218,0x4ff,0x218,0x218,0x218,0x502,0x218,0x218,0x218,0x218,0x218,0x218, +0x509,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x38c,0x393,0x510,0x218,0x218,0x218,0x218, +0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x518,0x51b, +0x39b,0x3a2,0x3aa,0x3b1,0x3b9,0x3c1,0x3c8,0x3d0,0x3d8,0x3e0,0x3e7,0x279,0x3ef,0x281,0x289,0x291, +0x218,0x218,0x218,0x218,0x218,0x218,0x523,0x52b,0x218,0x22c,0x218,0x218,0x3f7,0x3fe,0x403,0x218, +0x40a,0x411,0x419,0x421,0x425,0x42a,0x218,0x432,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x299,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x218,0x48d,0x429,0x430,0x438,0x429,0x430,0x440,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x218,0x49b,0x437,0x43e,0x446,0x437,0x43e,0x44e,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, @@ -1943,7 +1959,7 @@ static const uint16_t fcdTrie_index[5360]={ 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x510,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x532,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, @@ -1967,7 +1983,7 @@ static const uint16_t fcdTrie_index[5360]={ 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x531,0x534,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x553,0x556,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, @@ -1986,13 +2002,13 @@ static const uint16_t fcdTrie_index[5360]={ 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x2a1,0x2a9,0x2b1,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x218,0x495,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x218,0x4a3,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x515,0x519,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, -0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x2b5,0x2bd,0x521,0x2c5,0x2cd,0x218, -0x218,0x218,0x529,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x537,0x53b,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, +0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x2b5,0x2bd,0x543,0x2c5,0x2cd,0x218, +0x218,0x218,0x54b,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218,0x218, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xeaea,0xeaea,0xe9e9,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6, @@ -2086,87 +2102,92 @@ static const uint16_t fcdTrie_index[5360]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0, 0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0x707,0,0x909,0,0, -0,0,0,0,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6, -0xdc,0xdc,0xdc,0xdc,0xca,0xca,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc, -0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xca,0xca,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6, -0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6, -0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc, -0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc, -0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0,0xe6,0,0,0,0,0xdc,0xdc,0xe6,0xe6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x707,0,0,0,0,0,0,0,0,0,0,0, +0x909,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xdc,0xdc,0xe6,0xe6, +0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xca,0xca,0xdc,0xdc, +0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6, +0xca,0xca,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc, +0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc, +0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, +0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, +0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6, +0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6, +0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0,0xe6, +0,0,0,0,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, +0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6, +0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6, 0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, 0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xdc,0xdc,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6, -0xe6,0xe6,0,0,0,0,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, +0xdc,0xdc,0xe6,0xe6,0xdc,0xdc,0xe6,0xe6,0xe6,0xe6,0,0,0,0,0,0, 0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6, -0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0xe6,0,0xe6, -0,0xe6,0,0xe6,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0, +0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, +0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6, +0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0,0,0xe6,0xe6,0xe6,0xe6, +0xe6,0xe6,0xe6,0xe6,0,0xe6,0,0xe6,0,0xe6,0,0xe6,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0, -1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0, -8,0,8,0,0,8,0,8,0,8,0,0,0,0,0,0, -8,8,0,8,8,0,8,8,0,8,8,0,8,8,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8,0,0,0,0,0x808,0x808,0,0,0,8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8,0,0,8,8,8,8,0,0,0,8,0, -0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6, -0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe8e8,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe8e8,0xd8d8,0xdcdc,0xdcdc,0xdcdc,0xdcdc, -0xdcdc,0xcaca,0xcaca,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xcaca,0xcaca,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc, -0xdcdc,0xdcdc,0xdcdc,0xdcdc,0x101,0x101,0x101,0x101,0x101,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xe6e6, -0,0,0,0,0,0,0,0,0,0,0,0x1b1b,0x1c1c,0x1d1d,0x1e1e,0x1f1f, -0x2020,0x2121,0x2222,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x707,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xdede,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x2323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x6767,0x6767,0x909,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x7676,0x7676,0,0,0,0,0,0, -0,0,0,0,0x7a7a,0x7a7a,0x7a7a,0x7a7a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xdcdc,0xdcdc,0,0,0,0,0,0,0,0,0,0,0,0,0xdada,0xe4e4, -0xe8e8,0xdede,0xe0e0,0xe0e0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xe6e6, -0xe6e6,0xdede,0xe4e4,0xe6e6,0xa0a,0xb0b,0xc0c,0xd0d,0xe0e,0xf0f,0x1010,0x1111,0x1212,0x1313,0,0x1414, -0x1515,0x1616,0,0x1717,0,0x1818,0x1919,0,0xe6e6,0xdcdc,0,0x1212,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0, -0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0,0,0xe6e6,0xe6e6,0,0xdcdc,0xe6e6, -0xe6e6,0xdcdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x2424,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdcdc, -0xdcdc,0xdcdc,0xe6e6,0xdcdc,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6, -0xdcdc,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, +0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8,0,8,0,8,0,8,0, +8,0,8,0,8,0,8,0,8,0,8,0,0,8,0,8, +0,8,0,0,0,0,0,0,8,8,0,8,8,0,8,8, +0,8,8,0,8,8,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0, +0,0x808,0x808,0,0,0,8,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,8, +8,8,8,0,0,0,8,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6, +0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe8e8,0xdcdc,0xdcdc, +0xdcdc,0xdcdc,0xe8e8,0xd8d8,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xcaca,0xcaca,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xcaca, +0xcaca,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0x101,0x101,0x101,0x101, +0x101,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0, +0,0,0,0x1b1b,0x1c1c,0x1d1d,0x1e1e,0x1f1f,0x2020,0x2121,0x2222,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xe6e6, +0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x707,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6, +0xe6e6,0xe6e6,0xdede,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x2323,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x6767,0x6767,0x909,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x7676,0x7676,0,0,0,0,0,0,0,0,0,0,0x7a7a,0x7a7a,0x7a7a,0x7a7a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xdcdc,0xdcdc,0,0,0,0,0,0, +0,0,0,0,0,0,0xdada,0xe4e4,0xe8e8,0xdede,0xe0e0,0xe0e0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6, +0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xdcdc,0xdcdc, +0xdcdc,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdede,0xe4e4,0xe6e6,0xa0a,0xb0b,0xc0c,0xd0d, +0xe0e,0xf0f,0x1010,0x1111,0x1212,0x1313,0x1313,0x1414,0x1515,0x1616,0,0x1717,0,0x1818,0x1919,0, +0xe6e6,0xdcdc,0,0x1212,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6, +0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0xdcdc, +0xe6e6,0,0,0xe6e6,0xe6e6,0,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x2424,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0xdcdc,0xe6e6,0xdcdc,0xdcdc,0xe6e6,0xdcdc,0xe6e6, +0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0,0,0,0, 0,0,0,0,0,0,0,0,0x6b6b,0x6b6b,0x6b6b,0x6b6b,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xdcdc,0,0xdcdc,0,0xd8d8,0,0,0,0,0,0,0,0,0xdcdc,0, @@ -2178,22 +2199,26 @@ static const uint16_t fcdTrie_index[5360]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xdede,0xe6e6,0xdcdc,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0,0,0, -0,0,0,0,0xe6e6,0xe6e6,0xdcdc,0xe6e6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xe6e6,0xe6e6,0x101,0x101,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0x101,0x101,0x101,0xe6e6, -0xe6e6,0,0,0,0,0xe6e6,0,0,0,0x101,0x101,0xe6e6,0xdcdc,0xe6e6,0x101,0x101, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x909,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xdcdc,0,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0x101,0xdcdc,0, -0,0,0,0x909,0xdcdc,0xdcdc,0xdcdc,0,0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xdcdc, +0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xe6e6, +0xe6e6,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0, +0xe6e6,0xe6e6,0xdcdc,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe6e6,0xdcdc,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6,0x101,0x101, +0xe6e6,0xe6e6,0xe6e6,0xe6e6,0x101,0x101,0x101,0xe6e6,0xe6e6,0,0,0,0,0xe6e6,0,0, +0,0x101,0x101,0xe6e6,0xdcdc,0xe6e6,0x101,0x101,0xdcdc,0xdcdc,0xdcdc,0xdcdc,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x909,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xe6e6,0xe6e6,0xe6e6,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xdcdc,0,0xe6e6,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x820,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe6e6,0x101,0xdcdc,0,0,0,0,0x909,0xdcdc,0xdcdc,0xdcdc,0, +0,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xe6e6,0xdcdc,0xdcdc,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe6e6,0xe6e6, +0xe6e6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x820,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x840,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0x840,0,0,0, +0,0,0,0,0,0,0,0 }; static const UTrie fcdTrie={ @@ -2201,37 +2226,37 @@ static const UTrie fcdTrie={ NULL, utrie_defaultGetFoldingOffset, 2144, - 3216, + 3352, 0, FALSE }; -static const uint16_t auxTrie_index[5624]={ -0x228,0x228,0x228,0x228,0x228,0x228,0x3e3,0x3eb,0x3f3,0x3fb,0x403,0x40b,0x228,0x228,0x413,0x41b, -0x423,0x42b,0x228,0x228,0x228,0x228,0x228,0x228,0x4a9,0x4a9,0x30e,0x230,0x316,0x228,0x238,0x23e, -0x228,0x228,0x228,0x228,0x4fe,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4d7,0x506,0x50e,0x228, -0x512,0x433,0x4b1,0x441,0x228,0x228,0x436,0x51a,0x51e,0x22c,0x4b6,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x43e,0x31b,0x228,0x228,0x4b9,0x323,0x228, -0x228,0x32b,0x333,0x228,0x228,0x43e,0x51f,0x228,0x228,0x4b9,0x33b,0x228,0x228,0x4c1,0x446,0x228, -0x228,0x228,0x44c,0x228,0x228,0x43e,0x454,0x228,0x228,0x4c1,0x446,0x228,0x228,0x228,0x45a,0x228, -0x228,0x4df,0x4ed,0x228,0x228,0x4e6,0x4ed,0x228,0x4e6,0x523,0x343,0x34b,0x353,0x35b,0x52a,0x228, -0x228,0x462,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4c9,0x228,0x4cf,0x4b8,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4f7,0x228,0x228,0x228,0x228,0x228, +static const uint16_t auxTrie_index[5748]={ +0x228,0x228,0x228,0x228,0x228,0x228,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x412,0x228,0x228,0x41a,0x422, +0x42a,0x432,0x228,0x228,0x228,0x228,0x228,0x228,0x4be,0x4be,0x315,0x230,0x31d,0x228,0x238,0x23e, +0x228,0x228,0x228,0x228,0x513,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4ec,0x51b,0x523,0x228, +0x527,0x43a,0x4c6,0x448,0x228,0x228,0x43d,0x52f,0x533,0x22c,0x4cb,0x228,0x228,0x228,0x228,0x539, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x445,0x322,0x228,0x228,0x4ce,0x32a,0x228, +0x228,0x332,0x33a,0x228,0x228,0x445,0x53e,0x228,0x228,0x4ce,0x342,0x228,0x228,0x4d6,0x44d,0x228, +0x228,0x228,0x453,0x228,0x228,0x445,0x45b,0x228,0x228,0x4d6,0x44d,0x228,0x228,0x228,0x461,0x228, +0x228,0x4f4,0x502,0x228,0x228,0x4fb,0x502,0x228,0x4fb,0x542,0x34a,0x352,0x35a,0x362,0x549,0x228, +0x228,0x469,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x4de,0x228,0x4e4,0x4cd,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x50c,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x440,0x440,0x228,0x228,0x228,0x228,0x52e,0x228, -0x228,0x228,0x228,0x228,0x228,0x520,0x228,0x228,0x228,0x536,0x228,0x228,0x228,0x228,0x228,0x228, -0x53d,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x245,0x24d,0x228,0x228,0x228,0x4f6,0x228, -0x46a,0x472,0x477,0x47d,0x485,0x48d,0x490,0x494,0x228,0x228,0x228,0x362,0x49a,0x36a,0x372,0x378, -0x380,0x228,0x228,0x228,0x228,0x253,0x544,0x54c,0x25b,0x263,0x26b,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x386,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x447,0x447,0x228,0x228,0x228,0x228,0x54d,0x228, +0x228,0x228,0x228,0x228,0x228,0x53f,0x228,0x228,0x228,0x555,0x228,0x228,0x228,0x228,0x228,0x228, +0x55c,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x470,0x477,0x539,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x245,0x24d,0x228,0x228,0x228,0x4cb,0x43b, +0x47f,0x487,0x48c,0x492,0x49a,0x4a2,0x4a5,0x4a9,0x228,0x228,0x228,0x369,0x4af,0x371,0x379,0x37f, +0x387,0x228,0x228,0x228,0x228,0x253,0x563,0x56b,0x25b,0x263,0x26b,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x38d,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x389,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x390,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x4f3,0x228,0x228,0x4a1,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x508,0x228,0x228,0x4b6,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x26f,0x228,0x228,0x228,0x274,0x228,0x228,0x228,0x228,0x278,0x280,0x286,0x28e,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, @@ -2291,7 +2316,7 @@ static const uint16_t auxTrie_index[5624]={ 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x52a,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x549,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, @@ -2315,7 +2340,7 @@ static const uint16_t auxTrie_index[5624]={ 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x56d,0x570,0x228,0x576,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x58c,0x58f,0x228,0x595,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, @@ -2331,20 +2356,20 @@ static const uint16_t auxTrie_index[5624]={ 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391, -0x396,0x39e,0x391,0x3a4,0x391,0x391,0x3a8,0x228,0x3af,0x3b7,0x3bf,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398, +0x39d,0x3a5,0x398,0x3ab,0x398,0x398,0x3af,0x228,0x3b6,0x3be,0x3c6,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x4f6,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x50b,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x551,0x555,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x3c3,0x3cb,0x55d,0x3d3,0x3db,0x228, -0x228,0x228,0x565,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x570,0x574,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x3ca,0x3d2,0x57c,0x3da,0x3e2,0x228, +0x228,0x228,0x584,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x296,0x29d,0x299,0x2a0,0x2a8,0x2b0,0x29e,0x29a,0x2b7,0x2bf,0x2c7,0x29f,0x2a7,0x296,0x29d,0x299, -0x2a0,0x2cf,0x297,0x29e,0x29a,0x2d7,0x2df,0x2e7,0x2ee,0x2f6,0x2e2,0x2fe,0x2f1,0x306,0x228,0x228, -0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391,0x391, -0x392,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x2a0,0x2cf,0x297,0x29e,0x29a,0x2d7,0x2df,0x2e7,0x2ee,0x2f6,0x2e2,0x2fe,0x2f1,0x306,0x30d,0x228, +0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398,0x398, +0x399,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, @@ -2402,163 +2427,171 @@ static const uint16_t auxTrie_index[5624]={ 0xb,0x132,5,0x134,0x136,0x138,0xe0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x130,0x124,0xb,0x132,5,0x134,0x136,0x138, 0xe0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb,0,0,0,0,0xc00,0xc00,0x800,0xc00,0xc00,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0x400, +0,0,0,0xb,0,0,0,0,0,0,0,0,0,0,0x139,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x800,0,0,0,0x800,0x800,0x800, -0x800,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0, -0,0,0,0x800,0,0,0,0,0x400,0x400,0,0x400,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x400, -0,0,0x400,0,0,0,0,0,0x800,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0, -0,0,0,0,0,0x400,0x400,0x400,0,0,0x400,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0, -0,0,0x800,0x800,0,0,0,0,0x400,0x400,0,0,0,0,0,0x400, -0,0,0,0,0,0,0,0,0,0x400,0,0,0,0,0x400,0, -0,0,0,0x400,0,0,0,0,0x400,0,0,0,0,0,0,0, -0,0,0,0,0,0x400,0,0,0,0,0,0,0,0x800,0x800,0x400, -0x800,0x400,0x400,0,0x400,0,0x800,0x800,0x800,0x800,0,0,0x800,0x400,0x800,0x800, -0x800,0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0x400, -0,0,0,0,0,0,0,0,0,0x400,0,0,0,0,0x400,0, -0,0,0,0x400,0,0,0,0,0x400,0,0,0,0,0,0,0, -0,0x800,0,0x800,0,0x400,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x400,0,0x400,0,0x400,0,0x400, -0,0x400,0,0x400,0,0x400,0,0,0x1000,0x1000,0,0,0,0,0,0, -0x1000,0x1000,0,0,0,0,0,0,0,0,0,0x1000,0,0,0,0, -0,0,0,0x400,0x1000,0,0x400,0,0,0,0,0x1000,0,0,0,0, -0,0x400,0,0x400,0x1000,0,0,0,0,0,0,0x400,0,0,0,0, -0,0,0,0x400,0,0,0,0,0,0,0,0x400,0,0,0x400,0x400, -0,0,0,0x1000,0,0,0,0,0,0x400,0,0x400,0x1000,0x400,0,0, -0x400,0x400,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x400,0x400,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x400,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, +0,0,0,0,0xc00,0xc00,0x800,0xc00,0xc00,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0x400,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x800,0,0,0,0x800,0x800,0x800,0x800,0,0,0, +0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0x800, +0,0,0,0,0x400,0x400,0,0x400,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x400,0,0,0x400,0, +0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0, +0,0x400,0x400,0x400,0,0,0x400,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0x800,0x800, +0,0,0,0,0x400,0x400,0,0,0,0,0,0x400,0,0,0,0, +0,0,0,0,0,0x400,0,0,0,0,0x400,0,0,0,0,0x400, +0,0,0,0,0x400,0,0,0,0,0,0,0,0,0,0,0, +0,0x400,0,0,0,0,0,0,0,0x800,0x800,0x400,0x800,0x400,0x400,0, +0x400,0,0x800,0x800,0x800,0x800,0,0,0x800,0x400,0x800,0x800,0x800,0,0x800,0x800, +0,0,0,0,0,0,0,0,0,0,0,0x400,0,0,0,0, +0,0,0,0,0,0x400,0,0,0,0,0x400,0,0,0,0,0x400, +0,0,0,0,0x400,0,0,0,0,0,0,0,0,0x800,0,0x800, +0,0x400,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x400,0,0x400,0,0x400,0,0x400,0,0x400,0,0x400, +0,0x400,0,0,0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0, +0,0,0,0,0,0,0,0x1000,0,0,0,0,0,0,0,0x400, +0x1000,0,0x400,0,0,0,0,0x1000,0,0,0,0,0,0x400,0,0x400, +0x1000,0,0,0,0,0,0,0x400,0,0,0,0,0,0,0,0x400, +0,0,0,0,0,0,0,0x400,0,0,0x400,0x400,0,0,0,0x1000, +0,0,0,0,0,0x400,0,0x400,0x1000,0x400,0,0,0x400,0x400,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x400,0x400,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x400,0,0,0, +0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, 0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, -0x400,0x400,0x400,0x400,0x400,0x400,0,0,0x400,0,0x400,0,0,0x400,0x400,0x400, -0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0x400,0,0x400,0,0,0x400,0x400,0, -0,0,0x400,0x400,0x400,0x400,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, -0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0, +0x400,0x400,0,0,0x400,0,0x400,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400, +0x400,0x400,0x400,0,0x400,0,0x400,0,0,0x400,0x400,0,0,0,0x400,0x400, +0x400,0x400,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, +0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0x400,0x400,0x400,0x400, 0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, -0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x400,0x800,0x400,0,0,0,0, -0,0,0,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400, -0x400,0x400,0x400,0,0x400,0x400,0x400,0x400,0x400,0,0x400,0,0x400,0x400,0,0x400, -0x400,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400, -0x400,0x800,0x800,0x800,0x800,0x800,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0, -0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0,0,0,0, -0,0,0,0,0,0,0x800,0x800,0x800,0x800,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0,0x1000, -0,0,0,0,0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000, -0,0,0,0,0,0x1000,0x1000,0x1000,0,0x1000,0,0,0x1000,0x1000,0,0x1000, -0,0,0,0,0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000, -0,0,0,0,0,0x1000,0x1000,0x1000,0,0x1000,0,0x1000,0x1000,0x1000,0,0, -0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0, -0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0, -0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0,0,0, -0,0,0,0,0,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0x1000, -0x1000,0,0,0x1000,0x1000,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0, -0x1000,0x1000,0,0,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0,0, -0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0, -0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0, -0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0,0,0,0,0,0, -0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000, +0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x400,0x800,0x400,0,0,0,0,0,0,0,0, +0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0, +0x400,0x400,0x400,0x400,0x400,0,0x400,0,0x400,0x400,0,0x400,0x400,0,0x400,0x400, +0x400,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0x400,0x800,0x800,0x800, +0x800,0x800,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0, +0,0,0,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0, +0,0,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x400,0x400,0x400,0x400,0x400,0x400,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1000,0x1000,0,0x1000,0,0,0,0, +0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0,0,0,0, +0,0x1000,0x1000,0x1000,0,0x1000,0,0,0x1000,0x1000,0,0x1000,0,0,0,0, +0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0,0,0,0, +0,0x1000,0x1000,0x1000,0,0x1000,0,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000, +0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0, +0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0,0,0,0,0,0,0, +0,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0,0,0x1000, +0x1000,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0, +0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0, +0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0x1000,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000, +0x1000,0x1000,0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0,0, +0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0, -0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0,0,0,0,0,0,0,0, +0,0,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0,0,0x800,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0x800, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0, -0,0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,0,0, -0,0,0x800,0,0,0,0,0,0,0,0,0,0,0x800,0,0, -0,0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,0,0, -0,0,0x800,0,0,0,0,0x800,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x800,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0x800, -0,0x800,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0, -0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0, -0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0,0,0,0,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, +0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x800,0,0,0,0,0,0,0,0,0,0x800,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0, +0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0x800,0, +0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0, +0,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0x800,0, +0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x800,0,0,0,0,0,0,0,0,0x800,0,0x800,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,0,0,0, +0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000, +0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, +0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0,0, -0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0, -0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, +0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0x1000,0x1000, +0x1000,0x1000,0,0,0,0,0,0,0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, 0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, -0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0,0,0,0,0,0, -0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0,0,0,0,0, -0x1000,0x1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0, -0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x800,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000, +0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0,0,0x1000,0x1000,0x1000,0x1000,0,0, +0,0,0,0,0x1000,0x1000,0,0,0,0,0,0,0x1000,0x1000,0,0, +0,0,0,0,0x1000,0x1000,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0, -0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x800,0x800,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0, +0,0x800,0x800,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0, +0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0, +0,0,0,0,0x800,0,0x800,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0, 0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, 0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, -0x800,0x800,0,0x800,0x800,0x800,0,0x800,0,0x800,0x800,0,0x800,0x800,0,0x800, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0,0, -0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0,0,0x800, -0x800,0,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0,0, +0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x800,0,0x800,0,0x800,0,0,0,0,0,0,0,0,0x800,0, +0,0,0,0,0,0,0,0,0x800,0x800,0x800,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0, +0,0,0,0,0x800,0x800,0,0,0,0,0,0,0,0,0,0, +0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x800, +0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0x800,0,0x800,0x800,0, +0x800,0x800,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800, +0x800,0x800,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800, +0x800,0,0,0x800,0x800,0,0x800,0x800,0x800,0x800,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0,0,0,0, 0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0x800, +0,0x800,0,0,0,0,0,0,0,0,0x800,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0,0,0, +0,0,0,0,0,0,0x800,0,0,0,0,0,0,0,0,0, +0,0x800,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0, -0,0x800,0,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0, +0,0,0,0,0,0,0,0x800,0x800,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0,0x800,0,0, +0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x800,0,0x800, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x800,0,0x800,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x800,0x800,0x800,0, -0,0,0,0x800,0x800,0x800,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0,0,0,0,0,0,0,0,0x800,0x800,0x800,0,0,0,0,0x800, +0x800,0x800,0x800,0,0,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x800,0x800,0x800,0,0,0,0,0,0,0, +0,0,0x800,0x800,0x800,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x841,0,0,0,0,0,0,0,0,0, +0,0,0x841,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc42,0x43,0,0,0,0,0,0,0,0,0,0, +0xc42,0x43,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x444,0 +0,0,0x444,0 }; static const UTrie auxTrie={ @@ -2566,13 +2599,13 @@ static const UTrie auxTrie={ NULL, getFoldingAuxOffset, 2208, - 3416, + 3540, 0, FALSE }; -static const uint16_t canonStartSets[7702]={ -0x109b,0x898,0x153,0x1a86,0x1a9e,0x1e16,0,0,0,0,0,0,0,0,0,0, +static const uint16_t canonStartSets[7724]={ +0x109b,0x8ae,0x153,0x1a9c,0x1ab4,0x1e2c,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x32,0xc0,0xc6,0x100,0x101,0x102,0x103,0x104,0x105,0x1cd,0x1ce,0x1de,0x1df,0x1e0,0x1e1,0x1fa, 0x1fb,0x200,0x201,0x202,0x203,0x226,0x227,0x1e00,0x1e01,0x1ea0,0x1ea1,0x1ea2,0x1ea3,0x1ea4,0x1ea5,0x1ea6, @@ -2864,195 +2897,196 @@ static const uint16_t canonStartSets[7702]={ 0xf5c,0xf71,0x4508,0xf90,0xfb9,0xf92,0xf93,0xf9c,0xf9d,0xfa1,0xfa2,0xfa6,0xfa7,0xfab,0xfac,0xfb2, 0xf76,0xfb3,0xf78,0x1025,0x1026,0x1100,0x450f,0x1101,0x4512,0x1102,0x4515,0x1103,0x4518,0x1104,0x451b,0x1105, 0x451e,0x1106,0x4521,0x1107,0x4524,0x1108,0x4527,0x1109,0x452a,0x110a,0x452d,0x110b,0x4530,0x110c,0x4533,0x110d, -0x4536,0x110e,0x4539,0x110f,0x453c,0x1110,0x453f,0x1111,0x4542,0x1112,0x4545,0x1fbf,0x4548,0x1ffe,0x454b,0x2002, -0x2000,0x2003,0x2001,0x2190,0x219a,0x2192,0x219b,0x2194,0x21ae,0x21d0,0x21cd,0x21d2,0x21cf,0x21d4,0x21ce,0x2203, -0x2204,0x2208,0x2209,0x220b,0x220c,0x2223,0x2224,0x2225,0x2226,0x223c,0x2241,0x2243,0x2244,0x2245,0x2247,0x2248, -0x2249,0x224d,0x226d,0x2261,0x2262,0x2264,0x2270,0x2265,0x2271,0x2272,0x2274,0x2273,0x2275,0x2276,0x2278,0x2277, -0x2279,0x227a,0x2280,0x227b,0x2281,0x227c,0x22e0,0x227d,0x22e1,0x2282,0x2284,0x2283,0x2285,0x2286,0x2288,0x2287, -0x2289,0x2291,0x22e2,0x2292,0x22e3,0x22a2,0x22ac,0x22a8,0x22ad,0x22a9,0x22ae,0x22ab,0x22af,0x22b2,0x22ea,0x22b3, -0x22eb,0x22b4,0x22ec,0x22b5,0x22ed,0x2add,0x2adc,0x3008,0x2329,0x3009,0x232a,0x3046,0x3094,0x304b,0x304c,0x304d, -0x304e,0x304f,0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058,0x3059,0x305a,0x305b,0x305c,0x305d, -0x305e,0x305f,0x3060,0x3061,0x3062,0x3064,0x3065,0x3066,0x3067,0x3068,0x3069,0x306f,0x454e,0x3072,0x4551,0x3075, -0x4554,0x3078,0x4557,0x307b,0x455a,0x309d,0x309e,0x30a6,0x30f4,0x30ab,0x30ac,0x30ad,0x30ae,0x30af,0x30b0,0x30b1, -0x30b2,0x30b3,0x30b4,0x30b5,0x30b6,0x30b7,0x30b8,0x30b9,0x30ba,0x30bb,0x30bc,0x30bd,0x30be,0x30bf,0x30c0,0x30c1, -0x30c2,0x30c4,0x30c5,0x30c6,0x30c7,0x30c8,0x30c9,0x30cf,0x455d,0x30d2,0x4560,0x30d5,0x4563,0x30d8,0x4566,0x30db, -0x4569,0x30ef,0x30f7,0x30f0,0x30f8,0x30f1,0x30f9,0x30f2,0x30fa,0x30fd,0x30fe,0x349e,0x456c,0x34b9,0x4572,0x34bb, -0x4578,0x34df,0x457e,0x3515,0x4584,0x36ee,0x458a,0x36fc,0x4590,0x3781,0x4596,0x382f,0x459c,0x3862,0x45a2,0x387c, -0x45a8,0x38c7,0x45ae,0x38e3,0x45b4,0x391c,0x45ba,0x393a,0x45c0,0x3a2e,0x45c6,0x3a6c,0x45cc,0x3ae4,0x45d2,0x3b08, -0x45d8,0x3b19,0x45de,0x3b49,0x45e4,0x3b9d,0x45ea,0x3c18,0x45f2,0x3c4e,0x45f8,0x3d33,0x45fe,0x3d96,0x4604,0x3eac, -0x460a,0x3eb8,0x4610,0x3f1b,0x4616,0x3ffc,0x461c,0x4008,0x4622,0x4018,0xfad3,0x4039,0x4628,0x4046,0x4630,0x4096, -0x4636,0x40e3,0x463c,0x412f,0x4642,0x4202,0x4648,0x4227,0x464e,0x42a0,0x4654,0x4301,0x465a,0x4334,0x4660,0x4359, -0x4666,0x43d5,0x466c,0x43d9,0x4672,0x440b,0x4678,0x446b,0x467e,0x452b,0x4684,0x455d,0x468a,0x4561,0x4690,0x456b, -0x4696,0x45d7,0x469c,0x45f9,0x46a2,0x4635,0x46a8,0x46be,0x46ae,0x46c7,0x46b4,0x4995,0x46ba,0x49e6,0x46c0,0x4a6e, -0x46c6,0x4a76,0x46cc,0x4ab2,0x46d2,0x4b33,0x46d8,0x4bce,0x46de,0x4cce,0x46e4,0x4ced,0x46ea,0x4cf8,0x46f0,0x4d56, -0x46f6,0x4e0d,0xf967,0x4e26,0xfa70,0x4e32,0xf905,0x4e38,0x46fc,0x4e39,0xf95e,0x4e3d,0x4702,0x4e41,0x4708,0x4e82, -0xf91b,0x4e86,0xf9ba,0x4eae,0xf977,0x4ec0,0xf9fd,0x4ecc,0x470e,0x4ee4,0xf9a8,0x4f60,0x4714,0x4f80,0xfa73,0x4f86, -0xf92d,0x4f8b,0xf9b5,0x4fae,0x471a,0x4fbb,0x4722,0x4fbf,0xf965,0x5002,0x4728,0x502b,0xf9d4,0x507a,0x472e,0x5099, -0x4734,0x50cf,0x473a,0x50da,0xf9bb,0x50e7,0x4740,0x5140,0xfa0c,0x5145,0xfa74,0x514d,0x4748,0x5154,0x4750,0x5164, -0x4756,0x5167,0x475c,0x5168,0xfa72,0x5169,0xf978,0x516d,0xf9d1,0x5177,0x4762,0x5180,0xfa75,0x518d,0x4768,0x5192, -0x476e,0x5195,0x4774,0x5197,0x477a,0x51a4,0x4780,0x51ac,0x4786,0x51b5,0x478c,0x51b7,0xf92e,0x51c9,0xf979,0x51cc, -0xf955,0x51dc,0xf954,0x51de,0xfa15,0x51f5,0x4794,0x5203,0x479a,0x5207,0x47a0,0x5217,0xf99c,0x5229,0xf9dd,0x523a, -0xf9ff,0x523b,0x47a8,0x5246,0x47ae,0x5272,0x47b4,0x5277,0x47ba,0x5289,0xf9c7,0x529b,0xf98a,0x52a3,0xf99d,0x52b3, -0x47c0,0x52c7,0x47c6,0x52c9,0x47ce,0x52d2,0xf952,0x52de,0xf92f,0x52e4,0x47d6,0x52f5,0xf97f,0x52fa,0x47de,0x5305, -0x47e6,0x5306,0x47ec,0x5317,0x47f2,0x533f,0xf9eb,0x5349,0x47fa,0x5351,0x4800,0x535a,0x4808,0x5373,0x480e,0x5375, -0xf91c,0x537d,0x4814,0x537f,0x481a,0x53c3,0xf96b,0x53ca,0x4820,0x53df,0x4826,0x53e5,0xf906,0x53eb,0x482c,0x53f1, -0x4832,0x5406,0x4838,0x540f,0xf9de,0x541d,0xf9ed,0x5438,0x483e,0x5442,0xf980,0x5448,0x4844,0x5468,0x484a,0x549e, -0x4850,0x54a2,0x4856,0x54bd,0xf99e,0x54f6,0x485c,0x5510,0x4862,0x5553,0x4868,0x5555,0xfa79,0x5563,0x486e,0x5584, -0x4874,0x5587,0xf90b,0x5599,0x487a,0x559d,0x4882,0x55ab,0x4887,0x55b3,0x488d,0x55c0,0xfa0d,0x55c2,0x4893,0x55e2, -0xfa7b,0x5606,0x4899,0x5651,0x48a1,0x5668,0xfa38,0x5674,0x48a7,0x56f9,0xf9a9,0x5716,0x48ad,0x5717,0x48b3,0x578b, -0x48b9,0x57ce,0x48bf,0x57f4,0x48c5,0x580d,0x48cb,0x5831,0x48d1,0x5832,0x48d7,0x5840,0xfa39,0x585a,0x48dd,0x585e, -0xf96c,0x58a8,0xfa3a,0x58ac,0x48e2,0x58b3,0xfa7d,0x58d8,0xf94a,0x58df,0xf942,0x58ee,0x48e8,0x58f2,0x48ee,0x58f7, -0x48f4,0x5906,0x48fa,0x591a,0x4900,0x5922,0x4906,0x5944,0xfa7e,0x5948,0xf90c,0x5951,0xf909,0x5954,0xfa7f,0x5962, -0x490c,0x5973,0xf981,0x59d8,0x4912,0x59ec,0x4918,0x5a1b,0x491e,0x5a27,0x4924,0x5a62,0xfa80,0x5a66,0x492a,0x5ab5, -0x4930,0x5b08,0x4936,0x5b28,0xfa81,0x5b3e,0x493c,0x5b85,0xfa04,0x5bc3,0x4942,0x5bd8,0x4948,0x5be7,0x494e,0x5bee, -0xf9bc,0x5bf3,0x4958,0x5bff,0x495e,0x5c06,0x4964,0x5c22,0x496a,0x5c3f,0xf9bd,0x5c60,0x4970,0x5c62,0xf94b,0x5c64, -0xfa3b,0x5c65,0xf9df,0x5c6e,0x4976,0x5c8d,0x497e,0x5cc0,0x4984,0x5d19,0xf9d5,0x5d43,0x498a,0x5d50,0xf921,0x5d6b, -0x4990,0x5d6e,0x4996,0x5d7c,0x499c,0x5db2,0x49a2,0x5dba,0xf9ab,0x5de1,0x49a8,0x5de2,0x49ae,0x5dfd,0x49b4,0x5e28, -0x49ba,0x5e3d,0x49c0,0x5e69,0x49c6,0x5e74,0xf98e,0x5ea6,0xfa01,0x5eb0,0x49cc,0x5eb3,0x49d2,0x5eb6,0x49d8,0x5ec9, -0xf9a2,0x5eca,0x49de,0x5ed2,0xfa82,0x5ed3,0xfa0b,0x5ed9,0xfa83,0x5eec,0xf982,0x5efe,0x49e6,0x5f04,0xf943,0x5f22, -0x49ec,0x5f53,0x49f2,0x5f62,0x49f8,0x5f69,0xfa84,0x5f6b,0x49fe,0x5f8b,0xf9d8,0x5f9a,0x4a04,0x5fa9,0xf966,0x5fad, -0xfa85,0x5fcd,0x4a0a,0x5fd7,0x4a10,0x5ff5,0xf9a3,0x5ff9,0x4a16,0x6012,0xf960,0x601c,0xf9ac,0x6081,0x4a1c,0x6094, -0x4a22,0x60c7,0x4a2a,0x60d8,0xfa86,0x60e1,0xf9b9,0x6108,0xfa88,0x6144,0xf9d9,0x6148,0x4a30,0x614c,0x4a36,0x614e, -0x4a40,0x6160,0xfa8a,0x6168,0xfa3e,0x617a,0x4a48,0x618e,0x4a4e,0x6190,0xf98f,0x61a4,0x4a58,0x61af,0x4a5e,0x61b2, -0x4a64,0x61de,0x4a6a,0x61f2,0x4a70,0x61f6,0x4a7a,0x6200,0xf990,0x6210,0x4a82,0x621b,0x4a88,0x622e,0xf9d2,0x6234, -0xfa8c,0x625d,0x4a8e,0x62b1,0x4a94,0x62c9,0xf925,0x62cf,0xf95b,0x62d3,0xfa02,0x62d4,0x4a9a,0x62fc,0x4aa0,0x62fe, -0xf973,0x633d,0x4aa6,0x6350,0x4aac,0x6368,0x4ab2,0x637b,0xf9a4,0x6383,0x4ab8,0x63a0,0xf975,0x63a9,0x4abe,0x63c4, -0xfa8d,0x63c5,0x4ac4,0x63e4,0x4aca,0x641c,0xfa8e,0x6422,0x4ad0,0x6452,0xfa8f,0x6469,0x4ad6,0x6477,0x4adc,0x647e, -0x4ae2,0x649a,0xf991,0x649d,0x4ae8,0x64c4,0xf930,0x654f,0x4aee,0x6556,0xfa90,0x656c,0x4af6,0x6578,0xf969,0x6599, -0xf9be,0x65c5,0xf983,0x65e2,0xfa42,0x65e3,0x4afc,0x6613,0xf9e0,0x6649,0x4b02,0x6674,0x4b08,0x6688,0xf9c5,0x6691, -0x4b0d,0x669c,0x4b15,0x66b4,0xfa06,0x66c6,0xf98b,0x66f4,0xf901,0x66f8,0x4b1b,0x6700,0x4b21,0x6717,0x4b27,0x671b, -0x4b31,0x6721,0x4b39,0x674e,0xf9e1,0x6753,0x4b3f,0x6756,0xfa94,0x675e,0x4b45,0x677b,0xf9c8,0x6785,0x4b4b,0x6797, -0xf9f4,0x67f3,0xf9c9,0x67fa,0x4b51,0x6817,0xf9da,0x681f,0x4b57,0x6852,0x4b5d,0x6881,0xf97a,0x6885,0x4b63,0x688e, -0x4b6b,0x68a8,0xf9e2,0x6914,0x4b71,0x6942,0x4b77,0x69a3,0x4b7d,0x69ea,0x4b83,0x6a02,0x4b89,0x6a13,0xf94c,0x6aa8, -0x4b90,0x6ad3,0xf931,0x6adb,0x4b96,0x6b04,0xf91d,0x6b21,0x4b9c,0x6b54,0x4ba2,0x6b72,0x4ba8,0x6b77,0xf98c,0x6b79, -0xfa95,0x6b9f,0x4bae,0x6bae,0xf9a5,0x6bba,0x4bb4,0x6bbb,0x4bbe,0x6c4e,0x4bc4,0x6c67,0x4bca,0x6c88,0xf972,0x6cbf, -0x4bd0,0x6ccc,0xf968,0x6ccd,0x4bd6,0x6ce5,0xf9e3,0x6d16,0x4bdc,0x6d1b,0xf915,0x6d1e,0xfa05,0x6d34,0x4be2,0x6d3e, -0x4be8,0x6d41,0x4bee,0x6d69,0x4bf8,0x6d6a,0xf92a,0x6d77,0x4bfe,0x6d78,0x4c06,0x6d85,0x4c0c,0x6dcb,0xf9f5,0x6dda, -0xf94d,0x6dea,0xf9d6,0x6df9,0x4c12,0x6e1a,0xfa46,0x6e2f,0x4c18,0x6e6e,0x4c1e,0x6e9c,0xf9cb,0x6eba,0xf9ec,0x6ec7, -0x4c24,0x6ecb,0x4c2a,0x6ed1,0xf904,0x6edb,0xfa98,0x6f0f,0xf94e,0x6f22,0x4c32,0x6f23,0xf992,0x6f6e,0x4c37,0x6fc6, -0x4c3d,0x6feb,0xf922,0x6ffe,0xf984,0x701b,0x4c43,0x701e,0x4c49,0x7039,0x4c51,0x704a,0x4c57,0x7070,0x4c5d,0x7077, -0x4c63,0x707d,0x4c69,0x7099,0xf9fb,0x70ad,0x4c6f,0x70c8,0xf99f,0x70d9,0xf916,0x7145,0x4c75,0x7149,0xf993,0x716e, -0x4c7b,0x719c,0x4c80,0x71ce,0xf9c0,0x71d0,0xf9ee,0x7210,0xf932,0x721b,0xf91e,0x7228,0x4c86,0x722b,0xfa49,0x7235, -0x4c8c,0x7250,0x4c94,0x7262,0xf946,0x7280,0x4c9a,0x7295,0x4ca0,0x72af,0xfa9f,0x72c0,0xf9fa,0x72fc,0xf92b,0x732a, -0x4ca6,0x7375,0xf9a7,0x737a,0x4cab,0x7387,0x4cb1,0x738b,0x4cb6,0x73a5,0x4cbc,0x73b2,0xf9ad,0x73de,0xf917,0x7406, -0xf9e4,0x7409,0xf9cc,0x7422,0xfa4a,0x7447,0x4cc2,0x745c,0x4cc8,0x7469,0xf9ae,0x7471,0x4cce,0x7485,0x4cd6,0x7489, -0xf994,0x7498,0xf9ef,0x74ca,0x4cdc,0x7506,0xfaa2,0x7524,0x4ce2,0x753b,0xfaa3,0x753e,0x4ce8,0x7559,0xf9cd,0x7565, -0xf976,0x7570,0x4cee,0x75e2,0xf9e5,0x7610,0x4cf6,0x761d,0xfaa4,0x761f,0xfaa5,0x7642,0xf9c1,0x7669,0xf90e,0x76ca, -0x4cfc,0x76db,0xfaa7,0x76e7,0xf933,0x76f4,0x4d01,0x7701,0xf96d,0x771e,0x4d09,0x771f,0x4d0f,0x7740,0xfaaa,0x774a, -0x4d15,0x778b,0x4d1d,0x77a7,0xfa9d,0x784e,0x4d23,0x786b,0xf9ce,0x788c,0x4d29,0x7891,0xfa4b,0x78ca,0xf947,0x78cc, -0x4d31,0x78fb,0xf964,0x792a,0xf985,0x793c,0xfa18,0x793e,0xfa4c,0x7948,0xfa4e,0x7949,0xfa4d,0x7950,0xfa4f,0x7956, -0x4d39,0x795d,0xfa51,0x795e,0xfa19,0x7965,0xfa1a,0x797f,0xf93c,0x798d,0xfa52,0x798e,0xfa53,0x798f,0x4d41,0x79ae, -0xf9b6,0x79ca,0xf995,0x79eb,0x4d49,0x7a1c,0xf956,0x7a40,0x4d4f,0x7a4a,0x4d57,0x7a4f,0x4d5d,0x7a81,0xfa55,0x7ab1, -0xfaac,0x7acb,0xf9f7,0x7aee,0x4d63,0x7b20,0xf9f8,0x7bc0,0x4d69,0x7bc6,0x4d6e,0x7bc9,0x4d74,0x7c3e,0xf9a6,0x7c60, -0xf944,0x7c7b,0xfaae,0x7c92,0xf9f9,0x7cbe,0xfa1d,0x7cd2,0x4d7a,0x7cd6,0xfa03,0x7ce3,0x4d80,0x7ce7,0xf97b,0x7ce8, -0x4d86,0x7d00,0x4d8c,0x7d10,0xf9cf,0x7d22,0xf96a,0x7d2f,0xf94f,0x7d5b,0xfaaf,0x7d63,0x4d92,0x7da0,0xf93d,0x7dbe, -0xf957,0x7dc7,0x4d98,0x7df4,0x4d9e,0x7e02,0x4da5,0x7e09,0xfa58,0x7e37,0xf950,0x7e41,0xfa59,0x7e45,0x4dab,0x7f3e, -0xfab1,0x7f72,0xfa5a,0x7f79,0xf9e6,0x7f7a,0x4db1,0x7f85,0xf90f,0x7f95,0x4db7,0x7f9a,0xf9af,0x7fbd,0xfa1e,0x7ffa, -0x4dbd,0x8001,0xf934,0x8005,0x4dc3,0x8046,0xf9b0,0x8060,0x4dcd,0x806f,0xf997,0x8070,0x4dd3,0x807e,0xf945,0x808b, -0xf953,0x80ad,0x4dd9,0x80b2,0x4ddf,0x8103,0x4de5,0x813e,0x4deb,0x81d8,0xf926,0x81e8,0xf9f6,0x81ed,0xfa5c,0x8201, -0x4df1,0x8204,0x4dfb,0x826f,0xf97c,0x8279,0x4e01,0x828b,0x4e04,0x8291,0x4e0a,0x829d,0x4e10,0x82b1,0x4e16,0x82b3, -0x4e1c,0x82bd,0x4e22,0x82e5,0x4e28,0x82e6,0x4e30,0x831d,0x4e36,0x8323,0x4e3c,0x8336,0xf9fe,0x8352,0xfab3,0x8353, -0x4e42,0x8363,0x4e48,0x83ad,0x4e4e,0x83bd,0x4e54,0x83c9,0xf93e,0x83ca,0x4e5a,0x83cc,0x4e60,0x83dc,0x4e66,0x83e7, -0x4e6c,0x83ef,0xfab4,0x83f1,0xf958,0x843d,0xf918,0x8449,0xf96e,0x8457,0x4e72,0x84ee,0xf999,0x84f1,0x4e7a,0x84f3, -0x4e80,0x84fc,0xf9c2,0x8516,0x4e86,0x8564,0x4e8c,0x85cd,0xf923,0x85fa,0xf9f0,0x8606,0xf935,0x8612,0xfa20,0x862d, -0xf91f,0x863f,0xf910,0x8650,0x4e92,0x865c,0x4e98,0x8667,0x4ea0,0x8669,0x4ea6,0x8688,0x4eac,0x86a9,0x4eb2,0x86e2, -0x4eb8,0x870e,0x4ebe,0x8728,0x4ec4,0x876b,0x4eca,0x8779,0x4ed0,0x8786,0x4ed8,0x87ba,0xf911,0x87e1,0x4ede,0x8801, -0x4ee4,0x881f,0xf927,0x884c,0xfa08,0x8860,0x4eea,0x8863,0x4ef0,0x88c2,0xf9a0,0x88cf,0xf9e7,0x88d7,0x4ef6,0x88de, -0x4efc,0x88e1,0xf9e8,0x88f8,0xf912,0x88fa,0x4f02,0x8910,0xfa60,0x8941,0xfab6,0x8964,0xf924,0x8986,0xfab7,0x898b, -0xfa0a,0x8996,0x4f08,0x8aa0,0x4f0d,0x8aaa,0x4f13,0x8abf,0xfab9,0x8acb,0xfabb,0x8ad2,0xf97d,0x8ad6,0xf941,0x8aed, -0x4f18,0x8af8,0x4f20,0x8afe,0x4f25,0x8b01,0x4f2a,0x8b39,0x4f2f,0x8b58,0xf9fc,0x8b80,0xf95a,0x8b8a,0x4f34,0x8c48, -0xf900,0x8c55,0x4f3c,0x8cab,0x4f42,0x8cc1,0x4f48,0x8cc2,0xf948,0x8cc8,0xf903,0x8cd3,0xfa64,0x8d08,0x4f4e,0x8d1b, -0x4f53,0x8d77,0x4f59,0x8dbc,0x4f5f,0x8dcb,0x4f65,0x8def,0xf937,0x8df0,0x4f6b,0x8eca,0xf902,0x8ed4,0x4f71,0x8f26, -0xf998,0x8f2a,0xf9d7,0x8f38,0x4f77,0x8f3b,0xfa07,0x8f62,0xf98d,0x8f9e,0x4f7f,0x8fb0,0xf971,0x8fb6,0xfa66,0x9023, -0xf99a,0x9038,0x4f85,0x9072,0xfac3,0x907c,0xf9c3,0x908f,0xf913,0x9094,0x4f8a,0x90ce,0xf92c,0x90f1,0x4f90,0x90fd, -0xfa26,0x9111,0x4f96,0x911b,0x4f9c,0x916a,0xf919,0x9199,0xfac4,0x91b4,0xf9b7,0x91cc,0xf9e9,0x91cf,0xf97e,0x91d1, -0xf90a,0x9234,0xf9b1,0x9238,0x4fa2,0x9276,0xfac5,0x927c,0x4fa8,0x92d7,0x4fae,0x92d8,0x4fb4,0x9304,0xf93f,0x934a, -0xf99b,0x93f9,0x4fba,0x9415,0x4fc0,0x958b,0x4fc6,0x95ad,0xf986,0x95b7,0x4fcc,0x962e,0xf9c6,0x964b,0xf951,0x964d, -0xfa09,0x9675,0xf959,0x9678,0xf9d3,0x967c,0xfac6,0x9686,0xf9dc,0x96a3,0xf9f1,0x96b8,0xf9b8,0x96c3,0x4fd2,0x96e2, -0xf9ea,0x96e3,0x4fd8,0x96f6,0xf9b2,0x96f7,0xf949,0x9723,0x4fdd,0x9732,0xf938,0x9748,0xf9b3,0x9756,0x4fe3,0x97db, -0xfac9,0x97e0,0x4fe8,0x97ff,0x4fee,0x980b,0x4ff3,0x9818,0xf9b4,0x9829,0x4ffb,0x983b,0x5001,0x985e,0xf9d0,0x98e2, -0x5006,0x98ef,0xfa2a,0x98fc,0xfa2b,0x9928,0xfa2c,0x9929,0x500c,0x99a7,0x5012,0x99c2,0x5018,0x99f1,0xf91a,0x99fe, -0x501e,0x9a6a,0xf987,0x9b12,0x5024,0x9b6f,0xf939,0x9c40,0x502c,0x9c57,0xf9f2,0x9cfd,0x5032,0x9d67,0x5038,0x9db4, -0xfa2d,0x9dfa,0xf93a,0x9e1e,0xf920,0x9e7f,0xf940,0x9e97,0xf988,0x9e9f,0xf9f3,0x9ebb,0x503e,0x9ece,0xf989,0x9ef9, -0x5044,0x9efe,0x504a,0x9f05,0x5050,0x9f0f,0x5056,0x9f16,0x505c,0x9f3b,0x5062,0x9f43,0xfad8,0x9f8d,0xf9c4,0x9f8e, -0xfad9,0x9f9c,0x5068,0x8101,0xd157,0xd15e,1,0xd158,0x106d,1,0xd1b9,0x1073,1,0xd1ba,0x1081,0x8202, -0x122,0xf803,0x8202,0x51c,0xf812,0x8202,0x525,0xf91b,0x8202,0x54b,0xf816,0x8202,0x63a,0xf80d,0x8202,0x804, -0xf9d9,0x8202,0x8de,0xf9dd,0x8202,0xa2c,0xf834,0x8202,0xb63,0xf838,0x8202,0x14e4,0xf859,0x8202,0x16a8,0xf860, -0x8202,0x16ea,0xf861,0x8202,0x19c8,0xf86c,0x8202,0x1b18,0xf871,0x8202,0x1d0b,0xf8f8,0x8202,0x1de4,0xf87b,0x8202, -0x1de6,0xf87d,0x8202,0x2183,0xf889,0x8202,0x219f,0xf939,2,0x2331,0x108f,0x8202,0x26d4,0xf8a4,0x8002,0x2844, -0xfad0,0x8002,0x284a,0xfacf,0x8202,0x2b0c,0xf8b8,0x8202,0x2bf1,0xf8be,0x8202,0x300a,0xf8ca,0x8202,0x32b8,0xf897, -0x8202,0x335f,0xf980,0x8202,0x3393,0xf989,0x8202,0x339c,0xf98a,0x8202,0x33c3,0xf8dd,0x8002,0x33d5,0xfad1,0x8202, -0x346d,0xf8e3,0x8202,0x36a3,0xf8ec,0x8202,0x38a7,0xf8f0,0x8202,0x3a8d,0xf8f7,0x8202,0x3afa,0xf8f9,0x8202,0x3cbc, -0xf8fb,0x8202,0x3d1e,0xf906,0x8202,0x3ed1,0xf90d,0x8202,0x3f5e,0xf910,0x8202,0x3f8e,0xf911,0x8202,0x4263,0xf91d, -0x8202,0x43ab,0xf91f,0x8202,0x4608,0xf923,0x8202,0x4735,0xf926,0x8202,0x4814,0xf927,0x8202,0x4c36,0xf935,0x8202, -0x4c92,0xf937,0x8202,0x4fa1,0xf93b,0x8202,0x4fb8,0xf93c,0x8202,0x5044,0xf93d,0x8202,0x50f2,0xf942,0x8202,0x50f3, -0xf941,0x8202,0x5119,0xf943,0x8202,0x5133,0xf944,0x8002,0x5249,0xfad5,0x8202,0x541d,0xf94d,0x8202,0x5626,0xf952, -0x8202,0x569a,0xf954,0x8202,0x56c5,0xf955,0x8202,0x597c,0xf95c,2,0x5aa7,0x1095,0x8202,0x5bab,0xf961,0x8202, -0x5c80,0xf965,0x8002,0x5cd0,0xfad6,0x8202,0x5f86,0xf96b,0x8202,0x61da,0xf898,0x8202,0x6228,0xf972,0x8202,0x6247, -0xf973,0x8202,0x62d9,0xf975,0x8202,0x633e,0xf977,0x8202,0x64da,0xf97b,0x8202,0x6523,0xf97c,0x8202,0x65a8,0xf97e, -0x8202,0x67a7,0xf987,0x8202,0x67b5,0xf988,0x8202,0x6b3c,0xf997,0x8202,0x6c36,0xf9a4,0x8202,0x6cd5,0xf9a6,0x8202, -0x6d6b,0xf9a5,0x8202,0x6f2c,0xf9ad,0x8202,0x6fb1,0xf9b0,0x8202,0x70d2,0xf9b1,0x8202,0x73ca,0xf9ab,0x8202,0x7667, -0xf9c5,0x8202,0x78ae,0xf9cb,0x8202,0x7966,0xf9cc,0x8202,0x7ca8,0xf9d3,0x8002,0x7ed3,0xfad7,0x8202,0x7f2f,0xf9d8, -0x8202,0x85d2,0xf9e0,0x8202,0x85ed,0xf9e1,0x8202,0x872e,0xf9e5,0x8202,0x8bfa,0xf9ed,0x8202,0x8d77,0xf9f1,0x8202, -0x9145,0xf9f6,0x8202,0x91df,0xf81c,0x8202,0x921a,0xf9f7,0x8202,0x940a,0xf9fb,0x8202,0x9496,0xf9fd,0x8202,0x95b6, -0xfa01,0x8202,0x9b30,0xfa09,0x8202,0xa0ce,0xfa10,0x8202,0xa105,0xfa12,0x8202,0xa20e,0xfa13,0x8202,0xa291,0xfa14, -0x8202,0xa392,0xf88f,0x8202,0xa600,0xfa1d,0x8016,0x12,0xf900,0xfa0e,0xfa10,0xfa11,0xfa12,0xfa13,0xfa15,0xfa1f, -0xfa20,0xfa21,0xfa22,0xfa23,0xfa25,0xfa27,0xfa2a,0xfa2e,0xfa70,0xfada,2,0xf800,2,0xfa1e,0x8376,0x2ba, -0x221,0x222,0x234,0x250,0x2ae,0x2b0,0x2ef,0x300,0x350,0x360,0x370,0x374,0x376,0x37a,0x37b,0x37e, -0x37f,0x384,0x38b,0x38c,0x38d,0x38e,0x3a2,0x3a3,0x3cf,0x3d0,0x3f7,0x400,0x487,0x488,0x4cf,0x4d0, -0x4f6,0x4f8,0x4fa,0x500,0x510,0x531,0x557,0x559,0x560,0x561,0x588,0x589,0x58b,0x591,0x5a2,0x5a3, -0x5ba,0x5bb,0x5c5,0x5d0,0x5eb,0x5f0,0x5f5,0x60c,0x60d,0x61b,0x61c,0x61f,0x620,0x621,0x63b,0x640, -0x656,0x660,0x6ee,0x6f0,0x6ff,0x700,0x70e,0x70f,0x72d,0x730,0x74b,0x780,0x7b2,0x901,0x904,0x905, -0x93a,0x93c,0x94e,0x950,0x955,0x958,0x971,0x981,0x984,0x985,0x98d,0x98f,0x991,0x993,0x9a9,0x9aa, -0x9b1,0x9b2,0x9b3,0x9b6,0x9ba,0x9bc,0x9bd,0x9be,0x9c5,0x9c7,0x9c9,0x9cb,0x9ce,0x9d7,0x9d8,0x9dc, -0x9de,0x9df,0x9e4,0x9e6,0x9fb,0xa02,0xa03,0xa05,0xa0b,0xa0f,0xa11,0xa13,0xa29,0xa2a,0xa31,0xa32, -0xa34,0xa35,0xa37,0xa38,0xa3a,0xa3c,0xa3d,0xa3e,0xa43,0xa47,0xa49,0xa4b,0xa4e,0xa59,0xa5d,0xa5e, -0xa5f,0xa66,0xa75,0xa81,0xa84,0xa85,0xa8c,0xa8d,0xa8e,0xa8f,0xa92,0xa93,0xaa9,0xaaa,0xab1,0xab2, -0xab4,0xab5,0xaba,0xabc,0xac6,0xac7,0xaca,0xacb,0xace,0xad0,0xad1,0xae0,0xae1,0xae6,0xaf0,0xb01, -0xb04,0xb05,0xb0d,0xb0f,0xb11,0xb13,0xb29,0xb2a,0xb31,0xb32,0xb34,0xb36,0xb3a,0xb3c,0xb44,0xb47, -0xb49,0xb4b,0xb4e,0xb56,0xb58,0xb5c,0xb5e,0xb5f,0xb62,0xb66,0xb71,0xb82,0xb84,0xb85,0xb8b,0xb8e, -0xb91,0xb92,0xb96,0xb99,0xb9b,0xb9c,0xb9d,0xb9e,0xba0,0xba3,0xba5,0xba8,0xbab,0xbae,0xbb6,0xbb7, -0xbba,0xbbe,0xbc3,0xbc6,0xbc9,0xbca,0xbce,0xbd7,0xbd8,0xbe7,0xbf3,0xc01,0xc04,0xc05,0xc0d,0xc0e, -0xc11,0xc12,0xc29,0xc2a,0xc34,0xc35,0xc3a,0xc3e,0xc45,0xc46,0xc49,0xc4a,0xc4e,0xc55,0xc57,0xc60, -0xc62,0xc66,0xc70,0xc82,0xc84,0xc85,0xc8d,0xc8e,0xc91,0xc92,0xca9,0xcaa,0xcb4,0xcb5,0xcba,0xcbe, -0xcc5,0xcc6,0xcc9,0xcca,0xcce,0xcd5,0xcd7,0xcde,0xcdf,0xce0,0xce2,0xce6,0xcf0,0xd02,0xd04,0xd05, -0xd0d,0xd0e,0xd11,0xd12,0xd29,0xd2a,0xd3a,0xd3e,0xd44,0xd46,0xd49,0xd4a,0xd4e,0xd57,0xd58,0xd60, -0xd62,0xd66,0xd70,0xd82,0xd84,0xd85,0xd97,0xd9a,0xdb2,0xdb3,0xdbc,0xdbd,0xdbe,0xdc0,0xdc7,0xdca, -0xdcb,0xdcf,0xdd5,0xdd6,0xdd7,0xdd8,0xde0,0xdf2,0xdf5,0xe01,0xe3b,0xe3f,0xe5c,0xe81,0xe83,0xe84, -0xe85,0xe87,0xe89,0xe8a,0xe8b,0xe8d,0xe8e,0xe94,0xe98,0xe99,0xea0,0xea1,0xea4,0xea5,0xea6,0xea7, -0xea8,0xeaa,0xeac,0xead,0xeba,0xebb,0xebe,0xec0,0xec5,0xec6,0xec7,0xec8,0xece,0xed0,0xeda,0xedc, -0xede,0xf00,0xf48,0xf49,0xf6b,0xf71,0xf8c,0xf90,0xf98,0xf99,0xfbd,0xfbe,0xfcd,0xfcf,0xfd0,0x1000, -0x1022,0x1023,0x1028,0x1029,0x102b,0x102c,0x1033,0x1036,0x103a,0x1040,0x105a,0x10a0,0x10c6,0x10d0,0x10f9,0x10fb, -0x10fc,0x1100,0x115a,0x115f,0x11a3,0x11a8,0x11fa,0x1200,0x1207,0x1208,0x1247,0x1248,0x1249,0x124a,0x124e,0x1250, -0x1257,0x1258,0x1259,0x125a,0x125e,0x1260,0x1287,0x1288,0x1289,0x128a,0x128e,0x1290,0x12af,0x12b0,0x12b1,0x12b2, -0x12b6,0x12b8,0x12bf,0x12c0,0x12c1,0x12c2,0x12c6,0x12c8,0x12cf,0x12d0,0x12d7,0x12d8,0x12ef,0x12f0,0x130f,0x1310, -0x1311,0x1312,0x1316,0x1318,0x131f,0x1320,0x1347,0x1348,0x135b,0x1361,0x137d,0x13a0,0x13f5,0x1401,0x1677,0x1680, -0x169d,0x16a0,0x16f1,0x1700,0x170d,0x170e,0x1715,0x1720,0x1737,0x1740,0x1754,0x1760,0x176d,0x176e,0x1771,0x1772, -0x1774,0x1780,0x17dd,0x17e0,0x17ea,0x1800,0x180f,0x1810,0x181a,0x1820,0x1878,0x1880,0x18aa,0x1e00,0x1e9c,0x1ea0, -0x1efa,0x1f00,0x1f16,0x1f18,0x1f1e,0x1f20,0x1f46,0x1f48,0x1f4e,0x1f50,0x1f58,0x1f59,0x1f5a,0x1f5b,0x1f5c,0x1f5d, -0x1f5e,0x1f5f,0x1f7e,0x1f80,0x1fb5,0x1fb6,0x1fc5,0x1fc6,0x1fd4,0x1fd6,0x1fdc,0x1fdd,0x1ff0,0x1ff2,0x1ff5,0x1ff6, -0x1fff,0x2000,0x2053,0x2057,0x2058,0x205f,0x2064,0x206a,0x2072,0x2074,0x208f,0x20a0,0x20b2,0x20d0,0x20eb,0x2100, -0x213b,0x213d,0x214c,0x2153,0x2184,0x2190,0x23cf,0x2400,0x2427,0x2440,0x244b,0x2460,0x24ff,0x2500,0x2614,0x2616, -0x2618,0x2619,0x267e,0x2680,0x268a,0x2701,0x2705,0x2706,0x270a,0x270c,0x2728,0x2729,0x274c,0x274d,0x274e,0x274f, -0x2753,0x2756,0x2757,0x2758,0x275f,0x2761,0x2795,0x2798,0x27b0,0x27b1,0x27bf,0x27d0,0x27ec,0x27f0,0x2b00,0x2e80, -0x2e9a,0x2e9b,0x2ef4,0x2f00,0x2fd6,0x2ff0,0x2ffc,0x3000,0x3040,0x3041,0x3097,0x3099,0x3100,0x3105,0x312d,0x3131, -0x318f,0x3190,0x31b8,0x31f0,0x321d,0x3220,0x3244,0x3251,0x327c,0x327f,0x32cc,0x32d0,0x32ff,0x3300,0x3377,0x337b, -0x33de,0x33e0,0x33ff,0x3400,0x4db6,0x4e00,0x9fa6,0xa000,0xa48d,0xa490,0xa4c7,0xac00,0xd7a4,0xd800,0xfa2e,0xfa30, -0xfa6b,0xfb00,0xfb07,0xfb13,0xfb18,0xfb1d,0xfb37,0xfb38,0xfb3d,0xfb3e,0xfb3f,0xfb40,0xfb42,0xfb43,0xfb45,0xfb46, -0xfbb2,0xfbd3,0xfd40,0xfd50,0xfd90,0xfd92,0xfdc8,0xfdd0,0xfdfd,0xfe00,0xfe10,0xfe20,0xfe24,0xfe30,0xfe47,0xfe49, -0xfe53,0xfe54,0xfe67,0xfe68,0xfe6c,0xfe70,0xfe75,0xfe76,0xfefd,0xfeff,0xff00,0xff01,0xffbf,0xffc2,0xffc8,0xffca, -0xffd0,0xffd2,0xffd8,0xffda,0xffdd,0xffe0,0xffe7,0xffe8,0xffef,0xfff9,1,0,1,0x300,1,0x31f, -1,0x320,1,0x324,1,0x330,1,0x34b,1,0x400,1,0x426,1,0x428,1,0x44e, -1,0xd000,1,0xd0f6,1,0xd100,1,0xd127,1,0xd12a,1,0xd1de,1,0xd400,1,0xd455, -1,0xd456,1,0xd49d,1,0xd49e,1,0xd4a0,1,0xd4a2,1,0xd4a3,1,0xd4a5,1,0xd4a7, -1,0xd4a9,1,0xd4ad,1,0xd4ae,1,0xd4ba,1,0xd4bb,1,0xd4bc,1,0xd4bd,1,0xd4c1, -1,0xd4c2,1,0xd4c4,1,0xd4c5,1,0xd506,1,0xd507,1,0xd50b,1,0xd50d,1,0xd515, -1,0xd516,1,0xd51d,1,0xd51e,1,0xd53a,1,0xd53b,1,0xd53f,1,0xd540,1,0xd545, -1,0xd546,1,0xd547,1,0xd54a,1,0xd551,1,0xd552,1,0xd6a4,1,0xd6a8,1,0xd7ca, -1,0xd7ce,1,0xd800,1,0xfffe,2,0xa6d7,2,0xf800,2,0xfa1e,2,0xfffe,3,0, -3,0xfffe,4,0,4,0xfffe,5,0,5,0xfffe,6,0,6,0xfffe,7,0, -7,0xfffe,8,0,8,0xfffe,9,0,9,0xfffe,0xa,0,0xa,0xfffe,0xb,0, -0xb,0xfffe,0xc,0,0xc,0xfffe,0xd,0,0xd,0xfffe,0xe,0,0xe,1,0xe,2, -0xe,0x20,0xe,0x80,0xe,0xfffe +0x4536,0x110e,0x4539,0x110f,0x453c,0x1110,0x453f,0x1111,0x4542,0x1112,0x4545,0x1b05,0x1b06,0x1b07,0x1b08,0x1b09, +0x1b0a,0x1b0b,0x1b0c,0x1b0d,0x1b0e,0x1b11,0x1b12,0x1b3a,0x1b3b,0x1b3c,0x1b3d,0x1b3e,0x1b40,0x1b3f,0x1b41,0x1b42, +0x1b43,0x1fbf,0x4548,0x1ffe,0x454b,0x2002,0x2000,0x2003,0x2001,0x2190,0x219a,0x2192,0x219b,0x2194,0x21ae,0x21d0, +0x21cd,0x21d2,0x21cf,0x21d4,0x21ce,0x2203,0x2204,0x2208,0x2209,0x220b,0x220c,0x2223,0x2224,0x2225,0x2226,0x223c, +0x2241,0x2243,0x2244,0x2245,0x2247,0x2248,0x2249,0x224d,0x226d,0x2261,0x2262,0x2264,0x2270,0x2265,0x2271,0x2272, +0x2274,0x2273,0x2275,0x2276,0x2278,0x2277,0x2279,0x227a,0x2280,0x227b,0x2281,0x227c,0x22e0,0x227d,0x22e1,0x2282, +0x2284,0x2283,0x2285,0x2286,0x2288,0x2287,0x2289,0x2291,0x22e2,0x2292,0x22e3,0x22a2,0x22ac,0x22a8,0x22ad,0x22a9, +0x22ae,0x22ab,0x22af,0x22b2,0x22ea,0x22b3,0x22eb,0x22b4,0x22ec,0x22b5,0x22ed,0x2add,0x2adc,0x3008,0x2329,0x3009, +0x232a,0x3046,0x3094,0x304b,0x304c,0x304d,0x304e,0x304f,0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057, +0x3058,0x3059,0x305a,0x305b,0x305c,0x305d,0x305e,0x305f,0x3060,0x3061,0x3062,0x3064,0x3065,0x3066,0x3067,0x3068, +0x3069,0x306f,0x454e,0x3072,0x4551,0x3075,0x4554,0x3078,0x4557,0x307b,0x455a,0x309d,0x309e,0x30a6,0x30f4,0x30ab, +0x30ac,0x30ad,0x30ae,0x30af,0x30b0,0x30b1,0x30b2,0x30b3,0x30b4,0x30b5,0x30b6,0x30b7,0x30b8,0x30b9,0x30ba,0x30bb, +0x30bc,0x30bd,0x30be,0x30bf,0x30c0,0x30c1,0x30c2,0x30c4,0x30c5,0x30c6,0x30c7,0x30c8,0x30c9,0x30cf,0x455d,0x30d2, +0x4560,0x30d5,0x4563,0x30d8,0x4566,0x30db,0x4569,0x30ef,0x30f7,0x30f0,0x30f8,0x30f1,0x30f9,0x30f2,0x30fa,0x30fd, +0x30fe,0x349e,0x456c,0x34b9,0x4572,0x34bb,0x4578,0x34df,0x457e,0x3515,0x4584,0x36ee,0x458a,0x36fc,0x4590,0x3781, +0x4596,0x382f,0x459c,0x3862,0x45a2,0x387c,0x45a8,0x38c7,0x45ae,0x38e3,0x45b4,0x391c,0x45ba,0x393a,0x45c0,0x3a2e, +0x45c6,0x3a6c,0x45cc,0x3ae4,0x45d2,0x3b08,0x45d8,0x3b19,0x45de,0x3b49,0x45e4,0x3b9d,0x45ea,0x3c18,0x45f2,0x3c4e, +0x45f8,0x3d33,0x45fe,0x3d96,0x4604,0x3eac,0x460a,0x3eb8,0x4610,0x3f1b,0x4616,0x3ffc,0x461c,0x4008,0x4622,0x4018, +0xfad3,0x4039,0x4628,0x4046,0x4630,0x4096,0x4636,0x40e3,0x463c,0x412f,0x4642,0x4202,0x4648,0x4227,0x464e,0x42a0, +0x4654,0x4301,0x465a,0x4334,0x4660,0x4359,0x4666,0x43d5,0x466c,0x43d9,0x4672,0x440b,0x4678,0x446b,0x467e,0x452b, +0x4684,0x455d,0x468a,0x4561,0x4690,0x456b,0x4696,0x45d7,0x469c,0x45f9,0x46a2,0x4635,0x46a8,0x46be,0x46ae,0x46c7, +0x46b4,0x4995,0x46ba,0x49e6,0x46c0,0x4a6e,0x46c6,0x4a76,0x46cc,0x4ab2,0x46d2,0x4b33,0x46d8,0x4bce,0x46de,0x4cce, +0x46e4,0x4ced,0x46ea,0x4cf8,0x46f0,0x4d56,0x46f6,0x4e0d,0xf967,0x4e26,0xfa70,0x4e32,0xf905,0x4e38,0x46fc,0x4e39, +0xf95e,0x4e3d,0x4702,0x4e41,0x4708,0x4e82,0xf91b,0x4e86,0xf9ba,0x4eae,0xf977,0x4ec0,0xf9fd,0x4ecc,0x470e,0x4ee4, +0xf9a8,0x4f60,0x4714,0x4f80,0xfa73,0x4f86,0xf92d,0x4f8b,0xf9b5,0x4fae,0x471a,0x4fbb,0x4722,0x4fbf,0xf965,0x5002, +0x4728,0x502b,0xf9d4,0x507a,0x472e,0x5099,0x4734,0x50cf,0x473a,0x50da,0xf9bb,0x50e7,0x4740,0x5140,0xfa0c,0x5145, +0xfa74,0x514d,0x4748,0x5154,0x4750,0x5164,0x4756,0x5167,0x475c,0x5168,0xfa72,0x5169,0xf978,0x516d,0xf9d1,0x5177, +0x4762,0x5180,0xfa75,0x518d,0x4768,0x5192,0x476e,0x5195,0x4774,0x5197,0x477a,0x51a4,0x4780,0x51ac,0x4786,0x51b5, +0x478c,0x51b7,0xf92e,0x51c9,0xf979,0x51cc,0xf955,0x51dc,0xf954,0x51de,0xfa15,0x51f5,0x4794,0x5203,0x479a,0x5207, +0x47a0,0x5217,0xf99c,0x5229,0xf9dd,0x523a,0xf9ff,0x523b,0x47a8,0x5246,0x47ae,0x5272,0x47b4,0x5277,0x47ba,0x5289, +0xf9c7,0x529b,0xf98a,0x52a3,0xf99d,0x52b3,0x47c0,0x52c7,0x47c6,0x52c9,0x47ce,0x52d2,0xf952,0x52de,0xf92f,0x52e4, +0x47d6,0x52f5,0xf97f,0x52fa,0x47de,0x5305,0x47e6,0x5306,0x47ec,0x5317,0x47f2,0x533f,0xf9eb,0x5349,0x47fa,0x5351, +0x4800,0x535a,0x4808,0x5373,0x480e,0x5375,0xf91c,0x537d,0x4814,0x537f,0x481a,0x53c3,0xf96b,0x53ca,0x4820,0x53df, +0x4826,0x53e5,0xf906,0x53eb,0x482c,0x53f1,0x4832,0x5406,0x4838,0x540f,0xf9de,0x541d,0xf9ed,0x5438,0x483e,0x5442, +0xf980,0x5448,0x4844,0x5468,0x484a,0x549e,0x4850,0x54a2,0x4856,0x54bd,0xf99e,0x54f6,0x485c,0x5510,0x4862,0x5553, +0x4868,0x5555,0xfa79,0x5563,0x486e,0x5584,0x4874,0x5587,0xf90b,0x5599,0x487a,0x559d,0x4882,0x55ab,0x4887,0x55b3, +0x488d,0x55c0,0xfa0d,0x55c2,0x4893,0x55e2,0xfa7b,0x5606,0x4899,0x5651,0x48a1,0x5668,0xfa38,0x5674,0x48a7,0x56f9, +0xf9a9,0x5716,0x48ad,0x5717,0x48b3,0x578b,0x48b9,0x57ce,0x48bf,0x57f4,0x48c5,0x580d,0x48cb,0x5831,0x48d1,0x5832, +0x48d7,0x5840,0xfa39,0x585a,0x48dd,0x585e,0xf96c,0x58a8,0xfa3a,0x58ac,0x48e2,0x58b3,0xfa7d,0x58d8,0xf94a,0x58df, +0xf942,0x58ee,0x48e8,0x58f2,0x48ee,0x58f7,0x48f4,0x5906,0x48fa,0x591a,0x4900,0x5922,0x4906,0x5944,0xfa7e,0x5948, +0xf90c,0x5951,0xf909,0x5954,0xfa7f,0x5962,0x490c,0x5973,0xf981,0x59d8,0x4912,0x59ec,0x4918,0x5a1b,0x491e,0x5a27, +0x4924,0x5a62,0xfa80,0x5a66,0x492a,0x5ab5,0x4930,0x5b08,0x4936,0x5b28,0xfa81,0x5b3e,0x493c,0x5b85,0xfa04,0x5bc3, +0x4942,0x5bd8,0x4948,0x5be7,0x494e,0x5bee,0xf9bc,0x5bf3,0x4958,0x5bff,0x495e,0x5c06,0x4964,0x5c22,0x496a,0x5c3f, +0xf9bd,0x5c60,0x4970,0x5c62,0xf94b,0x5c64,0xfa3b,0x5c65,0xf9df,0x5c6e,0x4976,0x5c8d,0x497e,0x5cc0,0x4984,0x5d19, +0xf9d5,0x5d43,0x498a,0x5d50,0xf921,0x5d6b,0x4990,0x5d6e,0x4996,0x5d7c,0x499c,0x5db2,0x49a2,0x5dba,0xf9ab,0x5de1, +0x49a8,0x5de2,0x49ae,0x5dfd,0x49b4,0x5e28,0x49ba,0x5e3d,0x49c0,0x5e69,0x49c6,0x5e74,0xf98e,0x5ea6,0xfa01,0x5eb0, +0x49cc,0x5eb3,0x49d2,0x5eb6,0x49d8,0x5ec9,0xf9a2,0x5eca,0x49de,0x5ed2,0xfa82,0x5ed3,0xfa0b,0x5ed9,0xfa83,0x5eec, +0xf982,0x5efe,0x49e6,0x5f04,0xf943,0x5f22,0x49ec,0x5f53,0x49f2,0x5f62,0x49f8,0x5f69,0xfa84,0x5f6b,0x49fe,0x5f8b, +0xf9d8,0x5f9a,0x4a04,0x5fa9,0xf966,0x5fad,0xfa85,0x5fcd,0x4a0a,0x5fd7,0x4a10,0x5ff5,0xf9a3,0x5ff9,0x4a16,0x6012, +0xf960,0x601c,0xf9ac,0x6081,0x4a1c,0x6094,0x4a22,0x60c7,0x4a2a,0x60d8,0xfa86,0x60e1,0xf9b9,0x6108,0xfa88,0x6144, +0xf9d9,0x6148,0x4a30,0x614c,0x4a36,0x614e,0x4a40,0x6160,0xfa8a,0x6168,0xfa3e,0x617a,0x4a48,0x618e,0x4a4e,0x6190, +0xf98f,0x61a4,0x4a58,0x61af,0x4a5e,0x61b2,0x4a64,0x61de,0x4a6a,0x61f2,0x4a70,0x61f6,0x4a7a,0x6200,0xf990,0x6210, +0x4a82,0x621b,0x4a88,0x622e,0xf9d2,0x6234,0xfa8c,0x625d,0x4a8e,0x62b1,0x4a94,0x62c9,0xf925,0x62cf,0xf95b,0x62d3, +0xfa02,0x62d4,0x4a9a,0x62fc,0x4aa0,0x62fe,0xf973,0x633d,0x4aa6,0x6350,0x4aac,0x6368,0x4ab2,0x637b,0xf9a4,0x6383, +0x4ab8,0x63a0,0xf975,0x63a9,0x4abe,0x63c4,0xfa8d,0x63c5,0x4ac4,0x63e4,0x4aca,0x641c,0xfa8e,0x6422,0x4ad0,0x6452, +0xfa8f,0x6469,0x4ad6,0x6477,0x4adc,0x647e,0x4ae2,0x649a,0xf991,0x649d,0x4ae8,0x64c4,0xf930,0x654f,0x4aee,0x6556, +0xfa90,0x656c,0x4af6,0x6578,0xf969,0x6599,0xf9be,0x65c5,0xf983,0x65e2,0xfa42,0x65e3,0x4afc,0x6613,0xf9e0,0x6649, +0x4b02,0x6674,0x4b08,0x6688,0xf9c5,0x6691,0x4b0d,0x669c,0x4b15,0x66b4,0xfa06,0x66c6,0xf98b,0x66f4,0xf901,0x66f8, +0x4b1b,0x6700,0x4b21,0x6717,0x4b27,0x671b,0x4b31,0x6721,0x4b39,0x674e,0xf9e1,0x6753,0x4b3f,0x6756,0xfa94,0x675e, +0x4b45,0x677b,0xf9c8,0x6785,0x4b4b,0x6797,0xf9f4,0x67f3,0xf9c9,0x67fa,0x4b51,0x6817,0xf9da,0x681f,0x4b57,0x6852, +0x4b5d,0x6881,0xf97a,0x6885,0x4b63,0x688e,0x4b6b,0x68a8,0xf9e2,0x6914,0x4b71,0x6942,0x4b77,0x69a3,0x4b7d,0x69ea, +0x4b83,0x6a02,0x4b89,0x6a13,0xf94c,0x6aa8,0x4b90,0x6ad3,0xf931,0x6adb,0x4b96,0x6b04,0xf91d,0x6b21,0x4b9c,0x6b54, +0x4ba2,0x6b72,0x4ba8,0x6b77,0xf98c,0x6b79,0xfa95,0x6b9f,0x4bae,0x6bae,0xf9a5,0x6bba,0x4bb4,0x6bbb,0x4bbe,0x6c4e, +0x4bc4,0x6c67,0x4bca,0x6c88,0xf972,0x6cbf,0x4bd0,0x6ccc,0xf968,0x6ccd,0x4bd6,0x6ce5,0xf9e3,0x6d16,0x4bdc,0x6d1b, +0xf915,0x6d1e,0xfa05,0x6d34,0x4be2,0x6d3e,0x4be8,0x6d41,0x4bee,0x6d69,0x4bf8,0x6d6a,0xf92a,0x6d77,0x4bfe,0x6d78, +0x4c06,0x6d85,0x4c0c,0x6dcb,0xf9f5,0x6dda,0xf94d,0x6dea,0xf9d6,0x6df9,0x4c12,0x6e1a,0xfa46,0x6e2f,0x4c18,0x6e6e, +0x4c1e,0x6e9c,0xf9cb,0x6eba,0xf9ec,0x6ec7,0x4c24,0x6ecb,0x4c2a,0x6ed1,0xf904,0x6edb,0xfa98,0x6f0f,0xf94e,0x6f22, +0x4c32,0x6f23,0xf992,0x6f6e,0x4c37,0x6fc6,0x4c3d,0x6feb,0xf922,0x6ffe,0xf984,0x701b,0x4c43,0x701e,0x4c49,0x7039, +0x4c51,0x704a,0x4c57,0x7070,0x4c5d,0x7077,0x4c63,0x707d,0x4c69,0x7099,0xf9fb,0x70ad,0x4c6f,0x70c8,0xf99f,0x70d9, +0xf916,0x7145,0x4c75,0x7149,0xf993,0x716e,0x4c7b,0x719c,0x4c80,0x71ce,0xf9c0,0x71d0,0xf9ee,0x7210,0xf932,0x721b, +0xf91e,0x7228,0x4c86,0x722b,0xfa49,0x7235,0x4c8c,0x7250,0x4c94,0x7262,0xf946,0x7280,0x4c9a,0x7295,0x4ca0,0x72af, +0xfa9f,0x72c0,0xf9fa,0x72fc,0xf92b,0x732a,0x4ca6,0x7375,0xf9a7,0x737a,0x4cab,0x7387,0x4cb1,0x738b,0x4cb6,0x73a5, +0x4cbc,0x73b2,0xf9ad,0x73de,0xf917,0x7406,0xf9e4,0x7409,0xf9cc,0x7422,0xfa4a,0x7447,0x4cc2,0x745c,0x4cc8,0x7469, +0xf9ae,0x7471,0x4cce,0x7485,0x4cd6,0x7489,0xf994,0x7498,0xf9ef,0x74ca,0x4cdc,0x7506,0xfaa2,0x7524,0x4ce2,0x753b, +0xfaa3,0x753e,0x4ce8,0x7559,0xf9cd,0x7565,0xf976,0x7570,0x4cee,0x75e2,0xf9e5,0x7610,0x4cf6,0x761d,0xfaa4,0x761f, +0xfaa5,0x7642,0xf9c1,0x7669,0xf90e,0x76ca,0x4cfc,0x76db,0xfaa7,0x76e7,0xf933,0x76f4,0x4d01,0x7701,0xf96d,0x771e, +0x4d09,0x771f,0x4d0f,0x7740,0xfaaa,0x774a,0x4d15,0x778b,0x4d1d,0x77a7,0xfa9d,0x784e,0x4d23,0x786b,0xf9ce,0x788c, +0x4d29,0x7891,0xfa4b,0x78ca,0xf947,0x78cc,0x4d31,0x78fb,0xf964,0x792a,0xf985,0x793c,0xfa18,0x793e,0xfa4c,0x7948, +0xfa4e,0x7949,0xfa4d,0x7950,0xfa4f,0x7956,0x4d39,0x795d,0xfa51,0x795e,0xfa19,0x7965,0xfa1a,0x797f,0xf93c,0x798d, +0xfa52,0x798e,0xfa53,0x798f,0x4d41,0x79ae,0xf9b6,0x79ca,0xf995,0x79eb,0x4d49,0x7a1c,0xf956,0x7a40,0x4d4f,0x7a4a, +0x4d57,0x7a4f,0x4d5d,0x7a81,0xfa55,0x7ab1,0xfaac,0x7acb,0xf9f7,0x7aee,0x4d63,0x7b20,0xf9f8,0x7bc0,0x4d69,0x7bc6, +0x4d6e,0x7bc9,0x4d74,0x7c3e,0xf9a6,0x7c60,0xf944,0x7c7b,0xfaae,0x7c92,0xf9f9,0x7cbe,0xfa1d,0x7cd2,0x4d7a,0x7cd6, +0xfa03,0x7ce3,0x4d80,0x7ce7,0xf97b,0x7ce8,0x4d86,0x7d00,0x4d8c,0x7d10,0xf9cf,0x7d22,0xf96a,0x7d2f,0xf94f,0x7d5b, +0xfaaf,0x7d63,0x4d92,0x7da0,0xf93d,0x7dbe,0xf957,0x7dc7,0x4d98,0x7df4,0x4d9e,0x7e02,0x4da5,0x7e09,0xfa58,0x7e37, +0xf950,0x7e41,0xfa59,0x7e45,0x4dab,0x7f3e,0xfab1,0x7f72,0xfa5a,0x7f79,0xf9e6,0x7f7a,0x4db1,0x7f85,0xf90f,0x7f95, +0x4db7,0x7f9a,0xf9af,0x7fbd,0xfa1e,0x7ffa,0x4dbd,0x8001,0xf934,0x8005,0x4dc3,0x8046,0xf9b0,0x8060,0x4dcd,0x806f, +0xf997,0x8070,0x4dd3,0x807e,0xf945,0x808b,0xf953,0x80ad,0x4dd9,0x80b2,0x4ddf,0x8103,0x4de5,0x813e,0x4deb,0x81d8, +0xf926,0x81e8,0xf9f6,0x81ed,0xfa5c,0x8201,0x4df1,0x8204,0x4dfb,0x826f,0xf97c,0x8279,0x4e01,0x828b,0x4e04,0x8291, +0x4e0a,0x829d,0x4e10,0x82b1,0x4e16,0x82b3,0x4e1c,0x82bd,0x4e22,0x82e5,0x4e28,0x82e6,0x4e30,0x831d,0x4e36,0x8323, +0x4e3c,0x8336,0xf9fe,0x8352,0xfab3,0x8353,0x4e42,0x8363,0x4e48,0x83ad,0x4e4e,0x83bd,0x4e54,0x83c9,0xf93e,0x83ca, +0x4e5a,0x83cc,0x4e60,0x83dc,0x4e66,0x83e7,0x4e6c,0x83ef,0xfab4,0x83f1,0xf958,0x843d,0xf918,0x8449,0xf96e,0x8457, +0x4e72,0x84ee,0xf999,0x84f1,0x4e7a,0x84f3,0x4e80,0x84fc,0xf9c2,0x8516,0x4e86,0x8564,0x4e8c,0x85cd,0xf923,0x85fa, +0xf9f0,0x8606,0xf935,0x8612,0xfa20,0x862d,0xf91f,0x863f,0xf910,0x8650,0x4e92,0x865c,0x4e98,0x8667,0x4ea0,0x8669, +0x4ea6,0x8688,0x4eac,0x86a9,0x4eb2,0x86e2,0x4eb8,0x870e,0x4ebe,0x8728,0x4ec4,0x876b,0x4eca,0x8779,0x4ed0,0x8786, +0x4ed8,0x87ba,0xf911,0x87e1,0x4ede,0x8801,0x4ee4,0x881f,0xf927,0x884c,0xfa08,0x8860,0x4eea,0x8863,0x4ef0,0x88c2, +0xf9a0,0x88cf,0xf9e7,0x88d7,0x4ef6,0x88de,0x4efc,0x88e1,0xf9e8,0x88f8,0xf912,0x88fa,0x4f02,0x8910,0xfa60,0x8941, +0xfab6,0x8964,0xf924,0x8986,0xfab7,0x898b,0xfa0a,0x8996,0x4f08,0x8aa0,0x4f0d,0x8aaa,0x4f13,0x8abf,0xfab9,0x8acb, +0xfabb,0x8ad2,0xf97d,0x8ad6,0xf941,0x8aed,0x4f18,0x8af8,0x4f20,0x8afe,0x4f25,0x8b01,0x4f2a,0x8b39,0x4f2f,0x8b58, +0xf9fc,0x8b80,0xf95a,0x8b8a,0x4f34,0x8c48,0xf900,0x8c55,0x4f3c,0x8cab,0x4f42,0x8cc1,0x4f48,0x8cc2,0xf948,0x8cc8, +0xf903,0x8cd3,0xfa64,0x8d08,0x4f4e,0x8d1b,0x4f53,0x8d77,0x4f59,0x8dbc,0x4f5f,0x8dcb,0x4f65,0x8def,0xf937,0x8df0, +0x4f6b,0x8eca,0xf902,0x8ed4,0x4f71,0x8f26,0xf998,0x8f2a,0xf9d7,0x8f38,0x4f77,0x8f3b,0xfa07,0x8f62,0xf98d,0x8f9e, +0x4f7f,0x8fb0,0xf971,0x8fb6,0xfa66,0x9023,0xf99a,0x9038,0x4f85,0x9072,0xfac3,0x907c,0xf9c3,0x908f,0xf913,0x9094, +0x4f8a,0x90ce,0xf92c,0x90f1,0x4f90,0x90fd,0xfa26,0x9111,0x4f96,0x911b,0x4f9c,0x916a,0xf919,0x9199,0xfac4,0x91b4, +0xf9b7,0x91cc,0xf9e9,0x91cf,0xf97e,0x91d1,0xf90a,0x9234,0xf9b1,0x9238,0x4fa2,0x9276,0xfac5,0x927c,0x4fa8,0x92d7, +0x4fae,0x92d8,0x4fb4,0x9304,0xf93f,0x934a,0xf99b,0x93f9,0x4fba,0x9415,0x4fc0,0x958b,0x4fc6,0x95ad,0xf986,0x95b7, +0x4fcc,0x962e,0xf9c6,0x964b,0xf951,0x964d,0xfa09,0x9675,0xf959,0x9678,0xf9d3,0x967c,0xfac6,0x9686,0xf9dc,0x96a3, +0xf9f1,0x96b8,0xf9b8,0x96c3,0x4fd2,0x96e2,0xf9ea,0x96e3,0x4fd8,0x96f6,0xf9b2,0x96f7,0xf949,0x9723,0x4fdd,0x9732, +0xf938,0x9748,0xf9b3,0x9756,0x4fe3,0x97db,0xfac9,0x97e0,0x4fe8,0x97ff,0x4fee,0x980b,0x4ff3,0x9818,0xf9b4,0x9829, +0x4ffb,0x983b,0x5001,0x985e,0xf9d0,0x98e2,0x5006,0x98ef,0xfa2a,0x98fc,0xfa2b,0x9928,0xfa2c,0x9929,0x500c,0x99a7, +0x5012,0x99c2,0x5018,0x99f1,0xf91a,0x99fe,0x501e,0x9a6a,0xf987,0x9b12,0x5024,0x9b6f,0xf939,0x9c40,0x502c,0x9c57, +0xf9f2,0x9cfd,0x5032,0x9d67,0x5038,0x9db4,0xfa2d,0x9dfa,0xf93a,0x9e1e,0xf920,0x9e7f,0xf940,0x9e97,0xf988,0x9e9f, +0xf9f3,0x9ebb,0x503e,0x9ece,0xf989,0x9ef9,0x5044,0x9efe,0x504a,0x9f05,0x5050,0x9f0f,0x5056,0x9f16,0x505c,0x9f3b, +0x5062,0x9f43,0xfad8,0x9f8d,0xf9c4,0x9f8e,0xfad9,0x9f9c,0x5068,0x8101,0xd157,0xd15e,1,0xd158,0x106d,1, +0xd1b9,0x1073,1,0xd1ba,0x1081,0x8202,0x122,0xf803,0x8202,0x51c,0xf812,0x8202,0x525,0xf91b,0x8202,0x54b, +0xf816,0x8202,0x63a,0xf80d,0x8202,0x804,0xf9d9,0x8202,0x8de,0xf9dd,0x8202,0xa2c,0xf834,0x8202,0xb63,0xf838, +0x8202,0x14e4,0xf859,0x8202,0x16a8,0xf860,0x8202,0x16ea,0xf861,0x8202,0x19c8,0xf86c,0x8202,0x1b18,0xf871,0x8202, +0x1d0b,0xf8f8,0x8202,0x1de4,0xf87b,0x8202,0x1de6,0xf87d,0x8202,0x2183,0xf889,0x8202,0x219f,0xf939,2,0x2331, +0x108f,0x8202,0x26d4,0xf8a4,0x8002,0x2844,0xfad0,0x8002,0x284a,0xfacf,0x8202,0x2b0c,0xf8b8,0x8202,0x2bf1,0xf8be, +0x8202,0x300a,0xf8ca,0x8202,0x32b8,0xf897,0x8202,0x335f,0xf980,0x8202,0x3393,0xf989,0x8202,0x339c,0xf98a,0x8202, +0x33c3,0xf8dd,0x8002,0x33d5,0xfad1,0x8202,0x346d,0xf8e3,0x8202,0x36a3,0xf8ec,0x8202,0x38a7,0xf8f0,0x8202,0x3a8d, +0xf8f7,0x8202,0x3afa,0xf8f9,0x8202,0x3cbc,0xf8fb,0x8202,0x3d1e,0xf906,0x8202,0x3ed1,0xf90d,0x8202,0x3f5e,0xf910, +0x8202,0x3f8e,0xf911,0x8202,0x4263,0xf91d,0x8202,0x43ab,0xf91f,0x8202,0x4608,0xf923,0x8202,0x4735,0xf926,0x8202, +0x4814,0xf927,0x8202,0x4c36,0xf935,0x8202,0x4c92,0xf937,0x8202,0x4fa1,0xf93b,0x8202,0x4fb8,0xf93c,0x8202,0x5044, +0xf93d,0x8202,0x50f2,0xf942,0x8202,0x50f3,0xf941,0x8202,0x5119,0xf943,0x8202,0x5133,0xf944,0x8002,0x5249,0xfad5, +0x8202,0x541d,0xf94d,0x8202,0x5626,0xf952,0x8202,0x569a,0xf954,0x8202,0x56c5,0xf955,0x8202,0x597c,0xf95c,2, +0x5aa7,0x1095,0x8202,0x5bab,0xf961,0x8202,0x5c80,0xf965,0x8002,0x5cd0,0xfad6,0x8202,0x5f86,0xf96b,0x8202,0x61da, +0xf898,0x8202,0x6228,0xf972,0x8202,0x6247,0xf973,0x8202,0x62d9,0xf975,0x8202,0x633e,0xf977,0x8202,0x64da,0xf97b, +0x8202,0x6523,0xf97c,0x8202,0x65a8,0xf97e,0x8202,0x67a7,0xf987,0x8202,0x67b5,0xf988,0x8202,0x6b3c,0xf997,0x8202, +0x6c36,0xf9a4,0x8202,0x6cd5,0xf9a6,0x8202,0x6d6b,0xf9a5,0x8202,0x6f2c,0xf9ad,0x8202,0x6fb1,0xf9b0,0x8202,0x70d2, +0xf9b1,0x8202,0x73ca,0xf9ab,0x8202,0x7667,0xf9c5,0x8202,0x78ae,0xf9cb,0x8202,0x7966,0xf9cc,0x8202,0x7ca8,0xf9d3, +0x8002,0x7ed3,0xfad7,0x8202,0x7f2f,0xf9d8,0x8202,0x85d2,0xf9e0,0x8202,0x85ed,0xf9e1,0x8202,0x872e,0xf9e5,0x8202, +0x8bfa,0xf9ed,0x8202,0x8d77,0xf9f1,0x8202,0x9145,0xf9f6,0x8202,0x91df,0xf81c,0x8202,0x921a,0xf9f7,0x8202,0x940a, +0xf9fb,0x8202,0x9496,0xf9fd,0x8202,0x95b6,0xfa01,0x8202,0x9b30,0xfa09,0x8202,0xa0ce,0xfa10,0x8202,0xa105,0xfa12, +0x8202,0xa20e,0xfa13,0x8202,0xa291,0xfa14,0x8202,0xa392,0xf88f,0x8202,0xa600,0xfa1d,0x8016,0x12,0xf900,0xfa0e, +0xfa10,0xfa11,0xfa12,0xfa13,0xfa15,0xfa1f,0xfa20,0xfa21,0xfa22,0xfa23,0xfa25,0xfa27,0xfa2a,0xfa2e,0xfa70,0xfada, +2,0xf800,2,0xfa1e,0x8376,0x2ba,0x221,0x222,0x234,0x250,0x2ae,0x2b0,0x2ef,0x300,0x350,0x360, +0x370,0x374,0x376,0x37a,0x37b,0x37e,0x37f,0x384,0x38b,0x38c,0x38d,0x38e,0x3a2,0x3a3,0x3cf,0x3d0, +0x3f7,0x400,0x487,0x488,0x4cf,0x4d0,0x4f6,0x4f8,0x4fa,0x500,0x510,0x531,0x557,0x559,0x560,0x561, +0x588,0x589,0x58b,0x591,0x5a2,0x5a3,0x5ba,0x5bb,0x5c5,0x5d0,0x5eb,0x5f0,0x5f5,0x60c,0x60d,0x61b, +0x61c,0x61f,0x620,0x621,0x63b,0x640,0x656,0x660,0x6ee,0x6f0,0x6ff,0x700,0x70e,0x70f,0x72d,0x730, +0x74b,0x780,0x7b2,0x901,0x904,0x905,0x93a,0x93c,0x94e,0x950,0x955,0x958,0x971,0x981,0x984,0x985, +0x98d,0x98f,0x991,0x993,0x9a9,0x9aa,0x9b1,0x9b2,0x9b3,0x9b6,0x9ba,0x9bc,0x9bd,0x9be,0x9c5,0x9c7, +0x9c9,0x9cb,0x9ce,0x9d7,0x9d8,0x9dc,0x9de,0x9df,0x9e4,0x9e6,0x9fb,0xa02,0xa03,0xa05,0xa0b,0xa0f, +0xa11,0xa13,0xa29,0xa2a,0xa31,0xa32,0xa34,0xa35,0xa37,0xa38,0xa3a,0xa3c,0xa3d,0xa3e,0xa43,0xa47, +0xa49,0xa4b,0xa4e,0xa59,0xa5d,0xa5e,0xa5f,0xa66,0xa75,0xa81,0xa84,0xa85,0xa8c,0xa8d,0xa8e,0xa8f, +0xa92,0xa93,0xaa9,0xaaa,0xab1,0xab2,0xab4,0xab5,0xaba,0xabc,0xac6,0xac7,0xaca,0xacb,0xace,0xad0, +0xad1,0xae0,0xae1,0xae6,0xaf0,0xb01,0xb04,0xb05,0xb0d,0xb0f,0xb11,0xb13,0xb29,0xb2a,0xb31,0xb32, +0xb34,0xb36,0xb3a,0xb3c,0xb44,0xb47,0xb49,0xb4b,0xb4e,0xb56,0xb58,0xb5c,0xb5e,0xb5f,0xb62,0xb66, +0xb71,0xb82,0xb84,0xb85,0xb8b,0xb8e,0xb91,0xb92,0xb96,0xb99,0xb9b,0xb9c,0xb9d,0xb9e,0xba0,0xba3, +0xba5,0xba8,0xbab,0xbae,0xbb6,0xbb7,0xbba,0xbbe,0xbc3,0xbc6,0xbc9,0xbca,0xbce,0xbd7,0xbd8,0xbe7, +0xbf3,0xc01,0xc04,0xc05,0xc0d,0xc0e,0xc11,0xc12,0xc29,0xc2a,0xc34,0xc35,0xc3a,0xc3e,0xc45,0xc46, +0xc49,0xc4a,0xc4e,0xc55,0xc57,0xc60,0xc62,0xc66,0xc70,0xc82,0xc84,0xc85,0xc8d,0xc8e,0xc91,0xc92, +0xca9,0xcaa,0xcb4,0xcb5,0xcba,0xcbe,0xcc5,0xcc6,0xcc9,0xcca,0xcce,0xcd5,0xcd7,0xcde,0xcdf,0xce0, +0xce2,0xce6,0xcf0,0xd02,0xd04,0xd05,0xd0d,0xd0e,0xd11,0xd12,0xd29,0xd2a,0xd3a,0xd3e,0xd44,0xd46, +0xd49,0xd4a,0xd4e,0xd57,0xd58,0xd60,0xd62,0xd66,0xd70,0xd82,0xd84,0xd85,0xd97,0xd9a,0xdb2,0xdb3, +0xdbc,0xdbd,0xdbe,0xdc0,0xdc7,0xdca,0xdcb,0xdcf,0xdd5,0xdd6,0xdd7,0xdd8,0xde0,0xdf2,0xdf5,0xe01, +0xe3b,0xe3f,0xe5c,0xe81,0xe83,0xe84,0xe85,0xe87,0xe89,0xe8a,0xe8b,0xe8d,0xe8e,0xe94,0xe98,0xe99, +0xea0,0xea1,0xea4,0xea5,0xea6,0xea7,0xea8,0xeaa,0xeac,0xead,0xeba,0xebb,0xebe,0xec0,0xec5,0xec6, +0xec7,0xec8,0xece,0xed0,0xeda,0xedc,0xede,0xf00,0xf48,0xf49,0xf6b,0xf71,0xf8c,0xf90,0xf98,0xf99, +0xfbd,0xfbe,0xfcd,0xfcf,0xfd0,0x1000,0x1022,0x1023,0x1028,0x1029,0x102b,0x102c,0x1033,0x1036,0x103a,0x1040, +0x105a,0x10a0,0x10c6,0x10d0,0x10f9,0x10fb,0x10fc,0x1100,0x115a,0x115f,0x11a3,0x11a8,0x11fa,0x1200,0x1207,0x1208, +0x1247,0x1248,0x1249,0x124a,0x124e,0x1250,0x1257,0x1258,0x1259,0x125a,0x125e,0x1260,0x1287,0x1288,0x1289,0x128a, +0x128e,0x1290,0x12af,0x12b0,0x12b1,0x12b2,0x12b6,0x12b8,0x12bf,0x12c0,0x12c1,0x12c2,0x12c6,0x12c8,0x12cf,0x12d0, +0x12d7,0x12d8,0x12ef,0x12f0,0x130f,0x1310,0x1311,0x1312,0x1316,0x1318,0x131f,0x1320,0x1347,0x1348,0x135b,0x1361, +0x137d,0x13a0,0x13f5,0x1401,0x1677,0x1680,0x169d,0x16a0,0x16f1,0x1700,0x170d,0x170e,0x1715,0x1720,0x1737,0x1740, +0x1754,0x1760,0x176d,0x176e,0x1771,0x1772,0x1774,0x1780,0x17dd,0x17e0,0x17ea,0x1800,0x180f,0x1810,0x181a,0x1820, +0x1878,0x1880,0x18aa,0x1e00,0x1e9c,0x1ea0,0x1efa,0x1f00,0x1f16,0x1f18,0x1f1e,0x1f20,0x1f46,0x1f48,0x1f4e,0x1f50, +0x1f58,0x1f59,0x1f5a,0x1f5b,0x1f5c,0x1f5d,0x1f5e,0x1f5f,0x1f7e,0x1f80,0x1fb5,0x1fb6,0x1fc5,0x1fc6,0x1fd4,0x1fd6, +0x1fdc,0x1fdd,0x1ff0,0x1ff2,0x1ff5,0x1ff6,0x1fff,0x2000,0x2053,0x2057,0x2058,0x205f,0x2064,0x206a,0x2072,0x2074, +0x208f,0x20a0,0x20b2,0x20d0,0x20eb,0x2100,0x213b,0x213d,0x214c,0x2153,0x2184,0x2190,0x23cf,0x2400,0x2427,0x2440, +0x244b,0x2460,0x24ff,0x2500,0x2614,0x2616,0x2618,0x2619,0x267e,0x2680,0x268a,0x2701,0x2705,0x2706,0x270a,0x270c, +0x2728,0x2729,0x274c,0x274d,0x274e,0x274f,0x2753,0x2756,0x2757,0x2758,0x275f,0x2761,0x2795,0x2798,0x27b0,0x27b1, +0x27bf,0x27d0,0x27ec,0x27f0,0x2b00,0x2e80,0x2e9a,0x2e9b,0x2ef4,0x2f00,0x2fd6,0x2ff0,0x2ffc,0x3000,0x3040,0x3041, +0x3097,0x3099,0x3100,0x3105,0x312d,0x3131,0x318f,0x3190,0x31b8,0x31f0,0x321d,0x3220,0x3244,0x3251,0x327c,0x327f, +0x32cc,0x32d0,0x32ff,0x3300,0x3377,0x337b,0x33de,0x33e0,0x33ff,0x3400,0x4db6,0x4e00,0x9fa6,0xa000,0xa48d,0xa490, +0xa4c7,0xac00,0xd7a4,0xd800,0xfa2e,0xfa30,0xfa6b,0xfb00,0xfb07,0xfb13,0xfb18,0xfb1d,0xfb37,0xfb38,0xfb3d,0xfb3e, +0xfb3f,0xfb40,0xfb42,0xfb43,0xfb45,0xfb46,0xfbb2,0xfbd3,0xfd40,0xfd50,0xfd90,0xfd92,0xfdc8,0xfdd0,0xfdfd,0xfe00, +0xfe10,0xfe20,0xfe24,0xfe30,0xfe47,0xfe49,0xfe53,0xfe54,0xfe67,0xfe68,0xfe6c,0xfe70,0xfe75,0xfe76,0xfefd,0xfeff, +0xff00,0xff01,0xffbf,0xffc2,0xffc8,0xffca,0xffd0,0xffd2,0xffd8,0xffda,0xffdd,0xffe0,0xffe7,0xffe8,0xffef,0xfff9, +1,0,1,0x300,1,0x31f,1,0x320,1,0x324,1,0x330,1,0x34b,1,0x400, +1,0x426,1,0x428,1,0x44e,1,0xd000,1,0xd0f6,1,0xd100,1,0xd127,1,0xd12a, +1,0xd1de,1,0xd400,1,0xd455,1,0xd456,1,0xd49d,1,0xd49e,1,0xd4a0,1,0xd4a2, +1,0xd4a3,1,0xd4a5,1,0xd4a7,1,0xd4a9,1,0xd4ad,1,0xd4ae,1,0xd4ba,1,0xd4bb, +1,0xd4bc,1,0xd4bd,1,0xd4c1,1,0xd4c2,1,0xd4c4,1,0xd4c5,1,0xd506,1,0xd507, +1,0xd50b,1,0xd50d,1,0xd515,1,0xd516,1,0xd51d,1,0xd51e,1,0xd53a,1,0xd53b, +1,0xd53f,1,0xd540,1,0xd545,1,0xd546,1,0xd547,1,0xd54a,1,0xd551,1,0xd552, +1,0xd6a4,1,0xd6a8,1,0xd7ca,1,0xd7ce,1,0xd800,1,0xfffe,2,0xa6d7,2,0xf800, +2,0xfa1e,2,0xfffe,3,0,3,0xfffe,4,0,4,0xfffe,5,0,5,0xfffe, +6,0,6,0xfffe,7,0,7,0xfffe,8,0,8,0xfffe,9,0,9,0xfffe, +0xa,0,0xa,0xfffe,0xb,0,0xb,0xfffe,0xc,0,0xc,0xfffe,0xd,0,0xd,0xfffe, +0xe,0,0xe,1,0xe,2,0xe,0x20,0xe,0x80,0xe,0xfffe }; diff --git a/Build/source/libs/icu-xetex/common/uprops.c b/Build/source/libs/icu-xetex/common/uprops.c index 9ae04823959..86464e54e30 100644 --- a/Build/source/libs/icu-xetex/common/uprops.c +++ b/Build/source/libs/icu-xetex/common/uprops.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -36,115 +36,13 @@ /* cleanup ------------------------------------------------------------------ */ -static const UCaseProps *gCsp=NULL; static const UBiDiProps *gBdp=NULL; static UBool U_CALLCONV uprops_cleanup(void) { - gCsp=NULL; gBdp=NULL; return TRUE; } -/* case mapping properties API ---------------------------------------------- */ - -/* get the UCaseProps singleton, or else its dummy, once and for all */ -static const UCaseProps * -getCaseProps() { - /* - * This lazy intialization with double-checked locking (without mutex protection for - * the initial check) is transiently unsafe under certain circumstances. - * Check the readme and use u_init() if necessary. - */ - - /* the initial check is performed by the GET_CASE_PROPS() macro */ - const UCaseProps *csp; - UErrorCode errorCode=U_ZERO_ERROR; - - csp=ucase_getSingleton(&errorCode); - if(U_FAILURE(errorCode)) { - errorCode=U_ZERO_ERROR; - csp=ucase_getDummy(&errorCode); - if(U_FAILURE(errorCode)) { - return NULL; - } - } - - umtx_lock(NULL); - if(gCsp==NULL) { - gCsp=csp; - csp=NULL; - ucln_common_registerCleanup(UCLN_COMMON_UPROPS, uprops_cleanup); - } - umtx_unlock(NULL); - - return gCsp; -} - -/* - * In ICU 3.0, most Unicode properties were loaded from uprops.icu. - * ICU 3.2 adds ucase.icu for case mapping properties. - * ICU 3.4 adds ubidi.icu for bidi/shaping properties and - * removes case/bidi/shaping properties from uprops.icu. - * - * Loading of uprops.icu was never mutex-protected and required u_init() - * for thread safety. - * In order to maintain performance for all such properties, - * ucase.icu and ubidi.icu are loaded lazily, without mutexing. - * u_init() will try to load them for thread safety, - * but u_init() will not fail if they are missing. - * - * uchar.c maintains a tri-state flag for (not loaded/loaded/failed to load) - * and an error code for load failure. - * Instead, here we try to load at most once. - * If it works, we use the resulting singleton object. - * If it fails, then we get a dummy object, which always works unless - * we are seriously out of memory. - * After the first try, we have a never-changing pointer to either the - * real singleton or the dummy. - * - * This method is used in Unicode properties APIs (uchar.h) that - * do not have a service object and also do not have an error code parameter. - * Other API implementations get the singleton themselves - * (with mutexing), store it in the service object, and report errors. - */ -#define GET_CASE_PROPS() (gCsp!=NULL ? gCsp : getCaseProps()) - -/* public API (see uchar.h) */ - -U_CAPI UBool U_EXPORT2 -u_isULowercase(UChar32 c) { - return (UBool)(UCASE_LOWER==ucase_getType(GET_CASE_PROPS(), c)); -} - -U_CAPI UBool U_EXPORT2 -u_isUUppercase(UChar32 c) { - return (UBool)(UCASE_UPPER==ucase_getType(GET_CASE_PROPS(), c)); -} - -/* Transforms the Unicode character to its lower case equivalent.*/ -U_CAPI UChar32 U_EXPORT2 -u_tolower(UChar32 c) { - return ucase_tolower(GET_CASE_PROPS(), c); -} - -/* Transforms the Unicode character to its upper case equivalent.*/ -U_CAPI UChar32 U_EXPORT2 -u_toupper(UChar32 c) { - return ucase_toupper(GET_CASE_PROPS(), c); -} - -/* Transforms the Unicode character to its title case equivalent.*/ -U_CAPI UChar32 U_EXPORT2 -u_totitle(UChar32 c) { - return ucase_totitle(GET_CASE_PROPS(), c); -} - -/* return the simple case folding mapping for c */ -U_CAPI UChar32 U_EXPORT2 -u_foldCase(UChar32 c, uint32_t options) { - return ucase_fold(GET_CASE_PROPS(), c, options); -} - /* bidi/shaping properties API ---------------------------------------------- */ /* get the UBiDiProps singleton, or else its dummy, once and for all */ @@ -261,23 +159,7 @@ u_hasBinaryProperty(UChar32 c, UProperty which) { return (u_getUnicodeProperties(c, column)&mask)!=0; } else { if(column==UPROPS_SRC_CASE) { - /* case mapping properties */ - const UCaseProps *csp=GET_CASE_PROPS(); - if(csp==NULL) { - return FALSE; - } - switch(which) { - case UCHAR_LOWERCASE: - return (UBool)(UCASE_LOWER==ucase_getType(csp, c)); - case UCHAR_UPPERCASE: - return (UBool)(UCASE_UPPER==ucase_getType(csp, c)); - case UCHAR_SOFT_DOTTED: - return ucase_isSoftDotted(csp, c); - case UCHAR_CASE_SENSITIVE: - return ucase_isCaseSensitive(csp, c); - default: - break; - } + return ucase_hasBinaryProperty(c, which); } else if(column==UPROPS_SRC_NORM) { #if !UCONFIG_NO_NORMALIZATION /* normalization properties from unorm.icu */ @@ -288,7 +170,7 @@ u_hasBinaryProperty(UChar32 c, UProperty which) { case UCHAR_NFKD_INERT: case UCHAR_NFC_INERT: case UCHAR_NFKC_INERT: - return unorm_isNFSkippable(c, (UNormalizationMode)(which-UCHAR_NFD_INERT)+UNORM_NFD); + return unorm_isNFSkippable(c, (UNormalizationMode)(which-UCHAR_NFD_INERT+UNORM_NFD)); case UCHAR_SEGMENT_STARTER: return unorm_isCanonSafeStart(c); default: @@ -298,19 +180,19 @@ u_hasBinaryProperty(UChar32 c, UProperty which) { } else if(column==UPROPS_SRC_BIDI) { /* bidi/shaping properties */ const UBiDiProps *bdp=GET_BIDI_PROPS(); - if(bdp==NULL) { - return FALSE; - } - switch(which) { - case UCHAR_BIDI_MIRRORED: - return ubidi_isMirrored(bdp, c); - case UCHAR_BIDI_CONTROL: - return ubidi_isBidiControl(bdp, c); - case UCHAR_JOIN_CONTROL: - return ubidi_isJoinControl(bdp, c); - default: - break; + if(bdp!=NULL) { + switch(which) { + case UCHAR_BIDI_MIRRORED: + return ubidi_isMirrored(bdp, c); + case UCHAR_BIDI_CONTROL: + return ubidi_isBidiControl(bdp, c); + case UCHAR_JOIN_CONTROL: + return ubidi_isJoinControl(bdp, c); + default: + break; + } } + /* else return FALSE below */ } else if(column==UPROPS_SRC_CHAR) { switch(which) { case UCHAR_POSIX_BLANK: @@ -389,7 +271,7 @@ u_getIntPropertyValue(UChar32 c, UProperty which) { case UCHAR_NFKD_QUICK_CHECK: case UCHAR_NFC_QUICK_CHECK: case UCHAR_NFKC_QUICK_CHECK: - return (int32_t)unorm_getQuickCheck(c, (UNormalizationMode)(which-UCHAR_NFD_QUICK_CHECK)+UNORM_NFD); + return (int32_t)unorm_getQuickCheck(c, (UNormalizationMode)(which-UCHAR_NFD_QUICK_CHECK+UNORM_NFD)); case UCHAR_LEAD_CANONICAL_COMBINING_CLASS: return unorm_getFCD16FromCodePoint(c)>>8; case UCHAR_TRAIL_CANONICAL_COMBINING_CLASS: diff --git a/Build/source/libs/icu-xetex/common/uprops.h b/Build/source/libs/icu-xetex/common/uprops.h index dec3dd5b119..f8af28c3306 100644 --- a/Build/source/libs/icu-xetex/common/uprops.h +++ b/Build/source/libs/icu-xetex/common/uprops.h @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -325,19 +325,6 @@ enum { U_CAPI int32_t U_EXPORT2 uprv_getMaxCharNameLength(void); -#if 0 -/* -Currently not used but left for future use. Probably by UnicodeSet. -urename.h and unames.c changed accordingly. -*/ -/** - * Get the maximum length of an ISO comment. - * @return 0 if no ISO comments available. - */ -U_CAPI int32_t U_EXPORT2 -uprv_getMaxISOCommentLength(); -#endif - /** * Fills set with characters that are used in Unicode character names. * Includes all characters that are used in regular/Unicode 1.0/extended names. @@ -347,21 +334,6 @@ uprv_getMaxISOCommentLength(); U_CAPI void U_EXPORT2 uprv_getCharNameCharacters(const USetAdder *sa); -#if 0 -/* -Currently not used but left for future use. Probably by UnicodeSet. -urename.h and unames.c changed accordingly. -*/ -/** - * Fills set with characters that are used in Unicode character names. - * Just empties the set if no ISO comments are available. - * @param sa USetAdder to receive characters. - */ -U_CAPI void U_EXPORT2 -uprv_getISOCommentCharacters(const USetAdder *sa); -*/ -#endif - /** * Constants for which data and implementation files provide which properties. * Used by UnicodeSet for service-specific property enumeration. diff --git a/Build/source/libs/icu-xetex/common/ures_cnv.c b/Build/source/libs/icu-xetex/common/ures_cnv.c index c7d94b8af6f..c9729019df6 100644 --- a/Build/source/libs/icu-xetex/common/ures_cnv.c +++ b/Build/source/libs/icu-xetex/common/ures_cnv.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1997-2004, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -54,10 +54,6 @@ ures_openU(const UChar *myPath, #if !UCONFIG_NO_CONVERSION /* use the default converter to support variant-character paths */ UConverter *cnv=u_getDefaultConverter(status); - if(U_FAILURE(*status)) { - return NULL; - } - length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(pathBuffer), myPath, length, status); u_releaseDefaultConverter(cnv); if(U_FAILURE(*status)) { diff --git a/Build/source/libs/icu-xetex/common/uresbund.c b/Build/source/libs/icu-xetex/common/uresbund.c index 8b322b7c194..1a99a241138 100644 --- a/Build/source/libs/icu-xetex/common/uresbund.c +++ b/Build/source/libs/icu-xetex/common/uresbund.c @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2005, International Business Machines Corporation and * +* Copyright (C) 1997-2006, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** * @@ -214,7 +214,7 @@ static void initCache(UErrorCode *status) { makeCache = (cache == NULL); umtx_unlock(&resbMutex); if(makeCache) { - UHashtable *newCache = uhash_open(hashEntry, compareEntries, status); + UHashtable *newCache = uhash_open(hashEntry, compareEntries, NULL, status); if (U_FAILURE(*status)) { return; } @@ -257,7 +257,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE const char *myPath = NULL; char aliasName[100] = { 0 }; int32_t aliasLen = 0; - UBool isAlias = FALSE; + /*UBool isAlias = FALSE;*/ UHashTok hashkey; if(U_FAILURE(*status)) { @@ -320,12 +320,10 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE r->fHashKey = hashValue; r->fParent = NULL; - r->fData.data = NULL; - r->fData.pRoot = NULL; - r->fData.rootRes = 0; + uprv_memset(&r->fData, 0, sizeof(ResourceData)); r->fBogus = U_ZERO_ERROR; - /* this is the acutal loading - returns bool true/false */ + /* this is the actual loading - returns bool true/false */ result = res_load(&(r->fData), r->fPath, r->fName, status); if (result == FALSE || U_FAILURE(*status)) { @@ -342,7 +340,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE const UChar *alias = res_getString(&(r->fData), aliasres, &aliasLen); if(alias != NULL && aliasLen > 0) { /* if there is actual alias - unload and load new data */ u_UCharsToChars(alias, aliasName, aliasLen+1); - isAlias = TRUE; + /*isAlias = TRUE;*/ res_unload(&(r->fData)); result = res_load(&(r->fData), r->fPath, aliasName, status); if (result == FALSE || U_FAILURE(*status)) { @@ -461,7 +459,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, UEr if(r != NULL) { /* if there is one real locale, we can look for parents. */ t1 = r; hasRealData = TRUE; - while (hasChopped && !isRoot && t1->fParent == NULL) { + while (hasChopped && !isRoot && t1->fParent == NULL && !t1->fData.noFallback) { /* insert regular parents */ t2 = init_entry(name, r->fPath, &parentStatus); t1->fParent = t2; @@ -503,7 +501,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, UEr } else { /* we don't even have the root locale */ *status = U_MISSING_RESOURCE_ERROR; } - } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 && t1->fParent == NULL) { + } else if(!isRoot && uprv_strcmp(t1->fName, kRootLocaleName) != 0 && t1->fParent == NULL && !r->fData.noFallback) { /* insert root locale */ t2 = init_entry(kRootLocaleName, r->fPath, &parentStatus); if(!hasRealData) { @@ -582,6 +580,80 @@ static void entryClose(UResourceDataEntry *resB) { umtx_unlock(&resbMutex); } +/* +U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd) { + if(resB->fResPath == NULL) { + resB->fResPath = resB->fResBuf; + *(resB->fResPath) = 0; + } + resB->fResPathLen = uprv_strlen(toAdd); + if(RES_BUFSIZE <= resB->fResPathLen+1) { + if(resB->fResPath == resB->fResBuf) { + resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char)); + } else { + resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char)); + } + } + uprv_strcpy(resB->fResPath, toAdd); +} +*/ +static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd) { + int32_t resPathLenOrig = resB->fResPathLen; + if(resB->fResPath == NULL) { + resB->fResPath = resB->fResBuf; + *(resB->fResPath) = 0; + resB->fResPathLen = 0; + } + resB->fResPathLen += lenToAdd; + if(RES_BUFSIZE <= resB->fResPathLen+1) { + if(resB->fResPath == resB->fResBuf) { + resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char)); + uprv_strcpy(resB->fResPath, resB->fResBuf); + } else { + resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char)); + } + } + uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd); +} + +static void ures_freeResPath(UResourceBundle *resB) { + if (resB->fResPath && resB->fResPath != resB->fResBuf) { + uprv_free(resB->fResPath); + } + resB->fResPath = NULL; + resB->fResPathLen = 0; +} + +static void +ures_closeBundle(UResourceBundle* resB, UBool freeBundleObj) +{ + if(resB != NULL) { + if(resB->fData != NULL) { + entryClose(resB->fData); + } + if(resB->fVersion != NULL) { + uprv_free(resB->fVersion); + } + ures_freeResPath(resB); + + if(ures_isStackObject(resB) == FALSE && freeBundleObj) { + uprv_free(resB); + } +#if 0 /*U_DEBUG*/ + else { + /* poison the data */ + uprv_memset(resB, -1, sizeof(UResourceBundle)); + } +#endif + } +} + +U_CAPI void U_EXPORT2 +ures_close(UResourceBundle* resB) +{ + ures_closeBundle(resB, TRUE); +} + static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, const char *key, int32_t index, UResourceDataEntry *realData, const UResourceBundle *parent, int32_t noAlias, @@ -821,9 +893,17 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, if(resB->fVersion != NULL) { uprv_free(resB->fVersion); } + /* + weiv: if stack object was passed in, it doesn't really need to be reinited, + since the purpose of initing is to remove stack junk. However, at this point + we would not do anything to an allocated object, so stack object should be + treated the same + */ + /* if(ures_isStackObject(resB) != FALSE) { ures_initStackObject(resB); } + */ if(parent != resB) { ures_freeResPath(resB); } @@ -861,9 +941,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, resB->fVersion = NULL; resB->fRes = r; /*resB->fParent = parent->fRes;*/ - resB->fResData.data = rdata->data; - resB->fResData.pRoot = rdata->pRoot; - resB->fResData.rootRes = rdata->rootRes; + uprv_memcpy(&resB->fResData, rdata, sizeof(ResourceData)); resB->fSize = res_countArrayItems(&(resB->fResData), resB->fRes); return resB; } @@ -884,18 +962,7 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin } } else { isStackObject = ures_isStackObject(r); - if(U_FAILURE(*status)) { - return r; - } - ures_close(r); - if(isStackObject == FALSE) { - r = (UResourceBundle *)uprv_malloc(sizeof(UResourceBundle)); - /* test for NULL */ - if (r == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } - } + ures_closeBundle(r, FALSE); } uprv_memcpy(r, original, sizeof(UResourceBundle)); r->fResPath = NULL; @@ -907,10 +974,8 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin if(r->fData != NULL) { entryIncrease(r->fData); } - return r; - } else { - return r; } + return r; } /** @@ -943,6 +1008,78 @@ U_CAPI const UChar* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_ return NULL; } +static const char * +ures_toUTF8String(const UChar *s16, int32_t length16, + char *dest, int32_t *pLength, + UBool forceCopy, + UErrorCode *status) { + int32_t capacity; + + if (U_FAILURE(*status)) { + return NULL; + } + if (pLength != NULL) { + capacity = *pLength; + } else { + capacity = 0; + } + if (capacity < 0 || (capacity > 0 && dest == NULL)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + if (length16 == 0) { + /* empty string, return as read-only pointer */ + if (pLength != NULL) { + *pLength = 0; + } + if (forceCopy) { + u_terminateChars(dest, capacity, 0, status); + return dest; + } else { + return ""; + } + } else { + /* We need to transform the string to the destination buffer. */ + if (capacity < length16) { + /* No chance for the string to fit. Pure preflighting. */ + return u_strToUTF8(NULL, 0, pLength, s16, length16, status); + } + if (!forceCopy && (length16 <= 0x2aaaaaaa)) { + /* + * We know the string will fit into dest because each UChar turns + * into at most three UTF-8 bytes. Fill the latter part of dest + * so that callers do not expect to use dest as a string pointer, + * hopefully leading to more robust code for when resource bundles + * may store UTF-8 natively. + * (In which case dest would not be used at all.) + * + * We do not do this if forceCopy=TRUE because then the caller + * expects the string to start exactly at dest. + * + * The test above for <= 0x2aaaaaaa prevents overflows. + * The +1 is for the NUL terminator. + */ + int32_t maxLength = 3 * length16 + 1; + if (capacity > maxLength) { + dest += capacity - maxLength; + capacity = maxLength; + } + } + return u_strToUTF8(dest, capacity, pLength, s16, length16, status); + } +} + +U_DRAFT const char * U_EXPORT2 +ures_getUTF8String(const UResourceBundle *resB, + char *dest, int32_t *pLength, + UBool forceCopy, + UErrorCode *status) { + int32_t length16; + const UChar *s16 = ures_getString(resB, &length16, status); + return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status); +} + U_CAPI const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resB, int32_t* len, UErrorCode* status) { if (status==NULL || U_FAILURE(*status)) { @@ -1116,7 +1253,6 @@ U_CAPI const UChar* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* case URES_INT_VECTOR: default: return NULL; - break; } } @@ -1259,6 +1395,17 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB, return NULL; } +U_DRAFT const char * U_EXPORT2 +ures_getUTF8StringByIndex(const UResourceBundle *resB, + int32_t index, + char *dest, int32_t *pLength, + UBool forceCopy, + UErrorCode *status) { + int32_t length16; + const UChar *s16 = ures_getStringByIndex(resB, index, &length16, status); + return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status); +} + /*U_CAPI const char *ures_getResPath(UResourceBundle *resB) { return resB->fResPath; }*/ @@ -1269,7 +1416,7 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) UResourceBundle *first = NULL; UResourceBundle *result = fillIn; char *packageName = NULL; - char *pathToResource = NULL; + char *pathToResource = NULL, *save = NULL; char *locale = NULL, *localeEnd = NULL; int32_t length; @@ -1278,7 +1425,7 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) } length = (int32_t)(uprv_strlen(path)+1); - pathToResource = (char *)uprv_malloc(length*sizeof(char)); + save = pathToResource = (char *)uprv_malloc(length*sizeof(char)); /* test for NULL */ if(pathToResource == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -1314,7 +1461,7 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) } ures_close(first); } - uprv_free(pathToResource); + uprv_free(save); return result; } @@ -1345,6 +1492,20 @@ ures_findSubResource(const UResourceBundle *resB, char* path, UResourceBundle *f return result; } +U_INTERNAL const UChar* U_EXPORT2 +ures_getStringByKeyWithFallback(const UResourceBundle *resB, + const char* inKey, + int32_t* len, + UErrorCode *status) { + + UResourceBundle stack; + const UChar* retVal = NULL; + ures_initStackObject(&stack); + ures_getByKeyWithFallback(resB, inKey, &stack, status); + retVal = ures_getString(&stack, len, status); + ures_close(&stack); + return retVal; +} U_CAPI UResourceBundle* U_EXPORT2 ures_getByKeyWithFallback(const UResourceBundle *resB, @@ -1563,6 +1724,16 @@ U_CAPI const UChar* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, c return NULL; } +U_DRAFT const char * U_EXPORT2 +ures_getUTF8StringByKey(const UResourceBundle *resB, + const char *key, + char *dest, int32_t *pLength, + UBool forceCopy, + UErrorCode *status) { + int32_t length16; + const UChar *s16 = ures_getStringByKey(resB, key, &length16, status); + return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status); +} /* TODO: clean from here down */ @@ -1598,13 +1769,10 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle, switch(type) { case ULOC_ACTUAL_LOCALE: return resourceBundle->fData->fName; - break; case ULOC_VALID_LOCALE: return resourceBundle->fTopLevelData->fName; - break; case ULOC_REQUESTED_LOCALE: return NULL; - break; default: *status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; @@ -1612,52 +1780,6 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle, } } - -/* -U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd) { - if(resB->fResPath == NULL) { - resB->fResPath = resB->fResBuf; - *(resB->fResPath) = 0; - } - resB->fResPathLen = uprv_strlen(toAdd); - if(RES_BUFSIZE <= resB->fResPathLen+1) { - if(resB->fResPath == resB->fResBuf) { - resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char)); - } else { - resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char)); - } - } - uprv_strcpy(resB->fResPath, toAdd); -} -*/ -U_CFUNC void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd) { - int32_t resPathLenOrig = resB->fResPathLen; - if(resB->fResPath == NULL) { - resB->fResPath = resB->fResBuf; - *(resB->fResPath) = 0; - resB->fResPathLen = 0; - } - resB->fResPathLen += lenToAdd; - if(RES_BUFSIZE <= resB->fResPathLen+1) { - if(resB->fResPath == resB->fResBuf) { - resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char)); - uprv_strcpy(resB->fResPath, resB->fResBuf); - } else { - resB->fResPath = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char)); - } - } - uprv_strcpy(resB->fResPath + resPathLenOrig, toAdd); -} - -U_CFUNC void ures_freeResPath(UResourceBundle *resB) { - if (resB->fResPath && resB->fResPath != resB->fResBuf) { - uprv_free(resB->fResPath); - } - resB->fResPath = NULL; - resB->fResPathLen = 0; -} - - U_CFUNC const char* ures_getName(const UResourceBundle* resB) { if(resB == NULL) { return NULL; @@ -1685,37 +1807,31 @@ U_CAPI void U_EXPORT2 ures_openFillIn(UResourceBundle *r, const char* path, const char* localeID, UErrorCode* status) { if(r == NULL) { - *status = U_INTERNAL_PROGRAM_ERROR; + *status = U_ILLEGAL_ARGUMENT_ERROR; } else { UResourceDataEntry *firstData; + UBool isStackObject = ures_isStackObject(r); + + ures_closeBundle(r, FALSE); + uprv_memset(r, 0, sizeof(UResourceBundle)); + ures_setIsStackObject(r, isStackObject); r->fHasFallback = TRUE; r->fIsTopLevel = TRUE; - r->fKey = NULL; - r->fVersion = NULL; r->fIndex = -1; - if(r->fData != NULL) { - entryClose(r->fData); - } - if(r->fVersion != NULL) { - uprv_free(r->fVersion); - } r->fData = entryOpen(path, localeID, status); + if(U_FAILURE(*status)) { + return; + } /* this is a quick fix to get regular data in bundle - until construction is cleaned up */ firstData = r->fData; while(firstData->fBogus != U_ZERO_ERROR && firstData->fParent != NULL) { firstData = firstData->fParent; } - r->fResData.data = firstData->fData.data; - r->fResData.pRoot = firstData->fData.pRoot; - r->fResData.rootRes = firstData->fData.rootRes; + uprv_memcpy(&r->fResData, &firstData->fData, sizeof(ResourceData)); + r->fHasFallback=(UBool)!r->fResData.noFallback; r->fRes = r->fResData.rootRes; r->fSize = res_countArrayItems(&(r->fResData), r->fRes); - /*r->fParent = RES_BOGUS;*/ - /*r->fResPath = NULL;*/ - r->fParentRes = NULL; r->fTopLevelData = r->fData; - - ures_freeResPath(r); } } @@ -1727,14 +1843,13 @@ ures_open(const char* path, char canonLocaleID[100]; UResourceDataEntry *hasData = NULL; UResourceBundle *r; - int32_t length; if(status == NULL || U_FAILURE(*status)) { return NULL; } /* first "canonicalize" the locale ID */ - length = uloc_getBaseName(localeID, canonLocaleID, sizeof(canonLocaleID), status); + uloc_getBaseName(localeID, canonLocaleID, sizeof(canonLocaleID), status); if(U_FAILURE(*status) || *status == U_STRING_NOT_TERMINATED_WARNING) { *status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; @@ -1746,18 +1861,16 @@ ures_open(const char* path, return NULL; } + uprv_memset(r, 0, sizeof(UResourceBundle)); r->fHasFallback = TRUE; r->fIsTopLevel = TRUE; ures_setIsStackObject(r, FALSE); - r->fKey = NULL; - r->fVersion = NULL; r->fIndex = -1; r->fData = entryOpen(path, canonLocaleID, status); if(U_FAILURE(*status)) { uprv_free(r); return NULL; } - r->fParentRes = NULL; r->fTopLevelData = r->fData; hasData = r->fData; @@ -1773,14 +1886,10 @@ ures_open(const char* path, } } - r->fResData.data = hasData->fData.data; - r->fResData.pRoot = hasData->fData.pRoot; - r->fResData.rootRes = hasData->fData.rootRes; + uprv_memcpy(&r->fResData, &hasData->fData, sizeof(ResourceData)); + r->fHasFallback=(UBool)!r->fResData.noFallback; r->fRes = r->fResData.rootRes; - /*r->fParent = RES_BOGUS;*/ r->fSize = res_countArrayItems(&(r->fResData), r->fRes); - r->fResPath = NULL; - r->fResPathLen = 0; /* if(r->fData->fPath != NULL) { ures_setResPath(r, r->fData->fPath); @@ -1835,9 +1944,8 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) { r->fKey = NULL; r->fVersion = NULL; - r->fResData.data = r->fData->fData.data; - r->fResData.pRoot = r->fData->fData.pRoot; - r->fResData.rootRes = r->fData->fData.rootRes; + uprv_memcpy(&r->fResData, &r->fData->fData, sizeof(ResourceData)); + /* r->fHasFallback remains FALSE here in ures_openDirect() */ r->fRes = r->fResData.rootRes; /*r->fParent = RES_BOGUS;*/ r->fSize = res_countArrayItems(&(r->fResData), r->fRes); @@ -1880,30 +1988,6 @@ ures_countArrayItems(const UResourceBundle* resourceBundle, } } -U_CAPI void U_EXPORT2 -ures_close(UResourceBundle* resB) -{ - if(resB != NULL) { - if(resB->fData != NULL) { - entryClose(resB->fData); - } - if(resB->fVersion != NULL) { - uprv_free(resB->fVersion); - } - ures_freeResPath(resB); - - if(ures_isStackObject(resB) == FALSE) { - uprv_free(resB); - } - else { -#if 0 /*U_DEBUG*/ - /* poison the data */ - uprv_memset(resB, -1, sizeof(UResourceBundle)); -#endif - } - } -} - U_CAPI const char* U_EXPORT2 ures_getVersionNumber(const UResourceBundle* resourceBundle) { @@ -1937,7 +2021,7 @@ ures_getVersionNumber(const UResourceBundle* resourceBundle) resourceBundle->fVersion[len] = '\0'; } else { - uprv_strcpy(resourceBundle->fVersion, kDefaultMinorVersion); + uprv_strcpy(resourceBundle->fVersion, kDefaultMinorVersion); } } @@ -2381,8 +2465,8 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) locs = ures_openAvailableLocales(path, status); if(U_FAILURE(*status)) { - ures_close(&item); - ures_close(&subItem); + ures_close(&item); + ures_close(&subItem); return NULL; } @@ -2418,7 +2502,7 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) && U_SUCCESS(subStatus)) { const char *k; int32_t i; - k = ures_getKey(&subItem); + k = ures_getKey(subPtr); #if defined(URES_TREE_DEBUG) /* fprintf(stderr, "%s | %s | %s | %s\n", path?path:"<ICUDATA>", keyword, locale, k); */ @@ -2461,5 +2545,63 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) #endif return uloc_openKeywordList(valuesBuf, valuesIndex, status); } - +U_INTERNAL UBool U_EXPORT2 +ures_equal(const UResourceBundle* res1, const UResourceBundle* res2){ + if(res1==NULL || res2==NULL){ + return res1==res2; /* pointer comparision */ + } + if(res1->fKey==NULL|| res2->fKey==NULL){ + return (res1->fKey==res2->fKey); + }else{ + if(uprv_strcmp(res1->fKey, res2->fKey)!=0){ + return FALSE; + } + } + if(uprv_strcmp(res1->fData->fName, res2->fData->fName)!=0){ + return FALSE; + } + if(res1->fData->fPath == NULL|| res2->fData->fPath==NULL){ + return (res1->fData->fPath == res2->fData->fPath); + }else{ + if(uprv_strcmp(res1->fData->fPath, res2->fData->fPath)!=0){ + return FALSE; + } + } + if(uprv_strcmp(res1->fData->fParent->fName, res2->fData->fParent->fName)!=0){ + return FALSE; + } + if(uprv_strcmp(res1->fData->fParent->fPath, res2->fData->fParent->fPath)!=0){ + return FALSE; + } + if(uprv_strncmp(res1->fResPath, res2->fResPath, res1->fResPathLen)!=0){ + return FALSE; + } + if(res1->fRes != res2->fRes){ + return FALSE; + } + return TRUE; +} +U_INTERNAL UResourceBundle* U_EXPORT2 +ures_clone(const UResourceBundle* res, UErrorCode* status){ + UResourceBundle* bundle = NULL; + UResourceBundle* ret = NULL; + if(U_FAILURE(*status) || res == NULL){ + return NULL; + } + bundle = ures_open(res->fData->fPath, res->fData->fName, status); + if(res->fResPath!=NULL){ + ret = ures_findSubResource(bundle, res->fResPath, NULL, status); + ures_close(bundle); + }else{ + ret = bundle; + } + return ret; +} +U_INTERNAL const UResourceBundle* U_EXPORT2 +ures_getParentBundle(const UResourceBundle* res){ + if(res==NULL){ + return NULL; + } + return res->fParentRes; +} /* eof */ diff --git a/Build/source/libs/icu-xetex/common/uresdata.c b/Build/source/libs/icu-xetex/common/uresdata.c index c48b1cc0555..4d947f5ba77 100644 --- a/Build/source/libs/icu-xetex/common/uresdata.c +++ b/Build/source/libs/icu-xetex/common/uresdata.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * * -* Copyright (C) 1999-2005, International Business Machines Corporation * +* Copyright (C) 1999-2006, International Business Machines Corporation * * and others. All Rights Reserved. * * * ******************************************************************************* @@ -200,6 +200,7 @@ static UBool U_CALLCONV isAcceptable(void *context, const char *type, const char *name, const UDataInfo *pInfo) { + uprv_memcpy(context, pInfo->formatVersion, 4); return (UBool)( pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && @@ -217,10 +218,11 @@ isAcceptable(void *context, U_CFUNC UBool res_load(ResourceData *pResData, const char *path, const char *name, UErrorCode *errorCode) { + UVersionInfo formatVersion; UResType rootType; /* load the ResourceBundle file */ - pResData->data=udata_openChoice(path, "res", name, isAcceptable, NULL, errorCode); + pResData->data=udata_openChoice(path, "res", name, isAcceptable, formatVersion, errorCode); if(U_FAILURE(*errorCode)) { return FALSE; } @@ -228,6 +230,7 @@ res_load(ResourceData *pResData, /* get its memory and root resource */ pResData->pRoot=(Resource *)udata_getMemory(pResData->data); pResData->rootRes=*pResData->pRoot; + pResData->noFallback=FALSE; /* currently, we accept only resources that have a Table as their roots */ rootType=RES_GET_TYPE(pResData->rootRes); @@ -238,6 +241,14 @@ res_load(ResourceData *pResData, return FALSE; } + if(formatVersion[0]>1 || (formatVersion[0]==1 && formatVersion[1]>=1)) { + /* bundles with formatVersion 1.1 and later contain an indexes[] array */ + const int32_t *indexes=(const int32_t *)pResData->pRoot+1; + if(indexes[URES_INDEX_LENGTH]>URES_INDEX_ATTRIBUTES) { + pResData->noFallback=(UBool)(indexes[URES_INDEX_ATTRIBUTES]&URES_ATT_NO_FALLBACK); + } + } + return TRUE; } @@ -251,8 +262,16 @@ res_unload(ResourceData *pResData) { U_CFUNC const UChar * res_getString(const ResourceData *pResData, const Resource res, int32_t *pLength) { + /* + * The data structure is documented as supporting res==0 for empty strings. + * Return a fixed pointer in such a case. + * This was dropped in uresdata.c 1.17 as part of Jitterbug 1005 work + * on code coverage for ICU 2.0. + * Re-added for consistency with the design and with other code. + */ + static const int32_t emptyString[2]={ 0, 0 }; if(res!=RES_BOGUS && RES_GET_TYPE(res)==URES_STRING) { - const int32_t *p=(const int32_t *)RES_GET_POINTER(pResData->pRoot, res); + const int32_t *p= res==0 ? emptyString : (const int32_t *)RES_GET_POINTER(pResData->pRoot, res); if (pLength) { *pLength=*p; } diff --git a/Build/source/libs/icu-xetex/common/uresdata.h b/Build/source/libs/icu-xetex/common/uresdata.h index 92a8667d6f2..6b8aa8aaede 100644 --- a/Build/source/libs/icu-xetex/common/uresdata.h +++ b/Build/source/libs/icu-xetex/common/uresdata.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * * -* Copyright (C) 1999-2003, International Business Machines * +* Copyright (C) 1999-2006, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** @@ -31,7 +31,7 @@ typedef uint32_t Resource; #define RES_BOGUS 0xffffffff -#define RES_GET_TYPE(res) ((res)>>28UL) +#define RES_GET_TYPE(res) ((UResType)((res)>>28UL)) #define RES_GET_OFFSET(res) ((res)&0x0fffffff) #define RES_GET_POINTER(pRoot, res) ((pRoot)+RES_GET_OFFSET(res)) @@ -48,6 +48,7 @@ enum { URES_INDEX_BUNDLE_TOP, /* [3] contains the top of the bundle, */ /* in case it were ever different from [2] */ URES_INDEX_MAX_TABLE_LENGTH,/* [4] max. length of any table */ + URES_INDEX_ATTRIBUTES, /* [5] attributes bit set, see URES_ATT_* (new in formatVersion 1.2) */ URES_INDEX_TOP }; @@ -57,7 +58,20 @@ enum { }; /* - * File format for .res resource bundle files (formatVersion=1.1) + * Nofallback attribute, attribute bit 0 in indexes[URES_INDEX_ATTRIBUTES]. + * New in formatVersion 1.2 (ICU 3.6). + * + * If set, then this resource bundle is a standalone bundle. + * If not set, then the bundle participates in locale fallback, eventually + * all the way to the root bundle. + * If indexes[] is missing or too short, then the attribute cannot be determined + * reliably. Dependency checking should ignore such bundles, and loading should + * use fallbacks. + */ +#define URES_ATT_NO_FALLBACK 1 + +/* + * File format for .res resource bundle files (formatVersion=1.2) * * An ICU4C resource bundle file (.res) is a binary, memory-mappable file * with nested, hierarchical data structures. @@ -67,7 +81,7 @@ enum { * currently, the root item must be a table or table32 resource item * int32_t indexes[indexes[0]]; -- array of indexes for friendly * reading and swapping; see URES_INDEX_* above - * new in formatVersion 1.1 + * new in formatVersion 1.1 (ICU 2.8) * char keys[]; -- characters for key strings * (formatVersion 1.0: up to 65k of characters; 1.1: <2G) * (minus the space for root and indexes[]), @@ -156,6 +170,7 @@ typedef struct { UDataMemory *data; Resource *pRoot; Resource rootRes; + UBool noFallback; /* see URES_ATT_NO_FALLBACK */ } ResourceData; /* diff --git a/Build/source/libs/icu-xetex/common/uresimp.h b/Build/source/libs/icu-xetex/common/uresimp.h index a0f65e5626f..3e530d9e6d2 100644 --- a/Build/source/libs/icu-xetex/common/uresimp.h +++ b/Build/source/libs/icu-xetex/common/uresimp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2000-2005, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -84,9 +84,9 @@ U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB); /* Some getters used by the copy constructor */ U_CFUNC const char* ures_getName(const UResourceBundle* resB); U_CFUNC const char* ures_getPath(const UResourceBundle* resB); -U_CFUNC void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd); +/*U_CFUNC void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t lenToAdd);*/ /*U_CFUNC void ures_setResPath(UResourceBundle *resB, const char* toAdd);*/ -U_CFUNC void ures_freeResPath(UResourceBundle *resB); +/*U_CFUNC void ures_freeResPath(UResourceBundle *resB);*/ /* Candidates for export */ U_CFUNC UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status); @@ -165,4 +165,77 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, U_INTERNAL UEnumeration* U_EXPORT2 ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status); +/** + * Test if 2 resource bundles are equal + * @param res1 + * @param res2 + * @param status error code + * @internal ICU 3.6 + */ +U_INTERNAL UBool U_EXPORT2 +ures_equal(const UResourceBundle* res1, const UResourceBundle* res2); + +/** + * Clones the given resource bundle + * @param res + * @param status error code + * @internal ICU 3.6 + */ +U_INTERNAL UResourceBundle* U_EXPORT2 +ures_clone(const UResourceBundle* res, UErrorCode* status); + +/** + * Returns the parent bundle. Internal. DONOT close the returned bundle!!! + * @param res + * @internal ICU 3.6 + */ +U_INTERNAL const UResourceBundle* U_EXPORT2 +ures_getParentBundle(const UResourceBundle* res); + + +/** + * Get a resource with multi-level fallback. Normally only the top level resources will + * fallback to its parent. This performs fallback on subresources. For example, when a table + * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs + * on the sub-resources because the table is defined in the current resource bundle, but this + * function can perform fallback on the sub-resources of the table. + * @param resB a resource + * @param inKey a key associated with the requested resource + * @param fillIn if NULL a new UResourceBundle struct is allocated and must be deleted by the caller. + * Alternatively, you can supply a struct to be filled by this function. + * @param status: fills in the outgoing error code + * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found + * could be a non-failing error + * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> + * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @internal ICU 3.0 + */ +U_INTERNAL UResourceBundle* U_EXPORT2 +ures_getByKeyWithFallback(const UResourceBundle *resB, + const char* inKey, + UResourceBundle *fillIn, + UErrorCode *status); + + +/** + * Get a String with multi-level fallback. Normally only the top level resources will + * fallback to its parent. This performs fallback on subresources. For example, when a table + * is defined in a resource bundle and a parent resource bundle, normally no fallback occurs + * on the sub-resources because the table is defined in the current resource bundle, but this + * function can perform fallback on the sub-resources of the table. + * @param resB a resource + * @param inKey a key associated with the requested resource + * @param status: fills in the outgoing error code + * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found + * could be a non-failing error + * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> + * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @internal ICU 3.4 + * @draft ICU 3.4 + */ +U_INTERNAL const UChar* U_EXPORT2 +ures_getStringByKeyWithFallback(const UResourceBundle *resB, + const char* inKey, + int32_t* len, + UErrorCode *status); #endif /*URESIMP_H*/ diff --git a/Build/source/libs/icu-xetex/common/uscript.c b/Build/source/libs/icu-xetex/common/uscript.c index 546d5f88e6b..47ae56daf00 100644 --- a/Build/source/libs/icu-xetex/common/uscript.c +++ b/Build/source/libs/icu-xetex/common/uscript.c @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1997-2004, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -22,7 +22,10 @@ #include "cstring.h" static const char kLocaleScript[] = "LocaleScript"; +static const char kHyphen = '-'; +static const char kUnderscore = '_'; +/* TODO: this is a bad API should be deprecated */ U_CAPI int32_t U_EXPORT2 uscript_getCode(const char* nameOrAbbrOrLocale, UScriptCode* fillIn, @@ -41,12 +44,13 @@ uscript_getCode(const char* nameOrAbbrOrLocale, return numFilled; } - /* try long and abbreviated script names first */ - code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); - - /* we still haven't found it try locale */ + if(uprv_strchr(nameOrAbbrOrLocale, kHyphen)==NULL && uprv_strchr(nameOrAbbrOrLocale, kUnderscore)==NULL ){ + /* try long and abbreviated script names first */ + code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); + + } if(code==(UScriptCode)UCHAR_INVALID_CODE){ - /* Do not propagate error codes from just not finding a locale bundle. */ + /* Do not propagate error codes from just not finding a locale bundle. */ UErrorCode localErrorCode = U_ZERO_ERROR; UResourceBundle* resB = ures_open(NULL,nameOrAbbrOrLocale,&localErrorCode); if(U_SUCCESS(localErrorCode)&& localErrorCode != U_USING_DEFAULT_WARNING){ @@ -72,11 +76,16 @@ uscript_getCode(const char* nameOrAbbrOrLocale, } } } - ures_close(resD); - + ures_close(resD); } ures_close(resB); - }else{ + code = USCRIPT_INVALID_CODE; + } + if(code==(UScriptCode)UCHAR_INVALID_CODE){ + /* still not found .. try long and abbreviated script names again */ + code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); + } + if(code!=(UScriptCode)UCHAR_INVALID_CODE){ /* we found it */ if(numFilled<=capacity){ *(fillIn)++=code; diff --git a/Build/source/libs/icu-xetex/common/uset.cpp b/Build/source/libs/icu-xetex/common/uset.cpp index e3f94c6d251..8cd25221308 100644 --- a/Build/source/libs/icu-xetex/common/uset.cpp +++ b/Build/source/libs/icu-xetex/common/uset.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2002-2005, International Business Machines +* Copyright (C) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -42,22 +42,22 @@ uset_close(USet* set) { U_CAPI void U_EXPORT2 uset_set(USet* set, UChar32 start, UChar32 end) { - ((UnicodeSet*) set)->set(start, end); + ((UnicodeSet*) set)->UnicodeSet::set(start, end); } U_CAPI void U_EXPORT2 uset_addAll(USet* set, const USet *additionalSet) { - ((UnicodeSet*) set)->addAll(*((const UnicodeSet*)additionalSet)); + ((UnicodeSet*) set)->UnicodeSet::addAll(*((const UnicodeSet*)additionalSet)); } U_CAPI void U_EXPORT2 uset_add(USet* set, UChar32 c) { - ((UnicodeSet*) set)->add(c); + ((UnicodeSet*) set)->UnicodeSet::add(c); } U_CAPI void U_EXPORT2 uset_addRange(USet* set, UChar32 start, UChar32 end) { - ((UnicodeSet*) set)->add(start, end); + ((UnicodeSet*) set)->UnicodeSet::add(start, end); } U_CAPI void U_EXPORT2 @@ -68,108 +68,108 @@ uset_addString(USet* set, const UChar* str, int32_t strLen) { // UnicodeString handles -1 for strLen UnicodeString s(str, strLen); - ((UnicodeSet*) set)->add(s); + ((UnicodeSet*) set)->UnicodeSet::add(s); } U_CAPI void U_EXPORT2 uset_addAllCodePoints(USet* set, const UChar *str, int32_t strLen) { // UnicodeString handles -1 for strLen UnicodeString s(str, strLen); - ((UnicodeSet*) set)->addAll(s); + ((UnicodeSet*) set)->UnicodeSet::addAll(s); } U_CAPI void U_EXPORT2 uset_remove(USet* set, UChar32 c) { - ((UnicodeSet*) set)->remove(c); + ((UnicodeSet*) set)->UnicodeSet::remove(c); } U_CAPI void U_EXPORT2 uset_removeRange(USet* set, UChar32 start, UChar32 end) { - ((UnicodeSet*) set)->remove(start, end); + ((UnicodeSet*) set)->UnicodeSet::remove(start, end); } U_CAPI void U_EXPORT2 uset_removeString(USet* set, const UChar* str, int32_t strLen) { UnicodeString s(strLen==-1, str, strLen); - ((UnicodeSet*) set)->remove(s); + ((UnicodeSet*) set)->UnicodeSet::remove(s); } U_CAPI void U_EXPORT2 uset_removeAll(USet* set, const USet* remove) { - ((UnicodeSet*) set)->removeAll(*(const UnicodeSet*)remove); + ((UnicodeSet*) set)->UnicodeSet::removeAll(*(const UnicodeSet*)remove); } U_CAPI void U_EXPORT2 uset_retain(USet* set, UChar32 start, UChar32 end) { - ((UnicodeSet*) set)->retain(start, end); + ((UnicodeSet*) set)->UnicodeSet::retain(start, end); } U_CAPI void U_EXPORT2 uset_retainAll(USet* set, const USet* retain) { - ((UnicodeSet*) set)->retainAll(*(const UnicodeSet*)retain); + ((UnicodeSet*) set)->UnicodeSet::retainAll(*(const UnicodeSet*)retain); } U_CAPI void U_EXPORT2 uset_compact(USet* set) { - ((UnicodeSet*) set)->compact(); + ((UnicodeSet*) set)->UnicodeSet::compact(); } U_CAPI void U_EXPORT2 uset_complement(USet* set) { - ((UnicodeSet*) set)->complement(); + ((UnicodeSet*) set)->UnicodeSet::complement(); } U_CAPI void U_EXPORT2 uset_complementAll(USet* set, const USet* complement) { - ((UnicodeSet*) set)->complementAll(*(const UnicodeSet*)complement); + ((UnicodeSet*) set)->UnicodeSet::complementAll(*(const UnicodeSet*)complement); } U_CAPI void U_EXPORT2 uset_clear(USet* set) { - ((UnicodeSet*) set)->clear(); + ((UnicodeSet*) set)->UnicodeSet::clear(); } U_CAPI UBool U_EXPORT2 uset_isEmpty(const USet* set) { - return ((const UnicodeSet*) set)->isEmpty(); + return ((const UnicodeSet*) set)->UnicodeSet::isEmpty(); } U_CAPI UBool U_EXPORT2 uset_contains(const USet* set, UChar32 c) { - return ((const UnicodeSet*) set)->contains(c); + return ((const UnicodeSet*) set)->UnicodeSet::contains(c); } U_CAPI UBool U_EXPORT2 uset_containsRange(const USet* set, UChar32 start, UChar32 end) { - return ((const UnicodeSet*) set)->contains(start, end); + return ((const UnicodeSet*) set)->UnicodeSet::contains(start, end); } U_CAPI UBool U_EXPORT2 uset_containsString(const USet* set, const UChar* str, int32_t strLen) { UnicodeString s(strLen==-1, str, strLen); - return ((const UnicodeSet*) set)->contains(s); + return ((const UnicodeSet*) set)->UnicodeSet::contains(s); } U_CAPI UBool U_EXPORT2 uset_containsAll(const USet* set1, const USet* set2) { - return ((const UnicodeSet*) set1)->containsAll(* (const UnicodeSet*) set2); + return ((const UnicodeSet*) set1)->UnicodeSet::containsAll(* (const UnicodeSet*) set2); } U_CAPI UBool U_EXPORT2 uset_containsAllCodePoints(const USet* set, const UChar *str, int32_t strLen) { // Create a string alias, since nothing is being added to the set. UnicodeString s(strLen==-1, str, strLen); - return ((const UnicodeSet*) set)->containsAll(s); + return ((const UnicodeSet*) set)->UnicodeSet::containsAll(s); } U_CAPI UBool U_EXPORT2 uset_containsNone(const USet* set1, const USet* set2) { - return ((const UnicodeSet*) set1)->containsNone(* (const UnicodeSet*) set2); + return ((const UnicodeSet*) set1)->UnicodeSet::containsNone(* (const UnicodeSet*) set2); } U_CAPI UBool U_EXPORT2 uset_containsSome(const USet* set1, const USet* set2) { - return ((const UnicodeSet*) set1)->containsSome(* (const UnicodeSet*) set2); + return ((const UnicodeSet*) set1)->UnicodeSet::containsSome(* (const UnicodeSet*) set2); } U_CAPI UBool U_EXPORT2 @@ -179,17 +179,17 @@ uset_equals(const USet* set1, const USet* set2) { U_CAPI int32_t U_EXPORT2 uset_indexOf(const USet* set, UChar32 c) { - return ((UnicodeSet*) set)->indexOf(c); + return ((UnicodeSet*) set)->UnicodeSet::indexOf(c); } U_CAPI UChar32 U_EXPORT2 uset_charAt(const USet* set, int32_t index) { - return ((UnicodeSet*) set)->charAt(index); + return ((UnicodeSet*) set)->UnicodeSet::charAt(index); } U_CAPI int32_t U_EXPORT2 uset_size(const USet* set) { - return ((const UnicodeSet*) set)->size(); + return ((const UnicodeSet*) set)->UnicodeSet::size(); } U_NAMESPACE_BEGIN @@ -273,7 +273,7 @@ uprv_openRuleWhiteSpaceSet(UErrorCode* ec) { // create a set with the Pattern_White_Space characters, // without a pattern for fewer code dependencies UnicodeSet *set=new UnicodeSet(9, 0xd); - set->add(0x20).add(0x85).add(0x200e, 0x200f).add(0x2028, 0x2029); + set->UnicodeSet::add(0x20).add(0x85).add(0x200e, 0x200f).add(0x2028, 0x2029); return (USet *)set; } @@ -301,7 +301,7 @@ uset_serialize(const USet* set, uint16_t* dest, int32_t destCapacity, UErrorCode return 0; } - return ((const UnicodeSet*) set)->serialize(dest, destCapacity,* ec); + return ((const UnicodeSet*) set)->UnicodeSet::serialize(dest, destCapacity,* ec); } U_CAPI UBool U_EXPORT2 @@ -382,19 +382,50 @@ uset_serializedContains(const USerializedSet* set, UChar32 c) { array=set->array; if(c<=0xffff) { /* find c in the BMP part */ - int32_t i, bmpLength=set->bmpLength; - for(i=0; i<bmpLength && (uint16_t)c>=array[i]; ++i) {} - return (UBool)(i&1); + int32_t lo = 0; + int32_t hi = set->bmpLength-1; + if (c < array[0]) { + hi = 0; + } else if (c < array[hi]) { + for(;;) { + int32_t i = (lo + hi) >> 1; + if (i == lo) { + break; // Done! + } else if (c < array[i]) { + hi = i; + } else { + lo = i; + } + } + } else { + hi += 1; + } + return (UBool)(hi&1); } else { /* find c in the supplementary part */ - int32_t i, length=set->length; uint16_t high=(uint16_t)(c>>16), low=(uint16_t)c; - for(i=set->bmpLength; - i<length && (high>array[i] || (high==array[i] && low>=array[i+1])); - i+=2) {} - + int32_t base = set->bmpLength; + int32_t lo = 0; + int32_t hi = set->length - 2 - base; + if (high < array[base] || (high==array[base] && low<array[base+1])) { + hi = 0; + } else if (high < array[base+hi] || (high==array[base+hi] && low<array[base+hi+1])) { + for (;;) { + int32_t i = ((lo + hi) >> 1) & ~1; // Guarantee even result + int32_t iabs = i + base; + if (i == lo) { + break; // Done! + } else if (high < array[iabs] || (high==array[iabs] && low<array[iabs+1])) { + hi = i; + } else { + lo = i; + } + } + } else { + hi += 2; + } /* count pairs of 16-bit units even per BMP and check if the number of pairs is odd */ - return (UBool)(((i+set->bmpLength)&2)!=0); + return (UBool)(((hi+(base<<1))&2)!=0); } } diff --git a/Build/source/libs/icu-xetex/common/usetiter.cpp b/Build/source/libs/icu-xetex/common/usetiter.cpp index 75a75de4cce..44858ed46bd 100644 --- a/Build/source/libs/icu-xetex/common/usetiter.cpp +++ b/Build/source/libs/icu-xetex/common/usetiter.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2003, International Business Machines +* Copyright (c) 2002-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -18,6 +18,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSetIterator) * @param set set to iterate over */ UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) { + cpString = NULL; reset(uSet); } @@ -26,11 +27,12 @@ UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) { */ UnicodeSetIterator::UnicodeSetIterator() { this->set = NULL; + cpString = NULL; reset(); } UnicodeSetIterator::~UnicodeSetIterator() { - // Nothing to do + delete cpString; } /** @@ -45,11 +47,13 @@ UnicodeSetIterator::~UnicodeSetIterator() { UBool UnicodeSetIterator::next() { if (nextElement <= endElement) { codepoint = codepointEnd = nextElement++; + string = NULL; return TRUE; } if (range < endRange) { loadRange(++range); codepoint = codepointEnd = nextElement++; + string = NULL; return TRUE; } @@ -71,6 +75,7 @@ UBool UnicodeSetIterator::next() { * <br>Note also that the codepointEnd is undefined after calling this method. */ UBool UnicodeSetIterator::nextRange() { + string = NULL; if (nextElement <= endElement) { codepointEnd = endElement; codepoint = nextElement; @@ -118,6 +123,7 @@ void UnicodeSetIterator::reset() { loadRange(range); } nextString = 0; + string = NULL; } void UnicodeSetIterator::loadRange(int32_t iRange) { @@ -125,6 +131,20 @@ void UnicodeSetIterator::loadRange(int32_t iRange) { endElement = set->getRangeEnd(iRange); } + +const UnicodeString& UnicodeSetIterator::getString() { + if (string==NULL && codepoint!=(UChar32)IS_STRING) { + if (cpString == NULL) { + cpString = new UnicodeString(); + } + if (cpString != NULL) { + cpString->setTo((UChar32)codepoint); + } + string = cpString; + } + return *string; +} + U_NAMESPACE_END //eof diff --git a/Build/source/libs/icu-xetex/common/ushape.c b/Build/source/libs/icu-xetex/common/ushape.c index 41a3dbdf887..ad0b449d33a 100644 --- a/Build/source/libs/icu-xetex/common/ushape.c +++ b/Build/source/libs/icu-xetex/common/ushape.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2000-2005, International Business Machines +* Copyright (C) 2000-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -314,26 +314,20 @@ invertBuffer(UChar *buffer,int32_t size,uint32_t options,int32_t *spacesCountl,i * later it'll be converted into the 0xFExx LamAlefs * in the shaping function. */ -static UChar +static U_INLINE UChar changeLamAlef(UChar ch) { switch(ch) { case 0x0622 : - return(0x065C); - break; + return 0x065C; case 0x0623 : - return(0x065D); - break; + return 0x065D; case 0x0625 : - return(0x065E); - break; + return 0x065E; case 0x0627 : - return(0x065F); - break; - default : - return(0); - break; + return 0x065F; } + return 0; } /* @@ -348,11 +342,9 @@ specialChar(UChar ch) { (ch>0x0647 && ch<0x064a)||(ch==0x0629) ) { return (1); } - else - if( ch>=0x064B && ch<= 0x0652 ) + else if( ch>=0x064B && ch<= 0x0652 ) return (2); - else - if( (ch>=0x0653 && ch<= 0x0655) || ch == 0x0670 || + else if( (ch>=0x0653 && ch<= 0x0655) || ch == 0x0670 || (ch>=0xFE70 && ch<= 0xFE7F) ) return (3); else @@ -408,39 +400,27 @@ countSpaces(UChar *dest,int32_t size,uint32_t options,int32_t *spacesCountl,int3 *Name : isTashkeelChar *Function : Returns 1 for Tashkeel characters else return 0 */ -static int32_t +static U_INLINE int32_t isTashkeelChar(UChar ch) { - - if( ch>=0x064B && ch<= 0x0652 ) - return (1); - else - return (0); + return (int32_t)( ch>=0x064B && ch<= 0x0652 ); } /* *Name : isAlefChar *Function : Returns 1 for Alef characters else return 0 */ -static int32_t +static U_INLINE int32_t isAlefChar(UChar ch) { - - if( (ch==0x0622)||(ch==0x0623)||(ch==0x0625)||(ch==0x0627) ) - return (1); - else - return (0); + return (int32_t)( (ch==0x0622)||(ch==0x0623)||(ch==0x0625)||(ch==0x0627) ); } /* *Name : isLamAlefChar *Function : Returns 1 for LamAlef characters else return 0 */ -static int32_t +static U_INLINE int32_t isLamAlefChar(UChar ch) { - - if( (ch>=0xFEF5)&&(ch<=0xFEFC) ) - return (1); - else - return (0); + return (int32_t)( (ch>=0xFEF5)&&(ch<=0xFEFC) ); } /* @@ -806,7 +786,7 @@ shapeUnicode(UChar *dest, int32_t sourceLength, int32_t i, iend; int32_t step; - int32_t prevPos, lastPos,Nx, Nw; + int32_t lastPos,Nx, Nw; unsigned int Shape; int32_t flag; int32_t lamalef_found = 0; @@ -840,7 +820,6 @@ shapeUnicode(UChar *dest, int32_t sourceLength, */ currLink = getLink(dest[i]); - prevPos = i; lastPos = i; Nx = -2, Nw = 0; @@ -887,13 +866,14 @@ shapeUnicode(UChar *dest, int32_t sourceLength, if (flag == 1) { Shape = (Shape == 1 || Shape == 3) ? 1 : 0; } - else - if(flag == 2) { + else if(flag == 2) { if( (lastLink & LINKL) && (nextLink & LINKR) && (tashkeelFlag == 1) && - dest[i] != 0x064C && dest[i] != 0x064D ) { + dest[i] != 0x064C && dest[i] != 0x064D ) + { Shape = 1; - if( (nextLink&ALEFTYPE) == ALEFTYPE && (lastLink&LAMTYPE) == LAMTYPE ) + if( (nextLink&ALEFTYPE) == ALEFTYPE && (lastLink&LAMTYPE) == LAMTYPE ) { Shape = 0; + } } else { Shape = 0; @@ -911,7 +891,6 @@ shapeUnicode(UChar *dest, int32_t sourceLength, if ((currLink & IRRELEVANT) == 0) { prevLink = lastLink; lastLink = currLink; - prevPos = lastPos; lastPos = i; } @@ -997,7 +976,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength, if(sourceLength==-1) { sourceLength=u_strlen(source); } - if(sourceLength==0) { + if(sourceLength<=0) { return u_terminateUChars(dest, destCapacity, 0, pErrorCode); } diff --git a/Build/source/libs/icu-xetex/common/usprep.cpp b/Build/source/libs/icu-xetex/common/usprep.cpp index 389f17abd15..ec98ad01187 100644 --- a/Build/source/libs/icu-xetex/common/usprep.cpp +++ b/Build/source/libs/icu-xetex/common/usprep.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * - * Copyright (C) 2003-2005, International Business Machines + * Copyright (C) 2003-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -197,19 +197,18 @@ initCache(UErrorCode *status) { makeCache = (SHARED_DATA_HASHTABLE == NULL); umtx_unlock(&usprepMutex); if(makeCache) { - UHashtable *newCache = uhash_open(hashEntry, compareEntries, status); - if (U_FAILURE(*status)) { - return; - } - umtx_lock(&usprepMutex); - if(SHARED_DATA_HASHTABLE == NULL) { - SHARED_DATA_HASHTABLE = newCache; - ucln_common_registerCleanup(UCLN_COMMON_USPREP, usprep_cleanup); - newCache = NULL; - } - umtx_unlock(&usprepMutex); - if(newCache != NULL) { - uhash_close(newCache); + UHashtable *newCache = uhash_open(hashEntry, compareEntries, NULL, status); + if (U_SUCCESS(*status)) { + umtx_lock(&usprepMutex); + if(SHARED_DATA_HASHTABLE == NULL) { + SHARED_DATA_HASHTABLE = newCache; + ucln_common_registerCleanup(UCLN_COMMON_USPREP, usprep_cleanup); + newCache = NULL; + } + umtx_unlock(&usprepMutex); + if(newCache != NULL) { + uhash_close(newCache); + } } } } @@ -317,7 +316,9 @@ usprep_getProfile(const char* path, stackKey.path = (char*) path; /* fetch the data from the cache */ + umtx_lock(&usprepMutex); profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); + umtx_unlock(&usprepMutex); if(profile == NULL){ UStringPrepKey* key = (UStringPrepKey*) uprv_malloc(sizeof(UStringPrepKey)); @@ -356,7 +357,7 @@ usprep_getProfile(const char* path, key->path = (char*) uprv_malloc(uprv_strlen(path)+1); if(key->path == NULL){ *status = U_MEMORY_ALLOCATION_ERROR; - uprv_free(key->path); + uprv_free(key->name); uprv_free(key); uprv_free(profile); return NULL; @@ -366,6 +367,10 @@ usprep_getProfile(const char* path, /* load the data */ if(!loadData(profile, path, name, _SPREP_DATA_TYPE, status) || U_FAILURE(*status) ){ + uprv_free(key->path); + uprv_free(key->name); + uprv_free(key); + uprv_free(profile); return NULL; } @@ -378,6 +383,7 @@ usprep_getProfile(const char* path, if(U_FAILURE(*status)) { usprep_unload(profile); uprv_free(key->path); + uprv_free(key->name); uprv_free(key); uprv_free(profile); return NULL; @@ -411,7 +417,7 @@ usprep_open(const char* path, usprep_init(); /* initialize the profile struct members */ - return usprep_getProfile(path,name,status);; + return usprep_getProfile(path,name,status); } U_CAPI void U_EXPORT2 @@ -473,8 +479,12 @@ getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){ * the source codepoint is copied to the destination */ type = USPREP_TYPE_LIMIT; + isIndex =FALSE; + value = 0; }else if(trieWord >= _SPREP_TYPE_THRESHOLD){ type = (UStringPrepType) (trieWord - _SPREP_TYPE_THRESHOLD); + isIndex =FALSE; + value = 0; }else{ /* get the type */ type = USPREP_MAP; @@ -482,12 +492,10 @@ getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){ if(trieWord & 0x02){ isIndex = TRUE; value = trieWord >> 2; //mask off the lower 2 bits and shift - }else{ isIndex = FALSE; value = (int16_t)trieWord; value = (value >> 2); - } if((trieWord>>2) == _SPREP_MAX_INDEX_VALUE){ @@ -799,7 +807,7 @@ usprep_prepare( const UStringPrepProfile* profile, return FALSE; } } - if(b2Len <= destCapacity){ + if(b2Len>0 && b2Len <= destCapacity){ uprv_memmove(dest,b2, b2Len*U_SIZEOF_UCHAR); } diff --git a/Build/source/libs/icu-xetex/common/ustr_imp.h b/Build/source/libs/icu-xetex/common/ustr_imp.h index 00904b6a8f0..bfb851d7a93 100644 --- a/Build/source/libs/icu-xetex/common/ustr_imp.h +++ b/Build/source/libs/icu-xetex/common/ustr_imp.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ustr_imp.h @@ -67,8 +67,8 @@ uprv_haveProperties(UErrorCode *pErrorCode); * NOT thread safe. * @internal */ -U_CFUNC int8_t -uprv_loadPropsData(UErrorCode *errorCode); +/*U_CFUNC int8_t +uprv_loadPropsData(UErrorCode *errorCode);*/ /** * Type of a function that may be passed to the internal case mapping functions diff --git a/Build/source/libs/icu-xetex/common/ustr_wcs.c b/Build/source/libs/icu-xetex/common/ustr_wcs.c index 4f5008c783e..3b0e4b08452 100644 --- a/Build/source/libs/icu-xetex/common/ustr_wcs.c +++ b/Build/source/libs/icu-xetex/common/ustr_wcs.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2005, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -25,6 +25,12 @@ #include "ustr_imp.h" #include "ustr_cnv.h" +#if defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION + +#define _STACK_BUFFER_CAPACITY 1000 +#define _BUFFER_CAPACITY_MULTIPLIER 2 + +#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) static U_INLINE UBool u_growAnyBufferFromStatic(void *context, void **pBuffer, int32_t *pCapacity, int32_t reqCapacity, @@ -49,10 +55,6 @@ u_growAnyBufferFromStatic(void *context, return (UBool)(newBuffer!=NULL); } -#define _STACK_BUFFER_CAPACITY 1000 -#define _BUFFER_CAPACITY_MULTIPLIER 2 - -#if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) /* helper function */ static wchar_t* _strToWCS(wchar_t *dest, @@ -62,7 +64,6 @@ _strToWCS(wchar_t *dest, int32_t srcLength, UErrorCode *pErrorCode){ -#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION char stackBuffer [_STACK_BUFFER_CAPACITY]; char* tempBuf = stackBuffer; int32_t tempBufCapacity = _STACK_BUFFER_CAPACITY; @@ -215,12 +216,6 @@ cleanup: u_releaseDefaultConverter(conv); return dest; -#else - if(pErrorCode!=NULL && U_SUCCESS(*pErrorCode)){ - *pErrorCode = U_UNSUPPORTED_ERROR; - } - return NULL; -#endif } #endif @@ -279,9 +274,8 @@ _strFromWCS( UChar *dest, int32_t *pDestLength, const wchar_t *src, int32_t srcLength, - UErrorCode *pErrorCode){ - -#if (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) + UErrorCode *pErrorCode) +{ int32_t retVal =0, count =0 ; UConverter* conv = NULL; UChar* pTarget = NULL; @@ -315,7 +309,7 @@ _strFromWCS( UChar *dest, if(retVal == -1){ *pErrorCode = U_ILLEGAL_CHAR_FOUND; goto cleanup; - }else if(retVal == cStackCap){ + }else if(retVal >= (cStackCap-1)){ /* Should rarely occur */ u_growAnyBufferFromStatic(cStack,(void**)&pCSrc,&cStackCap, cStackCap * _BUFFER_CAPACITY_MULTIPLIER, 0, sizeof(char)); @@ -474,12 +468,6 @@ cleanup: u_releaseDefaultConverter(conv); return dest; -#else - if(pErrorCode!=NULL && U_SUCCESS(*pErrorCode)){ - *pErrorCode = U_UNSUPPORTED_ERROR; - } - return NULL; -#endif } #endif @@ -530,3 +518,5 @@ u_strFromWCS(UChar *dest, #endif } + +#endif /* #if !defined(U_WCHAR_IS_UTF16) && !defined(U_WCHAR_IS_UTF32) && !UCONFIG_NO_CONVERSION */ diff --git a/Build/source/libs/icu-xetex/common/ustrcase.c b/Build/source/libs/icu-xetex/common/ustrcase.c index aedae0a3538..866d7548ceb 100644 --- a/Build/source/libs/icu-xetex/common/ustrcase.c +++ b/Build/source/libs/icu-xetex/common/ustrcase.c @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2001-2005, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -174,7 +174,7 @@ _toTitle(const UCaseProps *csp, UErrorCode *pErrorCode) { const UChar *s; UChar32 c; - int32_t prev, index, destIndex; + int32_t prev, titleStart, titleLimit, index, destIndex, length; UBool isFirstIndex; /* set up local variables */ @@ -195,29 +195,65 @@ _toTitle(const UCaseProps *csp, index=srcLength; } - /* lowercase [prev..index[ */ + /* + * Unicode 4 & 5 section 3.13 Default Case Operations: + * + * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex + * #29, "Text Boundaries." Between each pair of word boundaries, find the first + * cased character F. If F exists, map F to default_title(F); then map each + * subsequent character C to default_lower(C). + * + * In this implementation, segment [prev..index[ into 3 parts: + * a) uncased characters (copy as-is) [prev..titleStart[ + * b) first case letter (titlecase) [titleStart..titleLimit[ + * c) subsequent characters (lowercase) [titleLimit..index[ + */ if(prev<index) { - destIndex+= - _caseMap( - csp, ucase_toFullLower, - dest+destIndex, destCapacity-destIndex, - src, csc, - prev, index, - locale, locCache, - pErrorCode); - } + /* find and copy uncased characters [prev..titleStart[ */ + titleStart=titleLimit=prev; + for(;;) { + U16_NEXT(src, titleLimit, srcLength, c); + if(UCASE_NONE!=ucase_getType(csp, c)) { + break; /* cased letter at [titleStart..titleLimit[ */ + } + titleStart=titleLimit; + if(titleLimit==index) { + /* + * only uncased characters in [prev..index[ + * stop with titleStart==titleLimit==index + */ + break; + } + } + length=titleStart-prev; + if(length>0) { + if((destIndex+length)<=destCapacity) { + uprv_memcpy(dest+destIndex, src+prev, length*U_SIZEOF_UCHAR); + } + destIndex+=length; + } - if(index>=srcLength) { - break; + if(titleStart<titleLimit) { + /* titlecase c which is from [titleStart..titleLimit[ */ + csc->cpStart=titleStart; + csc->cpLimit=titleLimit; + c=ucase_toFullTitle(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache); + destIndex=appendResult(dest, destIndex, destCapacity, c, s); + + /* lowercase [titleLimit..index[ */ + if(titleLimit<index) { + destIndex+= + _caseMap( + csp, ucase_toFullLower, + dest+destIndex, destCapacity-destIndex, + src, csc, + titleLimit, index, + locale, locCache, + pErrorCode); + } + } } - /* titlecase the character at the found index */ - csc->cpStart=index; - U16_NEXT(src, index, srcLength, c); - csc->cpLimit=index; - c=ucase_toFullTitle(csp, c, utf16_caseContextIterator, csc, &s, locale, locCache); - destIndex=appendResult(dest, destIndex, destCapacity, c, s); - prev=index; } diff --git a/Build/source/libs/icu-xetex/common/ustrenum.cpp b/Build/source/libs/icu-xetex/common/ustrenum.cpp index 22db32b87c1..2a7acf6801e 100644 --- a/Build/source/libs/icu-xetex/common/ustrenum.cpp +++ b/Build/source/libs/icu-xetex/common/ustrenum.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2002-2004, International Business Machines +* Copyright (c) 2002-2005, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Author: Alan Liu @@ -111,6 +111,15 @@ StringEnumeration::setChars(const char *s, int32_t length, UErrorCode &status) { return NULL; } +UBool +StringEnumeration::operator==(const StringEnumeration& that)const { + return getDynamicClassID() == that.getDynamicClassID(); +} + +UBool +StringEnumeration::operator!=(const StringEnumeration& that)const { + return !operator==(that); +} // UStringEnumeration implementation --------------------------------------- *** @@ -311,3 +320,4 @@ uenum_openCharStringsEnumeration(const char** strings, int32_t count, return (UEnumeration*) result; } + diff --git a/Build/source/libs/icu-xetex/common/ustrfmt.c b/Build/source/libs/icu-xetex/common/ustrfmt.c index 81b778c1b0f..5e9fb924f8d 100644 --- a/Build/source/libs/icu-xetex/common/ustrfmt.c +++ b/Build/source/libs/icu-xetex/common/ustrfmt.c @@ -1,42 +1,13 @@ /* ********************************************************************** -* Copyright (C) 2001-2004, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ #include "cstring.h" #include "ustrfmt.h" -#include <stdio.h> -U_CAPI char* U_EXPORT2 -uprv_dtostr(double value, char *buffer, int maximumDigits,UBool fixedPoint) -{ - char *itrPtr = buffer + 1; /* skip '-' or a number before the decimal */ - char *startPtr; - - sprintf(buffer,"%f",value); - - /* Find the decimal point. - Some unusal machines use a comma when the system locale changes - */ - while (isalnum(*itrPtr)) { - itrPtr++; - } - *itrPtr = '.'; - - /* truncate trailing zeros, except the one after '.' */ - startPtr = itrPtr + 1; - itrPtr = uprv_strchr(startPtr, 0); - while(--itrPtr > startPtr){ - if(*itrPtr == '0'){ - *itrPtr = 0; - }else{ - break; - } - } - return buffer; -} /*** * Fills in a UChar* string with the radix-based representation of a diff --git a/Build/source/libs/icu-xetex/common/ustrfmt.h b/Build/source/libs/icu-xetex/common/ustrfmt.h index 814b5373230..f1891bdabf5 100644 --- a/Build/source/libs/icu-xetex/common/ustrfmt.h +++ b/Build/source/libs/icu-xetex/common/ustrfmt.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 2001-2004, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -10,8 +10,6 @@ #include "unicode/utypes.h" -U_CAPI char* U_EXPORT2 -uprv_dtostr(double value, char *buffer, int maximumDigits,UBool fixedPoint); U_CAPI int32_t U_EXPORT2 uprv_itou (UChar * buffer, int32_t capacity, uint32_t i, uint32_t radix, int32_t minwidth); diff --git a/Build/source/libs/icu-xetex/common/ustrtrns.c b/Build/source/libs/icu-xetex/common/ustrtrns.c index e64476996b0..1801d8aeb64 100644 --- a/Build/source/libs/icu-xetex/common/ustrtrns.c +++ b/Build/source/libs/icu-xetex/common/ustrtrns.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001-2004, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -186,69 +186,687 @@ u_strToUTF32(UChar32 *dest, return dest; } +/* for utf8_nextCharSafeBodyTerminated() */ +static const UChar32 +utf8_minLegal[4]={ 0, 0x80, 0x800, 0x10000 }; + +/* + * Version of utf8_nextCharSafeBody() with the following differences: + * - checks for NUL termination instead of length + * - works with pointers instead of indexes + * - always strict (strict==-1) + * + * *ps points to after the lead byte and will be moved to after the last trail byte. + * c is the lead byte. + * @return the code point, or U_SENTINEL + */ +static UChar32 +utf8_nextCharSafeBodyTerminated(const uint8_t **ps, UChar32 c) { + const uint8_t *s=*ps; + uint8_t trail, illegal=0; + uint8_t count=UTF8_COUNT_TRAIL_BYTES(c); + UTF8_MASK_LEAD_BYTE((c), count); + /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ + switch(count) { + /* each branch falls through to the next one */ + case 5: + case 4: + /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ + illegal=1; + break; + case 3: + trail=(uint8_t)(*s++ - 0x80); + c=(c<<6)|trail; + if(trail>0x3f || c>=0x110) { + /* not a trail byte, or code point>0x10ffff (outside Unicode) */ + illegal=1; + break; + } + case 2: + trail=(uint8_t)(*s++ - 0x80); + if(trail>0x3f) { + /* not a trail byte */ + illegal=1; + break; + } + c=(c<<6)|trail; + case 1: + trail=(uint8_t)(*s++ - 0x80); + if(trail>0x3f) { + /* not a trail byte */ + illegal=1; + } + c=(c<<6)|trail; + break; + case 0: + return U_SENTINEL; + /* no default branch to optimize switch() - all values are covered */ + } + + /* correct sequence - all trail bytes have (b7..b6)==(10)? */ + /* illegal is also set if count>=4 */ + if(illegal || c<utf8_minLegal[count] || UTF_IS_SURROGATE(c)) { + /* error handling */ + /* don't go beyond this sequence */ + s=*ps; + while(count>0 && UTF8_IS_TRAIL(*s)) { + ++s; + --count; + } + c=U_SENTINEL; + } + *ps=s; + return c; +} + +/* + * Version of utf8_nextCharSafeBody() with the following differences: + * - works with pointers instead of indexes + * - always strict (strict==-1) + * + * *ps points to after the lead byte and will be moved to after the last trail byte. + * c is the lead byte. + * @return the code point, or U_SENTINEL + */ +static UChar32 +utf8_nextCharSafeBodyPointer(const uint8_t **ps, const uint8_t *limit, UChar32 c) { + const uint8_t *s=*ps; + uint8_t trail, illegal=0; + uint8_t count=UTF8_COUNT_TRAIL_BYTES(c); + if((limit-s)>=count) { + UTF8_MASK_LEAD_BYTE((c), count); + /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ + switch(count) { + /* each branch falls through to the next one */ + case 5: + case 4: + /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ + illegal=1; + break; + case 3: + trail=*s++; + c=(c<<6)|(trail&0x3f); + if(c<0x110) { + illegal|=(trail&0xc0)^0x80; + } else { + /* code point>0x10ffff, outside Unicode */ + illegal=1; + break; + } + case 2: + trail=*s++; + c=(c<<6)|(trail&0x3f); + illegal|=(trail&0xc0)^0x80; + case 1: + trail=*s++; + c=(c<<6)|(trail&0x3f); + illegal|=(trail&0xc0)^0x80; + break; + case 0: + return U_SENTINEL; + /* no default branch to optimize switch() - all values are covered */ + } + } else { + illegal=1; /* too few bytes left */ + } + + /* correct sequence - all trail bytes have (b7..b6)==(10)? */ + /* illegal is also set if count>=4 */ + if(illegal || c<utf8_minLegal[count] || UTF_IS_SURROGATE(c)) { + /* error handling */ + /* don't go beyond this sequence */ + s=*ps; + while(count>0 && s<limit && UTF8_IS_TRAIL(*s)) { + ++s; + --count; + } + c=U_SENTINEL; + } + *ps=s; + return c; +} + U_CAPI UChar* U_EXPORT2 -u_strFromUTF8(UChar *dest, +u_strFromUTF8WithSub(UChar *dest, int32_t destCapacity, int32_t *pDestLength, - const char* src, + const char* src, int32_t srcLength, + UChar32 subchar, int32_t *pNumSubstitutions, UErrorCode *pErrorCode){ UChar *pDest = dest; UChar *pDestLimit = dest+destCapacity; - UChar32 ch=0; - int32_t index = 0; + UChar32 ch; int32_t reqLength = 0; - uint8_t* pSrc = (uint8_t*) src; + const uint8_t* pSrc = (const uint8_t*) src; + uint8_t t1, t2; /* trail bytes */ + int32_t numSubstitutions; /* args check */ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ return NULL; } - if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + if( (src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0) || + subchar > 0x10ffff || U_IS_SURROGATE(subchar) + ) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } - if(srcLength == -1){ - srcLength = (int32_t)uprv_strlen((char*)pSrc); - } - - while((index < srcLength)&&(pDest<pDestLimit)){ - ch = pSrc[index++]; - if(ch <=0x7f){ - *pDest++=(UChar)ch; - }else{ - ch=utf8_nextCharSafeBody(pSrc, &index, srcLength, ch, -1); - if(ch<0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - }else if(ch<=0xFFFF){ - *(pDest++)=(UChar)ch; - }else{ - *(pDest++)=UTF16_LEAD(ch); - if(pDest<pDestLimit){ - *(pDest++)=UTF16_TRAIL(ch); + numSubstitutions=0; + + /* + * Inline processing of UTF-8 byte sequences: + * + * Byte sequences for the most common characters are handled inline in + * the conversion loops. In order to reduce the path lengths for those + * characters, the tests are arranged in a kind of binary search. + * ASCII (<=0x7f) is checked first, followed by the dividing point + * between 2- and 3-byte sequences (0xe0). + * The 3-byte branch is tested first to speed up CJK text. + * The compiler should combine the subtractions for the two tests for 0xe0. + * Each branch then tests for the other end of its range. + */ + + if(srcLength < 0){ + /* + * Transform a NUL-terminated string. + * The code explicitly checks for NULs only in the lead byte position. + * A NUL byte in the trail byte position fails the trail byte range check anyway. + */ + while(((ch = *pSrc) != 0) && (pDest < pDestLimit)) { + if(ch <= 0x7f){ + *pDest++=(UChar)ch; + ++pSrc; + } else { + if(ch > 0xe0) { + if( /* handle U+1000..U+CFFF inline */ + ch <= 0xec && + (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + ) { + /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ + *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); + pSrc += 3; + continue; + } + } else if(ch < 0xe0) { + if( /* handle U+0080..U+07FF inline */ + ch >= 0xc2 && + (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + ) { + *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); + pSrc += 2; + continue; + } + } + + /* function call for "complicated" and error cases */ + ++pSrc; /* continue after the lead byte */ + ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch); + if(ch<0 && (++numSubstitutions, ch = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(ch<=0xFFFF) { + *(pDest++)=(UChar)ch; + } else { + *(pDest++)=UTF16_LEAD(ch); + if(pDest<pDestLimit) { + *(pDest++)=UTF16_TRAIL(ch); + } else { + reqLength++; + break; + } + } + } + } + + /* Pre-flight the rest of the string. */ + while((ch = *pSrc) != 0) { + if(ch <= 0x7f){ + ++reqLength; + ++pSrc; + } else { + if(ch > 0xe0) { + if( /* handle U+1000..U+CFFF inline */ + ch <= 0xec && + (uint8_t)(pSrc[1] - 0x80) <= 0x3f && + (uint8_t)(pSrc[2] - 0x80) <= 0x3f + ) { + ++reqLength; + pSrc += 3; + continue; + } + } else if(ch < 0xe0) { + if( /* handle U+0080..U+07FF inline */ + ch >= 0xc2 && + (uint8_t)(pSrc[1] - 0x80) <= 0x3f + ) { + ++reqLength; + pSrc += 2; + continue; + } + } + + /* function call for "complicated" and error cases */ + ++pSrc; /* continue after the lead byte */ + ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch); + if(ch<0 && (++numSubstitutions, ch = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } + reqLength += U16_LENGTH(ch); + } + } + } else /* srcLength >= 0 */ { + const uint8_t *pSrcLimit = pSrc + srcLength; + int32_t count; + + /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ + for(;;) { + /* + * Each iteration of the inner loop progresses by at most 3 UTF-8 + * bytes and one UChar, for most characters. + * For supplementary code points (4 & 2), which are rare, + * there is an additional adjustment. + */ + count = (int32_t)(pDestLimit - pDest); + srcLength = (int32_t)((pSrcLimit - pSrc) / 3); + if(count > srcLength) { + count = srcLength; /* min(remaining dest, remaining src/3) */ + } + if(count < 3) { + /* + * Too much overhead if we get near the end of the string, + * continue with the next loop. + */ + break; + } + + do { + ch = *pSrc; + if(ch <= 0x7f){ + *pDest++=(UChar)ch; + ++pSrc; + } else { + if(ch > 0xe0) { + if( /* handle U+1000..U+CFFF inline */ + ch <= 0xec && + (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + ) { + /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ + *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); + pSrc += 3; + continue; + } + } else if(ch < 0xe0) { + if( /* handle U+0080..U+07FF inline */ + ch >= 0xc2 && + (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + ) { + *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); + pSrc += 2; + continue; + } + } + + if(ch >= 0xf0 || subchar > 0xffff) { + /* + * We may read up to six bytes and write up to two UChars, + * which we didn't account for with computing count, + * so we adjust it here. + */ + if(--count == 0) { + break; + } + } + + /* function call for "complicated" and error cases */ + ++pSrc; /* continue after the lead byte */ + ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + }else if(ch<=0xFFFF){ + *(pDest++)=(UChar)ch; + }else{ + *(pDest++)=UTF16_LEAD(ch); + if(pDest<pDestLimit){ + *(pDest++)=UTF16_TRAIL(ch); + }else{ + reqLength++; + break; + } + } + } + } while(--count > 0); + } + + while((pSrc<pSrcLimit) && (pDest<pDestLimit)) { + ch = *pSrc; + if(ch <= 0x7f){ + *pDest++=(UChar)ch; + ++pSrc; + } else { + if(ch > 0xe0) { + if( /* handle U+1000..U+CFFF inline */ + ch <= 0xec && + ((pSrcLimit - pSrc) >= 3) && + (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + ) { + /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ + *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); + pSrc += 3; + continue; + } + } else if(ch < 0xe0) { + if( /* handle U+0080..U+07FF inline */ + ch >= 0xc2 && + ((pSrcLimit - pSrc) >= 2) && + (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + ) { + *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); + pSrc += 2; + continue; + } + } + + /* function call for "complicated" and error cases */ + ++pSrc; /* continue after the lead byte */ + ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + }else if(ch<=0xFFFF){ + *(pDest++)=(UChar)ch; }else{ - reqLength++; - break; + *(pDest++)=UTF16_LEAD(ch); + if(pDest<pDestLimit){ + *(pDest++)=UTF16_TRAIL(ch); + }else{ + reqLength++; + break; + } } } } + /* donot fill the dest buffer just count the UChars needed */ + while(pSrc < pSrcLimit){ + ch = *pSrc; + if(ch <= 0x7f){ + reqLength++; + ++pSrc; + } else { + if(ch > 0xe0) { + if( /* handle U+1000..U+CFFF inline */ + ch <= 0xec && + ((pSrcLimit - pSrc) >= 3) && + (uint8_t)(pSrc[1] - 0x80) <= 0x3f && + (uint8_t)(pSrc[2] - 0x80) <= 0x3f + ) { + reqLength++; + pSrc += 3; + continue; + } + } else if(ch < 0xe0) { + if( /* handle U+0080..U+07FF inline */ + ch >= 0xc2 && + ((pSrcLimit - pSrc) >= 2) && + (uint8_t)(pSrc[1] - 0x80) <= 0x3f + ) { + reqLength++; + pSrc += 2; + continue; + } + } + + /* function call for "complicated" and error cases */ + ++pSrc; /* continue after the lead byte */ + ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } + reqLength+=UTF_CHAR_LENGTH(ch); + } + } } - /* donot fill the dest buffer just count the UChars needed */ - while(index < srcLength){ - ch = pSrc[index++]; - if(ch <= 0x7f){ - reqLength++; - }else{ - ch=utf8_nextCharSafeBody(pSrc, &index, srcLength, ch, -1); - if(ch<0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; + + reqLength+=(int32_t)(pDest - dest); + + if(pNumSubstitutions!=NULL) { + *pNumSubstitutions=numSubstitutions; + } + + if(pDestLength){ + *pDestLength = reqLength; + } + + /* Terminate the buffer */ + u_terminateUChars(dest,destCapacity,reqLength,pErrorCode); + + return dest; +} + +U_CAPI UChar* U_EXPORT2 +u_strFromUTF8(UChar *dest, + int32_t destCapacity, + int32_t *pDestLength, + const char* src, + int32_t srcLength, + UErrorCode *pErrorCode){ + return u_strFromUTF8WithSub( + dest, destCapacity, pDestLength, + src, srcLength, + U_SENTINEL, NULL, + pErrorCode); +} + +U_CAPI UChar * U_EXPORT2 +u_strFromUTF8Lenient(UChar *dest, + int32_t destCapacity, + int32_t *pDestLength, + const char *src, + int32_t srcLength, + UErrorCode *pErrorCode) { + + UChar *pDest = dest; + UChar32 ch; + int32_t reqLength = 0; + uint8_t* pSrc = (uint8_t*) src; + + /* args check */ + if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + return NULL; + } + + if((src==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)) { + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + if(srcLength < 0) { + /* Transform a NUL-terminated string. */ + UChar *pDestLimit = dest+destCapacity; + uint8_t t1, t2, t3; /* trail bytes */ + + while(((ch = *pSrc) != 0) && (pDest < pDestLimit)) { + if(ch < 0xc0) { + /* + * ASCII, or a trail byte in lead position which is treated like + * a single-byte sequence for better character boundary + * resynchronization after illegal sequences. + */ + *pDest++=(UChar)ch; + ++pSrc; + continue; + } else if(ch < 0xe0) { /* U+0080..U+07FF */ + if((t1 = pSrc[1]) != 0) { + /* 0x3080 = (0xc0 << 6) + 0x80 */ + *pDest++ = (UChar)((ch << 6) + t1 - 0x3080); + pSrc += 2; + continue; + } + } else if(ch < 0xf0) { /* U+0800..U+FFFF */ + if((t1 = pSrc[1]) != 0 && (t2 = pSrc[2]) != 0) { + /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ + /* 0x2080 = (0x80 << 6) + 0x80 */ + *pDest++ = (UChar)((ch << 12) + (t1 << 6) + t2 - 0x2080); + pSrc += 3; + continue; + } + } else /* f0..f4 */ { /* U+10000..U+10FFFF */ + if((t1 = pSrc[1]) != 0 && (t2 = pSrc[2]) != 0 && (t3 = pSrc[3]) != 0) { + pSrc += 4; + /* 0x3c82080 = (0xf0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */ + ch = (ch << 18) + (t1 << 12) + (t2 << 6) + t3 - 0x3c82080; + *(pDest++) = U16_LEAD(ch); + if(pDest < pDestLimit) { + *(pDest++) = U16_TRAIL(ch); + } else { + reqLength = 1; + break; + } + continue; + } } - reqLength+=UTF_CHAR_LENGTH(ch); + + /* truncated character at the end */ + *pDest++ = 0xfffd; + while(*++pSrc != 0) {} + break; + } + + /* Pre-flight the rest of the string. */ + while((ch = *pSrc) != 0) { + if(ch < 0xc0) { + /* + * ASCII, or a trail byte in lead position which is treated like + * a single-byte sequence for better character boundary + * resynchronization after illegal sequences. + */ + ++reqLength; + ++pSrc; + continue; + } else if(ch < 0xe0) { /* U+0080..U+07FF */ + if(pSrc[1] != 0) { + ++reqLength; + pSrc += 2; + continue; + } + } else if(ch < 0xf0) { /* U+0800..U+FFFF */ + if(pSrc[1] != 0 && pSrc[2] != 0) { + ++reqLength; + pSrc += 3; + continue; + } + } else /* f0..f4 */ { /* U+10000..U+10FFFF */ + if(pSrc[1] != 0 && pSrc[2] != 0 && pSrc[3] != 0) { + reqLength += 2; + pSrc += 4; + continue; + } + } + + /* truncated character at the end */ + ++reqLength; + break; + } + } else /* srcLength >= 0 */ { + const uint8_t *pSrcLimit = pSrc + srcLength; + + /* + * This function requires that if srcLength is given, then it must be + * destCapatity >= srcLength so that we need not check for + * destination buffer overflow in the loop. + */ + if(destCapacity < srcLength) { + if(pDestLength != NULL) { + *pDestLength = srcLength; /* this likely overestimates the true destLength! */ + } + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return NULL; + } + + if((pSrcLimit - pSrc) >= 4) { + pSrcLimit -= 3; /* temporarily reduce pSrcLimit */ + + /* in this loop, we can always access at least 4 bytes, up to pSrc+3 */ + do { + ch = *pSrc++; + if(ch < 0xc0) { + /* + * ASCII, or a trail byte in lead position which is treated like + * a single-byte sequence for better character boundary + * resynchronization after illegal sequences. + */ + *pDest++=(UChar)ch; + } else if(ch < 0xe0) { /* U+0080..U+07FF */ + /* 0x3080 = (0xc0 << 6) + 0x80 */ + *pDest++ = (UChar)((ch << 6) + *pSrc++ - 0x3080); + } else if(ch < 0xf0) { /* U+0800..U+FFFF */ + /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ + /* 0x2080 = (0x80 << 6) + 0x80 */ + ch = (ch << 12) + (*pSrc++ << 6); + *pDest++ = (UChar)(ch + *pSrc++ - 0x2080); + } else /* f0..f4 */ { /* U+10000..U+10FFFF */ + /* 0x3c82080 = (0xf0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */ + ch = (ch << 18) + (*pSrc++ << 12); + ch += *pSrc++ << 6; + ch += *pSrc++ - 0x3c82080; + *(pDest++) = U16_LEAD(ch); + *(pDest++) = U16_TRAIL(ch); + } + } while(pSrc < pSrcLimit); + + pSrcLimit += 3; /* restore original pSrcLimit */ + } + + while(pSrc < pSrcLimit) { + ch = *pSrc++; + if(ch < 0xc0) { + /* + * ASCII, or a trail byte in lead position which is treated like + * a single-byte sequence for better character boundary + * resynchronization after illegal sequences. + */ + *pDest++=(UChar)ch; + continue; + } else if(ch < 0xe0) { /* U+0080..U+07FF */ + if(pSrc < pSrcLimit) { + /* 0x3080 = (0xc0 << 6) + 0x80 */ + *pDest++ = (UChar)(((ch & 0x1f) << 6) + *pSrc++ - 0x3080); + continue; + } + } else if(ch < 0xf0) { /* U+0800..U+FFFF */ + if((pSrcLimit - pSrc) >= 2) { + /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ + /* 0x2080 = (0x80 << 6) + 0x80 */ + ch = (ch << 12) + (*pSrc++ << 6); + *pDest++ = (UChar)(ch + *pSrc++ - 0x2080); + pSrc += 3; + continue; + } + } else /* f0..f4 */ { /* U+10000..U+10FFFF */ + if((pSrcLimit - pSrc) >= 3) { + /* 0x3c82080 = (0xf0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */ + ch = (ch << 18) + (*pSrc++ << 12); + ch += *pSrc++ << 6; + ch += *pSrc++ - 0x3c82080; + *(pDest++) = U16_LEAD(ch); + *(pDest++) = U16_TRAIL(ch); + pSrc += 4; + continue; + } + } + + /* truncated character at the end */ + *pDest++ = 0xfffd; + break; } } @@ -266,11 +884,13 @@ u_strFromUTF8(UChar *dest, static U_INLINE uint8_t * _appendUTF8(uint8_t *pDest, UChar32 c) { - /* c<=0x7f is handled by the caller, here it is 0x80<=c<=0x10ffff */ - if((c)<=0x7ff) { + /* it is 0<=c<=0x10ffff and not a surrogate if called by a validating function */ + if((c)<=0x7f) { + *pDest++=(uint8_t)c; + } else if(c<=0x7ff) { *pDest++=(uint8_t)((c>>6)|0xc0); *pDest++=(uint8_t)((c&0x3f)|0x80); - } else if((uint32_t)(c)<=0xffff) { + } else if(c<=0xffff) { *pDest++=(uint8_t)((c>>12)|0xe0); *pDest++=(uint8_t)(((c>>6)&0x3f)|0x80); *pDest++=(uint8_t)(((c)&0x3f)|0x80); @@ -285,57 +905,86 @@ _appendUTF8(uint8_t *pDest, UChar32 c) { U_CAPI char* U_EXPORT2 -u_strToUTF8(char *dest, +u_strToUTF8WithSub(char *dest, int32_t destCapacity, int32_t *pDestLength, - const UChar *pSrc, + const UChar *pSrc, int32_t srcLength, + UChar32 subchar, int32_t *pNumSubstitutions, UErrorCode *pErrorCode){ int32_t reqLength=0; - const UChar *pSrcLimit; uint32_t ch=0,ch2=0; uint8_t *pDest = (uint8_t *)dest; uint8_t *pDestLimit = pDest + destCapacity; - + int32_t numSubstitutions; /* args check */ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ return NULL; } - if((pSrc==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0)){ + if( (pSrc==NULL) || (srcLength < -1) || (destCapacity<0) || (!dest && destCapacity > 0) || + subchar > 0x10ffff || U_IS_SURROGATE(subchar) + ) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } + numSubstitutions=0; + if(srcLength==-1) { - while((ch=*pSrc)!=0 && pDest!=pDestLimit) { + while((ch=*pSrc)!=0) { ++pSrc; if(ch <= 0x7f) { - *pDest++ = (char)ch; - ++reqLength; - continue; - } + if(pDest<pDestLimit) { + *pDest++ = (char)ch; + } else { + reqLength = 1; + break; + } + } else if(ch <= 0x7ff) { + if((pDestLimit - pDest) >= 2) { + *pDest++=(uint8_t)((ch>>6)|0xc0); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else { + reqLength = 2; + break; + } + } else if(ch <= 0xd7ff || ch >= 0xe000) { + if((pDestLimit - pDest) >= 3) { + *pDest++=(uint8_t)((ch>>12)|0xe0); + *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else { + reqLength = 3; + break; + } + } else /* ch is a surrogate */ { + int32_t length; - /*need not check for NUL because NUL fails UTF_IS_TRAIL() anyway*/ - if(UTF_IS_SURROGATE(ch)) { + /*need not check for NUL because NUL fails UTF_IS_TRAIL() anyway*/ if(UTF_IS_SURROGATE_FIRST(ch) && UTF_IS_TRAIL(ch2=*pSrc)) { ++pSrc; ch=UTF16_GET_PAIR_VALUE(ch, ch2); + } else if(subchar>=0) { + ch=subchar; + ++numSubstitutions; } else { /* Unicode 3.2 forbids surrogate code points in UTF-8 */ *pErrorCode = U_INVALID_CHAR_FOUND; return NULL; } + + length = U8_LENGTH(ch); + if((pDestLimit - pDest) >= length) { + /* convert and append*/ + pDest=_appendUTF8(pDest, ch); + } else { + reqLength = length; + break; + } } - reqLength += UTF8_CHAR_LENGTH(ch); - /* do we have enough room in destination? */ - if(destCapacity< reqLength){ - break; - } - /* convert and append*/ - pDest=_appendUTF8(pDest, ch); } while((ch=*pSrc++)!=0) { if(ch<=0x7f) { @@ -347,6 +996,9 @@ u_strToUTF8(char *dest, } else if(UTF_IS_SURROGATE_FIRST(ch) && UTF_IS_TRAIL(ch2=*pSrc)) { ++pSrc; reqLength+=4; + } else if(subchar>=0) { + reqLength+=U8_LENGTH(subchar); + ++numSubstitutions; } else { /* Unicode 3.2 forbids surrogate code points in UTF-8 */ *pErrorCode = U_INVALID_CHAR_FOUND; @@ -354,32 +1006,127 @@ u_strToUTF8(char *dest, } } } else { - pSrcLimit = pSrc+srcLength; - while(pSrc<pSrcLimit && pDest<pDestLimit) { + const UChar *pSrcLimit = pSrc+srcLength; + int32_t count; + + /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ + for(;;) { + /* + * Each iteration of the inner loop progresses by at most 3 UTF-8 + * bytes and one UChar, for most characters. + * For supplementary code points (4 & 2), which are rare, + * there is an additional adjustment. + */ + count = (int32_t)((pDestLimit - pDest) / 3); + srcLength = (int32_t)(pSrcLimit - pSrc); + if(count > srcLength) { + count = srcLength; /* min(remaining dest/3, remaining src) */ + } + if(count < 3) { + /* + * Too much overhead if we get near the end of the string, + * continue with the next loop. + */ + break; + } + do { + ch=*pSrc++; + if(ch <= 0x7f) { + *pDest++ = (char)ch; + } else if(ch <= 0x7ff) { + *pDest++=(uint8_t)((ch>>6)|0xc0); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else if(ch <= 0xd7ff || ch >= 0xe000) { + *pDest++=(uint8_t)((ch>>12)|0xe0); + *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else /* ch is a surrogate */ { + /* + * We will read two UChars and probably output four bytes, + * which we didn't account for with computing count, + * so we adjust it here. + */ + if(--count == 0) { + --pSrc; /* undo ch=*pSrc++ for the lead surrogate */ + break; /* recompute count */ + } + + if(UTF_IS_SURROGATE_FIRST(ch) && UTF_IS_TRAIL(ch2=*pSrc)) { + ++pSrc; + ch=UTF16_GET_PAIR_VALUE(ch, ch2); + + /* writing 4 bytes per 2 UChars is ok */ + *pDest++=(uint8_t)((ch>>18)|0xf0); + *pDest++=(uint8_t)(((ch>>12)&0x3f)|0x80); + *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else { + /* Unicode 3.2 forbids surrogate code points in UTF-8 */ + if(subchar>=0) { + ch=subchar; + ++numSubstitutions; + } else { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } + + /* convert and append*/ + pDest=_appendUTF8(pDest, ch); + } + } + } while(--count > 0); + } + + while(pSrc<pSrcLimit) { ch=*pSrc++; if(ch <= 0x7f) { - *pDest++ = (char)ch; - ++reqLength; - continue; - } + if(pDest<pDestLimit) { + *pDest++ = (char)ch; + } else { + reqLength = 1; + break; + } + } else if(ch <= 0x7ff) { + if((pDestLimit - pDest) >= 2) { + *pDest++=(uint8_t)((ch>>6)|0xc0); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else { + reqLength = 2; + break; + } + } else if(ch <= 0xd7ff || ch >= 0xe000) { + if((pDestLimit - pDest) >= 3) { + *pDest++=(uint8_t)((ch>>12)|0xe0); + *pDest++=(uint8_t)(((ch>>6)&0x3f)|0x80); + *pDest++=(uint8_t)((ch&0x3f)|0x80); + } else { + reqLength = 3; + break; + } + } else /* ch is a surrogate */ { + int32_t length; - if(UTF_IS_SURROGATE(ch)) { if(UTF_IS_SURROGATE_FIRST(ch) && pSrc<pSrcLimit && UTF_IS_TRAIL(ch2=*pSrc)) { ++pSrc; ch=UTF16_GET_PAIR_VALUE(ch, ch2); + } else if(subchar>=0) { + ch=subchar; + ++numSubstitutions; } else { /* Unicode 3.2 forbids surrogate code points in UTF-8 */ *pErrorCode = U_INVALID_CHAR_FOUND; return NULL; } + + length = U8_LENGTH(ch); + if((pDestLimit - pDest) >= length) { + /* convert and append*/ + pDest=_appendUTF8(pDest, ch); + } else { + reqLength = length; + break; + } } - reqLength += UTF8_CHAR_LENGTH(ch); - /* do we have enough room in destination? */ - if(destCapacity< reqLength){ - break; - } - /* convert and append*/ - pDest=_appendUTF8(pDest, ch); } while(pSrc<pSrcLimit) { ch=*pSrc++; @@ -392,6 +1139,9 @@ u_strToUTF8(char *dest, } else if(UTF_IS_SURROGATE_FIRST(ch) && pSrc<pSrcLimit && UTF_IS_TRAIL(ch2=*pSrc)) { ++pSrc; reqLength+=4; + } else if(subchar>=0) { + reqLength+=U8_LENGTH(subchar); + ++numSubstitutions; } else { /* Unicode 3.2 forbids surrogate code points in UTF-8 */ *pErrorCode = U_INVALID_CHAR_FOUND; @@ -400,6 +1150,12 @@ u_strToUTF8(char *dest, } } + reqLength+=(int32_t)(pDest - (uint8_t *)dest); + + if(pNumSubstitutions!=NULL) { + *pNumSubstitutions=numSubstitutions; + } + if(pDestLength){ *pDestLength = reqLength; } @@ -409,3 +1165,17 @@ u_strToUTF8(char *dest, return (char*)dest; } + +U_CAPI char* U_EXPORT2 +u_strToUTF8(char *dest, + int32_t destCapacity, + int32_t *pDestLength, + const UChar *pSrc, + int32_t srcLength, + UErrorCode *pErrorCode){ + return u_strToUTF8WithSub( + dest, destCapacity, pDestLength, + pSrc, srcLength, + U_SENTINEL, NULL, + pErrorCode); +} diff --git a/Build/source/libs/icu-xetex/common/utext.cpp b/Build/source/libs/icu-xetex/common/utext.cpp index 3550fb64c8a..da496cd01b0 100644 --- a/Build/source/libs/icu-xetex/common/utext.cpp +++ b/Build/source/libs/icu-xetex/common/utext.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2005, International Business Machines +* Copyright (C) 2005-2006, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -17,6 +17,7 @@ #include "unicode/utypes.h" #include "unicode/ustring.h" #include "unicode/unistr.h" +#include "unicode/chariter.h" #include "unicode/utext.h" #include "ustr_imp.h" #include "cmemory.h" @@ -28,40 +29,55 @@ static UBool -utext_access(UText *ut, int32_t index, UBool forward) { - return ut->access(ut, index, forward, &ut->chunk); +utext_access(UText *ut, int64_t index, UBool forward) { + return ut->pFuncs->access(ut, index, forward); } U_DRAFT UBool U_EXPORT2 utext_moveIndex32(UText *ut, int32_t delta) { - UBool retval = TRUE; - if(delta>0) { + UChar32 c; + if (delta > 0) { do { - if(ut->chunk.offset>=ut->chunk.length && !utext_access(ut, ut->chunk.nativeLimit, TRUE)) { - retval = FALSE; - break; + if(ut->chunkOffset>=ut->chunkLength && !utext_access(ut, ut->chunkNativeLimit, TRUE)) { + return FALSE; + } + c = ut->chunkContents[ut->chunkOffset]; + if (U16_IS_SURROGATE(c)) { + c = utext_next32(ut); + if (c == U_SENTINEL) { + return FALSE; + } + } else { + ut->chunkOffset++; } - U16_FWD_1(ut->chunk.contents, ut->chunk.offset, ut->chunk.length); } while(--delta>0); + } else if (delta<0) { do { - if(ut->chunk.offset<=0 && !utext_access(ut, ut->chunk.nativeStart, FALSE)) { - retval = FALSE; - break; + if(ut->chunkOffset<=0 && !utext_access(ut, ut->chunkNativeStart, FALSE)) { + return FALSE; + } + c = ut->chunkContents[ut->chunkOffset-1]; + if (U16_IS_SURROGATE(c)) { + c = utext_previous32(ut); + if (c == U_SENTINEL) { + return FALSE; + } + } else { + ut->chunkOffset--; } - U16_BACK_1(ut->chunk.contents, 0, ut->chunk.offset); } while(++delta<0); - } + } - return retval; + return TRUE; } -U_DRAFT int32_t U_EXPORT2 +U_DRAFT int64_t U_EXPORT2 utext_nativeLength(UText *ut) { - return ut->nativeLength(ut); + return ut->pFuncs->nativeLength(ut); } @@ -72,36 +88,43 @@ utext_isLengthExpensive(const UText *ut) { } -U_DRAFT int32_t U_EXPORT2 -utext_getNativeIndex(UText *ut) { - if(!ut->chunk.nonUTF16Indexes || ut->chunk.offset==0) { - return ut->chunk.nativeStart+ut->chunk.offset; +U_DRAFT int64_t U_EXPORT2 +utext_getNativeIndex(const UText *ut) { + if(ut->chunkOffset <= ut->nativeIndexingLimit) { + return ut->chunkNativeStart+ut->chunkOffset; } else { - return ut->mapOffsetToNative(ut, ut->chunk.offset); + return ut->pFuncs->mapOffsetToNative(ut); } } - U_DRAFT void U_EXPORT2 -utext_setNativeIndex(UText *ut, int32_t index) { - if(index<ut->chunk.nativeStart || ut->chunk.nativeLimit<index) { - // The desired position is outside of the current chunk. +utext_setNativeIndex(UText *ut, int64_t index) { + if(index<ut->chunkNativeStart || index>=ut->chunkNativeLimit) { + // The desired position is outside of the current chunk. // Access the new position. Assume a forward iteration from here, // which will also be optimimum for a single random access. // Reverse iterations may suffer slightly. - ut->access(ut, index, TRUE, &ut->chunk); - } else if(ut->chunk.nonUTF16Indexes) { - ut->chunk.offset=ut->mapNativeIndexToUTF16(ut, index); + ut->pFuncs->access(ut, index, TRUE); + } else if((int32_t)(index - ut->chunkNativeStart) <= ut->nativeIndexingLimit) { + // utf-16 indexing. + ut->chunkOffset=(int32_t)(index-ut->chunkNativeStart); } else { - ut->chunk.offset=index-ut->chunk.nativeStart; - // Our convention is that the index must always be on a code point boundary. - // If we are somewhere in the middle of a utf-16 buffer, check that new index - // is not in the middle of a surrogate pair. - if (index>ut->chunk.nativeStart && index < ut->chunk.nativeLimit) { - UChar c = ut->chunk.contents[ut->chunk.offset]; - if (U16_TRAIL(c)) { - utext_current32(ut); // force index to the start of the curent code point. + ut->chunkOffset=ut->pFuncs->mapNativeIndexToUTF16(ut, index); + } + // The convention is that the index must always be on a code point boundary. + // Adjust the index position if it is in the middle of a surrogate pair. + if (ut->chunkOffset<ut->chunkLength) { + UChar c= ut->chunkContents[ut->chunkOffset]; + if (UTF16_IS_TRAIL(c)) { + if (ut->chunkOffset==0) { + ut->pFuncs->access(ut, ut->chunkNativeStart, FALSE); + } + if (ut->chunkOffset>0) { + UChar lead = ut->chunkContents[ut->chunkOffset-1]; + if (UTF16_IS_LEAD(lead)) { + ut->chunkOffset--; + } } } } @@ -109,42 +132,123 @@ utext_setNativeIndex(UText *ut, int32_t index) { - +U_DRAFT int64_t U_EXPORT2 +utext_getPreviousNativeIndex(UText *ut) { + // + // Fast-path the common case. + // Common means current position is not at the beginning of a chunk + // and the preceding character is not supplementary. + // + int32_t i = ut->chunkOffset - 1; + int64_t result; + if (i >= 0) { + UChar c = ut->chunkContents[i]; + if (U16_IS_TRAIL(c) == FALSE) { + if (i <= ut->nativeIndexingLimit) { + result = ut->chunkNativeStart + i; + } else { + ut->chunkOffset = i; + result = ut->pFuncs->mapOffsetToNative(ut); + ut->chunkOffset++; + } + return result; + } + } + + // If at the start of text, simply return 0. + if (ut->chunkOffset==0 && ut->chunkNativeStart==0) { + return 0; + } + + // Harder, less common cases. We are at a chunk boundary, or on a surrogate. + // Keep it simple, use other functions to handle the edges. + // + utext_previous32(ut); + result = UTEXT_GETNATIVEINDEX(ut); + utext_next32(ut); + return result; +} + + +// +// utext_current32. Get the UChar32 at the current position. +// UText iteration position is always on a code point boundary, +// never on the trail half of a surrogate pair. +// U_DRAFT UChar32 U_EXPORT2 utext_current32(UText *ut) { - UChar32 c = U_SENTINEL; - if (ut->chunk.offset==ut->chunk.length) { + UChar32 c; + if (ut->chunkOffset==ut->chunkLength) { // Current position is just off the end of the chunk. - // Can also happen at startup, with a zero length chunk at zero offset. - ut->access(ut, ut->chunk.nativeLimit, TRUE, &ut->chunk); + if (ut->pFuncs->access(ut, ut->chunkNativeLimit, TRUE) == FALSE) { + // Off the end of the text. + return U_SENTINEL; + } } - if (ut->chunk.offset < ut->chunk.length) { - c = ut->chunk.contents[ut->chunk.offset]; - if (U16_IS_SURROGATE(c)) { - // looking at a surrogate. Could be unpaired, need to be careful. - // Speed doesn't matter, will be very rare. - UChar32 char16AtIndex = c; - U16_GET(ut->chunk.contents, 0, ut->chunk.offset, ut->chunk.length, c); - if (U16_IS_TRAIL(char16AtIndex) && U_IS_SUPPLEMENTARY(c)) { - // Incoming position pointed to the trailing part of a supplementary pair. - // Move offset to point to the lead surrogate. This is needed because utext_current() - // is used internally to force code point alignment. When called from - // the outside we should always be pre-aligned, but this check doesn't hurt. - ut->chunk.offset--; - } + + c = ut->chunkContents[ut->chunkOffset]; + if (U16_IS_LEAD(c) == FALSE) { + // Normal, non-supplementary case. + return c; + } + + // + // Possible supplementary char. + // + UChar32 trail = 0; + UChar32 supplementaryC = c; + if ((ut->chunkOffset+1) < ut->chunkLength) { + // The trail surrogate is in the same chunk. + trail = ut->chunkContents[ut->chunkOffset+1]; + } else { + // The trail surrogate is in a different chunk. + // Because we must maintain the iteration position, we need to switch forward + // into the new chunk, get the trail surrogate, then revert the chunk back to the + // original one. + // An edge case to be careful of: the entire text may end with an unpaired + // leading surrogate. The attempt to access the trail will fail, but + // the original position before the unpaired lead still needs to be restored. + int64_t nativePosition = ut->chunkNativeLimit; + int32_t originalOffset = ut->chunkOffset; + if (ut->pFuncs->access(ut, nativePosition, TRUE)) { + trail = ut->chunkContents[ut->chunkOffset]; + } + UBool r = ut->pFuncs->access(ut, nativePosition, FALSE); // reverse iteration flag loads preceding chunk + U_ASSERT(r==TRUE); + ut->chunkOffset = originalOffset; + if(!r) { + return U_SENTINEL; } } - return c; + + if (U16_IS_TRAIL(trail)) { + supplementaryC = U16_GET_SUPPLEMENTARY(c, trail); + } + return supplementaryC; + } U_DRAFT UChar32 U_EXPORT2 -utext_char32At(UText *ut, int32_t nativeIndex) { +utext_char32At(UText *ut, int64_t nativeIndex) { UChar32 c = U_SENTINEL; + + // Fast path the common case. + if (nativeIndex>=ut->chunkNativeStart && nativeIndex < ut->chunkNativeStart + ut->nativeIndexingLimit) { + ut->chunkOffset = (int32_t)(nativeIndex - ut->chunkNativeStart); + c = ut->chunkContents[ut->chunkOffset]; + if (U16_IS_SURROGATE(c) == FALSE) { + return c; + } + } + + utext_setNativeIndex(ut, nativeIndex); - if (ut->chunk.offset < ut->chunk.length) { - c = ut->chunk.contents[ut->chunk.offset]; - if (c >= 0xd800) { + if (nativeIndex>=ut->chunkNativeStart && ut->chunkOffset<ut->chunkLength) { + c = ut->chunkContents[ut->chunkOffset]; + if (U16_IS_SURROGATE(c)) { + // For surrogates, let current32() deal with the complications + // of supplementaries that may span chunk boundaries. c = utext_current32(ut); } } @@ -154,141 +258,196 @@ utext_char32At(UText *ut, int32_t nativeIndex) { U_DRAFT UChar32 U_EXPORT2 utext_next32(UText *ut) { - UTextChunk *chunk = &ut->chunk; - UChar32 c = U_SENTINEL; + UChar32 c; - if (chunk->offset >= chunk->length) { - if (ut->access(ut, chunk->nativeLimit, TRUE, chunk) == FALSE) { - goto next32_return; + if (ut->chunkOffset >= ut->chunkLength) { + if (ut->pFuncs->access(ut, ut->chunkNativeLimit, TRUE) == FALSE) { + return U_SENTINEL; } } - - c = chunk->contents[chunk->offset++]; - if (U16_IS_SURROGATE(c)) { - // looking at a surrogate. Could be unpaired, need to be careful. - // Speed doesn't matter, will be very rare. - chunk->offset--; - c = utext_current32(ut); - chunk->offset++; - if (U_IS_SUPPLEMENTARY(c)) { - chunk->offset++; - } + + c = ut->chunkContents[ut->chunkOffset++]; + if (U16_IS_LEAD(c) == FALSE) { + // Normal case, not supplementary. + // (A trail surrogate seen here is just returned as is, as a surrogate value. + // It cannot be part of a pair.) + return c; } -next32_return: - return c; -} + if (ut->chunkOffset >= ut->chunkLength) { + if (ut->pFuncs->access(ut, ut->chunkNativeLimit, TRUE) == FALSE) { + // c is an unpaired lead surrogate at the end of the text. + // return it as it is. + return c; + } + } + UChar32 trail = ut->chunkContents[ut->chunkOffset]; + if (U16_IS_TRAIL(trail) == FALSE) { + // c was an unpaired lead surrogate, not at the end of the text. + // return it as it is (unpaired). Iteration position is on the + // following character, possibly in the next chunk, where the + // trail surrogate would have been if it had existed. + return c; + } + UChar32 supplementary = U16_GET_SUPPLEMENTARY(c, trail); + ut->chunkOffset++; // move iteration position over the trail surrogate. + return supplementary; + } U_DRAFT UChar32 U_EXPORT2 utext_previous32(UText *ut) { - UTextChunk *chunk = &ut->chunk; - int32_t offset = chunk->offset; - UChar32 c = U_SENTINEL; + UChar32 c; - if (offset <= 0) { - if (ut->access(ut, chunk->nativeStart, FALSE, chunk) == FALSE) { - goto prev32_return; + if (ut->chunkOffset <= 0) { + if (ut->pFuncs->access(ut, ut->chunkNativeStart, FALSE) == FALSE) { + return U_SENTINEL; } - offset = chunk->offset; } - - c = chunk->contents[--offset]; - chunk->offset = offset; - if (U16_IS_SURROGATE(c)) { - // Note that utext_current() will move the chunk offset to the lead surrogate - // if we come in referring to trail half of a surrogate pair. - c = utext_current32(ut); - } + ut->chunkOffset--; + c = ut->chunkContents[ut->chunkOffset]; + if (U16_IS_TRAIL(c) == FALSE) { + // Normal case, not supplementary. + // (A lead surrogate seen here is just returned as is, as a surrogate value. + // It cannot be part of a pair.) + return c; + } -prev32_return: - return c; + if (ut->chunkOffset <= 0) { + if (ut->pFuncs->access(ut, ut->chunkNativeStart, FALSE) == FALSE) { + // c is an unpaired trail surrogate at the start of the text. + // return it as it is. + return c; + } + } + + UChar32 lead = ut->chunkContents[ut->chunkOffset-1]; + if (U16_IS_LEAD(lead) == FALSE) { + // c was an unpaired trail surrogate, not at the end of the text. + // return it as it is (unpaired). Iteration position is at c + return c; + } + + UChar32 supplementary = U16_GET_SUPPLEMENTARY(lead, c); + ut->chunkOffset--; // move iteration position over the lead surrogate. + return supplementary; } U_DRAFT UChar32 U_EXPORT2 -utext_next32From(UText *ut, int32_t index) { - UTextChunk *chunk = &ut->chunk; +utext_next32From(UText *ut, int64_t index) { UChar32 c = U_SENTINEL; - if(index<chunk->nativeStart || index>=chunk->nativeLimit) { - if(!ut->access(ut, index, TRUE, chunk)) { + if(index<ut->chunkNativeStart || index>=ut->chunkNativeLimit) { + // Desired position is outside of the current chunk. + if(!ut->pFuncs->access(ut, index, TRUE)) { // no chunk available here - goto next32return; + return U_SENTINEL; } - } else if(chunk->nonUTF16Indexes) { - chunk->offset = ut->mapNativeIndexToUTF16(ut, index); + } else if (index - ut->chunkNativeStart <= (int64_t)ut->nativeIndexingLimit) { + // Desired position is in chunk, with direct 1:1 native to UTF16 indexing + ut->chunkOffset = (int32_t)(index - ut->chunkNativeStart); } else { - chunk->offset = index - chunk->nativeStart; + // Desired position is in chunk, with non-UTF16 indexing. + ut->chunkOffset = ut->pFuncs->mapNativeIndexToUTF16(ut, index); } - c = chunk->contents[chunk->offset++]; + c = ut->chunkContents[ut->chunkOffset++]; if (U16_IS_SURROGATE(c)) { - // Surrogate code unit. Speed doesn't matter, let plain next32() do the work. - chunk->offset--; // undo the ++, above. - c = utext_next32(ut); + // Surrogates. Many edge cases. Use other functions that already + // deal with the problems. + utext_setNativeIndex(ut, index); + c = utext_next32(ut); } -next32return: return c; } U_DRAFT UChar32 U_EXPORT2 -utext_previous32From(UText *ut, int32_t index) { - UTextChunk *chunk = &ut->chunk; - UChar32 c = U_SENTINEL; - - if(index<=chunk->nativeStart || index>chunk->nativeLimit) { +utext_previous32From(UText *ut, int64_t index) { + // + // Return the character preceding the specified index. + // Leave the iteration position at the start of the character that was returned. + // + UChar32 cPrev; // The character preceding cCurr, which is what we will return. + + // Address the chunk containg the position preceding the incoming index + // A tricky edge case: + // We try to test the requested native index against the chunkNativeStart to determine + // whether the character preceding the one at the index is in the current chunk. + // BUT, this test can fail with UTF-8 (or any other multibyte encoding), when the + // requested index is on something other than the first position of the first char. + // + if(index<=ut->chunkNativeStart || index>ut->chunkNativeLimit) { // Requested native index is outside of the current chunk. - if(!ut->access(ut, index, FALSE, chunk)) { + if(!ut->pFuncs->access(ut, index, FALSE)) { // no chunk available here - goto prev32return; + return U_SENTINEL; } - } else if(chunk->nonUTF16Indexes) { - chunk->offset=ut->mapNativeIndexToUTF16(ut, index); + } else if(index - ut->chunkNativeStart <= (int64_t)ut->nativeIndexingLimit) { + // Direct UTF-16 indexing. + ut->chunkOffset = (int32_t)(index - ut->chunkNativeStart); } else { - // This chunk uses UTF-16 indexing. Index into it. - chunk->offset = index - chunk->nativeStart; - // put offset onto a code point boundary if it isn't there already. - if (index>ut->chunk.nativeStart && index < ut->chunk.nativeLimit) { - c = chunk->contents[chunk->offset]; - if (U16_TRAIL(c)) { - utext_current32(ut); // force index to the start of the curent code point. - } + ut->chunkOffset=ut->pFuncs->mapNativeIndexToUTF16(ut, index); + if (ut->chunkOffset==0 && !ut->pFuncs->access(ut, index, FALSE)) { + // no chunk available here + return U_SENTINEL; } } - if (chunk->offset<=0) { - // already at the start of text. Return U_SENTINEL. - goto prev32return; - } - - // Do the operation assuming that there are no surrogates involved. Fast, common case. - chunk->offset--; - c = chunk->contents[chunk->offset]; + // + // Simple case with no surrogates. + // + ut->chunkOffset--; + cPrev = ut->chunkContents[ut->chunkOffset]; - // Check for the char being a surrogate, get the whole char if it is. - if (U16_IS_SURROGATE(c)) { - c = utext_current32(ut); + if (U16_IS_SURROGATE(cPrev)) { + // Possible supplementary. Many edge cases. + // Let other functions do the heavy lifting. + utext_setNativeIndex(ut, index); + cPrev = utext_previous32(ut); } - -prev32return: - return c; + return cPrev; } U_DRAFT int32_t U_EXPORT2 utext_extract(UText *ut, - int32_t start, int32_t limit, + int64_t start, int64_t limit, UChar *dest, int32_t destCapacity, UErrorCode *status) { - return ut->extract(ut, start, limit, dest, destCapacity, status); + return ut->pFuncs->extract(ut, start, limit, dest, destCapacity, status); } +U_DRAFT UBool U_EXPORT2 +utext_equals(const UText *a, const UText *b) { + if (a==NULL || b==NULL || + a->magic != UTEXT_MAGIC || + b->magic != UTEXT_MAGIC) { + // Null or invalid arguments don't compare equal to anything. + return FALSE; + } + + if (a->pFuncs != b->pFuncs) { + // Different types of text providers. + return FALSE; + } + + if (a->context != b->context) { + // Different sources (different strings) + return FALSE; + } + if (utext_getNativeIndex(a) != utext_getNativeIndex(b)) { + // Different current position in the string. + return FALSE; + } + + return TRUE; +} U_DRAFT UBool U_EXPORT2 utext_isWritable(const UText *ut) @@ -298,6 +457,13 @@ utext_isWritable(const UText *ut) } +U_DRAFT void U_EXPORT2 +utext_freeze(UText *ut) { + // Zero out the WRITABLE flag. + ut->providerProperties &= ~(I32_FLAG(UTEXT_PROVIDER_WRITABLE)); +} + + U_DRAFT UBool U_EXPORT2 utext_hasMetaData(const UText *ut) { @@ -309,9 +475,9 @@ utext_hasMetaData(const UText *ut) U_DRAFT int32_t U_EXPORT2 utext_replace(UText *ut, - int32_t nativeStart, int32_t nativeLimit, + int64_t nativeStart, int64_t nativeLimit, const UChar *replacementText, int32_t replacementLength, - UErrorCode *status) + UErrorCode *status) { if (U_FAILURE(*status)) { return 0; @@ -320,14 +486,14 @@ utext_replace(UText *ut, *status = U_NO_WRITE_PERMISSION; return 0; } - int32_t i = ut->replace(ut, nativeStart, nativeLimit, replacementText, replacementLength, status); + int32_t i = ut->pFuncs->replace(ut, nativeStart, nativeLimit, replacementText, replacementLength, status); return i; } U_DRAFT void U_EXPORT2 utext_copy(UText *ut, - int32_t nativeStart, int32_t nativeLimit, - int32_t destIndex, + int64_t nativeStart, int64_t nativeLimit, + int64_t destIndex, UBool move, UErrorCode *status) { @@ -338,14 +504,19 @@ utext_copy(UText *ut, *status = U_NO_WRITE_PERMISSION; return; } - ut->copy(ut, nativeStart, nativeLimit, destIndex, move, status); + ut->pFuncs->copy(ut, nativeStart, nativeLimit, destIndex, move, status); } U_DRAFT UText * U_EXPORT2 -utext_clone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { - return src->clone(dest, src, deep, status); +utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status) { + UText *result; + result = src->pFuncs->clone(dest, src, deep, status); + if (readOnly) { + utext_freeze(result); + } + return result; } @@ -419,8 +590,8 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) { } // If the ut is already open and there's a provider supplied close // function, call it. - if ((ut->flags & UTEXT_OPEN) && ut->close != NULL) { - ut->close(ut); + if ((ut->flags & UTEXT_OPEN) && ut->pFuncs->close != NULL) { + ut->pFuncs->close(ut); } ut->flags &= ~UTEXT_OPEN; @@ -445,6 +616,27 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) { } if (U_SUCCESS(*status)) { ut->flags |= UTEXT_OPEN; + + // Initialize all remaining fields of the UText. + // + ut->context = NULL; + ut->chunkContents = NULL; + ut->p = NULL; + ut->q = NULL; + ut->r = NULL; + ut->a = 0; + ut->b = 0; + ut->c = 0; + ut->chunkOffset = 0; + ut->chunkLength = 0; + ut->chunkNativeStart = 0; + ut->chunkNativeLimit = 0; + ut->nativeIndexingLimit = 0; + ut->providerProperties = 0; + ut->privA = 0; + ut->privB = 0; + ut->privC = 0; + ut->privP = NULL; } return ut; } @@ -463,8 +655,8 @@ utext_close(UText *ut) { // If the provider gave us a close function, call it now. // This will clean up anything allocated specifically by the provider. - if (ut->close != NULL) { - ut->close(ut); + if (ut->pFuncs->close != NULL) { + ut->pFuncs->close(ut); } ut->flags &= ~UTEXT_OPEN; @@ -473,7 +665,15 @@ utext_close(UText *ut) { if (ut->flags & UTEXT_EXTRA_HEAP_ALLOCATED) { uprv_free(ut->pExtra); ut->pExtra = NULL; + ut->flags &= ~UTEXT_EXTRA_HEAP_ALLOCATED; + ut->extraSize = 0; } + + // Zero out function table of the closed UText. This is a defensive move, + // inteded to cause applications that inadvertantly use a closed + // utext to crash with null pointer errors. + ut->pFuncs = NULL; + if (ut->flags & UTEXT_HEAP_ALLOCATED) { // This UText was allocated by UText setup. We need to free it. // Clear magic, so we can detect if the user messes up and immediately @@ -487,51 +687,68 @@ utext_close(UText *ut) { -// -// resetChunk When an access fails for attempting to get text that is out-of-range -// this function puts the chunk into a benign state with the index at the -// at the requested position. -// -// If there is a pre-existing chunk that is adjacent to the index -// preserve the chunk, otherwise set up a dummy zero length chunk. -// -static void -resetChunk(UTextChunk *chunk, int32_t index) { - if (index==chunk->nativeLimit) { - chunk->offset = chunk->length; - } else if (index==chunk->nativeStart) { - chunk->offset = 0; - } else { - chunk->length = 0; - chunk->nativeStart = index; - chunk->nativeLimit = index; - chunk->offset = 0; - } -} - // // invalidateChunk Reset a chunk to have no contents, so that the next call -// to access will new data to load. +// to access will cause new data to load. // This is needed when copy/move/replace operate directly on the // backing text, potentially putting it out of sync with the // contents in the chunk. // static void -invalidateChunk(UTextChunk *chunk) { - chunk->length = 0; - chunk->nativeLimit = 0; - chunk->nativeStart = 0; - chunk->offset = 0; +invalidateChunk(UText *ut) { + ut->chunkLength = 0; + ut->chunkNativeLimit = 0; + ut->chunkNativeStart = 0; + ut->chunkOffset = 0; + ut->nativeIndexingLimit = 0; +} + +// +// pinIndex Do range pinning on a native index parameter. +// 64 bit pinning is done in place. +// 32 bit truncated result is returned as a convenience for +// use in providers that don't need 64 bits. +static int32_t +pinIndex(int64_t &index, int64_t limit) { + if (index<0) { + index = 0; + } else if (index > limit) { + index = limit; + } + return (int32_t)index; } - U_CDECL_BEGIN // +// Pointer relocation function, +// a utility used by shallow clone. +// Adjust a pointer that refers to something within one UText (the source) +// to refer to the same relative offset within a another UText (the target) +// +static void adjustPointer(UText *dest, const void **destPtr, const UText *src) { + // convert all pointers to (char *) so that byte address arithmetic will work. + char *dptr = (char *)*destPtr; + char *dUText = (char *)dest; + char *sUText = (char *)src; + + if (dptr >= (char *)src->pExtra && dptr < ((char*)src->pExtra)+src->extraSize) { + // target ptr was to something within the src UText's pExtra storage. + // relocate it into the target UText's pExtra region. + *destPtr = ((char *)dest->pExtra) + (dptr - (char *)src->pExtra); + } else if (dptr>=sUText && dptr < sUText+src->sizeOfStruct) { + // target ptr was pointing to somewhere within the source UText itself. + // Move it to the same offset within the target UText. + *destPtr = dUText + (dptr-sUText); + } +} + + +// // Clone. This is a generic copy-the-utext-by-value clone function that can be -// used as-is with some utext types, and as helper by other clones. +// used as-is with some utext types, and as a helper by other clones. // static UText * U_CALLCONV shallowTextClone(UText * dest, const UText * src, UErrorCode * status) { @@ -573,6 +790,15 @@ shallowTextClone(UText * dest, const UText * src, UErrorCode * status) { uprv_memcpy(dest->pExtra, src->pExtra, srcExtraSize); } + // + // Relocate any pointers in the target that refer to the UText itself + // to point to the cloned copy rather than the original source. + // + adjustPointer(dest, &dest->context, src); + adjustPointer(dest, &dest->p, src); + adjustPointer(dest, &dest->q, src); + adjustPointer(dest, &dest->r, src); + return dest; } @@ -583,190 +809,587 @@ U_CDECL_END //------------------------------------------------------------------------------ // -// UText implementation for UTF-8 strings (read-only) +// UText implementation for UTF-8 char * strings (read-only) +// Limitation: string length must be <= 0x7fffffff in length. +// (length must for in an int32_t variable) // // Use of UText data members: // context pointer to UTF-8 string -// utext.b is the input string length (bytes). -// utext.p pointer to allocated utf-8 string if owned by this utext (after a clone) -// utext.q pointer to the filled part of the Map array. -// -// TODO: make creation of the index mapping array lazy. -// Create it for a chunk the first time the user asks for an index. +// utext.b is the input string length (bytes). +// utext.c Length scanned so far in string +// (for optimizing finding length of zero terminated strings.) +// utext.p pointer to the current buffer +// utext.q pointer to the other buffer. // //------------------------------------------------------------------------------ -enum { UTF8_TEXT_CHUNK_SIZE=10 }; - -struct UTF8Extra { - /* - * Chunk UChars. - * +1 to simplify filling with surrogate pair at the end. - */ - UChar s[UTF8_TEXT_CHUNK_SIZE+1]; - /* - * Index map, from UTF-16 indexes into s back to native indexes. - * +2: length of s[] + one more for chunk limit index. - * - * When accessing preceding text, chunk.contents may point into the middle - * of s[]. - */ - int32_t map[UTF8_TEXT_CHUNK_SIZE+2]; -}; +// Chunk size. +// Must be less than 85, because of byte mapping from UChar indexes to native indexes. +// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes +// to two UChars.) +// +enum { UTF8_TEXT_CHUNK_SIZE=32 }; +// +// UTF8Buf Two of these structs will be set up in the UText's extra allocated space. +// Each contains the UChar chunk buffer, the to and from native maps, and +// header info. +// // because backwards iteration fills the buffers starting at the end and // working towards the front, the filled part of the buffers may not begin // at the start of the available storage for the buffers. +// +// Buffer size is one bigger than the specified UTF8_TEXT_CHUNK_SIZE to allow for +// the last character added being a supplementary, and thus requiring a surrogate +// pair. Doing this is simpler than checking for the edge case. +// -U_CDECL_BEGIN +struct UTF8Buf { + int32_t bufNativeStart; // Native index of first char in UChar buf + int32_t bufNativeLimit; // Native index following last char in buf. + int32_t bufStartIdx; // First filled position in buf. + int32_t bufLimitIdx; // Limit of filled range in buf. + int32_t bufNILimit; // Limit of native indexing part of buf + int32_t toUCharsMapStart; // Native index corresponding to + // mapToUChars[0]. + // Set to bufNativeStart when filling forwards. + // Set to computed value when filling backwards. + + UChar buf[UTF8_TEXT_CHUNK_SIZE+4]; // The UChar buffer. Requires one extra position beyond the + // the chunk size, to allow for surrogate at the end. + // Length must be identical to mapToNative array, below, + // because of the way indexing works when the array is + // filled backwards during a reverse iteration. Thus, + // the additional extra size. + uint8_t mapToNative[UTF8_TEXT_CHUNK_SIZE+4]; // map UChar index in buf to + // native offset from bufNativeStart. + // Requires two extra slots, + // one for a supplementary starting in the last normal position, + // and one for an entry for the buffer limit position. + uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to + // correspoding offset in filled part of buf. + int32_t align; +}; +U_CDECL_BEGIN -static int32_t U_CALLCONV +// +// utf8TextLength +// +// Get the length of the string. If we don't already know it, +// we'll need to scan for the trailing nul. +// +static int64_t U_CALLCONV utf8TextLength(UText *ut) { + if (ut->b < 0) { + // Zero terminated string, and we haven't scanned to the end yet. + // Scan it now. + const char *r = (const char *)ut->context + ut->c; + while (*r != 0) { + r++; + } + if ((r - (const char *)ut->context) < 0x7fffffff) { + ut->b = (int32_t)(r - (const char *)ut->context); + } else { + // Actual string was bigger (more than 2 gig) than we + // can handle. Clip it to 2 GB. + ut->b = 0x7fffffff; + } + ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); + } return ut->b; } - - -static UBool U_CALLCONV -utf8TextAccess(UText *ut, int32_t index, UBool forward, UTextChunk *chunk) { - const uint8_t *s8=(const uint8_t *)ut->context; - UChar32 c; - int32_t i; - int32_t length = ut->b; // Length of original utf-8 - UTF8Extra *ut8e = (UTF8Extra *)ut->pExtra; - UChar *u16buf = ut8e->s; - int32_t *map = ut8e->map; + + +static UBool U_CALLCONV +utf8TextAccess(UText *ut, int64_t index, UBool forward) { + // + // Apologies to those who are allergic to goto statements. + // Consider each goto to a labelled block to be the equivalent of + // call the named block as if it were a function(); + // return; + // + const uint8_t *s8=(const uint8_t *)ut->context; + UTF8Buf *u8b = NULL; + int32_t length = ut->b; // Length of original utf-8 + int32_t ix= (int32_t)index; // Requested index, trimmed to 32 bits. + int32_t mapIndex = 0; if (index<0) { - index = 0; - } else if (index>length) { - index = length; + ix=0; + } else if (index > 0x7fffffff) { + // Strings with 64 bit lengths not supported by this UTF-8 provider. + ix = 0x7fffffff; + } + + // Pin requested index to the string length. + if (ix>length) { + if (length>=0) { + ix=length; + } else if (ix>ut->c) { + // Zero terminated string, and requested index is beyond + // the region that has already been scanned. + // Scan up to either the end of the string or to the + // requested position, whichever comes first. + while (ut->c<ix && s8[ut->c]!=0) { + ut->c++; + } + // TODO: support for null terminated string length > 32 bits. + if (s8[ut->c] == 0) { + // We just found the actual length of the string. + // Trim the requested index back to that. + ix = ut->c; + ut->b = ut->c; + length = ut->c; + ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); + } + } } - if(forward) { - if(index >= length) { - resetChunk(chunk, length); - return FALSE; + // + // Dispatch to the appropriate action for a forward iteration request. + // + if (forward) { + if (ix==ut->chunkNativeLimit) { + // Check for normal sequential iteration cases first. + if (ix==length) { + // Just reached end of string + // Don't swap buffers, but do set the + // current buffer position. + ut->chunkOffset = ut->chunkLength; + return FALSE; + } else { + // End of current buffer. + // check whether other buffer already has what we need. + UTF8Buf *altB = (UTF8Buf *)ut->q; + if (ix>=altB->bufNativeStart && ix<altB->bufNativeLimit) { + goto swapBuffers; + } + } } - c=s8[index]; - if(c<=0x7f) { - // get a run of ASCII characters. - // Even if we don't fill the buffer, we will stop with the first - // non-ascii char, so that the buffer can use utf-16 indexing. - chunk->nativeStart=index; - u16buf[0]=(UChar)c; - for(i=1, ++index; - i<UTF8_TEXT_CHUNK_SIZE && index<length && (c=s8[index])<=0x7f; - ++i, ++index - ) { - u16buf[i]=(UChar)c; + // A random access. Desired index could be in either or niether buf. + // For optimizing the order of testing, first check for the index + // being in the other buffer. This will be the case for uses that + // move back and forth over a fairly limited range + { + u8b = (UTF8Buf *)ut->q; // the alternate buffer + if (ix>=u8b->bufNativeStart && ix<u8b->bufNativeLimit) { + // Requested index is in the other buffer. + goto swapBuffers; } - chunk->nonUTF16Indexes=FALSE; - } else { - // get a chunk of characters starting with a non-ASCII one - U8_SET_CP_START(s8, 0, index); // put utf-8 index at first byte of char, if not there already. - chunk->nativeStart=index; - for(i=0; i<UTF8_TEXT_CHUNK_SIZE && index<length; ) { - // i is utf-16 index into chunk buffer. - // index is utf-8 index into original string - map[i]=index; - map[i+1]=index; // in case there is a trail surrogate - U8_NEXT(s8, index, length, c); - if(c<0) { - c=0xfffd; // use SUB for illegal sequences + if (ix == length) { + // Requested index is end-of-string. + // (this is the case of randomly seeking to the end. + // The case of iterating off the end is handled earlier.) + if (ix == ut->chunkNativeLimit) { + // Current buffer extends up to the end of the string. + // Leave it as the current buffer. + ut->chunkOffset = ut->chunkLength; + return FALSE; } - U16_APPEND_UNSAFE(u16buf, i, c); // post-increments i. + if (ix == u8b->bufNativeLimit) { + // Alternate buffer extends to the end of string. + // Swap it in as the current buffer. + goto swapBuffersAndFail; + } + + // Neither existing buffer extends to the end of the string. + goto makeStubBuffer; } - map[i]=index; - chunk->nonUTF16Indexes=TRUE; + + if (ix<ut->chunkNativeStart || ix>=ut->chunkNativeLimit) { + // Requested index is in neither buffer. + goto fillForward; + } + + // Requested index is in this buffer. + u8b = (UTF8Buf *)ut->p; // the current buffer + mapIndex = ix - u8b->toUCharsMapStart; + ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; + return TRUE; + } - chunk->contents = u16buf; - chunk->length = i; - chunk->nativeLimit = index; - ut->q = map; - chunk->offset = 0; // chunkOffset corresponding to index - return TRUE; - } else { - // Reverse Access. The chunk buffer must be filled so as to contain the - // character preceding the specified index. - if(index<=0) { - resetChunk(chunk, 0); + } + + + // + // Dispatch to the appropriate action for a + // Backwards Diretion iteration request. + // + if (ix==ut->chunkNativeStart) { + // Check for normal sequential iteration cases first. + if (ix==0) { + // Just reached the start of string + // Don't swap buffers, but do set the + // current buffer position. + ut->chunkOffset = 0; return FALSE; + } else { + // Start of current buffer. + // check whether other buffer already has what we need. + UTF8Buf *altB = (UTF8Buf *)ut->q; + if (ix>altB->bufNativeStart && ix<=altB->bufNativeLimit) { + goto swapBuffers; + } } + } - c=s8[index-1]; - if(c<=0x7f) { - // get a chunk of ASCII characters. Don't build the index map - chunk->nativeLimit=index; - i=UTF8_TEXT_CHUNK_SIZE; - do { - u16buf[--i]=(UChar)c; - --index; - } while(i>0 && index>0 && (c=s8[index-1])<=0x7f); - chunk->nonUTF16Indexes=FALSE; + // A random access. Desired index could be in either or niether buf. + // For optimizing the order of testing, + // Most likely case: in the other buffer. + // Second most likely: in neither buffer. + // Unlikely, but must work: in the current buffer. + u8b = (UTF8Buf *)ut->q; // the alternate buffer + if (ix>u8b->bufNativeStart && ix<=u8b->bufNativeLimit) { + // Requested index is in the other buffer. + goto swapBuffers; + } + // Requested index is start-of-string. + // (this is the case of randomly seeking to the start. + // The case of iterating off the start is handled earlier.) + if (ix==0) { + if (u8b->bufNativeStart==0) { + // Alternate buffer contains the data for the start string. + // Make it be the current buffer. + goto swapBuffersAndFail; } else { - // get a chunk of characters starting with a non-ASCII one - if(index<length) { - U8_SET_CP_START(s8, 0, index); + // Request for data before the start of string, + // neither buffer is usable. + // set up a zero-length buffer. + goto makeStubBuffer; + } + } + + if (ix<=ut->chunkNativeStart || ix>ut->chunkNativeLimit) { + // Requested index is in neither buffer. + goto fillReverse; + } + + // Requested index is in this buffer. + // Set the utf16 buffer index. + u8b = (UTF8Buf *)ut->p; + mapIndex = ix - u8b->toUCharsMapStart; + ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; + if (ut->chunkOffset==0) { + // This occurs when the first character in the text is + // a multi-byte UTF-8 char, and the requested index is to + // one of the trailing bytes. Because there is no preceding , + // character, this access fails. We can't pick up on the + // situation sooner because the requested index is not zero. + return FALSE; + } else { + return TRUE; + } + + + +swapBuffers: + // The alternate buffer (ut->q) has the string data that was requested. + // Swap the primary and alternate buffers, and set the + // chunk index into the new primary buffer. + { + u8b = (UTF8Buf *)ut->q; + ut->q = ut->p; + ut->p = u8b; + ut->chunkContents = &u8b->buf[u8b->bufStartIdx]; + ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx; + ut->chunkNativeStart = u8b->bufNativeStart; + ut->chunkNativeLimit = u8b->bufNativeLimit; + ut->nativeIndexingLimit = u8b->bufNILimit; + + // Index into the (now current) chunk + // Use the map to set the chunk index. It's more trouble than it's worth + // to check whether native indexing can be used. + U_ASSERT(ix>=u8b->bufNativeStart); + U_ASSERT(ix<=u8b->bufNativeLimit); + mapIndex = ix - u8b->toUCharsMapStart; + U_ASSERT(mapIndex>=0); + U_ASSERT(mapIndex<(int32_t)sizeof(u8b->mapToUChars)); + ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; + + return TRUE; + } + + + swapBuffersAndFail: + // We got a request for either the start or end of the string, + // with iteration continuing in the out-of-bounds direction. + // The alternate buffer already contains the data up to the + // start/end. + // Swap the buffers, then return failure, indicating that we couldn't + // make things correct for continuing the iteration in the requested + // direction. The position & buffer are correct should the + // user decide to iterate in the opposite direction. + u8b = (UTF8Buf *)ut->q; + ut->q = ut->p; + ut->p = u8b; + ut->chunkContents = &u8b->buf[u8b->bufStartIdx]; + ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx; + ut->chunkNativeStart = u8b->bufNativeStart; + ut->chunkNativeLimit = u8b->bufNativeLimit; + ut->nativeIndexingLimit = u8b->bufNILimit; + + // Index into the (now current) chunk + // For this function (swapBuffersAndFail), the requested index + // will always be at either the start or end of the chunk. + if (ix==u8b->bufNativeLimit) { + ut->chunkOffset = ut->chunkLength; + } else { + ut->chunkOffset = 0; + U_ASSERT(ix == u8b->bufNativeStart); + } + return FALSE; + +makeStubBuffer: + // The user has done a seek/access past the start or end + // of the string. Rather than loading data that is likely + // to never be used, just set up a zero-length buffer at + // the position. + u8b = (UTF8Buf *)ut->q; + u8b->bufNativeStart = ix; + u8b->bufNativeLimit = ix; + u8b->bufStartIdx = 0; + u8b->bufLimitIdx = 0; + u8b->bufNILimit = 0; + u8b->toUCharsMapStart = ix; + u8b->mapToNative[0] = 0; + u8b->mapToUChars[0] = 0; + goto swapBuffersAndFail; + + + +fillForward: + { + // Move the incoming index to a code point boundary. + U8_SET_CP_START(s8, 0, ix); + + // Swap the UText buffers. + // We want to fill what was previously the alternate buffer, + // and make what was the current buffer be the new alternate. + UTF8Buf *u8b = (UTF8Buf *)ut->q; + ut->q = ut->p; + ut->p = u8b; + + int32_t strLen = ut->b; + UBool nulTerminated = FALSE; + if (strLen < 0) { + strLen = 0x7fffffff; + nulTerminated = TRUE; + } + + UChar *buf = u8b->buf; + uint8_t *mapToNative = u8b->mapToNative; + uint8_t *mapToUChars = u8b->mapToUChars; + int32_t destIx = 0; + int32_t srcIx = ix; + UBool seenNonAscii = FALSE; + UChar32 c; + + // Fill the chunk buffer and mapping arrays. + while (destIx<UTF8_TEXT_CHUNK_SIZE) { + c = s8[srcIx]; + if (c>0 && c<0x80) { + // Special case ASCII range for speed. + // zero is excluded to simplify bounds checking. + buf[destIx] = c; + mapToNative[destIx] = srcIx - ix; + mapToUChars[srcIx-ix] = destIx; + srcIx++; + destIx++; + } else { + // General case, handle everything. + if (seenNonAscii == FALSE) { + seenNonAscii = TRUE; + u8b->bufNILimit = destIx; + } + + int32_t cIx = srcIx; + int32_t dIx = destIx; + int32_t dIxSaved = destIx; + U8_NEXT(s8, srcIx, strLen, c); + if (c==0 && nulTerminated) { + srcIx--; + break; + } + if (c<0) { + // Illegal UTF-8. Replace with sub character. + c = 0x0fffd; + } + + U16_APPEND_UNSAFE(buf, destIx, c); + do { + mapToNative[dIx++] = cIx - ix; + } while (dIx < destIx); + + do { + mapToUChars[cIx++ - ix] = dIxSaved; + } while (cIx < srcIx); + } + if (srcIx>=strLen) { + break; + } + + } + + // store Native <--> Chunk Map entries for the end of the buffer. + // There is no actual character here, but the index position is valid. + mapToNative[destIx] = srcIx - ix; + mapToUChars[srcIx - ix] = destIx; + + // fill in Buffer descriptor + u8b->bufNativeStart = ix; + u8b->bufNativeLimit = srcIx; + u8b->bufStartIdx = 0; + u8b->bufLimitIdx = destIx; + if (seenNonAscii == FALSE) { + u8b->bufNILimit = destIx; + } + u8b->toUCharsMapStart = u8b->bufNativeStart; + + // Set UText chunk to refer to this buffer. + ut->chunkContents = buf; + ut->chunkOffset = 0; + ut->chunkLength = u8b->bufLimitIdx; + ut->chunkNativeStart = u8b->bufNativeStart; + ut->chunkNativeLimit = u8b->bufNativeLimit; + ut->nativeIndexingLimit = u8b->bufNILimit; + + // For zero terminated strings, keep track of the maximum point + // scanned so far. + if (nulTerminated && srcIx>ut->c) { + ut->c = srcIx; + if (c==0) { + // We scanned to the end. + // Remember the actual length. + ut->b = srcIx; + ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); } - chunk->nativeLimit=index; - i=UTF8_TEXT_CHUNK_SIZE; - map[i]=index; // map position for char following the last one in the buffer. - do { - // i is utf-16 index into chunk buffer. - // index is utf-8 index into original string - U8_PREV(s8, 0, index, c); - if(c<0) { - c=0xfffd; // use SUB for illegal sequences + } + return TRUE; + } + + +fillReverse: + { + // Move the incoming index to a code point boundary. + // Can only do this if the incoming index is somewhere in the interior of the string. + // If index is at the end, there is no character there to look at. + if (ix != ut->b) { + U8_SET_CP_START(s8, 0, ix); + } + + // Swap the UText buffers. + // We want to fill what was previously the alternate buffer, + // and make what was the current buffer be the new alternate. + UTF8Buf *u8b = (UTF8Buf *)ut->q; + ut->q = ut->p; + ut->p = u8b; + + UChar *buf = u8b->buf; + uint8_t *mapToNative = u8b->mapToNative; + uint8_t *mapToUChars = u8b->mapToUChars; + int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1); + int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region + // at end of buffer to leave room + // for a surrogate pair at the + // buffer start. + int32_t srcIx = ix; + int32_t bufNILimit = destIx; + UChar32 c; + + // Map to/from Native Indexes, fill in for the position at the end of + // the buffer. + // + mapToNative[destIx] = srcIx - toUCharsMapStart; + mapToUChars[srcIx - toUCharsMapStart] = destIx; + + // Fill the chunk buffer + // Work backwards, filling from the end of the buffer towards the front. + // + while (destIx>2 && (srcIx - toUCharsMapStart > 5) && (srcIx > 0)) { + srcIx--; + destIx--; + + // Get last byte of the UTF-8 character + c = s8[srcIx]; + if (c<0x80) { + // Special case ASCII range for speed. + buf[destIx] = c; + mapToUChars[srcIx - toUCharsMapStart] = destIx; + mapToNative[destIx] = srcIx - toUCharsMapStart; + } else { + // General case, handle everything non-ASCII. + + int32_t sIx = srcIx; // ix of last byte of multi-byte u8 char + + // Get the full character from the UTF8 string. + // use code derived from tbe macros in utf.8 + // Leaves srcIx pointing at the first byte of the UTF-8 char. + // + if (c<=0xbf) { + c=utf8_prevCharSafeBody(s8, 0, &srcIx, c, -1); + // leaves srcIx at first byte of the multi-byte char. + } else { + c=0x0fffd; } - if(c<=0xffff) { - u16buf[--i]=(UChar)c; - map[i]=index; + + // Store the character in UTF-16 buffer. + if (c<0x10000) { + buf[destIx] = c; + mapToNative[destIx] = srcIx - toUCharsMapStart; } else { - // We've got a supplementary char - if (i<2) { - // Both halves of the surrogate pair wont fit in the chunk buffer. - // Stop without putting either half in. - U8_NEXT(s8, index, length, c); // restore index. - break; - } - u16buf[--i]=U16_TRAIL(c); - map[i]=index; - u16buf[--i]=U16_LEAD(c); - map[i]=index; + buf[destIx] = U16_TRAIL(c); + mapToNative[destIx] = srcIx - toUCharsMapStart; + buf[--destIx] = U16_LEAD(c); + mapToNative[destIx] = srcIx - toUCharsMapStart; } - } while(i>0 && index>0); - // Because we have filled the map & chunk buffers from back to front, - // the start position for accesses may not be at the start of the - // available storage. - ut->q = map+i; - chunk->nonUTF16Indexes=TRUE; + // Fill in the map from native indexes to UChars buf index. + do { + mapToUChars[sIx-- - toUCharsMapStart] = destIx; + } while (sIx >= srcIx); + + // Set native indexing limit to be the current position. + // We are processing a non-ascii, non-native-indexing char now; + // the limit will be here if the rest of the chars to be + // added to this buffer are ascii. + bufNILimit = destIx; + } } - // Common reverse iteration, for both UTF16 and non-UTIF16 indexes. - chunk->contents = u16buf+i; - chunk->length = (UTF8_TEXT_CHUNK_SIZE)-i; - chunk->nativeStart = index; - chunk->offset = chunk->length; // chunkOffset corresponding to index + u8b->bufNativeStart = srcIx; + u8b->bufNativeLimit = ix; + u8b->bufStartIdx = destIx; + u8b->bufLimitIdx = UTF8_TEXT_CHUNK_SIZE+2; + u8b->bufNILimit = bufNILimit - u8b->bufStartIdx; + u8b->toUCharsMapStart = toUCharsMapStart; + + ut->chunkContents = &buf[u8b->bufStartIdx]; + ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx; + ut->chunkOffset = ut->chunkLength; + ut->chunkNativeStart = u8b->bufNativeStart; + ut->chunkNativeLimit = u8b->bufNativeLimit; + ut->nativeIndexingLimit = u8b->bufNILimit; return TRUE; } + } + // // This is a slightly modified copy of u_strFromUTF8, // Inserts a Replacement Char rather than failing on invalid UTF-8 // Removes unnecessary features. // -static UChar* -utext_strFromUTF8(UChar *dest, +static UChar* +utext_strFromUTF8(UChar *dest, int32_t destCapacity, int32_t *pDestLength, - const char* src, + const char* src, int32_t srcLength, // required. NUL terminated not supported. UErrorCode *pErrorCode ) @@ -779,7 +1402,7 @@ utext_strFromUTF8(UChar *dest, int32_t reqLength = 0; uint8_t* pSrc = (uint8_t*) src; - + while((index < srcLength)&&(pDest<pDestLimit)){ ch = pSrc[index++]; if(ch <=0x7f){ @@ -832,7 +1455,7 @@ utext_strFromUTF8(UChar *dest, static int32_t U_CALLCONV utf8TextExtract(UText *ut, - int32_t start, int32_t limit, + int64_t start, int64_t limit, UChar *dest, int32_t destCapacity, UErrorCode *pErrorCode) { if(U_FAILURE(*pErrorCode)) { @@ -842,103 +1465,101 @@ utf8TextExtract(UText *ut, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - if(start<0 || start>limit) { + int32_t length = ut->b; + int32_t start32 = pinIndex(start, length); + int32_t limit32 = pinIndex(limit, length); + + if(start32>limit32) { *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } - if (limit>ut->b) { - limit = ut->b; - } - if (start>ut->b) { - start = ut->b; - } + // adjust the incoming indexes to land on code point boundaries if needed. // adjust by no more than three, because that is the largest number of trail bytes // in a well formed UTF8 character. const uint8_t *buf = (const uint8_t *)ut->context; int i; - if (start < ut->chunk.nativeLimit) { + if (start32 < ut->chunkNativeLimit) { for (i=0; i<3; i++) { - if (U8_IS_LEAD(buf[start]) || start==0) { + if (U8_IS_LEAD(buf[start32]) || start32==0) { break; } - start--; + start32--; } } - if (limit < ut->chunk.nativeLimit) { + if (limit32 < ut->chunkNativeLimit) { for (i=0; i<3; i++) { - if (U8_IS_LEAD(buf[limit]) || limit==0) { + if (U8_IS_LEAD(buf[limit32]) || limit32==0) { break; } - limit--; + limit32--; } } // Do the actual extract. int32_t destLength=0; utext_strFromUTF8(dest, destCapacity, &destLength, - (const char *)ut->context+start, limit-start, + (const char *)ut->context+start32, limit32-start32, pErrorCode); return destLength; } -// Assume nonUTF16Indexes and 0<=offset<=chunk->length -static int32_t U_CALLCONV -utf8TextMapOffsetToNative(UText *ut, int32_t offset) { - // UText.q points to the index mapping array that is allocated in the extra storage area. - U_ASSERT(offset>=0 && offset<=ut->chunk.length); - int32_t *map=(int32_t *)(ut->q); - return map[offset]; +// +// utf8TextMapOffsetToNative +// +// Map a chunk (UTF-16) offset to a native index. +static int64_t U_CALLCONV +utf8TextMapOffsetToNative(const UText *ut) { + // + UTF8Buf *u8b = (UTF8Buf *)ut->p; + U_ASSERT(ut->chunkOffset>ut->nativeIndexingLimit && ut->chunkOffset<=ut->chunkLength); + int32_t nativeOffset = u8b->mapToNative[ut->chunkOffset + u8b->bufStartIdx] + u8b->toUCharsMapStart; + U_ASSERT(nativeOffset >= ut->chunkNativeStart && nativeOffset <= ut->chunkNativeLimit); + return nativeOffset; } -// Assume nonUTF16Indexes and chunk->start<=index<=chunk->limit +// +// Map a native index to the corrsponding chunk offset +// static int32_t U_CALLCONV -utf8TextMapIndexToUTF16(UText *ut, int32_t index) { - int32_t *map=(int32_t *)(ut->q); - int32_t offset=0; - - U_ASSERT(index>=ut->chunk.nativeStart && index<=ut->chunk.nativeLimit); - while(index>map[offset]) { - ++offset; - } - if (index<map[offset]) { - // index was to a trail byte of a multi-byte utf-8 char. - // The loop above advanced offset to the start of the following char, now - // offset must be backed up to the start of the utf-16 char into which - // the utf-8 index pointed. - offset--; - if (offset>0 && map[offset] == map[offset-1]) { - // index was to a utf-8 trail byte of a supplemenary char. - // Offset now points to the trail surrogate (one in back of the following char) - // Back offset up one more time to get to the utf-16 lead surrogate. - offset--; - } - } +utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) { + U_ASSERT(index64 <= 0x7fffffff); + int32_t index = (int32_t)index64; + UTF8Buf *u8b = (UTF8Buf *)ut->p; + U_ASSERT(index>=ut->chunkNativeStart+ut->nativeIndexingLimit); + U_ASSERT(index<=ut->chunkNativeLimit); + int32_t mapIndex = index - u8b->toUCharsMapStart; + int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; + U_ASSERT(offset>=0 && offset<=ut->chunkLength); return offset; } static UText * U_CALLCONV -utf8TextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) +utf8TextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { // First do a generic shallow clone. Does everything needed for the UText struct itself. dest = shallowTextClone(dest, src, status); // For deep clones, make a copy of the string. // The copied storage is owned by the newly created clone. - // A non-NULL pointer in UText.p is the signal to the close() function to delete - // it. + // + // TODO: There is an isssue with using utext_nativeLength(). + // That function is non-const in cases where the input was NUL terminated + // and the length has not yet been determined. + // This function (clone()) is const. + // There potentially a thread safety issue lurking here. // if (deep && U_SUCCESS(*status)) { - int32_t len = src->b; + int32_t len = (int32_t)utext_nativeLength((UText *)src); char *copyStr = (char *)uprv_malloc(len+1); if (copyStr == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; } else { uprv_memcpy(copyStr, src->context, len+1); dest->context = copyStr; - dest->p = copyStr; + dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); } } return dest; @@ -950,50 +1571,65 @@ utf8TextClose(UText *ut) { // Most of the work of close is done by the generic UText framework close. // All that needs to be done here is to delete the UTF8 string if the UText // owns it. This occurs if the UText was created by cloning. - char *s = (char *)ut->p; - uprv_free(s); - ut->p = NULL; + if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) { + char *s = (char *)ut->context; + uprv_free(s); + ut->context = NULL; + } } +U_CDECL_END +static struct UTextFuncs utf8Funcs = +{ + sizeof(UTextFuncs), + 0, 0, 0, // Reserved alignment padding + utf8TextClone, + utf8TextLength, + utf8TextAccess, + utf8TextExtract, + NULL, /* replace*/ + NULL, /* copy */ + utf8TextMapOffsetToNative, + utf8TextMapIndexToUTF16, + utf8TextClose, + NULL, // spare 1 + NULL, // spare 2 + NULL // spare 3 +}; + U_DRAFT UText * U_EXPORT2 -utext_openUTF8(UText *ut, const char *s, int32_t length, UErrorCode *status) { +utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status) { if(U_FAILURE(*status)) { return NULL; } - if(s==NULL || length<-1) { + if(s==NULL || length<-1 || length>INT32_MAX) { *status=U_ILLEGAL_ARGUMENT_ERROR; return NULL; } - ut = utext_setup(ut, sizeof(UTF8Extra), status); + ut = utext_setup(ut, sizeof(UTF8Buf) * 2, status); if (U_FAILURE(*status)) { return ut; } - ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_NON_UTF16_INDEXES); - - ut->clone = utf8TextClone; - ut->nativeLength = utf8TextLength; - ut->access = utf8TextAccess; - ut->extract = utf8TextExtract; - ut->mapOffsetToNative = utf8TextMapOffsetToNative; - ut->mapNativeIndexToUTF16 = utf8TextMapIndexToUTF16; - ut->close = utf8TextClose; - ut->context=s; - if(length>=0) { - ut->b=length; - } else { - // TODO: really undesirable to do this scan upfront. - ut->b=(int32_t)uprv_strlen(s); + ut->pFuncs = &utf8Funcs; + ut->context = s; + ut->b = (int32_t)length; + ut->c = (int32_t)length; + if (ut->c < 0) { + ut->c = 0; + ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); } - + ut->p = ut->pExtra; + ut->q = (char *)ut->pExtra + sizeof(UTF8Buf); return ut; + } -U_CDECL_END + @@ -1002,7 +1638,7 @@ U_CDECL_END //------------------------------------------------------------------------------ // -// UText implementation wrapper for Replaceable (read/write) +// UText implementation wrapper for Replaceable (read/write) // // Use of UText data members: // context pointer to Replaceable. @@ -1040,7 +1676,10 @@ repTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { if (deep && U_SUCCESS(*status)) { const Replaceable *replSrc = (const Replaceable *)src->context; dest->context = replSrc->clone(); - dest->p = dest->context; + dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); + + // with deep clone, the copy is writable, even when the source is not. + dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_WRITABLE); } return dest; } @@ -1051,13 +1690,15 @@ repTextClose(UText *ut) { // Most of the work of close is done by the generic UText framework close. // All that needs to be done here is delete the Replaceable if the UText // owns it. This occurs if the UText was created by cloning. - Replaceable *rep = (Replaceable *)ut->p; - delete rep; - ut->p = NULL; + if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) { + Replaceable *rep = (Replaceable *)ut->context; + delete rep; + ut->context = NULL; + } } -static int32_t U_CALLCONV +static int64_t U_CALLCONV repTextLength(UText *ut) { const Replaceable *replSrc = (const Replaceable *)ut->context; int32_t len = replSrc->length(); @@ -1066,17 +1707,13 @@ repTextLength(UText *ut) { static UBool U_CALLCONV -repTextAccess(UText *ut, int32_t index, UBool forward, UTextChunk* /* chunk*/ ) { +repTextAccess(UText *ut, int64_t index, UBool forward) { const Replaceable *rep=(const Replaceable *)ut->context; int32_t length=rep->length(); // Full length of the input text (bigger than a chunk) // clip the requested index to the limits of the text. - if (index<0) { - index = 0; - } - if (index>length) { - index = length; - } + int32_t index32 = pinIndex(index, length); + U_ASSERT(index<=INT32_MAX); /* @@ -1089,103 +1726,106 @@ repTextAccess(UText *ut, int32_t index, UBool forward, UTextChunk* /* chunk*/ ) */ if(forward) { - if (index>=ut->chunk.nativeStart && index<ut->chunk.nativeLimit) { + if (index32>=ut->chunkNativeStart && index32<ut->chunkNativeLimit) { // Buffer already contains the requested position. - ut->chunk.offset = index - ut->chunk.nativeStart; + ut->chunkOffset = (int32_t)(index - ut->chunkNativeStart); return TRUE; } - if (index>=length && ut->chunk.nativeLimit==length) { + if (index32>=length && ut->chunkNativeLimit==length) { // Request for end of string, and buffer already extends up to it. // Can't get the data, but don't change the buffer. - ut->chunk.offset = length - ut->chunk.nativeStart; + ut->chunkOffset = length - (int32_t)ut->chunkNativeStart; return FALSE; } - ut->chunk.nativeLimit = index + REP_TEXT_CHUNK_SIZE - 1; + ut->chunkNativeLimit = index + REP_TEXT_CHUNK_SIZE - 1; // Going forward, so we want to have the buffer with stuff at and beyond // the requested index. The -1 gets us one code point before the // requested index also, to handle the case of the index being on // a trail surrogate of a surrogate pair. - if(ut->chunk.nativeLimit > length) { - ut->chunk.nativeLimit = length; + if(ut->chunkNativeLimit > length) { + ut->chunkNativeLimit = length; } // unless buffer ran off end, start is index-1. - ut->chunk.nativeStart = ut->chunk.nativeLimit - REP_TEXT_CHUNK_SIZE; - if(ut->chunk.nativeStart < 0) { - ut->chunk.nativeStart = 0; + ut->chunkNativeStart = ut->chunkNativeLimit - REP_TEXT_CHUNK_SIZE; + if(ut->chunkNativeStart < 0) { + ut->chunkNativeStart = 0; } } else { // Reverse iteration. Fill buffer with data preceding the requested index. - if (index>ut->chunk.nativeStart && index<=ut->chunk.nativeLimit) { + if (index32>ut->chunkNativeStart && index32<=ut->chunkNativeLimit) { // Requested position already in buffer. - ut->chunk.offset = index - ut->chunk.nativeStart; + ut->chunkOffset = index32 - (int32_t)ut->chunkNativeStart; return TRUE; } - if (index==0 && ut->chunk.nativeStart==0) { + if (index32==0 && ut->chunkNativeStart==0) { // Request for start, buffer already begins at start. // No data, but keep the buffer as is. - ut->chunk.offset = 0; + ut->chunkOffset = 0; return FALSE; } // Figure out the bounds of the chunk to extract for reverse iteration. - // Need to worry about chunk not splitting surrogate pairs, and while still + // Need to worry about chunk not splitting surrogate pairs, and while still // containing the data we need. // Fix by requesting a chunk that includes an extra UChar at the end. // If this turns out to be a lead surrogate, we can lop it off and still have // the data we wanted. - ut->chunk.nativeStart = index + 1 - REP_TEXT_CHUNK_SIZE; - if (ut->chunk.nativeStart < 0) { - ut->chunk.nativeStart = 0; + ut->chunkNativeStart = index32 + 1 - REP_TEXT_CHUNK_SIZE; + if (ut->chunkNativeStart < 0) { + ut->chunkNativeStart = 0; } - ut->chunk.nativeLimit = index + 1; - if (ut->chunk.nativeLimit > length) { - ut->chunk.nativeLimit = length; + ut->chunkNativeLimit = index32 + 1; + if (ut->chunkNativeLimit > length) { + ut->chunkNativeLimit = length; } } // Extract the new chunk of text from the Replaceable source. ReplExtra *ex = (ReplExtra *)ut->pExtra; // UnicodeString with its buffer a writable alias to the chunk buffer - UnicodeString buffer(ex->s, 0 /*buffer length*/, REP_TEXT_CHUNK_SIZE /*buffer capacity*/); - rep->extractBetween(ut->chunk.nativeStart, ut->chunk.nativeLimit, buffer); + UnicodeString buffer(ex->s, 0 /*buffer length*/, REP_TEXT_CHUNK_SIZE /*buffer capacity*/); + rep->extractBetween((int32_t)ut->chunkNativeStart, (int32_t)ut->chunkNativeLimit, buffer); - ut->chunk.contents = ex->s; - ut->chunk.length = ut->chunk.nativeLimit - ut->chunk.nativeStart; - ut->chunk.offset = index - ut->chunk.nativeStart; + ut->chunkContents = ex->s; + ut->chunkLength = (int32_t)(ut->chunkNativeLimit - ut->chunkNativeStart); + ut->chunkOffset = (int32_t)(index32 - ut->chunkNativeStart); // Surrogate pairs from the input text must not span chunk boundaries. // If end of chunk could be the start of a surrogate, trim it off. - if (ut->chunk.nativeLimit < length && - U16_IS_LEAD(ex->s[ut->chunk.length-1])) { - ut->chunk.length--; - ut->chunk.nativeLimit--; - if (ut->chunk.offset > ut->chunk.length) { - ut->chunk.offset = ut->chunk.length; + if (ut->chunkNativeLimit < length && + U16_IS_LEAD(ex->s[ut->chunkLength-1])) { + ut->chunkLength--; + ut->chunkNativeLimit--; + if (ut->chunkOffset > ut->chunkLength) { + ut->chunkOffset = ut->chunkLength; } } // if the first UChar in the chunk could be the trailing half of a surrogate pair, // trim it off. - if(ut->chunk.nativeStart>0 && U16_IS_TRAIL(ex->s[0])) { - ++(ut->chunk.contents); - ++(ut->chunk.nativeStart); - --(ut->chunk.length); - --(ut->chunk.offset); + if(ut->chunkNativeStart>0 && U16_IS_TRAIL(ex->s[0])) { + ++(ut->chunkContents); + ++(ut->chunkNativeStart); + --(ut->chunkLength); + --(ut->chunkOffset); } // adjust the index/chunkOffset to a code point boundary - U16_SET_CP_START(ut->chunk.contents, 0, ut->chunk.offset); + U16_SET_CP_START(ut->chunkContents, 0, ut->chunkOffset); + + // Use fast indexing for get/setNativeIndex() + ut->nativeIndexingLimit = ut->chunkLength; - return TRUE; + return TRUE; } static int32_t U_CALLCONV repTextExtract(UText *ut, - int32_t start, int32_t limit, + int64_t start, int64_t limit, UChar *dest, int32_t destCapacity, UErrorCode *status) { const Replaceable *rep=(const Replaceable *)ut->context; @@ -1197,39 +1837,36 @@ repTextExtract(UText *ut, if(destCapacity<0 || (dest==NULL && destCapacity>0)) { *status=U_ILLEGAL_ARGUMENT_ERROR; } - if(start<0 || start>limit) { + if(start>limit) { *status=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } - if (start>length) { - start=length; - } - if (limit>length) { - limit=length; - } + + int32_t start32 = pinIndex(start, length); + int32_t limit32 = pinIndex(limit, length); // adjust start, limit if they point to trail half of surrogates - if (start<length && U16_IS_TRAIL(rep->charAt(start)) && - U_IS_SUPPLEMENTARY(rep->char32At(start))){ - start--; + if (start32<length && U16_IS_TRAIL(rep->charAt(start32)) && + U_IS_SUPPLEMENTARY(rep->char32At(start32))){ + start32--; } - if (limit<length && U16_IS_TRAIL(rep->charAt(limit)) && - U_IS_SUPPLEMENTARY(rep->char32At(limit))){ - limit--; + if (limit32<length && U16_IS_TRAIL(rep->charAt(limit32)) && + U_IS_SUPPLEMENTARY(rep->char32At(limit32))){ + limit32--; } - length=limit-start; + length=limit32-start32; if(length>destCapacity) { - limit = start + destCapacity; + limit32 = start32 + destCapacity; } UnicodeString buffer(dest, 0, destCapacity); // writable alias - rep->extractBetween(start, limit, buffer); + rep->extractBetween(start32, limit32, buffer); return u_terminateUChars(dest, destCapacity, length, status); } static int32_t U_CALLCONV repTextReplace(UText *ut, - int32_t start, int32_t limit, + int64_t start, int64_t limit, const UChar *src, int32_t length, UErrorCode *status) { Replaceable *rep=(Replaceable *)ut->context; @@ -1243,34 +1880,42 @@ repTextReplace(UText *ut, return 0; } oldLength=rep->length(); // will subtract from new length - if(start<0 || start>limit ) { + if(start>limit ) { *status=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } - if (start > oldLength) { - start = oldLength; + int32_t start32 = pinIndex(start, oldLength); + int32_t limit32 = pinIndex(limit, oldLength); + + // Snap start & limit to code point boundaries. + if (start32<oldLength && U16_IS_TRAIL(rep->charAt(start32)) && + start32>0 && U16_IS_LEAD(rep->charAt(start32-1))) + { + start32--; } - if (limit > oldLength) { - limit = oldLength; + if (limit32<oldLength && U16_IS_LEAD(rep->charAt(limit32-1)) && + U16_IS_TRAIL(rep->charAt(limit32))) + { + limit32++; } // Do the actual replace operation using methods of the Replaceable class UnicodeString replStr((UBool)(length<0), src, length); // read-only alias - rep->handleReplaceBetween(start, limit, replStr); + rep->handleReplaceBetween(start32, limit32, replStr); int32_t newLength = rep->length(); int32_t lengthDelta = newLength - oldLength; // Is the UText chunk buffer OK? - if (ut->chunk.nativeLimit > start) { + if (ut->chunkNativeLimit > start32) { // this replace operation may have impacted the current chunk. // invalidate it, which will force a reload on the next access. - invalidateChunk(&ut->chunk); + invalidateChunk(ut); } // set the iteration position to the end of the newly inserted replacement text. - int32_t newIndexPos = limit + lengthDelta; - repTextAccess(ut, newIndexPos, TRUE, &ut->chunk); + int32_t newIndexPos = limit32 + lengthDelta; + repTextAccess(ut, newIndexPos, TRUE); return lengthDelta; } @@ -1278,10 +1923,10 @@ repTextReplace(UText *ut, static void U_CALLCONV repTextCopy(UText *ut, - int32_t start, int32_t limit, - int32_t destIndex, + int64_t start, int64_t limit, + int64_t destIndex, UBool move, - UErrorCode *status) + UErrorCode *status) { Replaceable *rep=(Replaceable *)ut->context; int32_t length=rep->length(); @@ -1289,64 +1934,75 @@ repTextCopy(UText *ut, if(U_FAILURE(*status)) { return; } - if( start<0 || start>limit || destIndex<0 || - (start<destIndex && destIndex<limit) ) + if (start>limit || (start<destIndex && destIndex<limit)) { *status=U_INDEX_OUTOFBOUNDS_ERROR; return; } - if (destIndex > length) { - destIndex = length; - } - if (limit > length) { - limit = length; - } - if (start > length) { - start = length; - } + + int32_t start32 = pinIndex(start, length); + int32_t limit32 = pinIndex(limit, length); + int32_t destIndex32 = pinIndex(destIndex, length); + + // TODO: snap input parameters to code point boundaries. + if(move) { // move: copy to destIndex, then replace original with nothing - int32_t segLength=limit-start; - rep->copy(start, limit, destIndex); - if(destIndex<start) { - start+=segLength; - limit+=segLength; + int32_t segLength=limit32-start32; + rep->copy(start32, limit32, destIndex32); + if(destIndex32<start32) { + start32+=segLength; + limit32+=segLength; } - rep->handleReplaceBetween(start, limit, UnicodeString()); + rep->handleReplaceBetween(start32, limit32, UnicodeString()); } else { // copy - rep->copy(start, limit, destIndex); + rep->copy(start32, limit32, destIndex32); } // If the change to the text touched the region in the chunk buffer, // invalidate the buffer. - int32_t firstAffectedIndex = destIndex; - if (move && start<firstAffectedIndex) { - firstAffectedIndex = start; + int32_t firstAffectedIndex = destIndex32; + if (move && start32<firstAffectedIndex) { + firstAffectedIndex = start32; } - if (firstAffectedIndex < ut->chunk.nativeLimit) { + if (firstAffectedIndex < ut->chunkNativeLimit) { // changes may have affected range covered by the chunk - invalidateChunk(&ut->chunk); + invalidateChunk(ut); } // Put iteration position at the newly inserted (moved) block, - int32_t nativeIterIndex = destIndex + limit - start; - if (move && destIndex>start) { + int32_t nativeIterIndex = destIndex32 + limit32 - start32; + if (move && destIndex32>start32) { // moved a block of text towards the end of the string. - nativeIterIndex = destIndex; + nativeIterIndex = destIndex32; } // Set position, reload chunk if needed. - repTextAccess(ut, nativeIterIndex, TRUE, &ut->chunk); + repTextAccess(ut, nativeIterIndex, TRUE); } - - - +static struct UTextFuncs repFuncs = +{ + sizeof(UTextFuncs), + 0, 0, 0, // Reserved alignment padding + repTextClone, + repTextLength, + repTextAccess, + repTextExtract, + repTextReplace, + repTextCopy, + NULL, // MapOffsetToNative, + NULL, // MapIndexToUTF16, + repTextClose, + NULL, // spare 1 + NULL, // spare 2 + NULL // spare 3 +}; U_DRAFT UText * U_EXPORT2 -utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status) +utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status) { if(U_FAILURE(*status)) { return NULL; @@ -1356,21 +2012,14 @@ utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status) return NULL; } ut = utext_setup(ut, sizeof(ReplExtra), status); - + ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_WRITABLE); if(rep->hasMetaData()) { ut->providerProperties |=I32_FLAG(UTEXT_PROVIDER_HAS_META_DATA); } - ut->clone = repTextClone; - ut->nativeLength = repTextLength; - ut->access = repTextAccess; - ut->extract = repTextExtract; - ut->replace = repTextReplace; - ut->copy = repTextCopy; - ut->close = repTextClose; - - ut->context=rep; + ut->pFuncs = &repFuncs; + ut->context = rep; return ut; } @@ -1412,62 +2061,48 @@ unistrTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { if (deep && U_SUCCESS(*status)) { const UnicodeString *srcString = (const UnicodeString *)src->context; dest->context = new UnicodeString(*srcString); - dest->p = dest->context; + dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); + + // with deep clone, the copy is writable, even when the source is not. + dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_WRITABLE); } return dest; } - + static void U_CALLCONV unistrTextClose(UText *ut) { // Most of the work of close is done by the generic UText framework close. // All that needs to be done here is delete the UnicodeString if the UText // owns it. This occurs if the UText was created by cloning. - UnicodeString *str = (UnicodeString *)ut->p; - delete str; - ut->p = NULL; + if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) { + UnicodeString *str = (UnicodeString *)ut->context; + delete str; + ut->context = NULL; + } } -static int32_t U_CALLCONV +static int64_t U_CALLCONV unistrTextLength(UText *t) { return ((const UnicodeString *)t->context)->length(); } static UBool U_CALLCONV -unistrTextAccess(UText *ut, int32_t index, UBool forward, UTextChunk *chunk) { - const UnicodeString *us = (const UnicodeString *)ut->context; - int32_t length = us->length(); - - if (chunk->nativeLimit != length) { - // This chunk is not yet set up. Do it now. - // TODO: probably simplify things to move this into the open operation. - chunk->contents = us->getBuffer(); - chunk->length = length; - chunk->nativeStart = 0; - chunk->nativeLimit = length; - chunk->nonUTF16Indexes = FALSE; - } - - // pin the requested index to the bounds of the string, - // and set current iteration position. - if (index<0) { - index = 0; - } else if (index>length) { - index = length; - } - chunk->offset = index; +unistrTextAccess(UText *ut, int64_t index, UBool forward) { + int32_t length = ut->chunkLength; + ut->chunkOffset = pinIndex(index, length); // Check whether request is at the start or end UBool retVal = (forward && index<length) || (!forward && index>0); - return retVal; + return retVal; } static int32_t U_CALLCONV unistrTextExtract(UText *t, - int32_t start, int32_t limit, + int64_t start, int64_t limit, UChar *dest, int32_t destCapacity, UErrorCode *pErrorCode) { const UnicodeString *us=(const UnicodeString *)t->context; @@ -1484,16 +2119,16 @@ unistrTextExtract(UText *t, return 0; } - start = start<length ? us->getChar32Start(start) : length; - limit = limit<length ? us->getChar32Start(limit) : length; + int32_t start32 = start<length ? us->getChar32Start((int32_t)start) : length; + int32_t limit32 = limit<length ? us->getChar32Start((int32_t)limit) : length; - length=limit-start; + length=limit32-start32; if (destCapacity>0 && dest!=NULL) { int32_t trimmedLength = length; if(trimmedLength>destCapacity) { trimmedLength=destCapacity; } - us->extract(start, trimmedLength, dest); + us->extract(start32, trimmedLength, dest); } u_terminateUChars(dest, destCapacity, length, pErrorCode); return length; @@ -1501,7 +2136,7 @@ unistrTextExtract(UText *t, static int32_t U_CALLCONV unistrTextReplace(UText *ut, - int32_t start, int32_t limit, + int64_t start, int64_t limit, const UChar *src, int32_t length, UErrorCode *pErrorCode) { UnicodeString *us=(UnicodeString *)ut->context; @@ -1513,35 +2148,41 @@ unistrTextReplace(UText *ut, if(src==NULL && length!=0) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; } - oldLength=us->length(); // will subtract from new length - if(start<0 || start>limit) { + if(start>limit) { *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } - - start = start<oldLength ? us->getChar32Start(start) : oldLength; - limit = limit<oldLength ? us->getChar32Start(limit) : oldLength; + oldLength=us->length(); + int32_t start32 = pinIndex(start, oldLength); + int32_t limit32 = pinIndex(limit, oldLength); + if (start32 < oldLength) { + start32 = us->getChar32Start(start32); + } + if (limit32 < oldLength) { + limit32 = us->getChar32Start(limit32); + } // replace - us->replace(start, limit-start, src, length); + us->replace(start32, limit32-start32, src, length); int32_t newLength = us->length(); // Update the chunk description. - ut->chunk.contents = us->getBuffer(); - ut->chunk.length = newLength; - ut->chunk.nativeLimit = newLength; + ut->chunkContents = us->getBuffer(); + ut->chunkLength = newLength; + ut->chunkNativeLimit = newLength; + ut->nativeIndexingLimit = newLength; // Set iteration position to the point just following the newly inserted text. int32_t lengthDelta = newLength - oldLength; - ut->chunk.offset = limit + lengthDelta; + ut->chunkOffset = limit32 + lengthDelta; return lengthDelta; } static void U_CALLCONV unistrTextCopy(UText *ut, - int32_t start, int32_t limit, - int32_t destIndex, + int64_t start, int64_t limit, + int64_t destIndex, UBool move, UErrorCode *pErrorCode) { UnicodeString *us=(UnicodeString *)ut->context; @@ -1550,65 +2191,84 @@ unistrTextCopy(UText *ut, if(U_FAILURE(*pErrorCode)) { return; } - if( start<0 || start>limit || destIndex<0 || - (start<destIndex && destIndex<limit) - ) { + int32_t start32 = pinIndex(start, length); + int32_t limit32 = pinIndex(limit, length); + int32_t destIndex32 = pinIndex(destIndex, length); + + if( start32>limit32 || (start32<destIndex32 && destIndex32<limit32)) { *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return; } - if (limit>length) { - limit = length; - } - if (destIndex>length) { - destIndex = length; - } + if(move) { // move: copy to destIndex, then replace original with nothing - int32_t segLength=limit-start; - us->copy(start, limit, destIndex); - if(destIndex<start) { - start+=segLength; + int32_t segLength=limit32-start32; + us->copy(start32, limit32, destIndex32); + if(destIndex32<start32) { + start32+=segLength; } - us->replace(start, segLength, NULL, 0); + us->replace(start32, segLength, NULL, 0); } else { // copy - us->copy(start, limit, destIndex); + us->copy(start32, limit32, destIndex32); } - + // update chunk description, set iteration position. - ut->chunk.contents = us->getBuffer(); + ut->chunkContents = us->getBuffer(); if (move==FALSE) { // copy operation, string length grows - ut->chunk.length += limit-start; - ut->chunk.nativeLimit = ut->chunk.length; + ut->chunkLength += limit32-start32; + ut->chunkNativeLimit = ut->chunkLength; + ut->nativeIndexingLimit = ut->chunkLength; } // Iteration position to end of the newly inserted text. - ut->chunk.offset = destIndex+limit-start; - if (move && destIndex>start) { //TODO: backwards? check. - ut->chunk.offset = destIndex; + ut->chunkOffset = destIndex32+limit32-start32; + if (move && destIndex32>start32) { + ut->chunkOffset = destIndex32; } } +static struct UTextFuncs unistrFuncs = +{ + sizeof(UTextFuncs), + 0, 0, 0, // Reserved alignment padding + unistrTextClone, + unistrTextLength, + unistrTextAccess, + unistrTextExtract, + unistrTextReplace, + unistrTextCopy, + NULL, // MapOffsetToNative, + NULL, // MapIndexToUTF16, + unistrTextClose, + NULL, // spare 1 + NULL, // spare 2 + NULL // spare 3 +}; + + + U_CDECL_END U_DRAFT UText * U_EXPORT2 utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) { + // TODO: use openConstUnicodeString, then add in the differences. + // ut = utext_setup(ut, 0, status); if (U_SUCCESS(*status)) { - ut->clone = unistrTextClone; - ut->nativeLength = unistrTextLength; - ut->access = unistrTextAccess; - ut->extract = unistrTextExtract; - ut->replace = unistrTextReplace; - ut->copy = unistrTextCopy; - ut->close = unistrTextClose; - - ut->context = s; - ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS)| - I32_FLAG(UTEXT_PROVIDER_WRITABLE); + ut->pFuncs = &unistrFuncs; + ut->context = s; + ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS)| + I32_FLAG(UTEXT_PROVIDER_WRITABLE); + + ut->chunkContents = s->getBuffer(); + ut->chunkLength = s->length(); + ut->chunkNativeStart = 0; + ut->chunkNativeLimit = ut->chunkLength; + ut->nativeIndexingLimit = ut->chunkLength; } return ut; } @@ -1618,27 +2278,32 @@ utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) { U_DRAFT UText * U_EXPORT2 utext_openConstUnicodeString(UText *ut, const UnicodeString *s, UErrorCode *status) { ut = utext_setup(ut, 0, status); + // note: use the standard (writable) function table for UnicodeString. + // The flag settings disable writing, so having the functions in + // the table is harmless. if (U_SUCCESS(*status)) { - ut->clone = unistrTextClone; - ut->nativeLength = unistrTextLength; - ut->access = unistrTextAccess; - ut->extract = unistrTextExtract; - ut->close = unistrTextClose; - - ut->context = s; - ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS); + ut->pFuncs = &unistrFuncs; + ut->context = s; + ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS); + ut->chunkContents = s->getBuffer(); + ut->chunkLength = s->length(); + ut->chunkNativeStart = 0; + ut->chunkNativeLimit = ut->chunkLength; + ut->nativeIndexingLimit = ut->chunkLength; } return ut; } //------------------------------------------------------------------------------ // -// UText implementation for const UChar * strings +// UText implementation for const UChar * strings // // Use of UText data members: // context pointer to UnicodeString // a length. -1 if not yet known. // +// TODO: support 64 bit lengths. +// //------------------------------------------------------------------------------ U_CDECL_BEGIN @@ -1646,7 +2311,7 @@ U_CDECL_BEGIN static UText * U_CALLCONV ucstrTextClone(UText *dest, const UText * src, UBool deep, UErrorCode * status) { - // First do a generic shallow clone. + // First do a generic shallow clone. dest = shallowTextClone(dest, src, status); // For deep clones, make a copy of the string. @@ -1655,21 +2320,22 @@ ucstrTextClone(UText *dest, const UText * src, UBool deep, UErrorCode * status) // it. // if (deep && U_SUCCESS(*status)) { - int32_t len = utext_nativeLength(dest); + U_ASSERT(utext_nativeLength(dest) < INT32_MAX); + int32_t len = (int32_t)utext_nativeLength(dest); - // The cloned string IS going to be NUL terminated, whether or not the orginal was. + // The cloned string IS going to be NUL terminated, whether or not the original was. const UChar *srcStr = (const UChar *)src->context; UChar *copyStr = (UChar *)uprv_malloc((len+1) * sizeof(UChar)); if (copyStr == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; } else { - int i; + int64_t i; for (i=0; i<len; i++) { copyStr[i] = srcStr[i]; } copyStr[len] = 0; dest->context = copyStr; - dest->p = copyStr; + dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); } } return dest; @@ -1679,30 +2345,33 @@ ucstrTextClone(UText *dest, const UText * src, UBool deep, UErrorCode * status) static void U_CALLCONV ucstrTextClose(UText *ut) { // Most of the work of close is done by the generic UText framework close. - // All that needs to be done here is delete the Replaceable if the UText + // All that needs to be done here is delete the string if the UText // owns it. This occurs if the UText was created by cloning. - UChar *s = (UChar *)ut->p; - uprv_free(s); - ut->p = NULL; + if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) { + UChar *s = (UChar *)ut->context; + uprv_free(s); + ut->context = NULL; + } } -static int32_t U_CALLCONV +static int64_t U_CALLCONV ucstrTextLength(UText *ut) { if (ut->a < 0) { // null terminated, we don't yet know the length. Scan for it. - // Access is not convenient for doing this + // Access is not convenient for doing this // because the current interation postion can't be changed. const UChar *str = (const UChar *)ut->context; for (;;) { - if (str[ut->chunk.nativeLimit] == 0) { + if (str[ut->chunkNativeLimit] == 0) { break; } - ut->chunk.nativeLimit++; + ut->chunkNativeLimit++; } - ut->a = ut->chunk.nativeLimit; - ut->chunk.length = ut->chunk.nativeLimit; + ut->a = ut->chunkNativeLimit; + ut->chunkLength = (int32_t)ut->chunkNativeLimit; + ut->nativeIndexingLimit = ut->chunkLength; ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); } return ut->a; @@ -1710,103 +2379,131 @@ ucstrTextLength(UText *ut) { static UBool U_CALLCONV -ucstrTextAccess(UText *ut, int32_t index, UBool forward, UTextChunk *chunk) { +ucstrTextAccess(UText *ut, int64_t index, UBool forward) { const UChar *str = (const UChar *)ut->context; - + // pin the requested index to the bounds of the string, // and set current iteration position. if (index<0) { index = 0; - } else if (index < ut->chunk.nativeLimit) { + } else if (index < ut->chunkNativeLimit) { // The request data is within the chunk as it is known so far. - // There is nothing more that needs to be done within this access function. + // Put index on a code point boundary. + U16_SET_CP_START(str, 0, index); } else if (ut->a >= 0) { // We know the length of this string, and the user is requesting something - // at or beyond the length. Trim the requested index to the length. - index = ut->a; + // at or beyond the length. Pin the requested index to the length. + index = ut->a; } else { - // Null terminated string, length not yet known. - // Scan down another 32 UChars or to the requested index, whichever is further - int scanLimit = ut->chunk.nativeLimit + 32; - if (scanLimit <= index) { - scanLimit = index+1; // TODO: beware int overflow + // Null terminated string, length not yet known, and the requested index + // is beyond where we have scanned so far. + // Scan to 32 UChars beyond the requested index. The strategy here is + // to avoid fully scanning a long string when the caller only wants to + // see a few characters at its beginning. + int32_t scanLimit = (int32_t)index + 32; + if ((index + 32)>INT32_MAX || (index + 32)<0 ) { // note: int64 expression + scanLimit = INT32_MAX; } - for (; ut->chunk.nativeLimit<scanLimit; ut->chunk.nativeLimit++) { - if (str[ut->chunk.nativeLimit] == 0) { - // We found the end of the string. Remember it, trim the index to it, + + int32_t chunkLimit = (int32_t)ut->chunkNativeLimit; + for (; chunkLimit<scanLimit; chunkLimit++) { + if (str[chunkLimit] == 0) { + // We found the end of the string. Remember it, pin the requested index to it, // and bail out of here. - ut->a = ut->chunk.nativeLimit; - ut->chunk.length = ut->chunk.nativeLimit; - if (index > ut->chunk.nativeLimit) { - index = ut->chunk.nativeLimit; + ut->a = chunkLimit; + ut->chunkLength = chunkLimit; + ut->nativeIndexingLimit = chunkLimit; + if (index >= chunkLimit) { + index = chunkLimit; + } else { + U16_SET_CP_START(str, 0, index); } + + ut->chunkNativeLimit = chunkLimit; ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); goto breakout; } } // We scanned through the next batch of UChars without finding the end. - // The endpoint of a chunk must not be left in the middle of a surrogate pair. - // If the current end is on a lead surrogate, back the end up by one. - // It doesn't matter if the end char happens to be an unpaired surrogate, - // and it's simpler not to worry about it. - if (U16_IS_LEAD(str[ut->chunk.nativeLimit-1])) { - --ut->chunk.nativeLimit; + U16_SET_CP_START(str, 0, index); + if (chunkLimit == INT32_MAX) { + // Scanned to the limit of a 32 bit length. + // Forceably trim the overlength string back so length fits in int32 + // TODO: add support for 64 bit strings. + ut->a = chunkLimit; + ut->chunkLength = chunkLimit; + ut->nativeIndexingLimit = chunkLimit; + if (index > chunkLimit) { + index = chunkLimit; + } + ut->chunkNativeLimit = chunkLimit; + ut->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); + } else { + // The endpoint of a chunk must not be left in the middle of a surrogate pair. + // If the current end is on a lead surrogate, back the end up by one. + // It doesn't matter if the end char happens to be an unpaired surrogate, + // and it's simpler not to worry about it. + if (U16_IS_LEAD(str[chunkLimit-1])) { + --chunkLimit; + } + ut->chunkNativeLimit = chunkLimit; } + } breakout: - chunk->offset = index; + U_ASSERT(index<=INT32_MAX); + ut->chunkOffset = (int32_t)index; // Check whether request is at the start or end - UBool retVal = (forward && index<ut->chunk.nativeLimit) || (!forward && index>0); - return retVal; + UBool retVal = (forward && index<ut->chunkNativeLimit) || (!forward && index>0); + return retVal; } static int32_t U_CALLCONV ucstrTextExtract(UText *ut, - int32_t start, int32_t limit, + int64_t start, int64_t limit, UChar *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { - - + UErrorCode *pErrorCode) +{ if(U_FAILURE(*pErrorCode)) { return 0; } - if(destCapacity<0 || (dest==NULL && destCapacity>0)) { + if(destCapacity<0 || (dest==NULL && destCapacity>0) || start>limit) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } const UChar *s=(const UChar *)ut->context; - int32_t strLength=ut->a; int32_t si, di; - // If text is null terminated and we haven't yet scanned down as far as the starting - // position of the extract, do it now. - if (strLength<0 && limit>=ut->chunk.nativeLimit) { - ucstrTextAccess(ut, start, TRUE, &ut->chunk); - } + int32_t start32; + int32_t limit32; - // Raise an error if starting position is outside of the string. - if(start<0 || start>limit) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } + // Access the start. Does two things we need: + // Pins 'start' to the length of the string, if it came in out-of-bounds. + // Snaps 'start' to the beginning of a code point. + ucstrTextAccess(ut, start, TRUE); + U_ASSERT(start <= INT32_MAX); + start32 = (int32_t)start; - if (strLength >= 0 && limit > strLength) { - // String length is known. Trim requested limit to be no more than the length - limit = strLength; + int32_t strLength=(int32_t)ut->a; + if (strLength >= 0) { + limit32 = pinIndex(limit, strLength); + } else { + limit32 = pinIndex(limit, INT32_MAX); } di = 0; - for (si=start; si<limit; si++) { + for (si=start32; si<limit32; si++) { if (strLength<0 && s[si]==0) { // Just hit the end of a null-terminated string. ut->a = si; // set string length for this UText - ut->chunk.nativeLimit = si; - ut->chunk.length = si; - // + ut->chunkNativeLimit = si; + ut->chunkLength = si; + ut->nativeIndexingLimit = si; + strLength = si; break; } if (di<destCapacity) { @@ -1814,56 +2511,310 @@ ucstrTextExtract(UText *ut, dest[di] = s[si]; } else { if (strLength>=0) { - // We have filled the destination buffer, and the string is known. + // We have filled the destination buffer, and the string length is known. // Cut the loop short. There is no need to scan string termination. di = strLength; + si = limit32; break; } } di++; } + // If the limit index points to a lead surrogate of a pair, + // add the corresponding trail surrogate to the destination. + if (si>0 && U16_IS_LEAD(s[si-1]) && + ((si<strLength || strLength<0) && U16_IS_TRAIL(s[si]))) + { + if (di<destCapacity) { + // store only if there is space in the output buffer. + dest[di++] = s[si++]; + } + } + + // Put iteration position at the point just following the extracted text + ut->chunkOffset = si; + + // Add a terminating NUL if space in the buffer permits, + // and set the error status as required. u_terminateUChars(dest, destCapacity, di, pErrorCode); return di; - } - +} +static struct UTextFuncs ucstrFuncs = +{ + sizeof(UTextFuncs), + 0, 0, 0, // Reserved alignment padding + ucstrTextClone, + ucstrTextLength, + ucstrTextAccess, + ucstrTextExtract, + NULL, // Replace + NULL, // Copy + NULL, // MapOffsetToNative, + NULL, // MapIndexToUTF16, + ucstrTextClose, + NULL, // spare 1 + NULL, // spare 2 + NULL, // spare 3 +}; U_CDECL_END U_DRAFT UText * U_EXPORT2 -utext_openUChars(UText *ut, const UChar *s, int32_t length, UErrorCode *status) { +utext_openUChars(UText *ut, const UChar *s, int64_t length, UErrorCode *status) { if (U_FAILURE(*status)) { return NULL; } - if (length < -1) { + if (length < -1 || length>INT32_MAX) { *status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } ut = utext_setup(ut, 0, status); if (U_SUCCESS(*status)) { - ut->clone = ucstrTextClone; - ut->nativeLength = ucstrTextLength; - ut->access = ucstrTextAccess; - ut->extract = ucstrTextExtract; - ut->replace = NULL; - ut->copy = NULL; - ut->close = ucstrTextClose; - - ut->context = s; - ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS); + ut->pFuncs = &ucstrFuncs; + ut->context = s; + ut->providerProperties = I32_FLAG(UTEXT_PROVIDER_STABLE_CHUNKS); if (length==-1) { ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE); } - ut->a = length; - ut->chunk.contents = s; - ut->chunk.nativeStart = 0; - ut->chunk.nativeLimit = length>=0? length : 0; - ut->chunk.length = ut->chunk.nativeLimit; - ut->chunk.nonUTF16Indexes = FALSE; + ut->a = length; + ut->chunkContents = s; + ut->chunkNativeStart = 0; + ut->chunkNativeLimit = length>=0? length : 0; + ut->chunkLength = (int32_t)ut->chunkNativeLimit; + ut->chunkOffset = 0; + ut->nativeIndexingLimit = ut->chunkLength; } return ut; } +//------------------------------------------------------------------------------ +// +// UText implementation for text from ICU CharacterIterators +// +// Use of UText data members: +// context pointer to the CharacterIterator +// a length of the full text. +// p pointer to buffer 1 +// b start index of local buffer 1 contents +// q pointer to buffer 2 +// c start index of local buffer 2 contents +// r pointer to the character iterator if the UText owns it. +// Null otherwise. +// +//------------------------------------------------------------------------------ +#define CIBufSize 16 + +U_CDECL_BEGIN +static void U_CALLCONV +charIterTextClose(UText *ut) { + // Most of the work of close is done by the generic UText framework close. + // All that needs to be done here is delete the CharacterIterator if the UText + // owns it. This occurs if the UText was created by cloning. + CharacterIterator *ci = (CharacterIterator *)ut->r; + delete ci; + ut->r = NULL; +} + +static int64_t U_CALLCONV +charIterTextLength(UText *ut) { + return (int32_t)ut->a; +} + +static UBool U_CALLCONV +charIterTextAccess(UText *ut, int64_t index, UBool forward) { + CharacterIterator *ci = (CharacterIterator *)ut->context; + + int32_t clippedIndex = (int32_t)index; + if (clippedIndex<0) { + clippedIndex=0; + } else if (clippedIndex>=ut->a) { + clippedIndex=(int32_t)ut->a; + } + int32_t neededIndex = clippedIndex; + if (!forward && neededIndex>0) { + // reverse iteration, want the position just before what was asked for. + neededIndex--; + } else if (forward && neededIndex==ut->a && neededIndex>0) { + // Forward iteration, don't ask for something past the end of the text. + neededIndex--; + } + + // Find the native index of the start of the buffer containing what we want. + neededIndex -= neededIndex % CIBufSize; + + UChar *buf = NULL; + UBool needChunkSetup = TRUE; + int i; + if (ut->chunkNativeStart == neededIndex) { + // The buffer we want is already the current chunk. + needChunkSetup = FALSE; + } else if (ut->b == neededIndex) { + // The first buffer (buffer p) has what we need. + buf = (UChar *)ut->p; + } else if (ut->c == neededIndex) { + // The second buffer (buffer q) has what we need. + buf = (UChar *)ut->q; + } else { + // Neither buffer already has what we need. + // Load new data from the character iterator. + // Use the buf that is not the current buffer. + buf = (UChar *)ut->p; + if (ut->p == ut->chunkContents) { + buf = (UChar *)ut->q; + } + ci->setIndex(neededIndex); + for (i=0; i<CIBufSize; i++) { + buf[i] = ci->nextPostInc(); + if (i+neededIndex > ut->a) { + break; + } + } + } + + // We have a buffer with the data we need. + // Set it up as the current chunk, if it wasn't already. + if (needChunkSetup) { + ut->chunkContents = buf; + ut->chunkLength = CIBufSize; + ut->chunkNativeStart = neededIndex; + ut->chunkNativeLimit = neededIndex + CIBufSize; + if (ut->chunkNativeLimit > ut->a) { + ut->chunkNativeLimit = ut->a; + ut->chunkLength = (int32_t)(ut->chunkNativeLimit)-(int32_t)(ut->chunkNativeStart); + } + ut->nativeIndexingLimit = ut->chunkLength; + U_ASSERT(ut->chunkOffset>=0 && ut->chunkOffset<=CIBufSize); + } + ut->chunkOffset = clippedIndex - (int32_t)ut->chunkNativeStart; + UBool success = (forward? ut->chunkOffset<ut->chunkLength : ut->chunkOffset>0); + return success; +} + +static UText * U_CALLCONV +charIterTextClone(UText *dest, const UText *src, UBool deep, UErrorCode * status) { + if (U_FAILURE(*status)) { + return NULL; + } + + if (deep) { + // There is no CharacterIterator API for cloning the underlying text storage. + *status = U_UNSUPPORTED_ERROR; + return NULL; + } else { + CharacterIterator *srcCI =(CharacterIterator *)src->context; + srcCI = srcCI->clone(); + dest = utext_openCharacterIterator(dest, srcCI, status); + // cast off const on getNativeIndex. + // For CharacterIterator based UTexts, this is safe, the operation is const. + int64_t ix = utext_getNativeIndex((UText *)src); + utext_setNativeIndex(dest, ix); + dest->r = srcCI; // flags that this UText owns the CharacterIterator + } + return dest; +} + +static int32_t U_CALLCONV +charIterTextExtract(UText *ut, + int64_t start, int64_t limit, + UChar *dest, int32_t destCapacity, + UErrorCode *status) +{ + if(U_FAILURE(*status)) { + return 0; + } + if(destCapacity<0 || (dest==NULL && destCapacity>0) || start>limit) { + *status=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t length = (int32_t)ut->a; + int32_t start32 = pinIndex(start, length); + int32_t limit32 = pinIndex(limit, length); + int32_t desti = 0; + int32_t srci; + + CharacterIterator *ci = (CharacterIterator *)ut->context; + ci->setIndex32(start32); // Moves ix to lead of surrogate pair, if needed. + srci = ci->getIndex(); + while (srci<limit32) { + UChar32 c = ci->next32PostInc(); + int32_t len = U16_LENGTH(c); + if (desti+len <= destCapacity) { + U16_APPEND_UNSAFE(dest, desti, c); + } else { + desti += len; + *status = U_BUFFER_OVERFLOW_ERROR; + } + srci += len; + } + + u_terminateUChars(dest, destCapacity, desti, status); + return desti; +} + +static struct UTextFuncs charIterFuncs = +{ + sizeof(UTextFuncs), + 0, 0, 0, // Reserved alignment padding + charIterTextClone, + charIterTextLength, + charIterTextAccess, + charIterTextExtract, + NULL, // Replace + NULL, // Copy + NULL, // MapOffsetToNative, + NULL, // MapIndexToUTF16, + charIterTextClose, + NULL, // spare 1 + NULL, // spare 2 + NULL // spare 3 +}; +U_CDECL_END + + +U_DRAFT UText * U_EXPORT2 +utext_openCharacterIterator(UText *ut, CharacterIterator *ci, UErrorCode *status) { + if (U_FAILURE(*status)) { + return NULL; + } + + if (ci->startIndex() > 0) { + // No support for CharacterIterators that do not start indexing from zero. + *status = U_UNSUPPORTED_ERROR; + return NULL; + } + + // Extra space in UText for 2 buffers of CIBufSize UChars each. + int32_t extraSpace = 2 * CIBufSize * sizeof(UChar); + ut = utext_setup(ut, extraSpace, status); + if (U_SUCCESS(*status)) { + ut->pFuncs = &charIterFuncs; + ut->context = ci; + ut->providerProperties = 0; + ut->a = ci->endIndex(); // Length of text + ut->p = ut->pExtra; // First buffer + ut->b = -1; // Native index of first buffer contents + ut->q = (UChar*)ut->pExtra+CIBufSize; // Second buffer + ut->c = -1; // Native index of second buffer contents + + // Initialize current chunk contents to be empty. + // First access will fault something in. + // Note: The initial nativeStart and chunkOffset must sum to zero + // so that getNativeIndex() will correctly compute to zero + // if no call to Access() has ever been made. They can't be both + // zero without Access() thinking that the chunk is valid. + ut->chunkContents = (UChar *)ut->p; + ut->chunkNativeStart = -1; + ut->chunkOffset = 1; + ut->chunkNativeLimit = 0; + ut->chunkLength = 0; + ut->nativeIndexingLimit = ut->chunkOffset; // enables native indexing + } + return ut; +} + + + diff --git a/Build/source/libs/icu-xetex/common/utf_impl.c b/Build/source/libs/icu-xetex/common/utf_impl.c index 431b0eb5dad..8f45546bb76 100644 --- a/Build/source/libs/icu-xetex/common/utf_impl.c +++ b/Build/source/libs/icu-xetex/common/utf_impl.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1999-2003, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -82,6 +82,28 @@ utf8_errorValue[6]={ 0x3ffffff, 0x7fffffff }; +/* + * Handle the non-inline part of the U8_NEXT() macro and its obsolete sibling + * UTF8_NEXT_CHAR_SAFE(). + * + * The "strict" parameter controls the error behavior: + * <0 "Safe" behavior of U8_NEXT(): All illegal byte sequences yield a negative + * code point result. + * 0 Obsolete "safe" behavior of UTF8_NEXT_CHAR_SAFE(..., FALSE): + * All illegal byte sequences yield a positive code point such that this + * result code point would be encoded with the same number of bytes as + * the illegal sequence. + * >0 Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., TRUE): + * Same as the obsolete "safe" behavior, but non-characters are also treated + * like illegal sequences. + * + * The special negative (<0) value -2 is used for lenient treatment of surrogate + * code points as legal. Some implementations use this for roundtripping of + * Unicode 16-bit strings that are not well-formed UTF-16, that is, they + * contain unpaired surrogates. + * + * Note that a UBool is the same as an int8_t. + */ U_CAPI UChar32 U_EXPORT2 utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { int32_t i=*pi; @@ -139,7 +161,7 @@ utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, /* correct sequence - all trail bytes have (b7..b6)==(10)? */ /* illegal is also set if count>=4 */ - if(illegal || (c)<utf8_minLegal[count] || UTF_IS_SURROGATE(c)) { + if(illegal || (c)<utf8_minLegal[count] || (UTF_IS_SURROGATE(c) && strict!=-2)) { /* error handling */ uint8_t errorCount=count; /* don't go beyond this sequence */ @@ -235,7 +257,7 @@ utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, U } else { return U_SENTINEL; } - break; + /*break;*/ } /* read another previous byte */ @@ -250,7 +272,7 @@ utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, U *pi=i; UTF8_MASK_LEAD_BYTE(b, count); c|=(UChar32)b<<shift; - if(count>=4 || c>0x10ffff || c<utf8_minLegal[count] || UTF_IS_SURROGATE(c) || (strict>0 && UTF_IS_UNICODE_NONCHAR(c))) { + if(count>=4 || c>0x10ffff || c<utf8_minLegal[count] || (UTF_IS_SURROGATE(c) && strict!=-2) || (strict>0 && UTF_IS_UNICODE_NONCHAR(c))) { /* illegal sequence or (strict and non-character) */ if(count>=4) { count=3; diff --git a/Build/source/libs/icu-xetex/common/util.cpp b/Build/source/libs/icu-xetex/common/util.cpp index 450dca1556f..7a588b5ae63 100644 --- a/Build/source/libs/icu-xetex/common/util.cpp +++ b/Build/source/libs/icu-xetex/common/util.cpp @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (c) 2001-2005, International Business Machines +* Copyright (c) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -9,9 +9,7 @@ */ #include "util.h" -#include "unicode/uchar.h" #include "unicode/unimatch.h" -#include "uprops.h" // Define UChar constants using hex for EBCDIC compatibility @@ -29,6 +27,8 @@ static const UChar DIGITS[] = { 85,86,87,88,89,90 }; +U_NAMESPACE_BEGIN + UnicodeString& ICU_Utility::appendNumber(UnicodeString& result, int32_t n, int32_t radix, int32_t minDigits) { if (radix < 2 || radix > 36) { @@ -215,69 +215,6 @@ UBool ICU_Utility::parseChar(const UnicodeString& id, int32_t& pos, UChar ch) { } /** - * Parse a pattern string starting at offset pos. Keywords are - * matched case-insensitively. Spaces may be skipped and may be - * optional or required. Integer values may be parsed, and if - * they are, they will be returned in the given array. If - * successful, the offset of the next non-space character is - * returned. On failure, -1 is returned. - * @param pattern must only contain lowercase characters, which - * will match their uppercase equivalents as well. A space - * character matches one or more required spaces. A '~' character - * matches zero or more optional spaces. A '#' character matches - * an integer and stores it in parsedInts, which the caller must - * ensure has enough capacity. - * @param parsedInts array to receive parsed integers. Caller - * must ensure that parsedInts.length is >= the number of '#' - * signs in 'pattern'. - * @return the position after the last character parsed, or -1 if - * the parse failed - */ -int32_t ICU_Utility::parsePattern(const UnicodeString& rule, int32_t pos, int32_t limit, - const UnicodeString& pattern, int32_t* parsedInts) { - // TODO Update this to handle surrogates - int32_t p; - int32_t intCount = 0; // number of integers parsed - for (int32_t i=0; i<pattern.length(); ++i) { - UChar cpat = pattern.charAt(i); - UChar c; - switch (cpat) { - case 32 /*' '*/: - if (pos >= limit) { - return -1; - } - c = rule.charAt(pos++); - if (!uprv_isRuleWhiteSpace(c)) { - return -1; - } - // FALL THROUGH to skipWhitespace - case 126 /*'~'*/: - pos = skipWhitespace(rule, pos); - break; - case 35 /*'#'*/: - p = pos; - parsedInts[intCount++] = parseInteger(rule, p, limit); - if (p == pos) { - // Syntax error; failed to parse integer - return -1; - } - pos = p; - break; - default: - if (pos >= limit) { - return -1; - } - c = (UChar) u_tolower(rule.charAt(pos++)); - if (c != cpat) { - return -1; - } - break; - } - } - return pos; -} - -/** * Parse a pattern string within the given Replaceable and a parsing * pattern. Characters are matched literally and case-sensitively * except for the following special characters: @@ -344,140 +281,6 @@ int32_t ICU_Utility::parsePattern(const UnicodeString& pat, } /** - * Parse an integer at pos, either of the form \d+ or of the form - * 0x[0-9A-Fa-f]+ or 0[0-7]+, that is, in standard decimal, hex, - * or octal format. - * @param pos INPUT-OUTPUT parameter. On input, the first - * character to parse. On output, the character after the last - * parsed character. - */ -int32_t ICU_Utility::parseInteger(const UnicodeString& rule, int32_t& pos, int32_t limit) { - int32_t count = 0; - int32_t value = 0; - int32_t p = pos; - int8_t radix = 10; - - if (p < limit && rule.charAt(p) == 48 /*0*/) { - if (p+1 < limit && (rule.charAt(p+1) == 0x78 /*x*/ || rule.charAt(p+1) == 0x58 /*X*/)) { - p += 2; - radix = 16; - } - else { - p++; - count = 1; - radix = 8; - } - } - - while (p < limit) { - int32_t d = u_digit(rule.charAt(p++), radix); - if (d < 0) { - --p; - break; - } - ++count; - int32_t v = (value * radix) + d; - if (v <= value) { - // If there are too many input digits, at some point - // the value will go negative, e.g., if we have seen - // "0x8000000" already and there is another '0', when - // we parse the next 0 the value will go negative. - return 0; - } - value = v; - } - if (count > 0) { - pos = p; - } - return value; -} - -/** - * Parse a Unicode identifier from the given string at the given - * position. Return the identifier, or an empty string if there - * is no identifier. - * @param str the string to parse - * @param pos INPUT-OUPUT parameter. On INPUT, pos is the - * first character to examine. It must be less than str.length(), - * and it must not point to a whitespace character. That is, must - * have pos < str.length() and - * !uprv_isRuleWhiteSpace(str.char32At(pos)). On - * OUTPUT, the position after the last parsed character. - * @return the Unicode identifier, or an empty string if there is - * no valid identifier at pos. - */ -UnicodeString ICU_Utility::parseUnicodeIdentifier(const UnicodeString& str, int32_t& pos) { - // assert(pos < str.length()); - // assert(!uprv_isRuleWhiteSpace(str.char32At(pos))); - UnicodeString buf; - int p = pos; - while (p < str.length()) { - UChar32 ch = str.char32At(p); - if (buf.length() == 0) { - if (u_isIDStart(ch)) { - buf.append(ch); - } else { - buf.truncate(0); - return buf; - } - } else { - if (u_isIDPart(ch)) { - buf.append(ch); - } else { - break; - } - } - p += UTF_CHAR_LENGTH(ch); - } - pos = p; - return buf; -} - -/** - * Parse an unsigned 31-bit integer at the given offset. Use - * UCharacter.digit() to parse individual characters into digits. - * @param text the text to be parsed - * @param pos INPUT-OUTPUT parameter. On entry, pos[0] is the - * offset within text at which to start parsing; it should point - * to a valid digit. On exit, pos[0] is the offset after the last - * parsed character. If the parse failed, it will be unchanged on - * exit. Must be >= 0 on entry. - * @param radix the radix in which to parse; must be >= 2 and <= - * 36. - * @return a non-negative parsed number, or -1 upon parse failure. - * Parse fails if there are no digits, that is, if pos[0] does not - * point to a valid digit on entry, or if the number to be parsed - * does not fit into a 31-bit unsigned integer. - */ -int32_t ICU_Utility::parseNumber(const UnicodeString& text, - int32_t& pos, int8_t radix) { - // assert(pos[0] >= 0); - // assert(radix >= 2); - // assert(radix <= 36); - int32_t n = 0; - int32_t p = pos; - while (p < text.length()) { - UChar32 ch = text.char32At(p); - int32_t d = u_digit(ch, radix); - if (d < 0) { - break; - } - n = radix*n + d; - // ASSUME that when a 32-bit integer overflows it becomes - // negative. E.g., 214748364 * 10 + 8 => negative value. - if (n < 0) { - return -1; - } - ++p; - } - if (p == pos) { - return -1; - } - pos = p; - return n; -} - -/** * Append a character to a rule that is being built up. To flush * the quoteBuf to rule, make one final call with isLiteral == TRUE. * If there is no final character, pass in (UChar32)-1 as c. @@ -609,6 +412,8 @@ void ICU_Utility::appendToRule(UnicodeString& rule, } } +U_NAMESPACE_END + U_CAPI UBool U_EXPORT2 uprv_isRuleWhiteSpace(UChar32 c) { /* "white space" in the sense of ICU rule parsers diff --git a/Build/source/libs/icu-xetex/common/util_props.cpp b/Build/source/libs/icu-xetex/common/util_props.cpp new file mode 100644 index 00000000000..f91666b4f23 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/util_props.cpp @@ -0,0 +1,214 @@ +/* +********************************************************************** +* Copyright (c) 2001-2006, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Date Name Description +* 11/19/2001 aliu Creation. +********************************************************************** +*/ + +#include "util.h" +#include "unicode/uchar.h" + +U_NAMESPACE_BEGIN + +/** + * Parse an integer at pos, either of the form \d+ or of the form + * 0x[0-9A-Fa-f]+ or 0[0-7]+, that is, in standard decimal, hex, + * or octal format. + * @param pos INPUT-OUTPUT parameter. On input, the first + * character to parse. On output, the character after the last + * parsed character. + */ +int32_t ICU_Utility::parseInteger(const UnicodeString& rule, int32_t& pos, int32_t limit) { + int32_t count = 0; + int32_t value = 0; + int32_t p = pos; + int8_t radix = 10; + + if (p < limit && rule.charAt(p) == 48 /*0*/) { + if (p+1 < limit && (rule.charAt(p+1) == 0x78 /*x*/ || rule.charAt(p+1) == 0x58 /*X*/)) { + p += 2; + radix = 16; + } + else { + p++; + count = 1; + radix = 8; + } + } + + while (p < limit) { + int32_t d = u_digit(rule.charAt(p++), radix); + if (d < 0) { + --p; + break; + } + ++count; + int32_t v = (value * radix) + d; + if (v <= value) { + // If there are too many input digits, at some point + // the value will go negative, e.g., if we have seen + // "0x8000000" already and there is another '0', when + // we parse the next 0 the value will go negative. + return 0; + } + value = v; + } + if (count > 0) { + pos = p; + } + return value; +} + +/** + * Parse a pattern string starting at offset pos. Keywords are + * matched case-insensitively. Spaces may be skipped and may be + * optional or required. Integer values may be parsed, and if + * they are, they will be returned in the given array. If + * successful, the offset of the next non-space character is + * returned. On failure, -1 is returned. + * @param pattern must only contain lowercase characters, which + * will match their uppercase equivalents as well. A space + * character matches one or more required spaces. A '~' character + * matches zero or more optional spaces. A '#' character matches + * an integer and stores it in parsedInts, which the caller must + * ensure has enough capacity. + * @param parsedInts array to receive parsed integers. Caller + * must ensure that parsedInts.length is >= the number of '#' + * signs in 'pattern'. + * @return the position after the last character parsed, or -1 if + * the parse failed + */ +int32_t ICU_Utility::parsePattern(const UnicodeString& rule, int32_t pos, int32_t limit, + const UnicodeString& pattern, int32_t* parsedInts) { + // TODO Update this to handle surrogates + int32_t p; + int32_t intCount = 0; // number of integers parsed + for (int32_t i=0; i<pattern.length(); ++i) { + UChar cpat = pattern.charAt(i); + UChar c; + switch (cpat) { + case 32 /*' '*/: + if (pos >= limit) { + return -1; + } + c = rule.charAt(pos++); + if (!uprv_isRuleWhiteSpace(c)) { + return -1; + } + // FALL THROUGH to skipWhitespace + case 126 /*'~'*/: + pos = skipWhitespace(rule, pos); + break; + case 35 /*'#'*/: + p = pos; + parsedInts[intCount++] = parseInteger(rule, p, limit); + if (p == pos) { + // Syntax error; failed to parse integer + return -1; + } + pos = p; + break; + default: + if (pos >= limit) { + return -1; + } + c = (UChar) u_tolower(rule.charAt(pos++)); + if (c != cpat) { + return -1; + } + break; + } + } + return pos; +} + +/** + * Parse a Unicode identifier from the given string at the given + * position. Return the identifier, or an empty string if there + * is no identifier. + * @param str the string to parse + * @param pos INPUT-OUPUT parameter. On INPUT, pos is the + * first character to examine. It must be less than str.length(), + * and it must not point to a whitespace character. That is, must + * have pos < str.length() and + * !uprv_isRuleWhiteSpace(str.char32At(pos)). On + * OUTPUT, the position after the last parsed character. + * @return the Unicode identifier, or an empty string if there is + * no valid identifier at pos. + */ +UnicodeString ICU_Utility::parseUnicodeIdentifier(const UnicodeString& str, int32_t& pos) { + // assert(pos < str.length()); + // assert(!uprv_isRuleWhiteSpace(str.char32At(pos))); + UnicodeString buf; + int p = pos; + while (p < str.length()) { + UChar32 ch = str.char32At(p); + if (buf.length() == 0) { + if (u_isIDStart(ch)) { + buf.append(ch); + } else { + buf.truncate(0); + return buf; + } + } else { + if (u_isIDPart(ch)) { + buf.append(ch); + } else { + break; + } + } + p += UTF_CHAR_LENGTH(ch); + } + pos = p; + return buf; +} + +/** + * Parse an unsigned 31-bit integer at the given offset. Use + * UCharacter.digit() to parse individual characters into digits. + * @param text the text to be parsed + * @param pos INPUT-OUTPUT parameter. On entry, pos[0] is the + * offset within text at which to start parsing; it should point + * to a valid digit. On exit, pos[0] is the offset after the last + * parsed character. If the parse failed, it will be unchanged on + * exit. Must be >= 0 on entry. + * @param radix the radix in which to parse; must be >= 2 and <= + * 36. + * @return a non-negative parsed number, or -1 upon parse failure. + * Parse fails if there are no digits, that is, if pos[0] does not + * point to a valid digit on entry, or if the number to be parsed + * does not fit into a 31-bit unsigned integer. + */ +int32_t ICU_Utility::parseNumber(const UnicodeString& text, + int32_t& pos, int8_t radix) { + // assert(pos[0] >= 0); + // assert(radix >= 2); + // assert(radix <= 36); + int32_t n = 0; + int32_t p = pos; + while (p < text.length()) { + UChar32 ch = text.char32At(p); + int32_t d = u_digit(ch, radix); + if (d < 0) { + break; + } + n = radix*n + d; + // ASSUME that when a 32-bit integer overflows it becomes + // negative. E.g., 214748364 * 10 + 8 => negative value. + if (n < 0) { + return -1; + } + ++p; + } + if (p == pos) { + return -1; + } + pos = p; + return n; +} + +U_NAMESPACE_END + diff --git a/Build/source/libs/icu-xetex/common/utrie.c b/Build/source/libs/icu-xetex/common/utrie.c index 60e446a7106..812c89db567 100644 --- a/Build/source/libs/icu-xetex/common/utrie.c +++ b/Build/source/libs/icu-xetex/common/utrie.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001-2005, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -23,7 +23,6 @@ #endif #include "unicode/utypes.h" -#include "udataswp.h" #include "cmemory.h" #include "utrie.h" @@ -686,55 +685,6 @@ utrie_compact(UNewTrie *trie, UBool overlap, UErrorCode *pErrorCode) { /* serialization ------------------------------------------------------------ */ -/** - * Trie data structure in serialized form: - * - * UTrieHeader header; - * uint16_t index[header.indexLength]; - * uint16_t data[header.dataLength]; - */ -struct UTrieHeader { - /** "Trie" in big-endian US-ASCII (0x54726965) */ - uint32_t signature; - - /** - * options bit field: - * 9 1=Latin-1 data is stored linearly at data+UTRIE_DATA_BLOCK_LENGTH - * 8 0=16-bit data, 1=32-bit data - * 7..4 UTRIE_INDEX_SHIFT // 0..UTRIE_SHIFT - * 3..0 UTRIE_SHIFT // 1..9 - */ - uint32_t options; - - /** indexLength is a multiple of UTRIE_SURROGATE_BLOCK_COUNT */ - int32_t indexLength; - - /** dataLength>=UTRIE_DATA_BLOCK_LENGTH */ - int32_t dataLength; -}; - -typedef struct UTrieHeader UTrieHeader; - -/** - * Constants for use with UTrieHeader.options. - */ -enum { - /** Mask to get the UTRIE_SHIFT value from options. */ - UTRIE_OPTIONS_SHIFT_MASK=0xf, - - /** Shift options right this much to get the UTRIE_INDEX_SHIFT value. */ - UTRIE_OPTIONS_INDEX_SHIFT=4, - - /** If set, then the data (stage 2) array is 32 bits wide. */ - UTRIE_OPTIONS_DATA_IS_32_BIT=0x100, - - /** - * If set, then Latin-1 data (for U+0000..U+00ff) is stored in the data (stage 2) array - * as a simple, linear array at data+UTRIE_DATA_BLOCK_LENGTH. - */ - UTRIE_OPTIONS_LATIN1_IS_LINEAR=0x200 -}; - /* * Default function for the folding value: * Just store the offset (16 bits) if there is any non-initial-value entry. @@ -1077,79 +1027,6 @@ utrie_unserializeDummy(UTrie *trie, return actualLength; } -/* swapping ----------------------------------------------------------------- */ - -U_CAPI int32_t U_EXPORT2 -utrie_swap(const UDataSwapper *ds, - const void *inData, int32_t length, void *outData, - UErrorCode *pErrorCode) { - const UTrieHeader *inTrie; - UTrieHeader trie; - int32_t size; - UBool dataIs32; - - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { - return 0; - } - if(ds==NULL || inData==NULL || (length>=0 && outData==NULL)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - /* setup and swapping */ - if(length>=0 && length<sizeof(UTrieHeader)) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - - inTrie=(const UTrieHeader *)inData; - trie.signature=ds->readUInt32(inTrie->signature); - trie.options=ds->readUInt32(inTrie->options); - trie.indexLength=udata_readInt32(ds, inTrie->indexLength); - trie.dataLength=udata_readInt32(ds, inTrie->dataLength); - - if( trie.signature!=0x54726965 || - (trie.options&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_SHIFT || - ((trie.options>>UTRIE_OPTIONS_INDEX_SHIFT)&UTRIE_OPTIONS_SHIFT_MASK)!=UTRIE_INDEX_SHIFT || - trie.indexLength<UTRIE_BMP_INDEX_LENGTH || - (trie.indexLength&(UTRIE_SURROGATE_BLOCK_COUNT-1))!=0 || - trie.dataLength<UTRIE_DATA_BLOCK_LENGTH || - (trie.dataLength&(UTRIE_DATA_GRANULARITY-1))!=0 || - ((trie.options&UTRIE_OPTIONS_LATIN1_IS_LINEAR)!=0 && trie.dataLength<(UTRIE_DATA_BLOCK_LENGTH+0x100)) - ) { - *pErrorCode=U_INVALID_FORMAT_ERROR; /* not a UTrie */ - return 0; - } - - dataIs32=(UBool)((trie.options&UTRIE_OPTIONS_DATA_IS_32_BIT)!=0); - size=sizeof(UTrieHeader)+trie.indexLength*2+trie.dataLength*(dataIs32?4:2); - - if(length>=0) { - UTrieHeader *outTrie; - - if(length<size) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - - outTrie=(UTrieHeader *)outData; - - /* swap the header */ - ds->swapArray32(ds, inTrie, sizeof(UTrieHeader), outTrie, pErrorCode); - - /* swap the index and the data */ - if(dataIs32) { - ds->swapArray16(ds, inTrie+1, trie.indexLength*2, outTrie+1, pErrorCode); - ds->swapArray32(ds, (const uint16_t *)(inTrie+1)+trie.indexLength, trie.dataLength*4, - (uint16_t *)(outTrie+1)+trie.indexLength, pErrorCode); - } else { - ds->swapArray16(ds, inTrie+1, (trie.indexLength+trie.dataLength)*2, outTrie+1, pErrorCode); - } - } - - return size; -} - /* enumeration -------------------------------------------------------------- */ /* default UTrieEnumValue() returns the input value itself */ diff --git a/Build/source/libs/icu-xetex/common/utrie.h b/Build/source/libs/icu-xetex/common/utrie.h index a23d11a8e43..d8d77ac4cbb 100644 --- a/Build/source/libs/icu-xetex/common/utrie.h +++ b/Build/source/libs/icu-xetex/common/utrie.h @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 2001-2005, International Business Machines +* Copyright (C) 2001-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -736,6 +736,57 @@ utrie_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outData, UErrorCode *pErrorCode); +/* serialization ------------------------------------------------------------ */ + +/** + * Trie data structure in serialized form: + * + * UTrieHeader header; + * uint16_t index[header.indexLength]; + * uint16_t data[header.dataLength]; + * @internal + */ +typedef struct UTrieHeader { + /** "Trie" in big-endian US-ASCII (0x54726965) */ + uint32_t signature; + + /** + * options bit field: + * 9 1=Latin-1 data is stored linearly at data+UTRIE_DATA_BLOCK_LENGTH + * 8 0=16-bit data, 1=32-bit data + * 7..4 UTRIE_INDEX_SHIFT // 0..UTRIE_SHIFT + * 3..0 UTRIE_SHIFT // 1..9 + */ + uint32_t options; + + /** indexLength is a multiple of UTRIE_SURROGATE_BLOCK_COUNT */ + int32_t indexLength; + + /** dataLength>=UTRIE_DATA_BLOCK_LENGTH */ + int32_t dataLength; +} UTrieHeader; + +/** + * Constants for use with UTrieHeader.options. + * @internal + */ +enum { + /** Mask to get the UTRIE_SHIFT value from options. */ + UTRIE_OPTIONS_SHIFT_MASK=0xf, + + /** Shift options right this much to get the UTRIE_INDEX_SHIFT value. */ + UTRIE_OPTIONS_INDEX_SHIFT=4, + + /** If set, then the data (stage 2) array is 32 bits wide. */ + UTRIE_OPTIONS_DATA_IS_32_BIT=0x100, + + /** + * If set, then Latin-1 data (for U+0000..U+00ff) is stored in the data (stage 2) array + * as a simple, linear array at data+UTRIE_DATA_BLOCK_LENGTH. + */ + UTRIE_OPTIONS_LATIN1_IS_LINEAR=0x200 +}; + U_CDECL_END #endif diff --git a/Build/source/libs/icu-xetex/common/utypes.c b/Build/source/libs/icu-xetex/common/utypes.c index 5ac8e956999..2255b0c1b73 100644 --- a/Build/source/libs/icu-xetex/common/utypes.c +++ b/Build/source/libs/icu-xetex/common/utypes.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1997-2005, International Business Machines +* Copyright (C) 1997-2006, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -121,7 +121,6 @@ _uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = { static const char * const _uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = { - "U_BRK_ERROR_START", "U_BRK_INTERNAL_ERROR", "U_BRK_HEX_DIGITS_EXPECTED", "U_BRK_SEMICOLON_EXPECTED", @@ -140,7 +139,6 @@ _uBrkErrorName[U_BRK_ERROR_LIMIT - U_BRK_ERROR_START] = { static const char * const _uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = { - "U_REGEX_ERROR_START", "U_REGEX_INTERNAL_ERROR", "U_REGEX_RULE_SYNTAX", "U_REGEX_INVALID_STATE", @@ -156,12 +154,9 @@ _uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = { "U_REGEX_LOOK_BEHIND_LIMIT", "U_REGEX_SET_CONTAINS_STRING" }; -/* TODO: replace the definition with _uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START ] - * in ICU 3.6 - */ + static const char * const -_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START + 1] = { - "U_IDNA_ERROR_START", +_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START] = { "U_STRINGPREP_PROHIBITED_ERROR", "U_STRINGPREP_UNASSIGNED_ERROR", "U_STRINGPREP_CHECK_BIDI_ERROR", @@ -186,7 +181,7 @@ u_errorName(UErrorCode code) { return _uBrkErrorName[code - U_BRK_ERROR_START]; } else if (U_REGEX_ERROR_START <= code && code < U_REGEX_ERROR_LIMIT) { return _uRegexErrorName[code - U_REGEX_ERROR_START]; - } else if( U_IDNA_ERROR_START <= code && code <= U_IDNA_ERROR_LIMIT) { + } else if(U_IDNA_ERROR_START <= code && code < U_IDNA_ERROR_LIMIT) { return _uIDNAErrorName[code - U_IDNA_ERROR_START]; } else { return "[BOGUS UErrorCode]"; diff --git a/Build/source/libs/icu-xetex/common/uvector.h b/Build/source/libs/icu-xetex/common/uvector.h index 3aef964c054..710f0dbcc97 100644 --- a/Build/source/libs/icu-xetex/common/uvector.h +++ b/Build/source/libs/icu-xetex/common/uvector.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2004, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description @@ -247,15 +247,11 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 */ static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 */ virtual UClassID getDynamicClassID() const; @@ -328,15 +324,11 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 */ static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 */ virtual UClassID getDynamicClassID() const; diff --git a/Build/source/libs/icu-xetex/common/uvectr32.h b/Build/source/libs/icu-xetex/common/uvectr32.h index 5e50124d04a..68a3ee2e2fe 100644 --- a/Build/source/libs/icu-xetex/common/uvectr32.h +++ b/Build/source/libs/icu-xetex/common/uvectr32.h @@ -1,6 +1,6 @@ /* ********************************************************************** -* Copyright (C) 1999-2005, International Business Machines +* Copyright (C) 1999-2006, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -163,15 +163,11 @@ public: /** * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @draft ICU 2.2 */ static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @draft ICU 2.2 */ virtual UClassID getDynamicClassID() const; diff --git a/Build/source/libs/icu-xetex/common/wintz.c b/Build/source/libs/icu-xetex/common/wintz.c new file mode 100644 index 00000000000..136eba9e287 --- /dev/null +++ b/Build/source/libs/icu-xetex/common/wintz.c @@ -0,0 +1,581 @@ +/* +******************************************************************************** +* Copyright (C) 2005-2006, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************** +* +* File WINTZ.CPP +* +******************************************************************************** +*/ + +#include "unicode/utypes.h" + +#ifdef U_WINDOWS + +#include "wintz.h" + +#include "cmemory.h" +#include "cstring.h" + +#include "unicode/ustring.h" + +# define WIN32_LEAN_AND_MEAN +# define VC_EXTRALEAN +# define NOUSER +# define NOSERVICE +# define NOIME +# define NOMCX +#include <windows.h> + +#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) +#define NEW_ARRAY(type,count) (type *) uprv_malloc((count) * sizeof(type)) +#define DELETE_ARRAY(array) uprv_free((void *) (array)) + +#define ICUID_STACK_BUFFER_SIZE 32 + +/* The layout of the Tzi value in the registry */ +typedef struct +{ + int32_t bias; + int32_t standardBias; + int32_t daylightBias; + SYSTEMTIME standardDate; + SYSTEMTIME daylightDate; +} TZI; + +typedef struct +{ + const char *icuid; + const char *winid; +} WindowsICUMap; + +typedef struct { + const char* winid; + const char* altwinid; +} WindowsZoneRemap; + +/** + * Various registry keys and key fragments. + */ +static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\"; +static const char STANDARD_NAME_REGKEY[] = "StandardName"; +static const char STANDARD_TIME_REGKEY[] = " Standard Time"; +static const char TZI_REGKEY[] = "TZI"; +static const char STD_REGKEY[] = "Std"; + +/** + * HKLM subkeys used to probe for the flavor of Windows. Note that we + * specifically check for the "GMT" zone subkey; this is present on + * NT, but on XP has become "GMT Standard Time". We need to + * discriminate between these cases. + */ +static const char* const WIN_TYPE_PROBE_REGKEY[] = { + /* WIN_9X_ME_TYPE */ + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones", + + /* WIN_NT_TYPE */ + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\GMT" + + /* otherwise: WIN_2K_XP_TYPE */ +}; + +/** + * The time zone root subkeys (under HKLM) for different flavors of + * Windows. + */ +static const char* const TZ_REGKEY[] = { + /* WIN_9X_ME_TYPE */ + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\", + + /* WIN_NT_TYPE | WIN_2K_XP_TYPE */ + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\" +}; + +/** + * Flavor of Windows, from our perspective. Not a real OS version, + * but rather the flavor of the layout of the time zone information in + * the registry. + */ +enum { + WIN_9X_ME_TYPE = 0, + WIN_NT_TYPE = 1, + WIN_2K_XP_TYPE = 2 +}; + +/* + * TODO: Sort on ICU ID? + * TODO: This data should come from ICU/CLDR... + */ +static const WindowsICUMap ZONE_MAP[] = { + {"Etc/GMT+12", "Dateline"}, /* S (GMT-12:00) International Date Line West */ + + {"Pacific/Apia", "Samoa"}, /* S (GMT-11:00) Midway Island, Samoa */ + + {"Pacific/Honolulu", "Hawaiian"}, /* S (GMT-10:00) Hawaii */ + + {"America/Anchorage", "Alaskan"}, /* D (GMT-09:00) Alaska */ + + {"America/Los_Angeles", "Pacific"}, /* D (GMT-08:00) Pacific Time (US & Canada); Tijuana */ + + {"America/Phoenix", "US Mountain"}, /* S (GMT-07:00) Arizona */ + {"America/Denver", "Mountain"}, /* D (GMT-07:00) Mountain Time (US & Canada) */ + {"America/Chihuahua", "Mexico Standard Time 2"}, /* D (GMT-07:00) Chihuahua, La Paz, Mazatlan */ + + {"America/Managua", "Central America"}, /* S (GMT-06:00) Central America */ + {"America/Regina", "Canada Central"}, /* S (GMT-06:00) Saskatchewan */ + {"America/Mexico_City", "Mexico"}, /* D (GMT-06:00) Guadalajara, Mexico City, Monterrey */ + {"America/Chicago", "Central"}, /* D (GMT-06:00) Central Time (US & Canada) */ + + {"America/Indianapolis", "US Eastern"}, /* S (GMT-05:00) Indiana (East) */ + {"America/Bogota", "SA Pacific"}, /* S (GMT-05:00) Bogota, Lima, Quito */ + {"America/New_York", "Eastern"}, /* D (GMT-05:00) Eastern Time (US & Canada) */ + + {"America/Caracas", "SA Western"}, /* S (GMT-04:00) Caracas, La Paz */ + {"America/Santiago", "Pacific SA"}, /* D (GMT-04:00) Santiago */ + {"America/Halifax", "Atlantic"}, /* D (GMT-04:00) Atlantic Time (Canada) */ + + {"America/St_Johns", "Newfoundland"}, /* D (GMT-03:30) Newfoundland */ + + {"America/Buenos_Aires", "SA Eastern"}, /* S (GMT-03:00) Buenos Aires, Georgetown */ + {"America/Godthab", "Greenland"}, /* D (GMT-03:00) Greenland */ + {"America/Sao_Paulo", "E. South America"}, /* D (GMT-03:00) Brasilia */ + + {"America/Noronha", "Mid-Atlantic"}, /* D (GMT-02:00) Mid-Atlantic */ + + {"Atlantic/Cape_Verde", "Cape Verde"}, /* S (GMT-01:00) Cape Verde Is. */ + {"Atlantic/Azores", "Azores"}, /* D (GMT-01:00) Azores */ + + {"Africa/Casablanca", "Greenwich"}, /* S (GMT) Casablanca, Monrovia */ + {"Europe/London", "GMT"}, /* D (GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London */ + + {"Africa/Lagos", "W. Central Africa"}, /* S (GMT+01:00) West Central Africa */ + {"Europe/Berlin", "W. Europe"}, /* D (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna */ + {"Europe/Paris", "Romance"}, /* D (GMT+01:00) Brussels, Copenhagen, Madrid, Paris */ + {"Europe/Sarajevo", "Central European"}, /* D (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb */ + {"Europe/Belgrade", "Central Europe"}, /* D (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */ + + {"Africa/Johannesburg", "South Africa"}, /* S (GMT+02:00) Harare, Pretoria */ + {"Asia/Jerusalem", "Israel"}, /* S (GMT+02:00) Jerusalem */ + {"Europe/Istanbul", "GTB"}, /* D (GMT+02:00) Athens, Istanbul, Minsk */ + {"Europe/Helsinki", "FLE"}, /* D (GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */ + {"Africa/Cairo", "Egypt"}, /* D (GMT+02:00) Cairo */ + {"Europe/Bucharest", "E. Europe"}, /* D (GMT+02:00) Bucharest */ + + {"Africa/Nairobi", "E. Africa"}, /* S (GMT+03:00) Nairobi */ + {"Asia/Riyadh", "Arab"}, /* S (GMT+03:00) Kuwait, Riyadh */ + {"Europe/Moscow", "Russian"}, /* D (GMT+03:00) Moscow, St. Petersburg, Volgograd */ + {"Asia/Baghdad", "Arabic"}, /* D (GMT+03:00) Baghdad */ + + {"Asia/Tehran", "Iran"}, /* D (GMT+03:30) Tehran */ + + {"Asia/Muscat", "Arabian"}, /* S (GMT+04:00) Abu Dhabi, Muscat */ + {"Asia/Tbilisi", "Caucasus"}, /* D (GMT+04:00) Baku, Tbilisi, Yerevan */ + + {"Asia/Kabul", "Afghanistan"}, /* S (GMT+04:30) Kabul */ + + {"Asia/Karachi", "West Asia"}, /* S (GMT+05:00) Islamabad, Karachi, Tashkent */ + {"Asia/Yekaterinburg", "Ekaterinburg"}, /* D (GMT+05:00) Ekaterinburg */ + + {"Asia/Calcutta", "India"}, /* S (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi */ + + {"Asia/Katmandu", "Nepal"}, /* S (GMT+05:45) Kathmandu */ + + {"Asia/Colombo", "Sri Lanka"}, /* S (GMT+06:00) Sri Jayawardenepura */ + {"Asia/Dhaka", "Central Asia"}, /* S (GMT+06:00) Astana, Dhaka */ + {"Asia/Novosibirsk", "N. Central Asia"}, /* D (GMT+06:00) Almaty, Novosibirsk */ + + {"Asia/Rangoon", "Myanmar"}, /* S (GMT+06:30) Rangoon */ + + {"Asia/Bangkok", "SE Asia"}, /* S (GMT+07:00) Bangkok, Hanoi, Jakarta */ + {"Asia/Krasnoyarsk", "North Asia"}, /* D (GMT+07:00) Krasnoyarsk */ + + {"Australia/Perth", "W. Australia"}, /* S (GMT+08:00) Perth */ + {"Asia/Taipei", "Taipei"}, /* S (GMT+08:00) Taipei */ + {"Asia/Singapore", "Singapore"}, /* S (GMT+08:00) Kuala Lumpur, Singapore */ + {"Asia/Hong_Kong", "China"}, /* S (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi */ + {"Asia/Irkutsk", "North Asia East"}, /* D (GMT+08:00) Irkutsk, Ulaan Bataar */ + + {"Asia/Tokyo", "Tokyo"}, /* S (GMT+09:00) Osaka, Sapporo, Tokyo */ + {"Asia/Seoul", "Korea"}, /* S (GMT+09:00) Seoul */ + {"Asia/Yakutsk", "Yakutsk"}, /* D (GMT+09:00) Yakutsk */ + + {"Australia/Darwin", "AUS Central"}, /* S (GMT+09:30) Darwin */ + {"Australia/Adelaide", "Cen. Australia"}, /* D (GMT+09:30) Adelaide */ + + {"Pacific/Guam", "West Pacific"}, /* S (GMT+10:00) Guam, Port Moresby */ + {"Australia/Brisbane", "E. Australia"}, /* S (GMT+10:00) Brisbane */ + {"Asia/Vladivostok", "Vladivostok"}, /* D (GMT+10:00) Vladivostok */ + {"Australia/Hobart", "Tasmania"}, /* D (GMT+10:00) Hobart */ + {"Australia/Sydney", "AUS Eastern"}, /* D (GMT+10:00) Canberra, Melbourne, Sydney */ + + {"Asia/Magadan", "Central Pacific"}, /* S (GMT+11:00) Magadan, Solomon Is., New Caledonia */ + + {"Pacific/Fiji", "Fiji"}, /* S (GMT+12:00) Fiji, Kamchatka, Marshall Is. */ + {"Pacific/Auckland", "New Zealand"}, /* D (GMT+12:00) Auckland, Wellington */ + + {"Pacific/Tongatapu", "Tonga"}, /* S (GMT+13:00) Nuku'alofa */ + NULL, NULL +}; + +/** + * If a lookup fails, we attempt to remap certain Windows ids to + * alternate Windows ids. If the alternate listed here begins with + * '-', we use it as is (without the '-'). If it begins with '+', we + * append a " Standard Time" if appropriate. + */ +static const WindowsZoneRemap ZONE_REMAP[] = { + "Central European", "-Warsaw", + "Central Europe", "-Prague Bratislava", + "China", "-Beijing", + + "Greenwich", "+GMT", + "GTB", "+GFT", + "Arab", "+Saudi Arabia", + "SE Asia", "+Bangkok", + "AUS Eastern", "+Sydney", + NULL, NULL, +}; + +static int32_t fWinType = -1; + +static int32_t detectWindowsType() +{ + int32_t winType; + LONG result; + HKEY hkey; + + /* Detect the version of windows by trying to open a sequence of + probe keys. We don't use the OS version API because what we + really want to know is how the registry is laid out. + Specifically, is it 9x/Me or not, and is it "GMT" or "GMT + Standard Time". */ + for (winType = 0; winType < 2; winType += 1) { + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + WIN_TYPE_PROBE_REGKEY[winType], + 0, + KEY_QUERY_VALUE, + &hkey); + RegCloseKey(hkey); + + if (result == ERROR_SUCCESS) { + break; + } + } + + return winType; +} + +/* + * TODO: Binary search sorted ZONE_MAP... + * (u_detectWindowsTimeZone() needs them sorted by offset...) + */ +static const char *findWindowsZoneID(const UChar *icuid, int32_t length) +{ + char stackBuffer[ICUID_STACK_BUFFER_SIZE]; + char *buffer = stackBuffer; + const char *result = NULL; + int i; + + /* + * NOTE: >= because length doesn't include + * trailing null. + */ + if (length >= ICUID_STACK_BUFFER_SIZE) { + buffer = NEW_ARRAY(char, length + 1); + } + + u_UCharsToChars(icuid, buffer, length); + buffer[length] = '\0'; + + for (i = 0; ZONE_MAP[i].icuid != NULL; i += 1) { + if (uprv_strcmp(buffer, ZONE_MAP[i].icuid) == 0) { + result = ZONE_MAP[i].winid; + break; + } + } + + if (buffer != stackBuffer) { + DELETE_ARRAY(buffer); + } + + return result; +} + +static LONG openTZRegKey(HKEY *hkey, const char *winid) +{ + char subKeyName[96]; /* TODO: why 96?? */ + char *name; + LONG result; + + /* TODO: This isn't thread safe, but it's probably good enough. */ + if (fWinType < 0) { + fWinType = detectWindowsType(); + } + + uprv_strcpy(subKeyName, TZ_REGKEY[(fWinType == WIN_9X_ME_TYPE) ? 0 : 1]); + name = &subKeyName[strlen(subKeyName)]; + uprv_strcat(subKeyName, winid); + + if (fWinType != WIN_9X_ME_TYPE && + (winid[strlen(winid) - 1] != '2') && + !(fWinType == WIN_NT_TYPE && strcmp(winid, "GMT") == 0)) { + uprv_strcat(subKeyName, STANDARD_TIME_REGKEY); + } + + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + subKeyName, + 0, + KEY_QUERY_VALUE, + hkey); + + if (result != ERROR_SUCCESS) { + int i; + + /* If the primary lookup fails, try to remap the Windows zone + ID, according to the remapping table. */ + for (i=0; ZONE_REMAP[i].winid; i++) { + if (uprv_strcmp(winid, ZONE_REMAP[i].winid) == 0) { + uprv_strcpy(name, ZONE_REMAP[i].altwinid + 1); + if (*(ZONE_REMAP[i].altwinid) == '+' && fWinType != WIN_9X_ME_TYPE) { + uprv_strcat(subKeyName, STANDARD_TIME_REGKEY); + } + return RegOpenKeyEx(HKEY_LOCAL_MACHINE, + subKeyName, + 0, + KEY_QUERY_VALUE, + hkey); + } + } + } + + return result; +} + +static LONG getTZI(const char *winid, TZI *tzi) +{ + DWORD cbData = sizeof(TZI); + LONG result; + HKEY hkey; + + result = openTZRegKey(&hkey, winid); + + if (result == ERROR_SUCCESS) { + result = RegQueryValueEx(hkey, + TZI_REGKEY, + NULL, + NULL, + (LPBYTE)tzi, + &cbData); + + } + + RegCloseKey(hkey); + + return result; +} + +U_CAPI UBool U_EXPORT2 +uprv_getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length) +{ + const char *winid; + TZI tzi; + LONG result; + + winid = findWindowsZoneID(icuid, length); + + if (winid != NULL) { + result = getTZI(winid, &tzi); + + if (result == ERROR_SUCCESS) { + zoneInfo->Bias = tzi.bias; + zoneInfo->DaylightBias = tzi.daylightBias; + zoneInfo->StandardBias = tzi.standardBias; + zoneInfo->DaylightDate = tzi.daylightDate; + zoneInfo->StandardDate = tzi.standardDate; + + return TRUE; + } + } + + return FALSE; +} + +/* + This code attempts to detect the Windows time zone, as set in the + Windows Date and Time control panel. It attempts to work on + multiple flavors of Windows (9x, Me, NT, 2000, XP) and on localized + installs. It works by directly interrogating the registry and + comparing the data there with the data returned by the + GetTimeZoneInformation API, along with some other strategies. The + registry contains time zone data under one of two keys (depending on + the flavor of Windows): + + HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\ + HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ + + Under this key are several subkeys, one for each time zone. These + subkeys are named "Pacific" on Win9x/Me and "Pacific Standard Time" + on WinNT/2k/XP. There are some other wrinkles; see the code for + details. The subkey name is NOT LOCALIZED, allowing us to support + localized installs. + + Under the subkey are data values. We care about: + + Std Standard time display name, localized + TZI Binary block of data + + The TZI data is of particular interest. It contains the offset, two + more offsets for standard and daylight time, and the start and end + rules. This is the same data returned by the GetTimeZoneInformation + API. The API may modify the data on the way out, so we have to be + careful, but essentially we do a binary comparison against the TZI + blocks of various registry keys. When we find a match, we know what + time zone Windows is set to. Since the registry key is not + localized, we can then translate the key through a simple table + lookup into the corresponding ICU time zone. + + This strategy doesn't always work because there are zones which + share an offset and rules, so more than one TZI block will match. + For example, both Tokyo and Seoul are at GMT+9 with no DST rules; + their TZI blocks are identical. For these cases, we fall back to a + name lookup. We attempt to match the display name as stored in the + registry for the current zone to the display name stored in the + registry for various Windows zones. By comparing the registry data + directly we avoid conversion complications. + + Author: Alan Liu + Since: ICU 2.6 + Based on original code by Carl Brown <cbrown@xnetinc.com> +*/ + +/** + * Main Windows time zone detection function. Returns the Windows + * time zone, translated to an ICU time zone, or NULL upon failure. + */ +U_CAPI const char* U_EXPORT2 +uprv_detectWindowsTimeZone() { + LONG result; + HKEY hkey; + TZI tziKey; + TZI tziReg; + TIME_ZONE_INFORMATION apiTZI; + int firstMatch, lastMatch; + int j; + + /* Obtain TIME_ZONE_INFORMATION from the API, and then convert it + to TZI. We could also interrogate the registry directly; we do + this below if needed. */ + uprv_memset(&apiTZI, 0, sizeof(apiTZI)); + uprv_memset(&tziKey, 0, sizeof(tziKey)); + uprv_memset(&tziReg, 0, sizeof(tziReg)); + GetTimeZoneInformation(&apiTZI); + tziKey.bias = apiTZI.Bias; + uprv_memcpy((char *)&tziKey.standardDate, (char*)&apiTZI.StandardDate, + sizeof(apiTZI.StandardDate)); + uprv_memcpy((char *)&tziKey.daylightDate, (char*)&apiTZI.DaylightDate, + sizeof(apiTZI.DaylightDate)); + + /* For each zone that can be identified by Offset+Rules, see if we + have a match. Continue scanning after finding a match, + recording the index of the first and the last match. We have + to do this because some zones are not unique under + Offset+Rules. */ + firstMatch = -1; + lastMatch = -1; + for (j=0; ZONE_MAP[j].icuid; j++) { + result = getTZI(ZONE_MAP[j].winid, &tziReg); + + if (result == ERROR_SUCCESS) { + /* Assume that offsets are grouped together, and bail out + when we've scanned everything with a matching + offset. */ + if (firstMatch >= 0 && tziKey.bias != tziReg.bias) { + break; + } + + /* Windows alters the DaylightBias in some situations. + Using the bias and the rules suffices, so overwrite + these unreliable fields. */ + tziKey.standardBias = tziReg.standardBias; + tziKey.daylightBias = tziReg.daylightBias; + + if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) { + if (firstMatch < 0) { + firstMatch = j; + } + + lastMatch = j; + } + } + } + + /* This should never happen; if it does it means our table doesn't + match Windows AT ALL, perhaps because this is post-XP? */ + if (firstMatch < 0) { + return NULL; + } + + if (firstMatch != lastMatch) { + char stdName[32]; + DWORD stdNameSize; + char stdRegName[64]; + DWORD stdRegNameSize; + + /* Offset+Rules lookup yielded >= 2 matches. Try to match the + localized display name. Get the name from the registry + (not the API). This avoids conversion issues. Use the + standard name, since Windows modifies the daylight name to + match the standard name if there is no DST. */ + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + CURRENT_ZONE_REGKEY, + 0, + KEY_QUERY_VALUE, + &hkey) == ERROR_SUCCESS) + { + stdNameSize = sizeof(stdName); + result = RegQueryValueEx(hkey, + (LPTSTR)STANDARD_NAME_REGKEY, + NULL, + NULL, + (LPBYTE)stdName, + &stdNameSize); + RegCloseKey(hkey); + + /* + * Scan through the Windows time zone data in the registry + * again (just the range of zones with matching TZIs) and + * look for a standard display name match. + */ + for (j = firstMatch; j <= lastMatch; j += 1) { + stdRegNameSize = sizeof(stdRegName); + result = openTZRegKey(&hkey, ZONE_MAP[j].winid); + + if (result == ERROR_SUCCESS) { + result = RegQueryValueEx(hkey, + (LPTSTR)STD_REGKEY, + NULL, + NULL, + (LPBYTE)stdRegName, + &stdRegNameSize); + } + + RegCloseKey(hkey); + + if (result == ERROR_SUCCESS && + stdRegNameSize == stdNameSize && + uprv_memcmp(stdName, stdRegName, stdNameSize) == 0) + { + firstMatch = j; /* record the match */ + break; + } + } + } else { + RegCloseKey(hkey); /* should never get here */ + } + } + + return ZONE_MAP[firstMatch].icuid; +} + +#endif /* #ifdef U_WINDOWS */ diff --git a/Build/source/libs/icu-xetex/common/wintz.h b/Build/source/libs/icu-xetex/common/wintz.h new file mode 100644 index 00000000000..b8af862f38b --- /dev/null +++ b/Build/source/libs/icu-xetex/common/wintz.h @@ -0,0 +1,37 @@ +/* +******************************************************************************** +* Copyright (C) 2005-2006, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************** +* +* File WINTZ.H +* +******************************************************************************** +*/ + +#ifndef __WINTZ +#define __WINTZ + +#include "unicode/utypes.h" + +#ifdef U_WINDOWS + +/** + * \file + * \brief C API: Utilities for dealing w/ Windows time zones. + */ + +U_CDECL_BEGIN +/* Forward declarations for Windows types... */ +typedef struct _TIME_ZONE_INFORMATION TIME_ZONE_INFORMATION; +U_CDECL_END + +U_CAPI UBool U_EXPORT2 +uprv_getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length); + +U_CAPI const char* U_EXPORT2 +uprv_detectWindowsTimeZone(); + +#endif /* #ifdef U_WINDOWS */ + +#endif /* __WINTZ */ |