summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu-xetex/common
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu-xetex/common')
-rw-r--r--Build/source/libs/icu-xetex/common/.cvsignore1
-rw-r--r--Build/source/libs/icu-xetex/common/Makefile.in77
-rw-r--r--Build/source/libs/icu-xetex/common/brkdict.cpp242
-rw-r--r--Build/source/libs/icu-xetex/common/brkdict.h174
-rw-r--r--Build/source/libs/icu-xetex/common/brkeng.cpp230
-rw-r--r--Build/source/libs/icu-xetex/common/brkeng.h265
-rw-r--r--Build/source/libs/icu-xetex/common/brkiter.cpp89
-rw-r--r--Build/source/libs/icu-xetex/common/caniter.cpp216
-rw-r--r--Build/source/libs/icu-xetex/common/common.vcproj100
-rw-r--r--Build/source/libs/icu-xetex/common/cpputils.h20
-rw-r--r--Build/source/libs/icu-xetex/common/dbbi.cpp637
-rw-r--r--Build/source/libs/icu-xetex/common/dbbi_tbl.cpp59
-rw-r--r--Build/source/libs/icu-xetex/common/dbbi_tbl.h90
-rw-r--r--Build/source/libs/icu-xetex/common/dictbe.cpp418
-rw-r--r--Build/source/libs/icu-xetex/common/dictbe.h193
-rw-r--r--Build/source/libs/icu-xetex/common/hash.h50
-rw-r--r--Build/source/libs/icu-xetex/common/localsvc.h25
-rw-r--r--Build/source/libs/icu-xetex/common/locid.cpp13
-rw-r--r--Build/source/libs/icu-xetex/common/locmap.c185
-rw-r--r--Build/source/libs/icu-xetex/common/locutil.cpp4
-rw-r--r--Build/source/libs/icu-xetex/common/putil.c1003
-rw-r--r--Build/source/libs/icu-xetex/common/putilimp.h42
-rw-r--r--Build/source/libs/icu-xetex/common/rbbi.cpp1516
-rw-r--r--Build/source/libs/icu-xetex/common/rbbicst.pl145
-rw-r--r--Build/source/libs/icu-xetex/common/rbbidata.cpp18
-rw-r--r--Build/source/libs/icu-xetex/common/rbbidata.h3
-rw-r--r--Build/source/libs/icu-xetex/common/rbbinode.cpp11
-rw-r--r--Build/source/libs/icu-xetex/common/rbbinode.h11
-rw-r--r--Build/source/libs/icu-xetex/common/rbbirb.h4
-rw-r--r--Build/source/libs/icu-xetex/common/rbbirpt.h96
-rw-r--r--Build/source/libs/icu-xetex/common/rbbiscan.cpp21
-rw-r--r--Build/source/libs/icu-xetex/common/rbbiscan.h10
-rw-r--r--Build/source/libs/icu-xetex/common/rbbisetb.cpp35
-rw-r--r--Build/source/libs/icu-xetex/common/rbbisetb.h8
-rw-r--r--Build/source/libs/icu-xetex/common/rbbistbl.cpp2
-rw-r--r--Build/source/libs/icu-xetex/common/rbbitblb.cpp131
-rw-r--r--Build/source/libs/icu-xetex/common/rbbitblb.h3
-rw-r--r--Build/source/libs/icu-xetex/common/resbund_cnv.cpp5
-rw-r--r--Build/source/libs/icu-xetex/common/ruleiter.h8
-rw-r--r--Build/source/libs/icu-xetex/common/serv.h8
-rw-r--r--Build/source/libs/icu-xetex/common/servnotf.cpp100
-rw-r--r--Build/source/libs/icu-xetex/common/sprpimpl.h4
-rw-r--r--Build/source/libs/icu-xetex/common/triedict.cpp1407
-rw-r--r--Build/source/libs/icu-xetex/common/triedict.h346
-rw-r--r--Build/source/libs/icu-xetex/common/ubidi.c1598
-rw-r--r--Build/source/libs/icu-xetex/common/ubidi_props.c12
-rw-r--r--Build/source/libs/icu-xetex/common/ubidi_props_data.c444
-rw-r--r--Build/source/libs/icu-xetex/common/ubidiimp.h96
-rw-r--r--Build/source/libs/icu-xetex/common/ubidiln.c479
-rw-r--r--Build/source/libs/icu-xetex/common/ubidiwrt.c109
-rw-r--r--Build/source/libs/icu-xetex/common/ubrk.cpp86
-rw-r--r--Build/source/libs/icu-xetex/common/ubrkimpl.h13
-rw-r--r--Build/source/libs/icu-xetex/common/ucase.c128
-rw-r--r--Build/source/libs/icu-xetex/common/ucase.h5
-rw-r--r--Build/source/libs/icu-xetex/common/ucase_props_data.c515
-rw-r--r--Build/source/libs/icu-xetex/common/uchar.c17
-rw-r--r--Build/source/libs/icu-xetex/common/uchar_props_data.c3518
-rw-r--r--Build/source/libs/icu-xetex/common/ucln_cmn.c34
-rw-r--r--Build/source/libs/icu-xetex/common/ucln_cmn.h5
-rw-r--r--Build/source/libs/icu-xetex/common/ucmp8.c572
-rw-r--r--Build/source/libs/icu-xetex/common/ucmp8.h244
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv.c188
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv2022.c158
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_bld.c142
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_bld.h15
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_cb.c130
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_imp.h5
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_io.c495
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_io.h98
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_lmb.c11
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_u16.c51
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_u32.c13
-rw-r--r--Build/source/libs/icu-xetex/common/ucnv_u8.c12
-rw-r--r--Build/source/libs/icu-xetex/common/ucnvhz.c59
-rw-r--r--Build/source/libs/icu-xetex/common/ucnvisci.c91
-rw-r--r--Build/source/libs/icu-xetex/common/ucnvmbcs.c6
-rw-r--r--Build/source/libs/icu-xetex/common/ucnvscsu.c50
-rw-r--r--Build/source/libs/icu-xetex/common/ucol_swp.c87
-rw-r--r--Build/source/libs/icu-xetex/common/udata.c218
-rw-r--r--Build/source/libs/icu-xetex/common/udataswp.h2
-rw-r--r--Build/source/libs/icu-xetex/common/uenumimp.h16
-rw-r--r--Build/source/libs/icu-xetex/common/uhash.c844
-rw-r--r--Build/source/libs/icu-xetex/common/uhash.h73
-rw-r--r--Build/source/libs/icu-xetex/common/uidna.cpp15
-rw-r--r--Build/source/libs/icu-xetex/common/uinit.c31
-rw-r--r--Build/source/libs/icu-xetex/common/uinvchar.c45
-rw-r--r--Build/source/libs/icu-xetex/common/uiter.cpp7
-rw-r--r--Build/source/libs/icu-xetex/common/uloc.c394
-rw-r--r--Build/source/libs/icu-xetex/common/umapfile.c52
-rw-r--r--Build/source/libs/icu-xetex/common/umath.c24
-rw-r--r--Build/source/libs/icu-xetex/common/umutex.c29
-rw-r--r--Build/source/libs/icu-xetex/common/unames.c133
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/brkiter.h165
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/caniter.h6
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/dbbi.h252
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/locid.h16
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/normlzr.h5
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/platform.h.in11
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/ppalmos.h4
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/pwin32.h20
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/rbbi.h179
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/strenum.h19
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/ubidi.h726
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/ubrk.h169
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uchar.h382
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/ucnv.h119
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uconfig.h35
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/udata.h7
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/udeprctd.h48
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/udraft.h506
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uidna.h6
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uintrnal.h68
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uloc.h33
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/umachine.h6
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/umisc.h16
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/unifilt.h5
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uniset.h12
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/unistr.h81
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uobject.h6
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uobslete.h9
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/urename.h3053
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/ures.h228
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uscript.h112
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uset.h75
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/usetiter.h89
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/usprep.h6
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/ustring.h156
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/usystem.h46
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utext.h907
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utf.h16
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utf16.h20
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utf8.h77
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utf_old.h2
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utrace.h6
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/utypes.h29
-rw-r--r--Build/source/libs/icu-xetex/common/unicode/uversion.h20
-rw-r--r--Build/source/libs/icu-xetex/common/uniset.cpp15
-rw-r--r--Build/source/libs/icu-xetex/common/uniset_props.cpp98
-rw-r--r--Build/source/libs/icu-xetex/common/unistr_cnv.cpp481
-rw-r--r--Build/source/libs/icu-xetex/common/unorm.cpp10
-rw-r--r--Build/source/libs/icu-xetex/common/unorm_props_data.c4276
-rw-r--r--Build/source/libs/icu-xetex/common/uprops.c150
-rw-r--r--Build/source/libs/icu-xetex/common/uprops.h30
-rw-r--r--Build/source/libs/icu-xetex/common/ures_cnv.c6
-rw-r--r--Build/source/libs/icu-xetex/common/uresbund.c424
-rw-r--r--Build/source/libs/icu-xetex/common/uresdata.c25
-rw-r--r--Build/source/libs/icu-xetex/common/uresdata.h23
-rw-r--r--Build/source/libs/icu-xetex/common/uresimp.h79
-rw-r--r--Build/source/libs/icu-xetex/common/uscript.c27
-rw-r--r--Build/source/libs/icu-xetex/common/uset.cpp109
-rw-r--r--Build/source/libs/icu-xetex/common/usetiter.cpp24
-rw-r--r--Build/source/libs/icu-xetex/common/ushape.c65
-rw-r--r--Build/source/libs/icu-xetex/common/usprep.cpp46
-rw-r--r--Build/source/libs/icu-xetex/common/ustr_imp.h6
-rw-r--r--Build/source/libs/icu-xetex/common/ustr_wcs.c34
-rw-r--r--Build/source/libs/icu-xetex/common/ustrcase.c78
-rw-r--r--Build/source/libs/icu-xetex/common/ustrenum.cpp12
-rw-r--r--Build/source/libs/icu-xetex/common/ustrfmt.c31
-rw-r--r--Build/source/libs/icu-xetex/common/ustrfmt.h4
-rw-r--r--Build/source/libs/icu-xetex/common/ustrtrns.c920
-rw-r--r--Build/source/libs/icu-xetex/common/utext.cpp2331
-rw-r--r--Build/source/libs/icu-xetex/common/utf_impl.c30
-rw-r--r--Build/source/libs/icu-xetex/common/util.cpp205
-rw-r--r--Build/source/libs/icu-xetex/common/util_props.cpp214
-rw-r--r--Build/source/libs/icu-xetex/common/utrie.c125
-rw-r--r--Build/source/libs/icu-xetex/common/utrie.h53
-rw-r--r--Build/source/libs/icu-xetex/common/utypes.c13
-rw-r--r--Build/source/libs/icu-xetex/common/uvector.h10
-rw-r--r--Build/source/libs/icu-xetex/common/uvectr32.h6
-rw-r--r--Build/source/libs/icu-xetex/common/wintz.c581
-rw-r--r--Build/source/libs/icu-xetex/common/wintz.h37
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 &quot;$(InputPath)&quot; ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy &quot;$(InputPath)&quot; ..\..\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 &quot;$(InputPath)&quot; ..\..\include\unicode
+"
+ Outputs="..\..\include\unicode\$(InputFileName)"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy &quot;$(InputPath)&quot; ..\..\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(&notifyLock);
}
@@ -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(&notifyLock);
- 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(&notifyLock);
+ 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(&notifyLock);
- 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(&notifyLock);
+ 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(&notifyLock);
if (listeners != NULL) {
- for (int i = 0, e = listeners->size(); i < e; ++i) {
- EventListener* el = (EventListener*)listeners->elementAt(i);
- notifyListener(*el);
- }
+ Mutex lmx(&notifyLock);
+ 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: &lt;dictionary&gt;. 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 &lt;dictionary&gt;, 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 */