From ce245810fa5b4f7d6bb9ea4509e9e8d252eba455 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 21 Sep 2017 15:31:38 -0700 Subject: [PATCH] deps: ICU 60 bump - Update to released ICU 60.1, including: - CLDR 32 (many new languages and data improvements) - Unicode 10 (8,518 new characters, including four new scripts, 7,494 new Han characters, and 56 new emoji characters) - UTF-8 malformed bytes now handled according to W3C/WHATWG spec Fixes: https://github.com/nodejs/node/issues/15540 PR-URL: https://github.com/nodejs/node/pull/16876 Reviewed-By: James M Snell Reviewed-By: Michael Dawson --- LICENSE | 2 +- configure | 4 +- deps/icu-small/LICENSE | 2 +- deps/icu-small/README-SMALL-ICU.txt | 4 +- deps/icu-small/source/common/bmpset.cpp | 108 +- deps/icu-small/source/common/bmpset.h | 15 +- deps/icu-small/source/common/brkeng.cpp | 29 +- deps/icu-small/source/common/brkeng.h | 13 +- deps/icu-small/source/common/brkiter.cpp | 23 +- deps/icu-small/source/common/bytesinkutil.cpp | 123 + deps/icu-small/source/common/bytesinkutil.h | 53 + deps/icu-small/source/common/bytestream.cpp | 6 + deps/icu-small/source/common/caniter.cpp | 2 +- deps/icu-small/source/common/cmemory.h | 12 +- deps/icu-small/source/common/dictbe.cpp | 55 +- deps/icu-small/source/common/dictbe.h | 22 +- deps/icu-small/source/common/edits.cpp | 600 +- deps/icu-small/source/common/filteredbrk.cpp | 2 +- .../source/common/filterednormalizer2.cpp | 73 + deps/icu-small/source/common/hash.h | 34 + .../icu-small/source/common/listformatter.cpp | 2 +- .../source/common/loadednormalizer2impl.cpp | 4 +- deps/icu-small/source/common/locavailable.cpp | 6 +- deps/icu-small/source/common/locdispnames.cpp | 8 +- deps/icu-small/source/common/locdspnm.cpp | 5 +- deps/icu-small/source/common/loclikely.cpp | 5 +- deps/icu-small/source/common/locmap.cpp | 70 +- deps/icu-small/source/common/norm2_nfc_data.h | 1866 ++--- deps/icu-small/source/common/norm2allmodes.h | 54 +- deps/icu-small/source/common/normalizer2.cpp | 66 +- .../source/common/normalizer2impl.cpp | 1676 +++-- .../icu-small/source/common/normalizer2impl.h | 304 +- deps/icu-small/source/common/propname_data.h | 1724 ++--- deps/icu-small/source/common/putil.cpp | 137 +- deps/icu-small/source/common/putilimp.h | 33 +- deps/icu-small/source/common/rbbi.cpp | 976 +-- deps/icu-small/source/common/rbbi_cache.cpp | 630 ++ deps/icu-small/source/common/rbbi_cache.h | 203 + deps/icu-small/source/common/rbbicst.pl | 0 deps/icu-small/source/common/rbbidata.cpp | 76 +- deps/icu-small/source/common/rbbidata.h | 17 +- deps/icu-small/source/common/rbbirb.cpp | 66 +- deps/icu-small/source/common/rbbirb.h | 6 + deps/icu-small/source/common/rbbiscan.cpp | 5 + deps/icu-small/source/common/rbbisetb.cpp | 92 +- deps/icu-small/source/common/rbbisetb.h | 13 +- .../source/common/ubidi_props_data.h | 714 +- deps/icu-small/source/common/ucase.cpp | 2 + deps/icu-small/source/common/ucase.h | 12 +- .../source/common/ucase_props_data.h | 597 +- deps/icu-small/source/common/ucasemap.cpp | 527 +- deps/icu-small/source/common/ucasemap_imp.h | 86 +- .../common/ucasemap_titlecase_brkiter.cpp | 49 +- deps/icu-small/source/common/uchar.cpp | 5 +- .../source/common/uchar_props_data.h | 6614 +++++++++-------- .../source/common/ucharstriebuilder.cpp | 2 +- deps/icu-small/source/common/ucln_cmn.h | 2 +- deps/icu-small/source/common/ucnv_ct.cpp | 3 +- deps/icu-small/source/common/ucnv_lmb.cpp | 8 +- deps/icu-small/source/common/ucnv_u16.cpp | 14 +- deps/icu-small/source/common/ucnv_u8.cpp | 324 +- deps/icu-small/source/common/ucnvlat1.cpp | 5 +- deps/icu-small/source/common/ucnvmbcs.cpp | 171 +- deps/icu-small/source/common/ucurr.cpp | 173 +- deps/icu-small/source/common/udata.cpp | 8 +- deps/icu-small/source/common/uhash.cpp | 22 +- deps/icu-small/source/common/uhash.h | 19 + deps/icu-small/source/common/uinvchar.cpp | 4 +- deps/icu-small/source/common/ulist.cpp | 2 +- deps/icu-small/source/common/uloc.cpp | 16 +- deps/icu-small/source/common/uloc_tag.cpp | 6 +- deps/icu-small/source/common/umapfile.cpp | 8 +- deps/icu-small/source/common/umutex.cpp | 2 +- .../icu-small/source/common/unicode/brkiter.h | 24 +- .../source/common/unicode/bytestream.h | 33 +- .../icu-small/source/common/unicode/casemap.h | 177 +- .../source/common/unicode/char16ptr.h | 52 +- .../icu-small/source/common/unicode/docmain.h | 2 +- deps/icu-small/source/common/unicode/edits.h | 195 +- .../source/common/unicode/filteredbrk.h | 42 +- .../source/common/unicode/localpointer.h | 37 - deps/icu-small/source/common/unicode/locid.h | 2 +- .../source/common/unicode/normalizer2.h | 140 +- .../source/common/unicode/platform.h | 69 +- deps/icu-small/source/common/unicode/rbbi.h | 135 +- .../source/common/unicode/simpleformatter.h | 10 + .../source/common/unicode/stringoptions.h | 198 + .../source/common/unicode/stringtriebuilder.h | 18 +- .../source/common/unicode/ubiditransform.h | 31 +- deps/icu-small/source/common/unicode/ubrk.h | 3 +- .../source/common/unicode/ucasemap.h | 53 +- deps/icu-small/source/common/unicode/uchar.h | 80 +- deps/icu-small/source/common/unicode/uclean.h | 2 +- .../icu-small/source/common/unicode/uconfig.h | 9 +- .../source/common/unicode/udisplaycontext.h | 10 +- deps/icu-small/source/common/unicode/unistr.h | 23 +- deps/icu-small/source/common/unicode/unorm.h | 16 +- deps/icu-small/source/common/unicode/unorm2.h | 25 +- .../icu-small/source/common/unicode/urename.h | 3 + .../icu-small/source/common/unicode/uscript.h | 9 +- .../icu-small/source/common/unicode/ustring.h | 10 - deps/icu-small/source/common/unicode/utext.h | 2 +- deps/icu-small/source/common/unicode/utf.h | 34 +- deps/icu-small/source/common/unicode/utf16.h | 132 +- deps/icu-small/source/common/unicode/utf8.h | 148 +- .../icu-small/source/common/unicode/utf_old.h | 19 +- .../icu-small/source/common/unicode/uvernum.h | 15 +- deps/icu-small/source/common/unifiedcache.cpp | 4 +- deps/icu-small/source/common/unifiedcache.h | 2 +- deps/icu-small/source/common/uniset_props.cpp | 21 +- deps/icu-small/source/common/unisetspan.cpp | 21 +- deps/icu-small/source/common/unistr.cpp | 2 - deps/icu-small/source/common/unistr_case.cpp | 22 +- .../common/unistr_titlecase_brkiter.cpp | 36 +- deps/icu-small/source/common/uprops.cpp | 8 + deps/icu-small/source/common/uprops.h | 9 +- deps/icu-small/source/common/uresbund.cpp | 1 + .../icu-small/source/common/uscript_props.cpp | 17 +- deps/icu-small/source/common/ustr_imp.h | 59 + .../source/common/ustr_titlecase_brkiter.cpp | 199 +- deps/icu-small/source/common/ustrcase.cpp | 70 +- deps/icu-small/source/common/ustrtrns.cpp | 669 +- deps/icu-small/source/common/utext.cpp | 16 +- deps/icu-small/source/common/utf_impl.cpp | 283 +- deps/icu-small/source/common/utrie2.cpp | 4 +- deps/icu-small/source/common/utrie2.h | 38 +- deps/icu-small/source/common/uts46.cpp | 14 +- .../data/in/{icudt59l.dat => icudt60l.dat} | Bin 2717856 -> 2710368 bytes .../source/i18n/affixpatternparser.cpp | 14 +- deps/icu-small/source/i18n/anytrans.cpp | 14 +- deps/icu-small/source/i18n/calendar.cpp | 15 +- deps/icu-small/source/i18n/coll.cpp | 2 + .../source/i18n/collationdatareader.cpp | 3 +- .../source/i18n/collationdatawriter.cpp | 2 +- .../source/i18n/collationfastlatinbuilder.cpp | 2 +- deps/icu-small/source/i18n/collationfcd.cpp | 106 +- .../icu-small/source/i18n/collationiterator.h | 19 +- .../source/i18n/collationweights.cpp | 2 +- deps/icu-small/source/i18n/currunit.cpp | 24 +- deps/icu-small/source/i18n/datefmt.cpp | 3 +- deps/icu-small/source/i18n/dayperiodrules.cpp | 2 +- deps/icu-small/source/i18n/dcfmtsym.cpp | 41 +- deps/icu-small/source/i18n/decNumber.cpp | 28 +- deps/icu-small/source/i18n/decfmtst.cpp | 4 +- deps/icu-small/source/i18n/decimfmt.cpp | 24 +- deps/icu-small/source/i18n/decimfmtimpl.cpp | 7 +- deps/icu-small/source/i18n/digitformatter.cpp | 2 +- deps/icu-small/source/i18n/digitlst.cpp | 7 +- deps/icu-small/source/i18n/dtfmtsym.cpp | 22 +- deps/icu-small/source/i18n/dtptngen.cpp | 258 +- deps/icu-small/source/i18n/dtptngen_impl.h | 8 +- deps/icu-small/source/i18n/gregoimp.cpp | 5 + deps/icu-small/source/i18n/gregoimp.h | 11 + deps/icu-small/source/i18n/measfmt.cpp | 47 +- deps/icu-small/source/i18n/measunit.cpp | 153 +- deps/icu-small/source/i18n/msgfmt.cpp | 5 +- deps/icu-small/source/i18n/nfrs.cpp | 13 +- deps/icu-small/source/i18n/nfrs.h | 4 +- deps/icu-small/source/i18n/nfsubs.cpp | 8 +- deps/icu-small/source/i18n/nounit.cpp | 42 + .../source/i18n/number_affixutils.cpp | 403 + .../icu-small/source/i18n/number_affixutils.h | 224 + deps/icu-small/source/i18n/number_compact.cpp | 326 + deps/icu-small/source/i18n/number_compact.h | 91 + .../source/i18n/number_decimalquantity.cpp | 1011 +++ .../source/i18n/number_decimalquantity.h | 438 ++ .../source/i18n/number_decimfmtprops.cpp | 102 + .../source/i18n/number_decimfmtprops.h | 108 + deps/icu-small/source/i18n/number_fluent.cpp | 369 + .../source/i18n/number_formatimpl.cpp | 464 ++ .../icu-small/source/i18n/number_formatimpl.h | 125 + .../icu-small/source/i18n/number_grouping.cpp | 55 + .../source/i18n/number_integerwidth.cpp | 48 + .../source/i18n/number_longnames.cpp | 165 + deps/icu-small/source/i18n/number_longnames.h | 48 + .../source/i18n/number_modifiers.cpp | 303 + deps/icu-small/source/i18n/number_modifiers.h | 254 + .../icu-small/source/i18n/number_notation.cpp | 75 + deps/icu-small/source/i18n/number_padding.cpp | 84 + .../source/i18n/number_patternmodifier.cpp | 351 + .../source/i18n/number_patternmodifier.h | 259 + .../source/i18n/number_patternstring.cpp | 839 +++ .../source/i18n/number_patternstring.h | 266 + .../icu-small/source/i18n/number_rounding.cpp | 347 + .../source/i18n/number_roundingutils.h | 141 + .../source/i18n/number_scientific.cpp | 138 + .../icu-small/source/i18n/number_scientific.h | 62 + .../source/i18n/number_stringbuilder.cpp | 460 ++ .../source/i18n/number_stringbuilder.h | 135 + deps/icu-small/source/i18n/number_types.h | 293 + deps/icu-small/source/i18n/number_utils.h | 130 + deps/icu-small/source/i18n/numfmt.cpp | 18 + deps/icu-small/source/i18n/numsys.cpp | 7 + deps/icu-small/source/i18n/persncal.cpp | 2 +- deps/icu-small/source/i18n/plurrule.cpp | 77 +- deps/icu-small/source/i18n/plurrule_impl.h | 88 +- deps/icu-small/source/i18n/precision.cpp | 4 +- deps/icu-small/source/i18n/rbnf.cpp | 86 +- deps/icu-small/source/i18n/regexcst.pl | 0 deps/icu-small/source/i18n/reldatefmt.cpp | 2 +- deps/icu-small/source/i18n/rematch.cpp | 2 +- deps/icu-small/source/i18n/smpdtfmt.cpp | 30 +- deps/icu-small/source/i18n/transreg.cpp | 153 +- deps/icu-small/source/i18n/transreg.h | 10 +- deps/icu-small/source/i18n/tzfmt.cpp | 45 +- deps/icu-small/source/i18n/tzgnames.cpp | 10 +- deps/icu-small/source/i18n/tznames_impl.cpp | 34 +- deps/icu-small/source/i18n/tznames_impl.h | 5 + deps/icu-small/source/i18n/ucln_in.h | 1 + deps/icu-small/source/i18n/ucol_res.cpp | 10 +- deps/icu-small/source/i18n/ucol_sit.cpp | 11 +- deps/icu-small/source/i18n/umsg.cpp | 6 +- deps/icu-small/source/i18n/unicode/calendar.h | 4 +- deps/icu-small/source/i18n/unicode/coll.h | 4 +- deps/icu-small/source/i18n/unicode/currunit.h | 18 + deps/icu-small/source/i18n/unicode/dcfmtsym.h | 26 +- deps/icu-small/source/i18n/unicode/decimfmt.h | 24 - deps/icu-small/source/i18n/unicode/dtitvinf.h | 2 - deps/icu-small/source/i18n/unicode/dtptngen.h | 37 +- deps/icu-small/source/i18n/unicode/fpositer.h | 12 +- deps/icu-small/source/i18n/unicode/measfmt.h | 4 +- deps/icu-small/source/i18n/unicode/measunit.h | 13 +- deps/icu-small/source/i18n/unicode/nounit.h | 111 + .../source/i18n/unicode/numberformatter.h | 1998 +++++ deps/icu-small/source/i18n/unicode/numfmt.h | 49 +- deps/icu-small/source/i18n/unicode/plurrule.h | 6 +- deps/icu-small/source/i18n/unicode/rbnf.h | 17 +- deps/icu-small/source/i18n/unicode/selfmt.h | 0 deps/icu-small/source/i18n/unicode/smpdtfmt.h | 10 + deps/icu-small/source/i18n/unicode/tznames.h | 6 +- deps/icu-small/source/i18n/unicode/ucoleitr.h | 4 +- deps/icu-small/source/i18n/unicode/unum.h | 13 +- deps/icu-small/source/i18n/unicode/uspoof.h | 49 +- deps/icu-small/source/i18n/unum.cpp | 97 +- deps/icu-small/source/i18n/uspoof.cpp | 8 +- deps/icu-small/source/i18n/uspoof_conf.cpp | 1 + deps/icu-small/source/i18n/uspoof_conf.h | 2 + .../source/i18n/utf8collationiterator.cpp | 68 +- deps/icu-small/source/i18n/vtzone.cpp | 26 +- deps/icu-small/source/i18n/windtfmt.cpp | 6 +- deps/icu-small/source/i18n/winnmfmt.cpp | 8 +- deps/icu-small/source/i18n/wintzimpl.cpp | 28 +- deps/icu-small/source/i18n/zonemeta.cpp | 3 +- .../source/tools/escapesrc/escapesrc.cpp | 9 +- deps/icu-small/source/tools/genrb/parse.cpp | 4 +- deps/icu-small/source/tools/genrb/wrtjava.cpp | 22 +- deps/icu-small/source/tools/genrb/wrtxml.cpp | 5 + .../source/tools/toolutil/package.cpp | 2 +- .../source/tools/toolutil/pkg_genc.cpp | 3 +- .../icu-small/source/tools/toolutil/ppucd.cpp | 43 +- deps/icu-small/source/tools/toolutil/ppucd.h | 7 +- .../source/tools/toolutil/swapimpl.cpp | 1 + .../source/tools/toolutil/uparse.cpp | 4 +- tools/icu/icu-generic.gyp | 1 + 254 files changed, 23876 insertions(+), 10365 deletions(-) create mode 100644 deps/icu-small/source/common/bytesinkutil.cpp create mode 100644 deps/icu-small/source/common/bytesinkutil.h create mode 100644 deps/icu-small/source/common/rbbi_cache.cpp create mode 100644 deps/icu-small/source/common/rbbi_cache.h mode change 100755 => 100644 deps/icu-small/source/common/rbbicst.pl create mode 100644 deps/icu-small/source/common/unicode/stringoptions.h rename deps/icu-small/source/data/in/{icudt59l.dat => icudt60l.dat} (50%) create mode 100644 deps/icu-small/source/i18n/nounit.cpp create mode 100644 deps/icu-small/source/i18n/number_affixutils.cpp create mode 100644 deps/icu-small/source/i18n/number_affixutils.h create mode 100644 deps/icu-small/source/i18n/number_compact.cpp create mode 100644 deps/icu-small/source/i18n/number_compact.h create mode 100644 deps/icu-small/source/i18n/number_decimalquantity.cpp create mode 100644 deps/icu-small/source/i18n/number_decimalquantity.h create mode 100644 deps/icu-small/source/i18n/number_decimfmtprops.cpp create mode 100644 deps/icu-small/source/i18n/number_decimfmtprops.h create mode 100644 deps/icu-small/source/i18n/number_fluent.cpp create mode 100644 deps/icu-small/source/i18n/number_formatimpl.cpp create mode 100644 deps/icu-small/source/i18n/number_formatimpl.h create mode 100644 deps/icu-small/source/i18n/number_grouping.cpp create mode 100644 deps/icu-small/source/i18n/number_integerwidth.cpp create mode 100644 deps/icu-small/source/i18n/number_longnames.cpp create mode 100644 deps/icu-small/source/i18n/number_longnames.h create mode 100644 deps/icu-small/source/i18n/number_modifiers.cpp create mode 100644 deps/icu-small/source/i18n/number_modifiers.h create mode 100644 deps/icu-small/source/i18n/number_notation.cpp create mode 100644 deps/icu-small/source/i18n/number_padding.cpp create mode 100644 deps/icu-small/source/i18n/number_patternmodifier.cpp create mode 100644 deps/icu-small/source/i18n/number_patternmodifier.h create mode 100644 deps/icu-small/source/i18n/number_patternstring.cpp create mode 100644 deps/icu-small/source/i18n/number_patternstring.h create mode 100644 deps/icu-small/source/i18n/number_rounding.cpp create mode 100644 deps/icu-small/source/i18n/number_roundingutils.h create mode 100644 deps/icu-small/source/i18n/number_scientific.cpp create mode 100644 deps/icu-small/source/i18n/number_scientific.h create mode 100644 deps/icu-small/source/i18n/number_stringbuilder.cpp create mode 100644 deps/icu-small/source/i18n/number_stringbuilder.h create mode 100644 deps/icu-small/source/i18n/number_types.h create mode 100644 deps/icu-small/source/i18n/number_utils.h mode change 100755 => 100644 deps/icu-small/source/i18n/regexcst.pl create mode 100644 deps/icu-small/source/i18n/unicode/nounit.h create mode 100644 deps/icu-small/source/i18n/unicode/numberformatter.h mode change 100755 => 100644 deps/icu-small/source/i18n/unicode/selfmt.h diff --git a/LICENSE b/LICENSE index cb37cd1b961ab3..0e897ffbcb43dc 100644 --- a/LICENSE +++ b/LICENSE @@ -231,7 +231,7 @@ The externally maintained libraries used by Node.js are: # ---------COPYING.libtabe ---- BEGIN-------------------- # # /* - # * Copyrighy (c) 1999 TaBE Project. + # * Copyright (c) 1999 TaBE Project. # * Copyright (c) 1999 Pai-Hsiang Hsiao. # * All rights reserved. # * diff --git a/configure b/configure index b81a61045a4086..7939887add4111 100755 --- a/configure +++ b/configure @@ -1114,8 +1114,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir): def configure_intl(o): icus = [ { - 'url': 'https://ssl.icu-project.org/files/icu4c/59.1/icu4c-59_1-src.zip', - 'md5': '29a41f9bb576b06c7eef0487a84a7674', + 'url': 'https://ssl.icu-project.org/files/icu4c/60.1/icu4c-60_1-src.zip', + 'md5': 'e6cb990ac2a3161d31a3def8435f80cb', }, ] def icu_download(path): diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index c5295daeefff12..c84076cd072b80 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -131,7 +131,7 @@ property of their respective owners. # ---------COPYING.libtabe ---- BEGIN-------------------- # # /* - # * Copyrighy (c) 1999 TaBE Project. + # * Copyright (c) 1999 TaBE Project. # * Copyright (c) 1999 Pai-Hsiang Hsiao. # * All rights reserved. # * diff --git a/deps/icu-small/README-SMALL-ICU.txt b/deps/icu-small/README-SMALL-ICU.txt index e1079443d13c26..c6dc0b30515162 100644 --- a/deps/icu-small/README-SMALL-ICU.txt +++ b/deps/icu-small/README-SMALL-ICU.txt @@ -1,8 +1,8 @@ Small ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=small-icu (the default) -It is a strict subset of ICU 59 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt59l.dat : Reduced-size data file +It is a strict subset of ICU 60 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt60l.dat : Reduced-size data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/bmpset.cpp b/deps/icu-small/source/common/bmpset.cpp index 08f9bed0664bb5..f84bfd7f5bfcf1 100644 --- a/deps/icu-small/source/common/bmpset.cpp +++ b/deps/icu-small/source/common/bmpset.cpp @@ -28,7 +28,7 @@ U_NAMESPACE_BEGIN BMPSet::BMPSet(const int32_t *parentList, int32_t parentListLength) : list(parentList), listLength(parentListLength) { - uprv_memset(asciiBytes, 0, sizeof(asciiBytes)); + uprv_memset(latin1Contains, 0, sizeof(latin1Contains)); uprv_memset(table7FF, 0, sizeof(table7FF)); uprv_memset(bmpBlockBits, 0, sizeof(bmpBlockBits)); @@ -45,14 +45,16 @@ BMPSet::BMPSet(const int32_t *parentList, int32_t parentListLength) : list4kStarts[i]=findCodePoint(i<<12, list4kStarts[i-1], listLength-1); } list4kStarts[0x11]=listLength-1; + containsFFFD=containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10]); initBits(); overrideIllegal(); } BMPSet::BMPSet(const BMPSet &otherBMPSet, const int32_t *newParentList, int32_t newParentListLength) : + containsFFFD(otherBMPSet.containsFFFD), list(newParentList), listLength(newParentListLength) { - uprv_memcpy(asciiBytes, otherBMPSet.asciiBytes, sizeof(asciiBytes)); + uprv_memcpy(latin1Contains, otherBMPSet.latin1Contains, sizeof(latin1Contains)); uprv_memcpy(table7FF, otherBMPSet.table7FF, sizeof(table7FF)); uprv_memcpy(bmpBlockBits, otherBMPSet.bmpBlockBits, sizeof(bmpBlockBits)); uprv_memcpy(list4kStarts, otherBMPSet.list4kStarts, sizeof(list4kStarts)); @@ -120,7 +122,7 @@ void BMPSet::initBits() { UChar32 start, limit; int32_t listIndex=0; - // Set asciiBytes[]. + // Set latin1Contains[]. do { start=list[listIndex++]; if(listIndex=0x80) { + if(start>=0x100) { break; } do { - asciiBytes[start++]=1; - } while(start0x80) { + if(start<0x80) { + start=0x80; + } + break; + } + } // Set table7FF[]. while(start<0x800) { @@ -204,19 +223,14 @@ void BMPSet::initBits() { * for faster validity checking at runtime. * No need to set 0 values where they were reset to 0 in the constructor * and not modified by initBits(). - * (asciiBytes[] trail bytes, table7FF[] 0..7F, bmpBlockBits[] 0..7FF) + * (table7FF[] 0..7F, bmpBlockBits[] 0..7FF) * Need to set 0 values for surrogates D800..DFFF. */ void BMPSet::overrideIllegal() { uint32_t bits, mask; int32_t i; - if(containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10])) { - // contains(FFFD)==TRUE - for(i=0x80; i<0xc0; ++i) { - asciiBytes[i]=1; - } - + if(containsFFFD) { bits=3; // Lead bytes 0xC0 and 0xC1. for(i=0; i<64; ++i) { table7FF[i]|=bits; @@ -233,7 +247,6 @@ void BMPSet::overrideIllegal() { bmpBlockBits[i]=(bmpBlockBits[i]&mask)|bits; } } else { - // contains(FFFD)==FALSE mask=~(0x10001<<0xd); // Lead byte 0xED. for(i=32; i<64; ++i) { // Second half of 4k block. bmpBlockBits[i]&=mask; @@ -277,8 +290,8 @@ int32_t BMPSet::findCodePoint(UChar32 c, int32_t lo, int32_t hi) const { UBool BMPSet::contains(UChar32 c) const { - if((uint32_t)c<=0x7f) { - return (UBool)asciiBytes[c]; + if((uint32_t)c<=0xff) { + return (UBool)latin1Contains[c]; } else if((uint32_t)c<=0x7ff) { return (UBool)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0); } else if((uint32_t)c<0xd800 || (c>=0xe000 && c<=0xffff)) { @@ -314,8 +327,8 @@ BMPSet::span(const UChar *s, const UChar *limit, USetSpanCondition spanCondition // span do { c=*s; - if(c<=0x7f) { - if(!asciiBytes[c]) { + if(c<=0xff) { + if(!latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -354,8 +367,8 @@ BMPSet::span(const UChar *s, const UChar *limit, USetSpanCondition spanCondition // span not do { c=*s; - if(c<=0x7f) { - if(asciiBytes[c]) { + if(c<=0xff) { + if(latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -403,8 +416,8 @@ BMPSet::spanBack(const UChar *s, const UChar *limit, USetSpanCondition spanCondi // span for(;;) { c=*(--limit); - if(c<=0x7f) { - if(!asciiBytes[c]) { + if(c<=0xff) { + if(!latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -446,8 +459,8 @@ BMPSet::spanBack(const UChar *s, const UChar *limit, USetSpanCondition spanCondi // span not for(;;) { c=*(--limit); - if(c<=0x7f) { - if(asciiBytes[c]) { + if(c<=0xff) { + if(latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -497,22 +510,22 @@ const uint8_t * BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCondition) const { const uint8_t *limit=s+length; uint8_t b=*s; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { // Initial all-ASCII span. if(spanCondition) { do { - if(!asciiBytes[b] || ++s==limit) { + if(!latin1Contains[b] || ++s==limit) { return s; } b=*s; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } else { do { - if(asciiBytes[b] || ++s==limit) { + if(latin1Contains[b] || ++s==limit) { return s; } b=*s; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } length=(int32_t)(limit-s); } @@ -540,20 +553,20 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi // single trail byte, check for preceding 3- or 4-byte lead byte if(length>=2 && (b=*(limit-2))>=0xe0) { limit-=2; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } else if(b<0xc0 && b>=0x80 && length>=3 && (b=*(limit-3))>=0xf0) { // 4-byte lead byte with only two trail bytes limit-=3; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } } else { // lead byte with no trail bytes --limit; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } @@ -563,26 +576,26 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi while(s=0xc0 && (t1=(uint8_t)(*s-0x80)) <= 0x3f ) { if((USetSpanCondition)((table7FF[t1]&((uint32_t)1<<(b&0x1f)))!=0) != spanCondition) { @@ -642,7 +656,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi // Give an illegal sequence the same value as the result of contains(FFFD). // Handle each byte of an illegal sequence separately to simplify the code; // no need to optimize error handling. - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { return s-1; } } @@ -667,26 +681,26 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon do { b=s[--length]; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { // ASCII sub-span if(spanCondition) { do { - if(!asciiBytes[b]) { + if(!latin1Contains[b]) { return length+1; } else if(length==0) { return 0; } b=s[--length]; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } else { do { - if(asciiBytes[b]) { + if(latin1Contains[b]) { return length+1; } else if(length==0) { return 0; } b=s[--length]; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } } diff --git a/deps/icu-small/source/common/bmpset.h b/deps/icu-small/source/common/bmpset.h index 87375d2cace070..018aeb7f95b078 100644 --- a/deps/icu-small/source/common/bmpset.h +++ b/deps/icu-small/source/common/bmpset.h @@ -28,11 +28,12 @@ U_NAMESPACE_BEGIN * Helper class for frozen UnicodeSets, implements contains() and span() * optimized for BMP code points. Structured to be UTF-8-friendly. * - * ASCII: Look up bytes. + * Latin-1: Look up bytes. * 2-byte characters: Bits organized vertically. * 3-byte characters: Use zero/one/mixed data per 64-block in U+0000..U+FFFF, * with mixed for illegal ranges. - * Supplementary characters: Call contains() on the parent set. + * Supplementary characters: Binary search over + * the supplementary part of the parent set's inversion list. */ class BMPSet : public UMemory { public: @@ -96,12 +97,12 @@ class BMPSet : public UMemory { inline UBool containsSlow(UChar32 c, int32_t lo, int32_t hi) const; /* - * One byte per ASCII character, or trail byte in lead position. - * 0 or 1 for ASCII characters. - * The value for trail bytes is the result of contains(FFFD) - * for faster validity checking at runtime. + * One byte 0 or 1 per Latin-1 character. */ - UBool asciiBytes[0xc0]; + UBool latin1Contains[0x100]; + + /* TRUE if contains(U+FFFD). */ + UBool containsFFFD; /* * One bit per code point from U+0000..U+07FF. diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index 354998dac4dd07..da64b3bdef9bbc 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -11,9 +11,6 @@ #if !UCONFIG_NO_BREAK_ITERATION -#include "brkeng.h" -#include "cmemory.h" -#include "dictbe.h" #include "unicode/uchar.h" #include "unicode/uniset.h" #include "unicode/chariter.h" @@ -24,6 +21,10 @@ #include "unicode/uscript.h" #include "unicode/ucharstrie.h" #include "unicode/bytestrie.h" + +#include "brkeng.h" +#include "cmemory.h" +#include "dictbe.h" #include "charstr.h" #include "dictionarydata.h" #include "mutex.h" @@ -80,23 +81,15 @@ UnhandledEngine::handles(UChar32 c, int32_t breakType) const { int32_t UnhandledEngine::findBreaks( UText *text, - int32_t startPos, - int32_t endPos, - UBool reverse, - int32_t breakType, - UStack &/*foundBreaks*/ ) const { + int32_t /* startPos */, + int32_t endPos, + int32_t breakType, + UVector32 &/*foundBreaks*/ ) const { if (breakType >= 0 && breakType < UPRV_LENGTHOF(fHandled)) { 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); - } + 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; diff --git a/deps/icu-small/source/common/brkeng.h b/deps/icu-small/source/common/brkeng.h index ccb95320d25e55..5c61d2ed5d5d70 100644 --- a/deps/icu-small/source/common/brkeng.h +++ b/deps/icu-small/source/common/brkeng.h @@ -19,6 +19,7 @@ U_NAMESPACE_BEGIN class UnicodeSet; class UStack; +class UVector32; class DictionaryMatcher; /******************************************************************* @@ -67,18 +68,15 @@ class LanguageBreakEngine : public UMemory { * 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 + * @param foundBreaks A Vector of int32_t to receive the breaks. * @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; + UVector32 &foundBreaks ) const = 0; }; @@ -192,8 +190,6 @@ class UnhandledEngine : public LanguageBreakEngine { * 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. @@ -201,9 +197,8 @@ class UnhandledEngine : public LanguageBreakEngine { virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; /** *

Tell the engine to handle a particular character and break type.

diff --git a/deps/icu-small/source/common/brkiter.cpp b/deps/icu-small/source/common/brkiter.cpp index e2904b0544cb07..a509ff10c946ec 100644 --- a/deps/icu-small/source/common/brkiter.cpp +++ b/deps/icu-small/source/common/brkiter.cpp @@ -195,7 +195,7 @@ BreakIterator::getAvailableLocales(int32_t& count) // ------------------------------------------ // -// Default constructor and destructor +// Constructors, destructor and assignment operator // //------------------------------------------- @@ -204,6 +204,19 @@ BreakIterator::BreakIterator() *validLocale = *actualLocale = 0; } +BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) { + uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); + uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); +} + +BreakIterator &BreakIterator::operator =(const BreakIterator &other) { + if (this != &other) { + uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); + uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); + } + return *this; +} + BreakIterator::~BreakIterator() { } @@ -265,7 +278,7 @@ ICUBreakIteratorService::~ICUBreakIteratorService() {} // defined in ucln_cmn.h U_NAMESPACE_END -static icu::UInitOnce gInitOnce; +static icu::UInitOnce gInitOnceBrkiter; static icu::ICULocaleService* gService = NULL; @@ -280,7 +293,7 @@ static UBool U_CALLCONV breakiterator_cleanup(void) { delete gService; gService = NULL; } - gInitOnce.reset(); + gInitOnceBrkiter.reset(); #endif return TRUE; } @@ -296,7 +309,7 @@ initService(void) { static ICULocaleService* getService(void) { - umtx_initOnce(gInitOnce, &initService); + umtx_initOnce(gInitOnceBrkiter, &initService); return gService; } @@ -306,7 +319,7 @@ getService(void) static inline UBool hasService(void) { - return !gInitOnce.isReset() && getService() != NULL; + return !gInitOnceBrkiter.isReset() && getService() != NULL; } // ------------------------------------- diff --git a/deps/icu-small/source/common/bytesinkutil.cpp b/deps/icu-small/source/common/bytesinkutil.cpp new file mode 100644 index 00000000000000..bf1a2d45f8ae5a --- /dev/null +++ b/deps/icu-small/source/common/bytesinkutil.cpp @@ -0,0 +1,123 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// bytesinkutil.cpp +// created: 2017sep14 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/bytestream.h" +#include "unicode/edits.h" +#include "unicode/stringoptions.h" +#include "unicode/utf8.h" +#include "unicode/utf16.h" +#include "bytesinkutil.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +UBool +ByteSinkUtil::appendChange(int32_t length, const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + char scratch[200]; + int32_t s8Length = 0; + for (int32_t i = 0; i < s16Length;) { + int32_t capacity; + int32_t desiredCapacity = s16Length - i; + if (desiredCapacity < (INT32_MAX / 3)) { + desiredCapacity *= 3; // max 3 UTF-8 bytes per UTF-16 code unit + } else if (desiredCapacity < (INT32_MAX / 2)) { + desiredCapacity *= 2; + } else { + desiredCapacity = INT32_MAX; + } + char *buffer = sink.GetAppendBuffer(U8_MAX_LENGTH, desiredCapacity, + scratch, UPRV_LENGTHOF(scratch), &capacity); + capacity -= U8_MAX_LENGTH - 1; + int32_t j = 0; + for (; i < s16Length && j < capacity;) { + UChar32 c; + U16_NEXT_UNSAFE(s16, i, c); + U8_APPEND_UNSAFE(buffer, j, c); + } + if (j > (INT32_MAX - s8Length)) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + sink.Append(buffer, j); + s8Length += j; + } + if (edits != nullptr) { + edits->addReplace(length, s8Length); + } + return TRUE; +} + +UBool +ByteSinkUtil::appendChange(const uint8_t *s, const uint8_t *limit, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((limit - s) > INT32_MAX) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + return appendChange((int32_t)(limit - s), s16, s16Length, sink, edits, errorCode); +} + +void +ByteSinkUtil::appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits) { + char s8[U8_MAX_LENGTH]; + int32_t s8Length = 0; + U8_APPEND_UNSAFE(s8, s8Length, c); + if (edits != nullptr) { + edits->addReplace(length, s8Length); + } + sink.Append(s8, s8Length); +} + +namespace { + +// See unicode/utf8.h U8_APPEND_UNSAFE(). +inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } + +} // namespace + +void +ByteSinkUtil::appendTwoBytes(UChar32 c, ByteSink &sink) { + U_ASSERT(0x80 <= c && c <= 0x7ff); // 2-byte UTF-8 + char s8[2] = { (char)getTwoByteLead(c), (char)getTwoByteTrail(c) }; + sink.Append(s8, 2); +} + +UBool +ByteSinkUtil::appendUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if (length > 0) { + if (edits != nullptr) { + edits->addUnchanged(length); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(reinterpret_cast(s), length); + } + } + return TRUE; +} + +UBool +ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((limit - s) > INT32_MAX) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + return appendUnchanged(s, (int32_t)(limit - s), sink, options, edits, errorCode); +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/bytesinkutil.h b/deps/icu-small/source/common/bytesinkutil.h new file mode 100644 index 00000000000000..004b49c4ce62ea --- /dev/null +++ b/deps/icu-small/source/common/bytesinkutil.h @@ -0,0 +1,53 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// bytesinkutil.h +// created: 2017sep14 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/bytestream.h" +#include "unicode/edits.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +class ByteSink; +class Edits; + +class U_COMMON_API ByteSinkUtil { +public: + ByteSinkUtil() = delete; // all static + + /** (length) bytes were mapped to valid (s16, s16Length). */ + static UBool appendChange(int32_t length, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode); + + /** The bytes at [s, limit[ were mapped to valid (s16, s16Length). */ + static UBool appendChange(const uint8_t *s, const uint8_t *limit, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode); + + /** (length) bytes were mapped/changed to valid code point c. */ + static void appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits = nullptr); + + /** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */ + static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c, + ByteSink &sink, Edits *edits = nullptr) { + appendCodePoint((int32_t)(nextSrc - src), c, sink, edits); + } + + /** Append the two-byte character (U+0080..U+07FF). */ + static void appendTwoBytes(UChar32 c, ByteSink &sink); + + static UBool appendUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode); + + static UBool appendUnchanged(const uint8_t *s, const uint8_t *limit, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode); +}; + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/bytestream.cpp b/deps/icu-small/source/common/bytestream.cpp index bfd7bded714d91..0d0e4dda39b088 100644 --- a/deps/icu-small/source/common/bytestream.cpp +++ b/deps/icu-small/source/common/bytestream.cpp @@ -45,6 +45,12 @@ void CheckedArrayByteSink::Append(const char* bytes, int32_t n) { if (n <= 0) { return; } + if (n > (INT32_MAX - appended_)) { + // TODO: Report as integer overflow, not merely buffer overflow. + appended_ = INT32_MAX; + overflowed_ = TRUE; + return; + } appended_ += n; int32_t available = capacity_ - size_; if (n > available) { diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index eea0398d12f1f4..d57c64247fc591 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -405,7 +405,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i //String[] finalResult = new String[result.size()]; UnicodeString *finalResult = NULL; int32_t resultCount; - if((resultCount = result.count())) { + if((resultCount = result.count()) != 0) { finalResult = new UnicodeString[resultCount]; if (finalResult == 0) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index c77b8268675dd3..83a0129651e468 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -162,7 +162,6 @@ class LocalMemory : public LocalPointerBase { * @param p simple pointer to an array of T items that is adopted */ explicit LocalMemory(T *p=NULL) : LocalPointerBase(p) {} -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -170,14 +169,12 @@ class LocalMemory : public LocalPointerBase { LocalMemory(LocalMemory &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the memory it owns. */ ~LocalMemory() { uprv_free(LocalPointerBase::ptr); } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -187,7 +184,6 @@ class LocalMemory : public LocalPointerBase { LocalMemory &operator=(LocalMemory &&src) U_NOEXCEPT { return moveFrom(src); } -#endif /** * Move assignment, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -312,6 +308,14 @@ class MaybeStackArray { * Default constructor initializes with internal T[stackCapacity] buffer. */ MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(FALSE) {} + /** + * Automatically allocates the heap array if the argument is larger than the stack capacity. + * Intended for use when an approximate capacity is known at compile time but the true + * capacity is not known until runtime. + */ + MaybeStackArray(int32_t newCapacity) : MaybeStackArray() { + if (capacity < newCapacity) { resize(newCapacity); } + }; /** * Destructor deletes the array (if owned). */ diff --git a/deps/icu-small/source/common/dictbe.cpp b/deps/icu-small/source/common/dictbe.cpp index 6c0413a31b9a5c..02fc8a4726cf21 100644 --- a/deps/icu-small/source/common/dictbe.cpp +++ b/deps/icu-small/source/common/dictbe.cpp @@ -46,9 +46,9 @@ int32_t DictionaryBreakEngine::findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { + (void)startPos; // TODO: remove this param? int32_t result = 0; // Find the span of characters included in the set. @@ -60,34 +60,12 @@ DictionaryBreakEngine::findBreaks( UText *text, 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); - } - if (current < startPos) { - rangeStart = startPos; - } else { - rangeStart = current; - if (!isDict) { - utext_next32(text); - rangeStart = (int32_t)utext_getNativeIndex(text); - } - } - // rangeEnd = start + 1; - utext_setNativeIndex(text, start); - utext_next32(text); - rangeEnd = (int32_t)utext_getNativeIndex(text); - } - 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; + 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); @@ -248,7 +226,7 @@ int32_t ThaiBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { utext_setNativeIndex(text, rangeStart); utext_moveIndex32(text, THAI_MIN_WORD_SPAN); if (utext_getNativeIndex(text) >= rangeEnd) { @@ -487,7 +465,7 @@ int32_t LaoBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < LAO_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -680,7 +658,7 @@ int32_t BurmeseBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < BURMESE_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -885,7 +863,7 @@ int32_t KhmerBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -1110,9 +1088,9 @@ static inline uint32_t getKatakanaCost(int32_t wordLength){ return (wordLength > kMaxKatakanaLength) ? 8192 : katakanaCost[wordLength]; } -static inline bool isKatakana(uint16_t value) { - return (value >= 0x30A1u && value <= 0x30FEu && value != 0x30FBu) || - (value >= 0xFF66u && value <= 0xFF9fu); +static inline bool isKatakana(UChar32 value) { + return (value >= 0x30A1 && value <= 0x30FE && value != 0x30FB) || + (value >= 0xFF66 && value <= 0xFF9f); } @@ -1128,14 +1106,14 @@ static inline int32_t utext_i32_flag(int32_t bitIndex) { * @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 + * @param foundBreaks vector to receive the break positions * @return The number of breaks found */ int32_t CjkBreakEngine::divideUpDictionaryRange( UText *inText, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if (rangeStart >= rangeEnd) { return 0; } @@ -1405,6 +1383,7 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, prevCPPos = cpPos; prevUTextPos = utextPos; } + (void)prevCPPos; // suppress compiler warnings about unused variable // inString goes out of scope // inputMap goes out of scope diff --git a/deps/icu-small/source/common/dictbe.h b/deps/icu-small/source/common/dictbe.h index 088bcb788d7a8e..ffc1ae9f269236 100644 --- a/deps/icu-small/source/common/dictbe.h +++ b/deps/icu-small/source/common/dictbe.h @@ -15,6 +15,7 @@ #include "unicode/utext.h" #include "brkeng.h" +#include "uvectr32.h" U_NAMESPACE_BEGIN @@ -84,21 +85,18 @@ class DictionaryBreakEngine : public LanguageBreakEngine { * * @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 - * that starts from the first (or last) character in the range. + * that starts from the first character in the range. * @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 + * @param foundBreaks vector of int32_t to receive the break positions * @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; + UVector32 &foundBreaks ) const; protected: @@ -128,7 +126,7 @@ class DictionaryBreakEngine : public LanguageBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const = 0; + UVector32 &foundBreaks ) const = 0; }; @@ -185,7 +183,7 @@ class ThaiBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -241,7 +239,7 @@ class LaoBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -297,7 +295,7 @@ class BurmeseBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -353,7 +351,7 @@ class KhmerBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -417,7 +415,7 @@ class CjkBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; diff --git a/deps/icu-small/source/common/edits.cpp b/deps/icu-small/source/common/edits.cpp index 58a70d5c92796e..9ec005624fef0c 100644 --- a/deps/icu-small/source/common/edits.cpp +++ b/deps/icu-small/source/common/edits.cpp @@ -17,10 +17,10 @@ namespace { const int32_t MAX_UNCHANGED_LENGTH = 0x1000; const int32_t MAX_UNCHANGED = MAX_UNCHANGED_LENGTH - 1; -// 0wwwcccccccccccc with w=1..6 records ccc+1 replacements of w:w text units. -// No length change. -const int32_t MAX_SHORT_WIDTH = 6; -const int32_t MAX_SHORT_CHANGE_LENGTH = 0xfff; +// 0mmmnnnccccccccc with m=1..6 records ccc+1 replacements of m:n text units. +const int32_t MAX_SHORT_CHANGE_OLD_LENGTH = 6; +const int32_t MAX_SHORT_CHANGE_NEW_LENGTH = 7; +const int32_t SHORT_CHANGE_NUM_MASK = 0x1ff; const int32_t MAX_SHORT_CHANGE = 0x6fff; // 0111mmmmmmnnnnnn records a replacement of m text units with n. @@ -33,20 +33,85 @@ const int32_t LENGTH_IN_2TRAIL = 62; } // namespace -Edits::~Edits() { - if(array != stackArray) { +void Edits::releaseArray() U_NOEXCEPT { + if (array != stackArray) { uprv_free(array); } } -void Edits::reset() { - length = delta = 0; +Edits &Edits::copyArray(const Edits &other) { + if (U_FAILURE(errorCode_)) { + length = delta = numChanges = 0; + return *this; + } + if (length > capacity) { + uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)length * 2); + if (newArray == nullptr) { + length = delta = numChanges = 0; + errorCode_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + releaseArray(); + array = newArray; + capacity = length; + } + if (length > 0) { + uprv_memcpy(array, other.array, (size_t)length * 2); + } + return *this; +} + +Edits &Edits::moveArray(Edits &src) U_NOEXCEPT { + if (U_FAILURE(errorCode_)) { + length = delta = numChanges = 0; + return *this; + } + releaseArray(); + if (length > STACK_CAPACITY) { + array = src.array; + capacity = src.capacity; + src.array = src.stackArray; + src.capacity = STACK_CAPACITY; + src.reset(); + return *this; + } + array = stackArray; + capacity = STACK_CAPACITY; + if (length > 0) { + uprv_memcpy(array, src.array, (size_t)length * 2); + } + return *this; +} + +Edits &Edits::operator=(const Edits &other) { + length = other.length; + delta = other.delta; + numChanges = other.numChanges; + errorCode_ = other.errorCode_; + return copyArray(other); +} + +Edits &Edits::operator=(Edits &&src) U_NOEXCEPT { + length = src.length; + delta = src.delta; + numChanges = src.numChanges; + errorCode_ = src.errorCode_; + return moveArray(src); +} + +Edits::~Edits() { + releaseArray(); +} + +void Edits::reset() U_NOEXCEPT { + length = delta = numChanges = 0; + errorCode_ = U_ZERO_ERROR; } void Edits::addUnchanged(int32_t unchangedLength) { - if(U_FAILURE(errorCode) || unchangedLength == 0) { return; } + if(U_FAILURE(errorCode_) || unchangedLength == 0) { return; } if(unchangedLength < 0) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; + errorCode_ = U_ILLEGAL_ARGUMENT_ERROR; return; } // Merge into previous unchanged-text record, if any. @@ -72,38 +137,41 @@ void Edits::addUnchanged(int32_t unchangedLength) { } void Edits::addReplace(int32_t oldLength, int32_t newLength) { - if(U_FAILURE(errorCode)) { return; } - if(oldLength == newLength && 0 < oldLength && oldLength <= MAX_SHORT_WIDTH) { - // Replacement of short oldLength text units by same-length new text. - // Merge into previous short-replacement record, if any. - int32_t last = lastUnit(); - if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE && - (last >> 12) == oldLength && (last & 0xfff) < MAX_SHORT_CHANGE_LENGTH) { - setLastUnit(last + 1); - return; - } - append(oldLength << 12); - return; - } - + if(U_FAILURE(errorCode_)) { return; } if(oldLength < 0 || newLength < 0) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; + errorCode_ = U_ILLEGAL_ARGUMENT_ERROR; return; } if (oldLength == 0 && newLength == 0) { return; } + ++numChanges; int32_t newDelta = newLength - oldLength; if (newDelta != 0) { if ((newDelta > 0 && delta >= 0 && newDelta > (INT32_MAX - delta)) || (newDelta < 0 && delta < 0 && newDelta < (INT32_MIN - delta))) { // Integer overflow or underflow. - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return; } delta += newDelta; } + if(0 < oldLength && oldLength <= MAX_SHORT_CHANGE_OLD_LENGTH && + newLength <= MAX_SHORT_CHANGE_NEW_LENGTH) { + // Merge into previous same-lengths short-replacement record, if any. + int32_t u = (oldLength << 12) | (newLength << 9); + int32_t last = lastUnit(); + if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE && + (last & ~SHORT_CHANGE_NUM_MASK) == u && + (last & SHORT_CHANGE_NUM_MASK) < SHORT_CHANGE_NUM_MASK) { + setLastUnit(last + 1); + return; + } + append(u); + return; + } + int32_t head = 0x7000; if (oldLength < LENGTH_IN_1TRAIL && newLength < LENGTH_IN_1TRAIL) { head |= oldLength << 6; @@ -149,7 +217,7 @@ UBool Edits::growArray() { } else if (capacity == INT32_MAX) { // Not U_BUFFER_OVERFLOW_ERROR because that could be confused on a string transform API // with a result-string-buffer overflow. - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return FALSE; } else if (capacity >= (INT32_MAX / 2)) { newCapacity = INT32_MAX; @@ -158,18 +226,16 @@ UBool Edits::growArray() { } // Grow by at least 5 units so that a maximal change record will fit. if ((newCapacity - capacity) < 5) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return FALSE; } uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)newCapacity * 2); if (newArray == NULL) { - errorCode = U_MEMORY_ALLOCATION_ERROR; + errorCode_ = U_MEMORY_ALLOCATION_ERROR; return FALSE; } uprv_memcpy(newArray, array, (size_t)length * 2); - if (array != stackArray) { - uprv_free(array); - } + releaseArray(); array = newArray; capacity = newCapacity; return TRUE; @@ -177,27 +243,161 @@ UBool Edits::growArray() { UBool Edits::copyErrorTo(UErrorCode &outErrorCode) { if (U_FAILURE(outErrorCode)) { return TRUE; } - if (U_SUCCESS(errorCode)) { return FALSE; } - outErrorCode = errorCode; + if (U_SUCCESS(errorCode_)) { return FALSE; } + outErrorCode = errorCode_; return TRUE; } -UBool Edits::hasChanges() const { - if (delta != 0) { - return TRUE; - } - for (int32_t i = 0; i < length; ++i) { - if (array[i] > MAX_UNCHANGED) { - return TRUE; +Edits &Edits::mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode) { + if (copyErrorTo(errorCode)) { return *this; } + // Picture string a --(Edits ab)--> string b --(Edits bc)--> string c. + // Parallel iteration over both Edits. + Iterator abIter = ab.getFineIterator(); + Iterator bcIter = bc.getFineIterator(); + UBool abHasNext = TRUE, bcHasNext = TRUE; + // Copy iterator state into local variables, so that we can modify and subdivide spans. + // ab old & new length, bc old & new length + int32_t aLength = 0, ab_bLength = 0, bc_bLength = 0, cLength = 0; + // When we have different-intermediate-length changes, we accumulate a larger change. + int32_t pending_aLength = 0, pending_cLength = 0; + for (;;) { + // At this point, for each of the two iterators: + // Either we are done with the locally cached current edit, + // and its intermediate-string length has been reset, + // or we will continue to work with a truncated remainder of this edit. + // + // If the current edit is done, and the iterator has not yet reached the end, + // then we fetch the next edit. This is true for at least one of the iterators. + // + // Normally it does not matter whether we fetch from ab and then bc or vice versa. + // However, the result is observably different when + // ab deletions meet bc insertions at the same intermediate-string index. + // Some users expect the bc insertions to come first, so we fetch from bc first. + if (bc_bLength == 0) { + if (bcHasNext && (bcHasNext = bcIter.next(errorCode))) { + bc_bLength = bcIter.oldLength(); + cLength = bcIter.newLength(); + if (bc_bLength == 0) { + // insertion + if (ab_bLength == 0 || !abIter.hasChange()) { + addReplace(pending_aLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + } else { + pending_cLength += cLength; + } + continue; + } + } + // else see if the other iterator is done, too. + } + if (ab_bLength == 0) { + if (abHasNext && (abHasNext = abIter.next(errorCode))) { + aLength = abIter.oldLength(); + ab_bLength = abIter.newLength(); + if (ab_bLength == 0) { + // deletion + if (bc_bLength == bcIter.oldLength() || !bcIter.hasChange()) { + addReplace(pending_aLength + aLength, pending_cLength); + pending_aLength = pending_cLength = 0; + } else { + pending_aLength += aLength; + } + continue; + } + } else if (bc_bLength == 0) { + // Both iterators are done at the same time: + // The intermediate-string lengths match. + break; + } else { + // The ab output string is shorter than the bc input string. + if (!copyErrorTo(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; + } + } + if (bc_bLength == 0) { + // The bc input string is shorter than the ab output string. + if (!copyErrorTo(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; + } + // Done fetching: ab_bLength > 0 && bc_bLength > 0 + + // The current state has two parts: + // - Past: We accumulate a longer ac edit in the "pending" variables. + // - Current: We have copies of the current ab/bc edits in local variables. + // At least one side is newly fetched. + // One side might be a truncated remainder of an edit we fetched earlier. + + if (!abIter.hasChange() && !bcIter.hasChange()) { + // An unchanged span all the way from string a to string c. + if (pending_aLength != 0 || pending_cLength != 0) { + addReplace(pending_aLength, pending_cLength); + pending_aLength = pending_cLength = 0; + } + int32_t unchangedLength = aLength <= cLength ? aLength : cLength; + addUnchanged(unchangedLength); + ab_bLength = aLength -= unchangedLength; + bc_bLength = cLength -= unchangedLength; + // At least one of the unchanged spans is now empty. + continue; + } + if (!abIter.hasChange() && bcIter.hasChange()) { + // Unchanged a->b but changed b->c. + if (ab_bLength >= bc_bLength) { + // Split the longer unchanged span into change + remainder. + addReplace(pending_aLength + bc_bLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + aLength = ab_bLength -= bc_bLength; + bc_bLength = 0; + continue; + } + // Handle the shorter unchanged span below like a change. + } else if (abIter.hasChange() && !bcIter.hasChange()) { + // Changed a->b and then unchanged b->c. + if (ab_bLength <= bc_bLength) { + // Split the longer unchanged span into change + remainder. + addReplace(pending_aLength + aLength, pending_cLength + ab_bLength); + pending_aLength = pending_cLength = 0; + cLength = bc_bLength -= ab_bLength; + ab_bLength = 0; + continue; + } + // Handle the shorter unchanged span below like a change. + } else { // both abIter.hasChange() && bcIter.hasChange() + if (ab_bLength == bc_bLength) { + // Changes on both sides up to the same position. Emit & reset. + addReplace(pending_aLength + aLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + ab_bLength = bc_bLength = 0; + continue; + } + } + // Accumulate the a->c change, reset the shorter side, + // keep a remainder of the longer one. + pending_aLength += aLength; + pending_cLength += cLength; + if (ab_bLength < bc_bLength) { + bc_bLength -= ab_bLength; + cLength = ab_bLength = 0; + } else { // ab_bLength > bc_bLength + ab_bLength -= bc_bLength; + aLength = bc_bLength = 0; } } - return FALSE; + if (pending_aLength != 0 || pending_cLength != 0) { + addReplace(pending_aLength, pending_cLength); + } + copyErrorTo(errorCode); + return *this; } Edits::Iterator::Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs) : array(a), index(0), length(len), remaining(0), onlyChanges_(oc), coarse(crs), - changed(FALSE), oldLength_(0), newLength_(0), + dir(0), changed(FALSE), oldLength_(0), newLength_(0), srcIndex(0), replIndex(0), destIndex(0) {} int32_t Edits::Iterator::readLength(int32_t head) { @@ -219,7 +419,7 @@ int32_t Edits::Iterator::readLength(int32_t head) { } } -void Edits::Iterator::updateIndexes() { +void Edits::Iterator::updateNextIndexes() { srcIndex += oldLength_; if (changed) { replIndex += newLength_; @@ -227,22 +427,52 @@ void Edits::Iterator::updateIndexes() { destIndex += newLength_; } +void Edits::Iterator::updatePreviousIndexes() { + srcIndex -= oldLength_; + if (changed) { + replIndex -= newLength_; + } + destIndex -= newLength_; +} + UBool Edits::Iterator::noNext() { - // No change beyond the string. + // No change before or beyond the string. + dir = 0; changed = FALSE; oldLength_ = newLength_ = 0; return FALSE; } UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { + // Forward iteration: Update the string indexes to the limit of the current span, + // and post-increment-read array units to assemble a new span. + // Leaves the array index one after the last unit of that span. if (U_FAILURE(errorCode)) { return FALSE; } // We have an errorCode in case we need to start guarding against integer overflows. // It is also convenient for caller loops if we bail out when an error was set elsewhere. - updateIndexes(); - if (remaining > 0) { - // Fine-grained iterator: Continue a sequence of equal-length changes. - --remaining; - return TRUE; + if (dir > 0) { + updateNextIndexes(); + } else { + if (dir < 0) { + // Turn around from previous() to next(). + // Post-increment-read the same span again. + if (remaining > 0) { + // Fine-grained iterator: + // Stay on the current one of a sequence of compressed changes. + ++index; // next() rests on the index after the sequence unit. + dir = 1; + return TRUE; + } + } + dir = 1; + } + if (remaining >= 1) { + // Fine-grained iterator: Continue a sequence of compressed changes. + if (remaining > 1) { + --remaining; + return TRUE; + } + remaining = 0; } if (index >= length) { return noNext(); @@ -258,7 +488,7 @@ UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { } newLength_ = oldLength_; if (onlyChanges) { - updateIndexes(); + updateNextIndexes(); if (index >= length) { return noNext(); } @@ -270,14 +500,19 @@ UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { } changed = TRUE; if (u <= MAX_SHORT_CHANGE) { + int32_t oldLen = u >> 12; + int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; if (coarse) { - int32_t w = u >> 12; - int32_t len = (u & 0xfff) + 1; - oldLength_ = newLength_ = len * w; + oldLength_ = num * oldLen; + newLength_ = num * newLen; } else { - // Split a sequence of equal-length changes that was compressed into one unit. - oldLength_ = newLength_ = u >> 12; - remaining = u & 0xfff; + // Split a sequence of changes that was compressed into one unit. + oldLength_ = oldLen; + newLength_ = newLen; + if (num > 1) { + remaining = num; // This is the first of two or more changes. + } return TRUE; } } else { @@ -292,55 +527,250 @@ UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { while (index < length && (u = array[index]) > MAX_UNCHANGED) { ++index; if (u <= MAX_SHORT_CHANGE) { - int32_t w = u >> 12; - int32_t len = (u & 0xfff) + 1; - len = len * w; - oldLength_ += len; - newLength_ += len; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + oldLength_ += (u >> 12) * num; + newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num; } else { U_ASSERT(u <= 0x7fff); - int32_t oldLen = readLength((u >> 6) & 0x3f); - int32_t newLen = readLength(u & 0x3f); - oldLength_ += oldLen; - newLength_ += newLen; + oldLength_ += readLength((u >> 6) & 0x3f); + newLength_ += readLength(u & 0x3f); } } return TRUE; } -UBool Edits::Iterator::findSourceIndex(int32_t i, UErrorCode &errorCode) { - if (U_FAILURE(errorCode) || i < 0) { return FALSE; } - if (i < srcIndex) { +UBool Edits::Iterator::previous(UErrorCode &errorCode) { + // Backward iteration: Pre-decrement-read array units to assemble a new span, + // then update the string indexes to the start of that span. + // Leaves the array index on the head unit of that span. + if (U_FAILURE(errorCode)) { return FALSE; } + // We have an errorCode in case we need to start guarding against integer overflows. + // It is also convenient for caller loops if we bail out when an error was set elsewhere. + if (dir >= 0) { + if (dir > 0) { + // Turn around from next() to previous(). + // Set the string indexes to the span limit and + // pre-decrement-read the same span again. + if (remaining > 0) { + // Fine-grained iterator: + // Stay on the current one of a sequence of compressed changes. + --index; // previous() rests on the sequence unit. + dir = -1; + return TRUE; + } + updateNextIndexes(); + } + dir = -1; + } + if (remaining > 0) { + // Fine-grained iterator: Continue a sequence of compressed changes. + int32_t u = array[index]; + U_ASSERT(MAX_UNCHANGED < u && u <= MAX_SHORT_CHANGE); + if (remaining <= (u & SHORT_CHANGE_NUM_MASK)) { + ++remaining; + updatePreviousIndexes(); + return TRUE; + } + remaining = 0; + } + if (index <= 0) { + return noNext(); + } + int32_t u = array[--index]; + if (u <= MAX_UNCHANGED) { + // Combine adjacent unchanged ranges. + changed = FALSE; + oldLength_ = u + 1; + while (index > 0 && (u = array[index - 1]) <= MAX_UNCHANGED) { + --index; + oldLength_ += u + 1; + } + newLength_ = oldLength_; + // No need to handle onlyChanges as long as previous() is called only from findIndex(). + updatePreviousIndexes(); + return TRUE; + } + changed = TRUE; + if (u <= MAX_SHORT_CHANGE) { + int32_t oldLen = u >> 12; + int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + if (coarse) { + oldLength_ = num * oldLen; + newLength_ = num * newLen; + } else { + // Split a sequence of changes that was compressed into one unit. + oldLength_ = oldLen; + newLength_ = newLen; + if (num > 1) { + remaining = 1; // This is the last of two or more changes. + } + updatePreviousIndexes(); + return TRUE; + } + } else { + if (u <= 0x7fff) { + // The change is encoded in u alone. + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + } else { + // Back up to the head of the change, read the lengths, + // and reset the index to the head again. + U_ASSERT(index > 0); + while ((u = array[--index]) > 0x7fff) {} + U_ASSERT(u > MAX_SHORT_CHANGE); + int32_t headIndex = index++; + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + index = headIndex; + } + if (!coarse) { + updatePreviousIndexes(); + return TRUE; + } + } + // Combine adjacent changes. + while (index > 0 && (u = array[index - 1]) > MAX_UNCHANGED) { + --index; + if (u <= MAX_SHORT_CHANGE) { + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + oldLength_ += (u >> 12) * num; + newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num; + } else if (u <= 0x7fff) { + // Read the lengths, and reset the index to the head again. + int32_t headIndex = index++; + oldLength_ += readLength((u >> 6) & 0x3f); + newLength_ += readLength(u & 0x3f); + index = headIndex; + } + } + updatePreviousIndexes(); + return TRUE; +} + +int32_t Edits::Iterator::findIndex(int32_t i, UBool findSource, UErrorCode &errorCode) { + if (U_FAILURE(errorCode) || i < 0) { return -1; } + int32_t spanStart, spanLength; + if (findSource) { // find source index + spanStart = srcIndex; + spanLength = oldLength_; + } else { // find destination index + spanStart = destIndex; + spanLength = newLength_; + } + if (i < spanStart) { + if (i >= (spanStart / 2)) { + // Search backwards. + for (;;) { + UBool hasPrevious = previous(errorCode); + U_ASSERT(hasPrevious); // because i>=0 and the first span starts at 0 + (void)hasPrevious; // avoid unused-variable warning + spanStart = findSource ? srcIndex : destIndex; + if (i >= spanStart) { + // The index is in the current span. + return 0; + } + if (remaining > 0) { + // Is the index in one of the remaining compressed edits? + // spanStart is the start of the current span, first of the remaining ones. + spanLength = findSource ? oldLength_ : newLength_; + int32_t u = array[index]; + U_ASSERT(MAX_UNCHANGED < u && u <= MAX_SHORT_CHANGE); + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1 - remaining; + int32_t len = num * spanLength; + if (i >= (spanStart - len)) { + int32_t n = ((spanStart - i - 1) / spanLength) + 1; + // 1 <= n <= num + srcIndex -= n * oldLength_; + replIndex -= n * newLength_; + destIndex -= n * newLength_; + remaining += n; + return 0; + } + // Skip all of these edits at once. + srcIndex -= num * oldLength_; + replIndex -= num * newLength_; + destIndex -= num * newLength_; + remaining = 0; + } + } + } // Reset the iterator to the start. + dir = 0; index = remaining = oldLength_ = newLength_ = srcIndex = replIndex = destIndex = 0; - } else if (i < (srcIndex + oldLength_)) { + } else if (i < (spanStart + spanLength)) { // The index is in the current span. - return TRUE; + return 0; } while (next(FALSE, errorCode)) { - if (i < (srcIndex + oldLength_)) { + if (findSource) { + spanStart = srcIndex; + spanLength = oldLength_; + } else { + spanStart = destIndex; + spanLength = newLength_; + } + if (i < (spanStart + spanLength)) { // The index is in the current span. - return TRUE; + return 0; } - if (remaining > 0) { + if (remaining > 1) { // Is the index in one of the remaining compressed edits? - // srcIndex is the start of the current span, before the remaining ones. - int32_t len = (remaining + 1) * oldLength_; - if (i < (srcIndex + len)) { - int32_t n = (i - srcIndex) / oldLength_; // 1 <= n <= remaining - len = n * oldLength_; - srcIndex += len; - replIndex += len; - destIndex += len; + // spanStart is the start of the current span, first of the remaining ones. + int32_t len = remaining * spanLength; + if (i < (spanStart + len)) { + int32_t n = (i - spanStart) / spanLength; // 1 <= n <= remaining - 1 + srcIndex += n * oldLength_; + replIndex += n * newLength_; + destIndex += n * newLength_; remaining -= n; - return TRUE; + return 0; } // Make next() skip all of these edits at once. - oldLength_ = newLength_ = len; + oldLength_ *= remaining; + newLength_ *= remaining; remaining = 0; } } - return FALSE; + return 1; +} + +int32_t Edits::Iterator::destinationIndexFromSourceIndex(int32_t i, UErrorCode &errorCode) { + int32_t where = findIndex(i, TRUE, errorCode); + if (where < 0) { + // Error or before the string. + return 0; + } + if (where > 0 || i == srcIndex) { + // At or after string length, or at start of the found span. + return destIndex; + } + if (changed) { + // In a change span, map to its end. + return destIndex + newLength_; + } else { + // In an unchanged span, offset 1:1 within it. + return destIndex + (i - srcIndex); + } +} + +int32_t Edits::Iterator::sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode) { + int32_t where = findIndex(i, FALSE, errorCode); + if (where < 0) { + // Error or before the string. + return 0; + } + if (where > 0 || i == destIndex) { + // At or after string length, or at start of the found span. + return srcIndex; + } + if (changed) { + // In a change span, map to its end. + return srcIndex + oldLength_; + } else { + // In an unchanged span, offset within it. + return srcIndex + (i - destIndex); + } } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/filteredbrk.cpp b/deps/icu-small/source/common/filteredbrk.cpp index 0f642b19f6c828..6a38b1bf3baf40 100644 --- a/deps/icu-small/source/common/filteredbrk.cpp +++ b/deps/icu-small/source/common/filteredbrk.cpp @@ -694,7 +694,7 @@ FilteredBreakIteratorBuilder::createInstance(const Locale& where, UErrorCode& st } FilteredBreakIteratorBuilder * -FilteredBreakIteratorBuilder::createInstance(UErrorCode& status) { +FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode& status) { if(U_FAILURE(status)) return NULL; LocalPointer ret(new SimpleFilteredBreakIteratorBuilder(status), status); return (U_SUCCESS(status))? ret.orphan(): NULL; diff --git a/deps/icu-small/source/common/filterednormalizer2.cpp b/deps/icu-small/source/common/filterednormalizer2.cpp index 28e5f6cbddefaf..1a0914d3f7b34c 100644 --- a/deps/icu-small/source/common/filterednormalizer2.cpp +++ b/deps/icu-small/source/common/filterednormalizer2.cpp @@ -20,7 +20,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/uniset.h" #include "unicode/unistr.h" #include "unicode/unorm.h" @@ -85,6 +87,52 @@ FilteredNormalizer2::normalize(const UnicodeString &src, return dest; } +void +FilteredNormalizer2::normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + options |= U_EDITS_NO_RESET; // Do not reset for each span. + normalizeUTF8(options, src.data(), src.length(), sink, edits, USET_SPAN_SIMPLE, errorCode); +} + +void +FilteredNormalizer2::normalizeUTF8(uint32_t options, const char *src, int32_t length, + ByteSink &sink, Edits *edits, + USetSpanCondition spanCondition, + UErrorCode &errorCode) const { + while (length > 0) { + int32_t spanLength = set.spanUTF8(src, length, spanCondition); + if (spanCondition == USET_SPAN_NOT_CONTAINED) { + if (spanLength != 0) { + if (edits != nullptr) { + edits->addUnchanged(spanLength); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(src, spanLength); + } + } + spanCondition = USET_SPAN_SIMPLE; + } else { + if (spanLength != 0) { + // Not norm2.normalizeSecondAndAppend() because we do not want + // to modify the non-filter part of dest. + norm2.normalizeUTF8(options, StringPiece(src, spanLength), sink, edits, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + } + spanCondition = USET_SPAN_NOT_CONTAINED; + } + src += spanLength; + length -= spanLength; + } +} + UnicodeString & FilteredNormalizer2::normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, @@ -196,6 +244,31 @@ FilteredNormalizer2::isNormalized(const UnicodeString &s, UErrorCode &errorCode) return TRUE; } +UBool +FilteredNormalizer2::isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + return FALSE; + } + const char *s = sp.data(); + int32_t length = sp.length(); + USetSpanCondition spanCondition = USET_SPAN_SIMPLE; + while (length > 0) { + int32_t spanLength = set.spanUTF8(s, length, spanCondition); + if (spanCondition == USET_SPAN_NOT_CONTAINED) { + spanCondition = USET_SPAN_SIMPLE; + } else { + if (!norm2.isNormalizedUTF8(StringPiece(s, spanLength), errorCode) || + U_FAILURE(errorCode)) { + return FALSE; + } + spanCondition = USET_SPAN_NOT_CONTAINED; + } + s += spanLength; + length -= spanLength; + } + return TRUE; +} + UNormalizationCheckResult FilteredNormalizer2::quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { uprv_checkCanGetBuffer(s, errorCode); diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index 900c8120984e84..cc82ad2454b440 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -33,6 +33,8 @@ class U_COMMON_API Hashtable : public UMemory { inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + inline void initSize(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, int32_t size, UErrorCode& status); + public: /** * Construct a hashtable @@ -41,6 +43,14 @@ class U_COMMON_API Hashtable : public UMemory { */ Hashtable(UBool ignoreKeyCase, UErrorCode& status); + /** + * Construct a hashtable + * @param ignoreKeyCase If true, keys are case insensitive. + * @param size initial size allocation + * @param status Error code + */ + Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); + /** * Construct a hashtable * @param keyComp Comparator for comparing the keys @@ -119,10 +129,23 @@ inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, } } +inline void Hashtable::initSize(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, int32_t size, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + uhash_initSize(&hashObj, keyHash, keyComp, valueComp, size, &status); + if (U_SUCCESS(status)) { + hash = &hashObj; + uhash_setKeyDeleter(hash, uprv_deleteUObject); + } +} + 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) { @@ -134,6 +157,17 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) status); } +inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status) + : hash(0) +{ + initSize(ignoreKeyCase ? uhash_hashCaselessUnicodeString + : uhash_hashUnicodeString, + ignoreKeyCase ? uhash_compareCaselessUnicodeString + : uhash_compareUnicodeString, + NULL, size, + status); +} + inline Hashtable::Hashtable(UErrorCode& status) : hash(0) { diff --git a/deps/icu-small/source/common/listformatter.cpp b/deps/icu-small/source/common/listformatter.cpp index d105654755fd1e..33a8ac28671fc6 100644 --- a/deps/icu-small/source/common/listformatter.cpp +++ b/deps/icu-small/source/common/listformatter.cpp @@ -63,7 +63,7 @@ ListFormatInternal(const ListFormatInternal &other) : static Hashtable* listPatternHash = NULL; static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; -static const char *STANDARD_STYLE = "standard"; +static const char STANDARD_STYLE[] = "standard"; U_CDECL_BEGIN static UBool U_CALLCONV uprv_listformatter_cleanup() { diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index 2b2d9a8e809b04..6fb9b816dc6591 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -62,7 +62,7 @@ LoadedNormalizer2Impl::isAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - pInfo->formatVersion[0]==2 + pInfo->formatVersion[0]==3 ) { // Normalizer2Impl *me=(Normalizer2Impl *)context; // uprv_memcpy(me->dataVersion, pInfo->dataVersion, 4); @@ -84,7 +84,7 @@ LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCod const uint8_t *inBytes=(const uint8_t *)udata_getMemory(memory); const int32_t *inIndexes=(const int32_t *)inBytes; int32_t indexesLength=inIndexes[IX_NORM_TRIE_OFFSET]/4; - if(indexesLength<=IX_MIN_MAYBE_YES) { + if(indexesLength<=IX_MIN_LCCC_CP) { errorCode=U_INVALID_FORMAT_ERROR; // Not enough indexes. return; } diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 5079885936ae32..b3a3346a195995 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN static icu::Locale* availableLocaleList = NULL; static int32_t availableLocaleListCount; -static icu::UInitOnce gInitOnce = U_INITONCE_INITIALIZER; +static icu::UInitOnce gInitOnceLocale = U_INITONCE_INITIALIZER; U_NAMESPACE_END @@ -50,7 +50,7 @@ static UBool U_CALLCONV locale_available_cleanup(void) availableLocaleList = NULL; } availableLocaleListCount = 0; - gInitOnce.reset(); + gInitOnceLocale.reset(); return TRUE; } @@ -81,7 +81,7 @@ void U_CALLCONV locale_available_init() { const Locale* U_EXPORT2 Locale::getAvailableLocales(int32_t& count) { - umtx_initOnce(gInitOnce, &locale_available_init); + umtx_initOnce(gInitOnceLocale, &locale_available_init); count = availableLocaleListCount; return availableLocaleList; } diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index f5cd9a48f333c0..83c7bc30c02703 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -542,7 +542,7 @@ uloc_getDisplayName(const char *locale, return 0; } separator = (const UChar *)p0 + subLen; - sepLen = p1 - separator; + sepLen = static_cast(p1 - separator); } if(patLen==0 || (patLen==defaultPatLen && !u_strncmp(pattern, defaultPattern, patLen))) { @@ -558,8 +558,8 @@ uloc_getDisplayName(const char *locale, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - sub0Pos=p0-pattern; - sub1Pos=p1-pattern; + sub0Pos = static_cast(p0-pattern); + sub1Pos = static_cast(p1-pattern); if (sub1Pos < sub0Pos) { /* a very odd pattern */ int32_t t=sub0Pos; sub0Pos=sub1Pos; sub1Pos=t; langi=1; @@ -821,6 +821,8 @@ uloc_getDisplayKeywordValue( const char* locale, /* get the keyword value */ keywordValue[0]=0; keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status); + if (*status == U_STRING_NOT_TERMINATED_WARNING) + *status = U_BUFFER_OVERFLOW_ERROR; /* * if the keyword is equal to currency .. then to get the display name diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 39934dc6c33020..6ceb6cfc8bc653 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -54,7 +54,7 @@ static int32_t ncat(char *buffer, uint32_t buflen, ...) { *p = 0; va_end(args); - return p - buffer; + return static_cast(p - buffer); } U_NAMESPACE_BEGIN @@ -636,8 +636,9 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; while ((key = e->next((int32_t *)0, status)) != NULL) { + value[0] = 0; locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); - if (U_FAILURE(status)) { + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { return result; } keyDisplayName(key, temp, TRUE); diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index 1fbad9b9ff6e6c..e5876e2ea22773 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -511,7 +511,7 @@ parseTagString( unknownLanguage); *langLength = (int32_t)uprv_strlen(lang); } - else if (_isIDSeparator(*position)) { + if (_isIDSeparator(*position)) { ++position; } @@ -1281,7 +1281,7 @@ uloc_minimizeSubtags(const char* localeID, // Pairs of (language subtag, + or -) for finding out fast if common languages // are LTR (minus) or RTL (plus). -static const char* LANG_DIR_STRING = +static const char LANG_DIR_STRING[] = "root-en-es-pt-zh-ja-ko-de-fr-it-ar+he+fa+ru-nl-pl-th-tr-"; // Implemented here because this calls uloc_addLikelySubtags(). @@ -1383,4 +1383,3 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, uprv_strncpy(region, rgBuf, regionCapacity); return u_terminateChars(region, regionCapacity, rgLen, status); } - diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index 8e47c84b1ee741..029c1edf032a00 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -190,7 +190,10 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY) ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG) -ILCID_POSIX_ELEMENT_ARRAY(0x0466, bin, bin_NG) +ILCID_POSIX_SUBTABLE(bin) { + {0x66, "bin"}, + {0x0466, "bin_NG"} +}; ILCID_POSIX_SUBTABLE(bn) { {0x45, "bn"}, @@ -214,7 +217,13 @@ ILCID_POSIX_SUBTABLE(ca) { }; ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR) -ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) + +ILCID_POSIX_SUBTABLE(chr) { + {0x05c, "chr"}, + {0x7c5c, "chr_Cher"}, + {0x045c, "chr_Cher_US"}, + {0x045c, "chr_US"} +}; // ICU has chosen different names for these. ILCID_POSIX_SUBTABLE(ckb) { @@ -263,10 +272,10 @@ ILCID_POSIX_SUBTABLE(en) { {0x2C09, "en_TT"}, {0x0409, "en_US"}, {0x007f, "en_US_POSIX"}, /* duplicate for round-tripping */ - {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). On Windows8+ This is 0x1000 or dynamically assigned */ + {0x2409, "en_029"}, {0x1c09, "en_ZA"}, {0x3009, "en_ZW"}, - {0x2409, "en_029"}, + {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). On Windows8+ This is 0x1000 or dynamically assigned */ {0x0409, "en_AS"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ {0x0409, "en_GU"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ {0x0409, "en_MH"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ @@ -419,7 +428,12 @@ ILCID_POSIX_SUBTABLE(hsb) { ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU) ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM) -ILCID_POSIX_ELEMENT_ARRAY(0x0469, ibb, ibb_NG) + +ILCID_POSIX_SUBTABLE(ibb) { + {0x69, "ibb"}, + {0x0469, "ibb_NG"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID) ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG) ILCID_POSIX_ELEMENT_ARRAY(0x0478, ii, ii_CN) @@ -458,13 +472,18 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0471, kr, kr_NG) ILCID_POSIX_SUBTABLE(ks) { /* We could add PK and CN too */ {0x60, "ks"}, - {0x0860, "ks_IN"}, /* Documentation doesn't mention script */ {0x0460, "ks_Arab_IN"}, {0x0860, "ks_Deva_IN"} }; 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_SUBTABLE(la) { + {0x76, "la"}, + {0x0476, "la_001"}, + {0x0476, "la_IT"} /*Left in for compatibility*/ +}; + ILCID_POSIX_ELEMENT_ARRAY(0x046e, lb, lb_LU) ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA) ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) @@ -535,15 +554,19 @@ ILCID_POSIX_SUBTABLE(or_IN) { {0x0448, "or_IN"}, }; - ILCID_POSIX_SUBTABLE(pa) { {0x46, "pa"}, {0x0446, "pa_IN"}, - {0x0846, "pa_PK"}, - {0x0846, "pa_Arab_PK"} + {0x0846, "pa_Arab_PK"}, + {0x0846, "pa_PK"} +}; + +ILCID_POSIX_SUBTABLE(pap) { + {0x79, "pap"}, + {0x0479, "pap_029"}, + {0x0479, "pap_AN"} /*Left in for compatibility*/ }; -ILCID_POSIX_ELEMENT_ARRAY(0x0479, pap, pap_AN) ILCID_POSIX_ELEMENT_ARRAY(0x0415, pl, pl_PL) ILCID_POSIX_ELEMENT_ARRAY(0x0463, ps, ps_AF) @@ -619,9 +642,11 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0485, sah,sah_RU) ILCID_POSIX_SUBTABLE(sd) { {0x59, "sd"}, - {0x0459, "sd_IN"}, {0x0459, "sd_Deva_IN"}, - {0x0859, "sd_PK"} + {0x0459, "sd_IN"}, + {0x0859, "sd_Arab_PK"}, + {0x0859, "sd_PK"}, + {0x7c59, "sd_Arab"} }; ILCID_POSIX_SUBTABLE(se) { @@ -645,9 +670,8 @@ ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK) ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK) ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI) -ILCID_POSIX_SUBTABLE(so) { /* TODO: Verify the country */ +ILCID_POSIX_SUBTABLE(so) { {0x77, "so"}, - {0x0477, "so_ET"}, {0x0477, "so_SO"} }; @@ -739,7 +763,12 @@ ILCID_POSIX_SUBTABLE(ve) { /* TODO: Verify the country */ ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN) ILCID_POSIX_ELEMENT_ARRAY(0x0488, wo, wo_SN) ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) -ILCID_POSIX_ELEMENT_ARRAY(0x043d, yi, yi) + +ILCID_POSIX_SUBTABLE(yi) { + {0x003d, "yi"}, + {0x043d, "yi_001"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) // Windows & ICU tend to different names for some of these @@ -1033,6 +1062,8 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr const char *pPosixID = NULL; #ifdef USE_WINDOWS_LCID_MAPPING_API + char locName[LOCALE_NAME_MAX_LENGTH] = {}; // ICU name can't be longer than Windows name + // Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and // GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for // Northern Kurdish and "ckb" for Central Kurdish. For this reason, we cannot @@ -1040,7 +1071,6 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr if ((hostid & 0x3FF) != 0x92) { int32_t tmpLen = 0; UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH - char locName[LOCALE_NAME_MAX_LENGTH]; // ICU name can't be longer than Windows name // Note: LOCALE_ALLOW_NEUTRAL_NAMES was enabled in Windows7+, prior versions did not handle neutral (no-region) locale names. tmpLen = LCIDToLocaleName(hostid, (PWSTR)windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName), LOCALE_ALLOW_NEUTRAL_NAMES); @@ -1102,7 +1132,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr } if (pPosixID) { - int32_t resLen = uprv_strlen(pPosixID); + int32_t resLen = static_cast(uprv_strlen(pPosixID)); int32_t copyLen = resLen <= posixIDCapacity ? resLen : posixIDCapacity; uprv_memcpy(posixID, pPosixID, copyLen); if (resLen < posixIDCapacity) { @@ -1176,7 +1206,7 @@ uprv_convertToLCIDPlatform(const char* localeID) char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form - int32_t bcp47Len = uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); + (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); if (U_SUCCESS(myStatus)) { @@ -1213,6 +1243,8 @@ uprv_convertToLCIDPlatform(const char* localeID) } } } +#else + (void)localeID; // Suppress unused variable warning. #endif /* USE_WINDOWS_LCID_MAPPING_API */ // No found, or not implemented on platforms without native name->lcid conversion diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 9295404a35bac6..8f5c4346db5ffe 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -1,49 +1,50 @@ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: norm2_nfc_data.h - * - * machine-generated by: icu/source/tools/gennorm2/n2builder.cpp - */ +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: norm2_nfc_data.h +// +// machine-generated by: icu/source/tools/gennorm2/n2builder.cpp + #ifdef INCLUDED_FROM_NORMALIZER2_CPP -static const UVersionInfo norm2_nfc_data_formatVersion={2,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={9,0,0,0}; +static const UVersionInfo norm2_nfc_data_formatVersion={3,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0xa,0,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x40,0x4bb8,0x880c,0x890c,0x890c,0x890c,0x890c,0x890c,0xc0,0x300,0x56e,0x14e7,0x1e2a,0xfe00,0x941,0 +0x50,0x4cc0,0x8918,0x8a18,0x8a18,0x8a18,0x8a18,0x8a18,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, +0x3c24,0x3c56,0x300,0 }; -static const uint16_t norm2_nfc_data_trieIndex[9652]={ +static const uint16_t norm2_nfc_data_trieIndex[9776]={ 0x2a8,0x2b0,0x2b8,0x2c0,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31c,0x324, 0x32c,0x334,0x2c7,0x2cf,0x339,0x341,0x2c7,0x2cf,0x349,0x351,0x359,0x361,0x369,0x371,0x379,0x381, 0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b9,0x3c1,0x2c7,0x2cf,0x2c7,0x2cf,0x3c8,0x3d0,0x3d8,0x3e0, 0x3e4,0x3ec,0x3f2,0x3fa,0x2c7,0x2cf,0x402,0x40a,0x40e,0x416,0x41e,0x426,0x2c7,0x2cf,0x424,0x42c, 0x431,0x438,0x43c,0x2c7,0x2c7,0x2c7,0x443,0x44b,0x2c7,0x453,0x45b,0x2c7,0x2c7,0x463,0x46b,0x2c7, 0x2c7,0x473,0x47b,0x2c7,0x2c7,0x483,0x48b,0x2c7,0x2c7,0x463,0x492,0x2c7,0x49a,0x4a0,0x4a8,0x2c7, -0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4a0,0x4c4,0x2c7,0x2c7,0x2c7,0x4ca,0x2c7, -0x2c7,0x4d2,0x4d9,0x2c7,0x2c7,0x4dc,0x4e3,0x2c7,0x4e6,0x4ed,0x4f5,0x4fd,0x505,0x50d,0x514,0x2c7, -0x2c7,0x51b,0x2c7,0x2c7,0x522,0x2c7,0x2c7,0x2c7,0x929,0x2c7,0x2c7,0x931,0x2c7,0x937,0x93f,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x526,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4c3,0x4cb,0x2c7,0x2c7,0x2c7,0x4d1,0x2c7, +0x2c7,0x4d9,0x4e0,0x2c7,0x2c7,0x4e3,0x4ea,0x2c7,0x4ed,0x4f4,0x4fc,0x504,0x50c,0x514,0x51b,0x2c7, +0x2c7,0x522,0x2c7,0x2c7,0x529,0x2c7,0x2c7,0x2c7,0x93b,0x2c7,0x2c7,0x943,0x2c7,0x949,0x951,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52e,0x52e,0x2c7,0x2c7,0x2c7,0x2c7,0x534,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x53c,0x2c7,0x2c7,0x2c7,0x53f,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x546,0x2c7,0x2c7,0x54e,0x2c7,0x556,0x2c7,0x2c7,0x55e,0x563,0x56b,0x571,0x2c7,0x577,0x2c7,0x57e, -0x2c7,0x583,0x2c7,0x2c7,0x2c7,0x2c7,0x589,0x591,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x599,0x59e, -0x5a6,0x5ae,0x5b6,0x5be,0x5c6,0x5ce,0x5d6,0x5de,0x5e6,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e, -0x626,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x62a,0x632,0x2c7,0x639,0x2c7,0x2c7,0x63d,0x644,0x649,0x2c7, -0x651,0x659,0x661,0x669,0x671,0x679,0x2c7,0x681,0x2c7,0x687,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x535,0x535,0x2c7,0x2c7,0x2c7,0x2c7,0x53b,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x543,0x2c7,0x2c7,0x2c7,0x546,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x54d,0x2c7,0x2c7,0x555,0x2c7,0x55d,0x2c7,0x2c7,0x565,0x56a,0x572,0x578,0x2c7,0x57e,0x2c7,0x585, +0x2c7,0x58a,0x2c7,0x2c7,0x2c7,0x2c7,0x590,0x598,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x5a0,0x5a5, +0x5ad,0x5b5,0x5bd,0x5c5,0x5cd,0x5d5,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61d,0x625, +0x62d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x631,0x639,0x2c7,0x640,0x2c7,0x2c7,0x644,0x64b,0x650,0x2c7, +0x658,0x660,0x668,0x670,0x678,0x680,0x2c7,0x688,0x2c7,0x68e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x68a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x692,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x69f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x691,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x699,0x2c7,0x2c7,0x2c7,0x69e,0x2c7,0x2c7,0x2c7,0x6a6, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x6a7,0x6ae,0x6b6,0x6be,0x6c6,0x6ce,0x6d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x6ae,0x6b5,0x6bd,0x6c5,0x6cd,0x6d5,0x6dd,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, @@ -102,32 +103,32 @@ static const uint16_t norm2_nfc_data_trieIndex[9652]={ 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x6de,0x6e6,0x2c7,0x2c7,0x6ee,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x6fc,0x704,0x2c7,0x70a,0x70e,0x2c7,0x2c7,0x584,0x716,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x71a,0x722,0x725,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x94e,0x2c7,0x2c7, -0x956,0x95d,0x2a8,0x964,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, +0x2c7,0x2c7,0x2c7,0x6e5,0x6ed,0x2c7,0x2c7,0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6fc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x703,0x70b,0x2c7,0x711,0x715,0x2c7,0x2c7,0x58b,0x71d,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x721,0x729,0x72c,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x965,0x2c7,0x2c7, +0x975,0x97c,0x2a8,0x983,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, 0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, @@ -143,489 +144,496 @@ static const uint16_t norm2_nfc_data_trieIndex[9652]={ 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x72d,0x735,0x73d,0x745,0x74d,0x755,0x75d,0x765, -0x76d,0x775,0x77d,0x785,0x78d,0x795,0x79d,0x2c7,0x7a4,0x7ac,0x7b4,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x734,0x73c,0x744,0x74c,0x754,0x75c,0x764,0x76c, +0x774,0x77c,0x784,0x78c,0x794,0x79c,0x7a4,0x2c7,0x7ab,0x7b3,0x7bb,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x7bc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x7c3,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0xb20,0xb20,0xb38,0xb78,0xbb8,0xbf8,0xc38,0xc70,0xcb0,0xb1c,0xce4,0xb1c,0xd24,0xd64,0xda4,0xde4, 0xe24,0xe64,0xea4,0xee4,0xb1c,0xb1c,0xf20,0xf60,0xf90,0xfc8,0xb1c,0x1008,0x1038,0x1078,0xb1c,0x1090, -0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x951,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96d,0x188,0x188,0x9a3,0x188,0x9e3,0xa1d,0x188,0x188, +0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x953,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96f,0x188,0x188,0x9a5,0x188,0x9e5,0xa1f,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5d, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c0, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c8,0x2c7,0x2c7,0x2c7,0x7cb,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x7d2,0x7d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7de,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x6f5,0x697,0x7e0,0x7e8,0x2c7,0x2c7,0x7f0,0x7f7,0x2c7,0x584,0x2c7,0x2c7,0x7ff,0x2c7,0x2c7,0x802, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x808,0x2c7,0x463,0x80f,0x816,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x81e,0x2c7,0x2c7,0x822,0x82a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x82f,0x837,0x2c7,0x2c7,0x697, -0x2c7,0x2c7,0x2c7,0x83a,0x2c7,0x2c7,0x2c7,0x840,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x844,0x2c7,0x84a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x850,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x858,0x860,0x868, -0x86e,0x876,0x2c7,0x2c7,0x2c7,0x87e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x886,0x88e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x892,0x2c7,0x2c7,0x2c7,0x899,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a1,0x8a9,0x8b1, -0x8b9,0x8c1,0x8c9,0x8d1,0x8d9,0x8e1,0x8e9,0x8f1,0x8f9,0x901,0x909,0x911,0x919,0x921,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7,0x2a7,0x2a7, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,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,4,6,0, -0,8,0x28,0x2e,0x38,0x44,0x66,0x68,0x76,0x84,0xa2,0xa4,0xae,0xba,0xc0,0xd2, -0xf2,0,0xf6,0x106,0x114,0x122,0x148,0x14c,0x158,0x15c,0x16e,0,0,0,0,0, -0,0x17a,0x19a,0x1a0,0x1aa,0x1b6,0x1d8,0x1da,0x1e8,0x1f8,0x214,0x218,0x222,0x22e,0x234,0x246, -0x266,0,0x26a,0x27a,0x288,0x298,0x2be,0x2c2,0x2d0,0x2d4,0x2e8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x2f4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x941,0x944,0x56f,0x947,0x57a,0x57f,0x2fa,0x584, -0x94a,0x94d,0x589,0x950,0x953,0x956,0x959,0x594,0,0x95c,0x95f,0x962,0x599,0x5a4,0x5ad,0, -0x2fe,0x965,0x968,0x96b,0x5b2,0x96e,0,0,0x971,0x974,0x5bd,0x977,0x5c8,0x5cd,0x300,0x5d2, -0x97a,0x97d,0x5d7,0x980,0x983,0x986,0x989,0x5e2,0,0x98c,0x98f,0x992,0x5e7,0x5f2,0x5fb,0, -0x304,0x995,0x998,0x99b,0x600,0x99e,0,0x9a1,0x9a4,0x9a7,0x60b,0x616,0x9aa,0x9ad,0x9b0,0x9b3, -0x9b6,0x9b9,0x9bc,0x9bf,0x9c2,0x9c5,0x9c8,0x9cb,0,0,0x621,0x628,0x9ce,0x9d1,0x9d4,0x9d7, -0x9da,0x9dd,0x9e0,0x9e3,0x9e6,0x9e9,0x9ec,0x9ef,0x9f2,0x9f5,0x9f8,0x9fb,0x9fe,0xa01,0,0, -0xa04,0xa07,0xa0a,0xa0d,0xa10,0xa13,0xa16,0xa19,0xa1c,0,0,0,0xa1f,0xa22,0xa25,0xa28, -0,0xa2b,0xa2e,0xa31,0xa34,0xa37,0xa3a,0,0,0,0,0xa3d,0xa40,0xa43,0xa46,0xa49, -0xa4c,0,0,0,0x62f,0x636,0xa4f,0xa52,0xa55,0xa58,0,0,0xa5b,0xa5e,0xa61,0xa64, -0xa67,0xa6a,0x63d,0x642,0xa6d,0xa70,0xa73,0xa76,0x647,0x64c,0xa79,0xa7c,0xa7f,0xa82,0,0, -0x651,0x656,0x65b,0x660,0xa85,0xa88,0xa8b,0xa8e,0xa91,0xa94,0xa97,0xa9a,0xa9d,0xaa0,0xaa3,0xaa6, -0xaa9,0xaac,0xaaf,0xab2,0xab5,0xab8,0xabb,0x306,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x665,0x672,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x67f,0x68c,0,0,0,0,0,0,0x308, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xabe,0xac1,0xac4, -0xac7,0xaca,0xacd,0xad0,0xad3,0xad7,0xadc,0xae1,0xae6,0xaeb,0xaf0,0xaf5,0xafa,0,0xaff,0xb04, -0xb09,0xb0e,0xb12,0xb15,0,0,0xb18,0xb1b,0xb1e,0xb21,0x699,0x69e,0xb25,0xb2a,0xb2e,0xb31, -0xb34,0,0,0,0xb37,0xb3a,0,0,0xb3d,0xb40,0xb44,0xb49,0xb4d,0xb50,0xb53,0xb56, -0xb59,0xb5c,0xb5f,0xb62,0xb65,0xb68,0xb6b,0xb6e,0xb71,0xb74,0xb77,0xb7a,0xb7d,0xb80,0xb83,0xb86, -0xb89,0xb8c,0xb8f,0xb92,0xb95,0xb98,0xb9b,0xb9e,0xba1,0xba4,0xba7,0xbaa,0,0,0xbad,0xbb0, -0,0,0,0,0,0,0x6a3,0x6a8,0x6ad,0x6b2,0xbb4,0xbb9,0xbbe,0xbc3,0x6b7,0x6bc, -0xbc8,0xbcd,0xbd1,0xbd4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x30a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xffe6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6, -0xfee6,0xffe6,0xffe6,0xfee6,0xffe6,0xfee6,0xffe6,0xfee6,0xfee6,0xffe8,0xffdc,0xffdc,0xffdc,0xffdc,0xffe8,0xfed8, -0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffca,0xffca,0xfedc,0xfedc,0xfedc,0xfedc,0xfeca,0xfeca,0xffdc,0xffdc,0xffdc, -0xffdc,0xfedc,0xfedc,0xffdc,0xfedc,0xfedc,0xffdc,0xffdc,0xff01,0xff01,0xff01,0xff01,0xfe01,0xffdc,0xffdc,0xffdc, -0xffdc,0xffe6,0xffe6,0xffe6,0x14e8,0x14eb,0xfee6,0x14ee,0x14f1,0xfef0,0xffe6,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0xffe6,0xffdc,0xffdc,0,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe8,0xffdc,0xffdc,0xffe6, -0xffe9,0xffea,0xffea,0xffe9,0xffea,0xffea,0xffe9,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0x14f4,0,0,0,0,0,0,0, -0,0,0x14f6,0,0,0,0,0,0,0xbd7,0xbda,0x14f8,0xbdd,0xbe0,0xbe3,0, -0xbe6,0,0xbe9,0xbec,0xbf0,0x30c,0,0,0,0x31a,0,0x322,0,0x32c,0,0, -0,0,0,0x33a,0,0x342,0,0,0,0x344,0,0,0,0x350,0xbf4,0xbf7, -0x6c1,0xbfa,0x6c6,0xbfd,0xc01,0x35a,0,0,0,0x36a,0,0x372,0,0x37e,0,0, -0,0,0,0x38e,0,0x396,0,0,0,0x39a,0,0,0,0x3aa,0x6cb,0x6d4, -0xc05,0xc08,0x6dd,0,0,0,0x3b6,0xc0b,0xc0e,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc11,0xc14,0,0xc17,0,0,0x3ba,0xc1a,0,0,0,0, -0xc1d,0xc20,0xc23,0,0x3bc,0,0,0x3c0,0,0x3c2,0x3c8,0x3cc,0x3ce,0xc26,0x3d6,0, -0,0,0x3d8,0,0,0,0,0x3da,0,0,0,0x3e2,0,0,0,0x3e4, -0,0x3e6,0,0,0x3e8,0,0,0x3ec,0,0x3ee,0x3f4,0x3f8,0x3fa,0xc29,0x402,0, -0,0,0x404,0,0,0,0,0x406,0,0,0,0x40e,0,0,0,0x410, -0,0x412,0,0,0xc2c,0xc2f,0,0xc32,0,0,0x414,0xc35,0,0,0,0, -0xc38,0xc3b,0xc3e,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x416,0x418,0xc41,0xc44,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xc47,0xc4a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc4d,0xc50,0xc53,0xc56,0,0,0xc59,0xc5c,0x41a,0x41c,0xc5f,0xc62, -0xc65,0xc68,0xc6b,0xc6e,0,0,0xc71,0xc74,0xc77,0xc7a,0xc7d,0xc80,0x41e,0x420,0xc83,0xc86, -0xc89,0xc8c,0xc8f,0xc92,0xc95,0xc98,0xc9b,0xc9e,0xca1,0xca4,0,0,0xca7,0xcaa,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffde,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffde,0xffe4,0xffe6, -0xff0a,0xff0b,0xff0c,0xff0d,0xff0e,0xff0f,0xff10,0xff11,0xff12,0xff13,0xff13,0xff14,0xff15,0xff16,0,0xff17, -0,0xff18,0xff19,0,0xffe6,0xffdc,0,0xff12,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff1e,0xff1f,0xff20,0,0,0,0,0, -0,0,0xcad,0xcb0,0xcb3,0xcb6,0xcb9,0x422,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x428,0,0x42a,0xff1b,0xff1c,0xff1d,0xff1e,0xff1f,0xff20,0xff21,0xff22,0xfee6,0xfee6,0xfedc,0xffdc,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff23,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xcbc,0x42c,0xcbf,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x42e,0xcc2,0,0x430,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0,0,0xffe6, -0xffe6,0,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff24,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc, -0xffdc,0xffdc,0xffe6,0xffdc,0xffdc,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6, -0xffdc,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffdc,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffdc, -0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xff1b,0xff1c,0xff1d,0xffe6, -0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0x432,0xcc5,0,0,0,0,0,0,0x434,0xcc8,0,0x436, -0xccb,0,0,0,0,0,0,0,0xfe07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xffe6,0xffdc,0xffe6, -0xffe6,0,0,0,0x14fa,0x14fd,0x1500,0x1503,0x1506,0x1509,0x150c,0x150f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0xfe00,0,0,0,0,0, -0,0,0,0x438,0,0,0,0xcce,0xcd1,0xff09,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0x1512,0x1515,0,0x1518,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x151b, -0,0,0x151e,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0,0,0,0,0x1521,0x1524,0x1527,0,0,0x152a,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x43c, -0xcd4,0,0,0xcd7,0xcda,0xff09,0,0,0,0,0,0,0,0,0xfe00,0xfe00, -0,0,0,0,0x152d,0x1530,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x442,0,0xcdd,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe00,0, -0,0,0,0,0,0,0x444,0x448,0,0,0xce0,0xce3,0xce6,0xff09,0,0, -0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0,0x44a,0,0xce9,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0xff54,0xfe5b,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0,0,0x44c,0xcec,0,0xfe00,0,0,0,0x44e,0xcef,0xcf2,0,0x6e2,0xcf6, -0,0xff09,0,0,0,0,0,0,0,0xfe00,0xfe00,0,0,0,0,0, -0,0,0,0,0,0,0x454,0x458,0,0,0xcfa,0xcfd,0xd00,0xff09,0,0, -0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0,0xfe09,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0x45a,0xd03,0,0x6e7,0xd07,0xd0b,0xfe00,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff67,0xff67,0xff09,0,0,0,0,0,0,0,0,0,0xff6b,0xff6b,0xff6b,0xff6b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff76,0xff76,0,0,0,0,0,0, -0,0,0,0,0xff7a,0xff7a,0xff7a,0xff7a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xffdc,0,0xffdc,0,0xffd8,0,0, -0,0,0,0,0,0,0,0x1533,0,0,0,0,0,0,0,0, -0,0x1536,0,0,0,0,0x1539,0,0,0,0,0x153c,0,0,0,0, -0x153f,0,0,0,0,0,0,0,0,0,0,0,0,0x1542,0,0, -0,0,0,0,0,0xff81,0xff82,0x1546,0xff84,0x154a,0x154d,0,0x1550,0,0xff82,0xff82, -0xff82,0xff82,0,0,0xff82,0x1554,0xffe6,0xffe6,0xff09,0,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0,0x1557,0,0,0,0,0,0,0,0, -0,0x155a,0,0,0,0,0x155d,0,0,0,0,0x1560,0,0,0,0, -0x1563,0,0,0,0,0,0,0,0,0,0,0,0,0x1566,0,0, -0,0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x460,0xd0e,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0, -0,0,0,0xff07,0,0xff09,0xff09,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0xffe6,0,0, -0,0,0,0,0,0,0,0,0,0xffe4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffde,0xffe6,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffdc,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc, -0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0x462,0xd11,0x464, -0xd14,0x466,0xd17,0x468,0xd1a,0x46a,0xd1d,0,0,0x46c,0xd20,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0xfe00,0,0,0,0,0x46e,0xd23,0x470,0xd26,0x472,0x474,0xd29,0xd2c,0x476,0xd2f, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xff09,0xff09,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xff07,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xffe6,0xffe6,0xffe6,0,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0, -0,0xffdc,0,0,0,0,0,0,0xffe6,0,0,0,0xffe6,0xffe6,0,0, -0,0,0,0,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6, -0xffe6,0xffea,0xffd6,0xffdc,0xffca,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, -0,0,0,0xffe6,0xffe9,0xffdc,0xffe6,0xffdc,0xd32,0xd35,0xd38,0xd3b,0xd3e,0xd41,0xd44,0xd47, -0xd4b,0xd50,0xd54,0xd57,0xd5a,0xd5d,0xd60,0xd63,0xd66,0xd69,0xd6c,0xd6f,0xd73,0xd78,0xd7d,0xd82, -0xd86,0xd89,0xd8c,0xd8f,0xd93,0xd98,0xd9c,0xd9f,0xda2,0xda5,0xda8,0xdab,0xdae,0xdb1,0xdb4,0xdb7, -0xdba,0xdbd,0xdc0,0xdc3,0xdc6,0xdc9,0xdcd,0xdd2,0xdd6,0xdd9,0xddc,0xddf,0xde2,0xde5,0x6ec,0x6f1, -0xde9,0xdee,0xdf2,0xdf5,0xdf8,0xdfb,0xdfe,0xe01,0xe04,0xe07,0xe0a,0xe0d,0xe10,0xe13,0xe16,0xe19, -0xe1c,0xe1f,0xe22,0xe25,0xe29,0xe2e,0xe33,0xe38,0xe3d,0xe42,0xe47,0xe4c,0xe50,0xe53,0xe56,0xe59, -0xe5c,0xe5f,0x6f6,0x6fb,0xe63,0xe68,0xe6c,0xe6f,0xe72,0xe75,0x700,0x705,0xe79,0xe7e,0xe83,0xe88, -0xe8d,0xe92,0xe96,0xe99,0xe9c,0xe9f,0xea2,0xea5,0xea8,0xeab,0xeae,0xeb1,0xeb4,0xeb7,0xeba,0xebd, -0xec1,0xec6,0xecb,0xed0,0xed4,0xed7,0xeda,0xedd,0xee0,0xee3,0xee6,0xee9,0xeec,0xeef,0xef2,0xef5, -0xef8,0xefb,0xefe,0xf01,0xf04,0xf07,0xf0a,0xf0d,0xf10,0xf13,0xf16,0xf19,0xf1c,0xf1f,0xf22,0xf25, -0xf28,0xf2b,0,0xf2e,0,0,0,0,0x70a,0x711,0xf31,0xf34,0xf38,0xf3d,0xf42,0xf47, -0xf4c,0xf51,0xf56,0xf5b,0xf60,0xf65,0xf6a,0xf6f,0xf74,0xf79,0xf7e,0xf83,0xf88,0xf8d,0xf92,0xf97, -0x718,0x71d,0xf9b,0xf9e,0xfa1,0xfa4,0xfa8,0xfad,0xfb2,0xfb7,0xfbc,0xfc1,0xfc6,0xfcb,0xfd0,0xfd5, -0xfd9,0xfdc,0xfdf,0xfe2,0x722,0x727,0xfe5,0xfe8,0xfec,0xff1,0xff6,0xffb,0x1000,0x1005,0x100a,0x100f, -0x1014,0x1019,0x101e,0x1023,0x1028,0x102d,0x1032,0x1037,0x103c,0x1041,0x1046,0x104b,0x104f,0x1052,0x1055,0x1058, -0x105c,0x1061,0x1066,0x106b,0x1070,0x1075,0x107a,0x107f,0x1084,0x1089,0x108d,0x1090,0x1093,0x1096,0x1099,0x109c, -0x109f,0x10a2,0,0,0,0,0,0,0x72c,0x737,0x743,0x74a,0x751,0x758,0x75f,0x766, -0x76c,0x777,0x783,0x78a,0x791,0x798,0x79f,0x7a6,0x7ac,0x7b3,0x10a6,0x10ab,0x10b0,0x10b5,0,0, -0x7ba,0x7c1,0x10ba,0x10bf,0x10c4,0x10c9,0,0,0x7c8,0x7d3,0x7df,0x7e6,0x7ed,0x7f4,0x7fb,0x802, -0x808,0x813,0x81f,0x826,0x82d,0x834,0x83b,0x842,0x848,0x851,0x10ce,0x10d3,0x10d8,0x10dd,0x10e2,0x10e7, -0x85a,0x863,0x10ec,0x10f1,0x10f6,0x10fb,0x1100,0x1105,0x86c,0x873,0x110a,0x110f,0x1114,0x1119,0,0, -0x87a,0x881,0x111e,0x1123,0x1128,0x112d,0,0,0x888,0x891,0x1132,0x1137,0x113c,0x1141,0x1146,0x114b, -0,0x89a,0,0x1150,0,0x1155,0,0x115a,0x8a3,0x8ae,0x8ba,0x8c1,0x8c8,0x8cf,0x8d6,0x8dd, -0x8e3,0x8ee,0x8fa,0x901,0x908,0x90f,0x916,0x91d,0x923,0x156a,0x115e,0x156e,0x928,0x1572,0x1161,0x1576, -0x1164,0x157a,0x1167,0x157e,0x92d,0x1582,0,0,0x116b,0x1170,0x1177,0x117f,0x1187,0x118f,0x1197,0x119f, -0x11a5,0x11aa,0x11b1,0x11b9,0x11c1,0x11c9,0x11d1,0x11d9,0x11df,0x11e4,0x11eb,0x11f3,0x11fb,0x1203,0x120b,0x1213, -0x1219,0x121e,0x1225,0x122d,0x1235,0x123d,0x1245,0x124d,0x1253,0x1258,0x125f,0x1267,0x126f,0x1277,0x127f,0x1287, -0x128d,0x1292,0x1299,0x12a1,0x12a9,0x12b1,0x12b9,0x12c1,0x12c6,0x12c9,0x12cd,0x12d1,0x12d5,0,0x932,0x12da, -0x12de,0x12e1,0x12e4,0x1586,0x12e7,0,0x1589,0x478,0,0x12ea,0x12ee,0x12f2,0x12f6,0,0x937,0x12fb, -0x12ff,0x158c,0x1302,0x1590,0x1305,0x1308,0x130b,0x130e,0x1311,0x1314,0x1318,0x1595,0,0,0x131c,0x1320, -0x1324,0x1327,0x132a,0x159a,0,0x132d,0x1330,0x1333,0x1336,0x1339,0x133d,0x159f,0x1341,0x1344,0x1347,0x134b, -0x134f,0x1352,0x1355,0x15a4,0x1358,0x135b,0x15a8,0x15ab,0,0,0x135f,0x1363,0x1367,0,0x93c,0x136c, -0x1370,0x15ae,0x1373,0x15b2,0x1376,0x15b5,0x47e,0,0xfdc1,0xfdc1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xff01,0xff01,0xffe6,0xffe6,0xffe6,0xffe6, -0xff01,0xff01,0xff01,0xffe6,0xffe6,0,0,0,0,0xffe6,0,0,0,0xff01,0xff01,0xffe6, -0xffdc,0xffe6,0xff01,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x15b7,0,0,0,0x15b9,0x15bc, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x484,0,0x486,0,0x488,0,0,0,0,0,0x1379,0x137c, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x137f,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x1382,0x1385,0x1388,0x48a,0,0x48c,0,0x48e,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x490,0x138b,0,0,0,0x492,0x138e,0,0x494, -0x1391,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x496,0x1394,0x498,0x1397,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x49a,0,0,0,0,0x139a,0,0x49c,0x139d,0x49e,0,0x13a0,0x4a0,0x13a3,0,0, -0,0x4a2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x13a6,0x4a4,0x13a9,0,0x4a6,0x4a8,0,0,0,0,0,0, -0,0x13ac,0x13af,0x13b2,0x13b5,0x13b8,0x4aa,0x4ac,0x13bb,0x13be,0x4ae,0x4b0,0x13c1,0x13c4,0x4b2,0x4b4, -0x4b6,0x4b8,0,0,0x13c7,0x13ca,0x4ba,0x4bc,0x13cd,0x13d0,0x4be,0x4c0,0x13d3,0x13d6,0,0, -0,0,0,0,0,0x4c2,0x4c4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x4c6,0,0,0,0,0,0x4c8,0x4ca,0,0x4cc, -0x13d9,0x13dc,0x13df,0x13e2,0,0,0x4ce,0x4d0,0x4d2,0x4d4,0,0,0,0,0,0, -0,0,0,0,0x13e5,0x13e8,0x13eb,0x13ee,0,0,0,0,0,0,0x13f1,0x13f4, -0x13f7,0x13fa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x15bf,0x15c1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x15c3,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0xffda,0xffe4,0xffe8,0xffde,0xffe0,0xffe0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x4d6,0, -0,0,0,0x4d8,0x13fd,0x4da,0x1400,0x4dc,0x1403,0x4de,0x1406,0x4e0,0x1409,0x4e2,0x140c,0x4e4, -0x140f,0x4e6,0x1412,0x4e8,0x1415,0x4ea,0x1418,0x4ec,0x141b,0x4ee,0x141e,0,0x4f0,0x1421,0x4f2,0x1424, -0x4f4,0x1427,0,0,0,0,0,0x4f6,0x142a,0x142d,0x4fa,0x1430,0x1433,0x4fe,0x1436,0x1439, -0x502,0x143c,0x143f,0x506,0x1442,0x1445,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1448,0,0,0, -0,0xfe08,0xfe08,0,0,0x50a,0x144b,0,0,0,0,0,0,0,0x50c,0, -0,0,0,0x50e,0x144e,0x510,0x1451,0x512,0x1454,0x514,0x1457,0x516,0x145a,0x518,0x145d,0x51a, -0x1460,0x51c,0x1463,0x51e,0x1466,0x520,0x1469,0x522,0x146c,0x524,0x146f,0,0x526,0x1472,0x528,0x1475, -0x52a,0x1478,0,0,0,0,0,0x52c,0x147b,0x147e,0x530,0x1481,0x1484,0x534,0x1487,0x148a, -0x538,0x148d,0x1490,0x53c,0x1493,0x1496,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x540,0x542,0x544,0x546,0,0x1499,0,0,0x149c, -0x149f,0x14a2,0x14a5,0,0,0x548,0x14a8,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0,0xffe6,0xffe6,0xffdc,0,0,0xffe6, -0xffe6,0,0,0,0,0,0xffe6,0xffe6,0,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0x15c6,0x15c8,0x15ca,0x15cc,0x15ce,0x15d0,0x15d2,0x15d4,0x15d4,0x15d6,0x15d8,0x15da, -0x15dc,0x15de,0x15e0,0x15e2,0x15e4,0x15e6,0x15e8,0x15ea,0x15ec,0x15ee,0x15f0,0x15f2,0x15f4,0x15f6,0x15f8,0x15fa, -0x15fc,0x15fe,0x1600,0x1602,0x1604,0x1606,0x1608,0x160a,0x160c,0x160e,0x1610,0x1612,0x1614,0x1616,0x1618,0x161a, -0x161c,0x161e,0x1620,0x1622,0x1624,0x1626,0x1628,0x162a,0x162c,0x162e,0x1630,0x1632,0x1634,0x1636,0x1638,0x163a, -0x163c,0x163e,0x1640,0x1642,0x1644,0x1646,0x1648,0x164a,0x164c,0x164e,0x1650,0x1652,0x1654,0x1656,0x1658,0x165a, -0x165c,0x165e,0x1660,0x1662,0x1664,0x1666,0x1668,0x166a,0x166c,0x166e,0x1670,0x1672,0x1674,0x1676,0x1678,0x167a, -0x15ec,0x167c,0x167e,0x1680,0x1682,0x1684,0x1686,0x1688,0x168a,0x168c,0x168e,0x1690,0x1692,0x1694,0x1696,0x1698, -0x169a,0x169c,0x169e,0x16a0,0x16a2,0x16a4,0x16a6,0x16a8,0x16aa,0x16ac,0x16ae,0x16b0,0x16b2,0x16b4,0x16b6,0x16b8, -0x16ba,0x16bc,0x16be,0x16c0,0x16c2,0x16c4,0x16c6,0x16c8,0x16ca,0x16cc,0x16ce,0x16d0,0x16d2,0x16d4,0x16d6,0x16d8, -0x16da,0x16dc,0x16de,0x16e0,0x16e2,0x16e4,0x16e6,0x16e8,0x16ea,0x16ec,0x16ee,0x16f0,0x16f2,0x16f4,0x16f6,0x16f8, -0x16fa,0x16fc,0x16fe,0x1700,0x1702,0x16a0,0x1704,0x1706,0x1708,0x170a,0x170c,0x170e,0x1710,0x1712,0x1680,0x1714, -0x1716,0x1718,0x171a,0x171c,0x171e,0x1720,0x1722,0x1724,0x1726,0x1728,0x172a,0x172c,0x172e,0x1730,0x1732,0x1734, -0x1736,0x1738,0x173a,0x15ec,0x173c,0x173e,0x1740,0x1742,0x1744,0x1746,0x1748,0x174a,0x174c,0x174e,0x1750,0x1752, -0x1754,0x1756,0x1758,0x175a,0x175c,0x175e,0x1760,0x1762,0x1764,0x1766,0x1768,0x176a,0x176c,0x176e,0x1770,0x1684, -0x1772,0x1774,0x1776,0x1778,0x177a,0x177c,0x177e,0x1780,0x1782,0x1784,0x1786,0x1788,0x178a,0x178c,0x178e,0x1790, -0x1792,0x1794,0x1796,0x1798,0x179a,0x179c,0x179e,0x17a0,0x17a2,0x17a4,0x17a6,0x17a8,0x17aa,0x17ac,0x17ae,0x17b0, -0x17b2,0x17b4,0x17b6,0x17b8,0x17ba,0x17bc,0x17be,0x17c0,0x17c2,0x17c4,0x17c6,0x17c8,0x17ca,0x17cc,0x17ce,0x17d0, -0x17d2,0x17d4,0,0,0x17d6,0,0x17d8,0,0,0x17da,0x17dc,0x17de,0x17e0,0x17e2,0x17e4,0x17e6, -0x17e8,0x17ea,0x17ec,0,0x17ee,0,0x17f0,0,0,0x17f2,0x17f4,0,0,0,0x17f6,0x17f8, -0x17fa,0x17fc,0x17fe,0x1800,0x1802,0x1804,0x1806,0x1808,0x180a,0x180c,0x180e,0x1810,0x1812,0x1814,0x1816,0x1818, -0x181a,0x181c,0x181e,0x1820,0x1822,0x1824,0x1826,0x1828,0x182a,0x182c,0x182e,0x1830,0x1832,0x1834,0x1836,0x1838, -0x183a,0x183c,0x183e,0x1840,0x1842,0x1844,0x1846,0x1848,0x184a,0x184c,0x184e,0x16ee,0x1850,0x1852,0x1854,0x1856, -0x1858,0x185a,0x185a,0x185c,0x185e,0x1860,0x1862,0x1864,0x1866,0x1868,0x186a,0x17f2,0x186c,0x186e,0x1870,0x1872, -0x1874,0x1877,0,0,0x1879,0x187b,0x187d,0x187f,0x1881,0x1883,0x1885,0x1887,0x180e,0x1889,0x188b,0x188d, -0x17d6,0x188f,0x1891,0x1893,0x1895,0x1897,0x1899,0x189b,0x189d,0x189f,0x18a1,0x18a3,0x18a5,0x1820,0x18a7,0x1822, -0x18a9,0x18ab,0x18ad,0x18af,0x18b1,0x17d8,0x1616,0x18b3,0x18b5,0x18b7,0x16a2,0x1750,0x18b9,0x18bb,0x1830,0x18bd, -0x1832,0x18bf,0x18c1,0x18c3,0x17dc,0x18c5,0x18c7,0x18c9,0x18cb,0x18cd,0x17de,0x18cf,0x18d1,0x18d3,0x18d5,0x18d7, -0x18d9,0x184e,0x18db,0x18dd,0x16ee,0x18df,0x1856,0x18e1,0x18e3,0x18e5,0x18e7,0x18e9,0x1860,0x18eb,0x17f0,0x18ed, -0x1862,0x167c,0x18ef,0x1864,0x18f1,0x1868,0x18f3,0x18f5,0x18f7,0x18f9,0x18fb,0x186c,0x17e8,0x18fd,0x186e,0x18ff, -0x1870,0x1901,0x15d4,0x1903,0x1906,0x1909,0x190c,0x190e,0x1910,0x1912,0x1915,0x1918,0x191b,0x191d,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x191f,0xff1a,0x1922, -0,0,0,0,0,0,0,0,0,0,0x1925,0x1928,0x192c,0x1931,0x1935,0x1938, -0x193b,0x193e,0x1941,0x1944,0x1947,0x194a,0x194d,0,0x1950,0x1953,0x1956,0x1959,0x195c,0,0x195f,0, -0x1962,0x1965,0,0x1968,0x196b,0,0x196e,0x1971,0x1974,0x1977,0x197a,0x197d,0x1980,0x1983,0x1986,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0,0, -0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xff01,0xffdc,0,0,0,0,0xff09,0,0,0,0,0,0xffe6,0xffdc,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x54a,0x14ab,0x54d,0x14b0,0,0,0, -0,0,0,0,0,0x550,0,0,0,0,0,0x14b5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0xfe07,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0,0,0x14ba,0x14bf,0,0x553,0x556,0xff09, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, -0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07,0, -0,0,0,0,0,0,0,0,0,0xff07,0xff09,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x559,0,0,0,0x14c4,0x14c9,0xff09,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0, -0,0x55f,0xfe00,0x14ce,0x14d3,0xfe00,0x14d8,0,0,0,0xff09,0xff07,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xfe00,0,0,0,0, -0,0,0,0,0x568,0x56b,0x14dd,0x14e2,0,0,0,0xff09,0xff07,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff01,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1989,0x198e, -0x1998,0x19a4,0x19b0,0x19bc,0x19c8,0xffd8,0xffd8,0xff01,0xff01,0xff01,0,0,0,0xffe2,0xffd8,0xffd8, -0xffd8,0xffd8,0xffd8,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc, -0xffdc,0xffdc,0xffdc,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x19cf,0x19d4,0x19de,0x19ea,0x19f6,0x1a02,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1a09,0x1a0b,0x1a0d,0x1a0f,0x1a12,0x1802,0x1a14,0x1a16,0x1a18,0x1a1a,0x1804,0x1a1c, -0x1a1e,0x1a20,0x1806,0x1a23,0x1a25,0x1a27,0x1a29,0x1a2c,0x1a2e,0x1a30,0x1a32,0x1a35,0x1a37,0x1a39,0x1a3b,0x187b, -0x1a3d,0x1a40,0x1a42,0x1a44,0x1a46,0x1a48,0x1a4a,0x1a4c,0x1a4e,0x1885,0x1808,0x180a,0x1887,0x1a50,0x1a52,0x1688, -0x1a54,0x180c,0x1a56,0x1a58,0x1a5a,0x1a5c,0x1a5c,0x1a5c,0x1a5e,0x1a61,0x1a63,0x1a65,0x1a67,0x1a6a,0x1a6c,0x1a6e, -0x1a70,0x1a72,0x1a74,0x1a76,0x1a78,0x1a7a,0x1a7c,0x1a7e,0x1a80,0x1a82,0x1a82,0x188b,0x1a84,0x1a86,0x1a88,0x1a8a, -0x1810,0x1a8c,0x1a8e,0x1a90,0x17ba,0x1a92,0x1a94,0x1a96,0x1a98,0x1a9a,0x1a9c,0x1a9e,0x1aa0,0x1aa2,0x1aa5,0x1aa7, -0x1aa9,0x1aab,0x1aad,0x1aaf,0x1ab1,0x1ab4,0x1ab7,0x1ab9,0x1abb,0x1abd,0x1abf,0x1ac1,0x1ac3,0x1ac5,0x1ac7,0x1ac7, -0x1ac9,0x1acc,0x1ace,0x1680,0x1ad0,0x1ad2,0x1ad5,0x1ad7,0x1ad9,0x1adb,0x1add,0x1adf,0x181a,0x1ae1,0x1ae3,0x1ae5, -0x1ae8,0x1aea,0x1aed,0x1aef,0x1af1,0x1af3,0x1af5,0x1af7,0x1af9,0x1afb,0x1afd,0x1aff,0x1b01,0x1b03,0x1b06,0x1b08, -0x1b0a,0x1b0c,0x1614,0x1b0e,0x1b11,0x1b13,0x1b13,0x1b16,0x1b18,0x1b18,0x1b1a,0x1b1c,0x1b1f,0x1b22,0x1b24,0x1b26, -0x1b28,0x1b2a,0x1b2c,0x1b2e,0x1b30,0x1b32,0x1b34,0x181c,0x1b36,0x1b39,0x1b3b,0x1b3d,0x18a3,0x1b3d,0x1b3f,0x1820, -0x1b41,0x1b43,0x1b45,0x1b47,0x1822,0x15de,0x1b49,0x1b4b,0x1b4d,0x1b4f,0x1b51,0x1b53,0x1b55,0x1b58,0x1b5a,0x1b5c, -0x1b5e,0x1b60,0x1b62,0x1b65,0x1b67,0x1b69,0x1b6b,0x1b6d,0x1b6f,0x1b71,0x1b73,0x1b75,0x1824,0x1b77,0x1b79,0x1b7c, -0x1b7e,0x1b80,0x1b82,0x1828,0x1b84,0x1b86,0x1b88,0x1b8a,0x1b8c,0x1b8e,0x1b90,0x1b92,0x1616,0x18b3,0x1b94,0x1b96, -0x1b98,0x1b9a,0x1b9d,0x1b9f,0x1ba1,0x1ba3,0x182a,0x1ba5,0x1ba8,0x1baa,0x1bac,0x190c,0x1bae,0x1bb0,0x1bb2,0x1bb4, -0x1bb6,0x1bb9,0x1bbb,0x1bbd,0x1bbf,0x1bc2,0x1bc4,0x1bc6,0x1bc8,0x16a2,0x1bca,0x1bcc,0x1bcf,0x1bd2,0x1bd5,0x1bd7, -0x1bda,0x1bdc,0x1bde,0x1be0,0x1be2,0x182c,0x1750,0x1be4,0x1be6,0x1be8,0x1bea,0x1bed,0x1bef,0x1bf1,0x1bf3,0x18bb, -0x1bf5,0x1bf7,0x1bfa,0x1bfc,0x1bfe,0x1c01,0x1c04,0x1c06,0x18bd,0x1c08,0x1c0a,0x1c0c,0x1c0e,0x1c10,0x1c12,0x1c14, -0x1c17,0x1c19,0x1c1c,0x1c1e,0x1c21,0x18c1,0x1c23,0x1c25,0x1c28,0x1c2a,0x1c2c,0x1c2f,0x1c32,0x1c34,0x1c36,0x1c38, -0x1c3a,0x1c3a,0x1c3c,0x1c3e,0x18c5,0x1c40,0x1c42,0x1c44,0x1c46,0x1c48,0x1c4b,0x1c4d,0x1686,0x1c50,0x1c53,0x1c55, -0x1c58,0x1c5b,0x1c5e,0x1c60,0x18d1,0x1c62,0x1c65,0x1c68,0x1c6b,0x1c6e,0x1c70,0x1c70,0x18d3,0x1910,0x1c72,0x1c74, -0x1c76,0x1c78,0x1c7b,0x163a,0x18d7,0x1c7d,0x1c7f,0x1842,0x1c82,0x1c85,0x17e6,0x1c88,0x1c8a,0x184a,0x1c8c,0x1c8e, -0x1c90,0x1c93,0x1c93,0x1c96,0x1c98,0x1c9a,0x1c9d,0x1c9f,0x1ca1,0x1ca3,0x1ca6,0x1ca8,0x1caa,0x1cac,0x1cae,0x1cb0, -0x1cb3,0x1cb5,0x1cb7,0x1cb9,0x1cbb,0x1cbd,0x1cbf,0x1cc2,0x1cc5,0x1cc7,0x1cca,0x1ccc,0x1ccf,0x1cd1,0x1856,0x1cd3, -0x1cd6,0x1cd9,0x1cdb,0x1cde,0x1ce0,0x1ce3,0x1ce5,0x1ce7,0x1ce9,0x1ceb,0x1ced,0x1cef,0x1cf2,0x1cf5,0x1cf8,0x1b16, -0x1cfb,0x1cfd,0x1cff,0x1d01,0x1d03,0x1d05,0x1d07,0x1d09,0x1d0b,0x1d0d,0x1d0f,0x1d11,0x16aa,0x1d14,0x1d16,0x1d18, -0x1d1a,0x1d1c,0x1d1e,0x185c,0x1d20,0x1d22,0x1d24,0x1d26,0x1d28,0x1d2b,0x1d2e,0x1d31,0x1d33,0x1d35,0x1d37,0x1d39, -0x1d3c,0x1d3e,0x1d41,0x1d43,0x1d45,0x1d48,0x1d4b,0x1d4d,0x1630,0x1d4f,0x1d51,0x1d53,0x1d55,0x1d57,0x1d59,0x18e5, -0x1d5b,0x1d5d,0x1d5f,0x1d61,0x1d63,0x1d65,0x1d67,0x1d69,0x1d6b,0x1d6d,0x1d70,0x1d72,0x1d74,0x1d76,0x1d78,0x1d7a, -0x1d7d,0x1d80,0x1d82,0x1d84,0x18ef,0x18f1,0x1d86,0x1d88,0x1d8b,0x1d8d,0x1d8f,0x1d91,0x1d93,0x1d96,0x1d99,0x1d9b, -0x1d9d,0x1d9f,0x1da2,0x18f3,0x1da4,0x1da7,0x1daa,0x1dac,0x1dae,0x1db0,0x1db3,0x1db5,0x1db7,0x1db9,0x1dbb,0x1dbd, -0x1dbf,0x1dc1,0x1dc4,0x1dc6,0x1dc8,0x1dca,0x1dcd,0x1dcf,0x1dd1,0x1dd3,0x1dd5,0x1dd8,0x1ddb,0x1ddd,0x1ddf,0x1de1, -0x1de4,0x1de6,0x18ff,0x18ff,0x1de9,0x1deb,0x1dee,0x1df0,0x1df2,0x1df4,0x1df6,0x1df8,0x1dfa,0x1dfc,0x1901,0x1dff, -0x1e01,0x1e03,0x1e05,0x1e07,0x1e09,0x1e0c,0x1e0e,0x1e11,0x1e14,0x1e17,0x1e19,0x1e1b,0x1e1d,0x1e1f,0x1e21,0x1e23, -0x1e25,0x1e27,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0,0,0,0,0,0, -0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x56e,0x56e,0x56e,0x56e, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e29,0,0x1e29,0,0x1e29,0x1e29,0,0x1e29, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x1e29,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x1e29,0,0,0,0,0x1e29,0,0,0,0x1e29,0,0x1e29,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e27,0, -0,0,0,0 +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7cf,0x2c7,0x2c7,0x2c7,0x7d2,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x7d9,0x7dd,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7e5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6fc,0x69e,0x7e7,0x7ef,0x2c7,0x2c7,0x7f7,0x7fe,0x2c7,0x58b,0x2c7,0x2c7,0x806,0x2c7,0x2c7,0x809, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x80f,0x2c7,0x463,0x816,0x81d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x825,0x2c7,0x2c7,0x829,0x831,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x836,0x83e,0x2c7,0x2c7,0x69e, +0x2c7,0x2c7,0x2c7,0x841,0x2c7,0x2c7,0x2c7,0x847,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x535,0x848,0x2c7,0x84a,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x69e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x852,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x856,0x2c7,0x85c,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x862,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x86a, +0x872,0x87a,0x880,0x888,0x2c7,0x2c7,0x2c7,0x890,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x898,0x8a0,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a4,0x2c7,0x2c7,0x2c7,0x8ab,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8b3, +0x8bb,0x8c3,0x8cb,0x8d3,0x8db,0x8e3,0x8eb,0x8f3,0x8fb,0x903,0x90b,0x913,0x91b,0x923,0x92b,0x933, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,4,8,0xc,1, +1,0x10,0x50,0x5c,0x70,0x88,0xcc,0xd0,0xec,0x108,0x144,0x148,0x15c,0x174,0x180,0x1a4, +0x1e4,1,0x1ec,0x20c,0x228,0x244,0x290,0x298,0x2b0,0x2b8,0x2dc,1,1,1,1,1, +1,0x2f4,0x334,0x340,0x354,0x36c,0x3b0,0x3b4,0x3d0,0x3f0,0x428,0x430,0x444,0x45c,0x468,0x48c, +0x4cc,1,0x4d4,0x4f4,0x510,0x530,0x57c,0x584,0x5a0,0x5a8,0x5d0,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x5e8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x1284,0x128a,0xade,0x1290,0xaf4,0xafe,0x5f4,0xb08, +0x1296,0x129c,0xb12,0x12a2,0x12a8,0x12ae,0x12b4,0xb28,1,0x12ba,0x12c0,0x12c6,0xb32,0xb48,0xb5a,1, +0x5fc,0x12cc,0x12d2,0x12d8,0xb64,0x12de,1,1,0x12e4,0x12ea,0xb7a,0x12f0,0xb90,0xb9a,0x600,0xba4, +0x12f6,0x12fc,0xbae,0x1302,0x1308,0x130e,0x1314,0xbc4,1,0x131a,0x1320,0x1326,0xbce,0xbe4,0xbf6,1, +0x608,0x132c,0x1332,0x1338,0xc00,0x133e,1,0x1344,0x134a,0x1350,0xc16,0xc2c,0x1357,0x135d,0x1362,0x1368, +0x136e,0x1374,0x137a,0x1380,0x1386,0x138c,0x1392,0x1398,1,1,0xc42,0xc50,0x139e,0x13a4,0x13aa,0x13b0, +0x13b7,0x13bd,0x13c2,0x13c8,0x13ce,0x13d4,0x13da,0x13e0,0x13e6,0x13ec,0x13f3,0x13f9,0x13fe,0x1404,1,1, +0x140a,0x1410,0x1416,0x141c,0x1422,0x1428,0x142f,0x1435,0x143a,1,1,1,0x1441,0x1447,0x144d,0x1453, +1,0x1458,0x145e,0x1465,0x146b,0x1470,0x1476,1,1,1,1,0x147c,0x1482,0x1489,0x148f,0x1494, +0x149a,1,1,1,0xc5e,0xc6c,0x14a0,0x14a6,0x14ac,0x14b2,1,1,0x14b8,0x14be,0x14c5,0x14cb, +0x14d0,0x14d6,0xc7a,0xc84,0x14dc,0x14e2,0x14e9,0x14ef,0xc8e,0xc98,0x14f5,0x14fb,0x1500,0x1506,1,1, +0xca2,0xcac,0xcb6,0xcc0,0x150c,0x1512,0x1518,0x151e,0x1524,0x152a,0x1531,0x1537,0x153c,0x1542,0x1548,0x154e, +0x1554,0x155a,0x1560,0x1566,0x156c,0x1572,0x1578,0x60c,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xcca,0xce4,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xcfe,0xd18,1,1,1,1,1,1,0x610, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x157e,0x1584,0x158a, +0x1590,0x1596,0x159c,0x15a2,0x15a8,0x15b0,0x15ba,0x15c4,0x15ce,0x15d8,0x15e2,0x15ec,0x15f6,1,0x1600,0x160a, +0x1614,0x161e,0x1627,0x162d,1,1,0x1632,0x1638,0x163e,0x1644,0xd32,0xd3c,0x164d,0x1657,0x165f,0x1665, +0x166b,1,1,1,0x1670,0x1676,1,1,0x167c,0x1682,0x168a,0x1694,0x169d,0x16a3,0x16a9,0x16af, +0x16b4,0x16ba,0x16c0,0x16c6,0x16cc,0x16d2,0x16d8,0x16de,0x16e4,0x16ea,0x16f0,0x16f6,0x16fc,0x1702,0x1708,0x170e, +0x1714,0x171a,0x1720,0x1726,0x172c,0x1732,0x1738,0x173e,0x1744,0x174a,0x1750,0x1756,1,1,0x175c,0x1762, +1,1,1,1,1,1,0xd46,0xd50,0xd5a,0xd64,0x176a,0x1774,0x177e,0x1788,0xd6e,0xd78, +0x1792,0x179c,0x17a4,0x17aa,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x614,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc, +0xfdcc,0xffcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xffd0,0xffb8,0xffb8,0xffb8,0xffb8,0xffd0,0xfdb0, +0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xff94,0xff94,0xfdb8,0xfdb8,0xfdb8,0xfdb8,0xfd94,0xfd94,0xffb8,0xffb8,0xffb8, +0xffb8,0xfdb8,0xfdb8,0xffb8,0xfdb8,0xfdb8,0xffb8,0xffb8,0xfe02,0xfe02,0xfe02,0xfe02,0xfc02,0xffb8,0xffb8,0xffb8, +0xffb8,0xffcc,0xffcc,0xffcc,0x3c26,0x3c2c,0xfdcc,0x3c32,0x3c38,0xfde0,0xffcc,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, +0xffcc,0xffb8,0xffb8,1,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffd0,0xffb8,0xffb8,0xffcc, +0xffd2,0xffd4,0xffd4,0xffd2,0xffd4,0xffd4,0xffd2,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,0x29d1,1,1,1,1,1,1,1, +1,1,0x29d5,1,1,1,1,1,1,0x17b1,0x17b7,0x29d9,0x17bd,0x17c3,0x17c9,1, +0x17cf,1,0x17d5,0x17db,0x17e3,0x618,1,1,1,0x634,1,0x644,1,0x658,1,1, +1,1,1,0x674,1,0x684,1,1,1,0x688,1,1,1,0x6a0,0x17eb,0x17f1, +0xd82,0x17f7,0xd8c,0x17fd,0x1805,0x6b4,1,1,1,0x6d4,1,0x6e4,1,0x6fc,1,1, +1,1,1,0x71c,1,0x72c,1,1,1,0x734,1,1,1,0x754,0xd96,0xda8, +0x180d,0x1813,0xdba,1,1,1,0x76c,0x1819,0x181f,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x1825,0x182b,1,0x1831,1,1,0x774,0x1837,1,1,1,1, +0x183d,0x1843,0x1849,1,0x778,1,1,0x780,1,0x784,0x790,0x798,0x79c,0x184f,0x7ac,1, +1,1,0x7b0,1,1,1,1,0x7b4,1,1,1,0x7c4,1,1,1,0x7c8, +1,0x7cc,1,1,0x7d0,1,1,0x7d8,1,0x7dc,0x7e8,0x7f0,0x7f4,0x1855,0x804,1, +1,1,0x808,1,1,1,1,0x80c,1,1,1,0x81c,1,1,1,0x820, +1,0x824,1,1,0x185b,0x1861,1,0x1867,1,1,0x828,0x186d,1,1,1,1, +0x1873,0x1879,0x187f,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x82c,0x830,0x1885,0x188b,1,1,1,1, +1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x1891,0x1897,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x189d,0x18a3,0x18a9,0x18af,1,1,0x18b5,0x18bb,0x834,0x838,0x18c1,0x18c7, +0x18cd,0x18d3,0x18d9,0x18df,1,1,0x18e5,0x18eb,0x18f1,0x18f7,0x18fd,0x1903,0x83c,0x840,0x1909,0x190f, +0x1915,0x191b,0x1921,0x1927,0x192d,0x1933,0x1939,0x193f,0x1945,0x194b,1,1,0x1951,0x1957,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffbc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffbc,0xffc8,0xffcc, +0xfe14,0xfe16,0xfe18,0xfe1a,0xfe1c,0xfe1e,0xfe20,0xfe22,0xfe24,0xfe26,0xfe26,0xfe28,0xfe2a,0xfe2c,1,0xfe2e, +1,0xfe30,0xfe32,1,0xffcc,0xffb8,1,0xfe24,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe3c,0xfe3e,0xfe40,1,1,1,1,1, +1,1,0x195c,0x1962,0x1969,0x196f,0x1975,0x844,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x850,1,0x854,0xfe36,0xfe38,0xfe3a,0xfe3c,0xfe3e,0xfe40,0xfe42,0xfe44,0xfdcc,0xfdcc,0xfdb8,0xffb8,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe46,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x197b,0x858,0x1981,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x85c,0x1987,1,0x860,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,1,1,0xffcc, +0xffcc,1,0xffb8,0xffcc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe48,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8, +0xffb8,0xffb8,0xffcc,0xffb8,0xffb8,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc, +0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffb8, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xfe36,0xfe38,0xfe3a,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,0x864,0x198d,1,1,1,1,1,1,0x868,0x1993,1,0x86c, +0x1999,1,1,1,1,1,1,1,0xfc0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,0xffcc,0xffb8,0xffcc, +0xffcc,1,1,1,0x29dc,0x29e2,0x29e8,0x29ee,0x29f4,0x29fa,0x2a00,0x2a06,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe0e,1,0xfc00,1,1,1,1,1, +1,1,1,0x870,1,1,1,0x199f,0x19a5,0xfe12,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,0x2a0c,0x2a12,1,0x2a18,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2a1e, +1,1,0x2a24,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,0x2a2a,0x2a30,0x2a36,1,1,0x2a3c,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x878, +0x19ab,1,1,0x19b1,0x19b7,0xfe12,1,1,1,1,1,1,1,1,0xfc00,0xfc00, +1,1,1,1,0x2a42,0x2a48,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x884,1,0x19bd,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc00,1, +1,1,1,1,1,1,0x888,0x890,1,1,0x19c3,0x19c9,0x19cf,0xfe12,1,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1, +1,1,0x894,1,0x19d5,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,0xfea8,0xfcb6,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe0e,1,1,0x898,0x19db,1,0xfc00,1,1,1,0x89c,0x19e1,0x19e7,1,0xdc4,0x19ef, +1,0xfe12,1,1,1,1,1,1,1,0xfc00,0xfc00,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,0xfe12,1,0xfc00,1,1,1,1,1, +1,1,0x8a8,0x8b0,1,1,0x19f7,0x19fd,0x1a03,0xfe12,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,1,0xfc12,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,0x8b4,0x1a09,1, +0xdce,0x1a11,0x1a19,0xfc00,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfece,0xfece,0xfe12,1, +1,1,1,1,1,1,1,1,0xfed6,0xfed6,0xfed6,0xfed6,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfeec,0xfeec,1,1,1,1,1,1,1,1,1,1, +0xfef4,0xfef4,0xfef4,0xfef4,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1, +1,1,1,0x2a4f,1,1,1,1,1,1,1,1,1,0x2a55,1,1, +1,1,0x2a5b,1,1,1,1,0x2a61,1,1,1,1,0x2a67,1,1,1, +1,1,1,1,1,1,1,1,1,0x2a6d,1,1,1,1,1,1, +1,0xff02,0xff04,0x3c40,0xff08,0x3c48,0x2a72,1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1, +0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,1,0x2a7f,1,1,1,1,1,1,1,1,1,0x2a85,1,1, +1,1,0x2a8b,1,1,1,1,0x2a91,1,1,1,1,0x2a97,1,1,1, +1,1,1,1,1,1,1,1,1,0x2a9d,1,1,1,1,1,1, +1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x8c0,0x1a1f,1, +1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xfe0e, +1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, +1,1,1,1,1,1,1,1,1,0xffcc,1,1,1,1,1,1, +1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc, +0xffcc,0xffb8,1,1,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0, +0x1a37,0x8d4,0x1a3d,1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfe0e,0xfc00,1,1, +1,1,0x8dc,0x1a49,0x8e0,0x1a4f,0x8e4,0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe0e, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8, +0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,0xffb8,1,1, +1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffd4,0xffac,0xffb8, +0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,1,0xffcc, +0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3,0x1aaa,0x1ab0, +0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14,0x1b1a,0x1b20, +0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d,0x1b82,0x1b88, +0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde,0x1be6,0x1bec, +0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,0x1c46,0x1c4c, +0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0,0xdec,0xdf6, +0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26,0x1d2e,0x1d34, +0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e,0x1d98,0x1da2, +0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9,0x1dff,0x1e05, +0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58,1,0x1e5f, +1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4,0x1eae,0x1eb8, +0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a,0x1f38,0x1f3e, +0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba,0x1fc0,0x1fc6, +0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034,0x203e,0x2048, +0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4,0x20ce,0x20d8, +0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146,1,1, +1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee,0xf06,0xf14, +0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82,0x2177,0x2181, +0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026,0x103e,0x104c, +0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6,0x21db,0x21e5, +0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102,0x223f,0x2249, +0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134,1,0x22a3, +1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc,0x11f4,0x1202, +0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae,0x22d1,0x3bb6, +0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356,0x2365,0x2375, +0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e,0x244d,0x245d, +0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526,0x2535,0x2545, +0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5,0x25cb,0x3bc6, +0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce,0x2607,0x3bd6, +0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651,0x2657,0x3bea, +1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7,0x26ad,0x3bfe, +0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e,0x26e9,0x3c16, +0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02,0xffcc, +0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02,0xfe02, +0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x2aae,1,1,1,0x2ab2,0x3c1e,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x908,1,0x90c,1,0x910,1,1,1,1,1,0x26f5,0x26fb,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x2701,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x2707,0x270d,0x2713, +0x914,1,0x918,1,0x91c,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x920,0x2719,1,1,1,0x924,0x271f,1,0x928,0x2725,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x92c,0x272b,0x930,0x2731,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x934,1,1,1, +1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749,1,1,1,0x944,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1,1,1,1,0x275b,0x2761,0x2767, +0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b,0x964,0x968,0x96c,0x970,1,1, +0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af,1,1,1,1,1,1, +1,0x984,0x988,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0x98c,1,1,1,1,1,0x990,0x994,1,0x998,0x27b5,0x27bb,0x27c1,0x27c7, +1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1,1,1,1,1,1, +0x27cd,0x27d3,0x27d9,0x27df,1,1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0,0xffc0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x9ac,1,1,1,1,0x9b0, +0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0,0x2815,0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0, +0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1,0x9e0,0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1, +1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863,0x2869,0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c, +0x2887,0x288d,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x2893,1,1,1,1,0xfc10,0xfc10,1, +1,0xa14,0x2899,1,1,1,1,1,1,1,0xa18,1,1,1,1,0xa1c, +0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30,0x28bd,0xa34,0x28c3,0xa38,0x28c9,0xa3c, +0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7,0xa50,0x28ed,0xa54,0x28f3,1,1, +1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68,0x2911,0x2917,0xa70,0x291d,0x2923,0xa78, +0x2929,0x292f,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1,1,0x293b,0x2941,0x2947,0x294d,1, +1,0xa90,0x2953,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffb8, +0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1, +1,1,0xffcc,0xffcc,1,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1,0x2ae5,0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd, +0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,0x2b25,0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d, +0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,0x2b65,0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d, +0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,0x2ba5,0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd, +0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,0x2be5,0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd, +0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,0x2c25,0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39, +0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,0x2c61,0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79, +0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,0x2ca1,0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9, +0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,0x2ce1,0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9, +0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,0x2d21,0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39, +0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59,0x2d5d,0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71, +0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,0x2d99,0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11, +0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,0x2dd5,0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded, +0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,0x2e15,0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29, +0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,0x2e51,0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69, +0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,0x2e91,0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9, +0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,0x2ed1,0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1, +0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9,0x2efd,0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1, +0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1,1,0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39, +0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,0x2f61,0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79, +0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,0x2fa1,0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9, +0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9,0x2fdd,0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1, +0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011,0x3015,0x3019,0x301d,0x3021,0x3027,1,1, +0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55,0x304b,0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f, +0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083,0x2f79,0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097, +0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab,0x30af,0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf, +0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db,0x30df,0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3, +0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9,0x310f,0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001, +0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09,0x3133,0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f, +0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f,0x3173,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1, +1,1,1,1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0, +0x31c6,0x31cc,0x31d2,1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208, +0x320e,1,0x3214,0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,1,1,0xffb8,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,1,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xfe02,0xffb8,1, +1,1,1,0xfe12,1,1,1,1,1,0xffcc,0xffb8,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xa94,0x2959,0xa9a,0x2963,1,1,1,1,1,1,1, +1,0xaa0,1,1,1,1,1,0x296d,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1, +1,1,0xfe0e,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1, +1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xab2, +1,1,1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f, +0x29a9,0xfc00,0x29b3,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1, +0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xfe12,1,1,1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02, +0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,0xffb0,0xffb0,1,1,1,1,1, +1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324, +0x333c,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x334b,0x334f,0x3353,0x3357, +0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383,0x3387,0x338b,0x3391, +0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5,0x33c9,0x33cd,0x33d1, +0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed,0x33f1,0x33f1,0x33f1, +0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429,0x342d,0x3431,0x3435, +0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead,0x345d,0x3461,0x3465, +0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b,0x34a1,0x34a7,0x34ab, +0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9,0x34dd,0x34e3,0x34e7, +0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b,0x351f,0x3523,0x3527, +0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b,0x355f,0x355f,0x3565, +0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599,0x359d,0x35a1,0x2f71, +0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d,0x2af5,0x35cb,0x35cf, +0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607,0x360b,0x360f,0x3613, +0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641,0x3645,0x3649,0x364d, +0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b,0x367f,0x2f8d,0x3683, +0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7,0x36bd,0x36c1,0x36c5, +0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd,0x2f91,0x2dd9,0x3701, +0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735,0x373b,0x3741,0x3745, +0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b,0x30bb,0x377f,0x3783, +0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3,0x37b9,0x37bd,0x37c1, +0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db,0x37fd,0x3803,0x3809, +0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7,0x3833,0x3837,0x2fbd, +0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869,0x386d,0x3873,0x3877, +0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af,0x38b3,0x38b7,0x38bd, +0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9,0x38ff,0x3903,0x3907, +0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f,0x3943,0x3947,0x394b, +0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979,0x397d,0x3981,0x3985, +0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3,0x39c9,0x39cf,0x39d3, +0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff,0x3a03,0x3a07,0x3a0b, +0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117,0x311b,0x3a45,0x3a49, +0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81,0x3a87,0x3a8d,0x3a91, +0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9,0x3acd,0x3ad3,0x3ad7, +0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b,0x3b0f,0x3b15,0x3b19, +0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b,0x3b51,0x3b55,0x3b5b, +0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1,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,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x3c54,1,0x3c54,1,0x3c54,0x3c54,0x3c54,0x3c54,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c54,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c54, +1,1,1,1,0x3c54,1,1,1,0x3c54,1,0x3c54,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x3b87,1,1,1,1,1 }; -static const uint16_t norm2_nfc_data_extraData[7722]={ +static const uint16_t norm2_nfc_data_extraData[7724]={ 0xffff,0xffff,0x8670,0x44dc,0x8670,0x44c0,0x8670,0x44de,0x600,0x180,0x602,0x182,0x604,0x185,0x606,0x186, 0x608,0x200,0x60c,0x205,0x60e,0x44d,0x610,0x189,0x612,0x3d44,0x614,0x18b,0x618,0x39a,0x61e,0x400, 0x622,0x404,0x646,0x3d41,0x64a,0x3c00,0x8650,0x208,0x60e,0x3c04,0x646,0x3c08,0x8662,0x3c0c,0x602,0x20c, @@ -712,407 +720,407 @@ static const uint16_t norm2_nfc_data_extraData[7722]={ 0x6132,0x61a6,0xe134,0x61a8,0x6132,0x61ac,0xe134,0x61ae,0x6132,0x61b2,0xe134,0x61b4,0x6132,0x61b8,0xe134,0x61ba, 0xe132,0x61ee,0xe132,0x61f0,0xe132,0x61f2,0xe132,0x61f4,0xe132,0x61fc,0xb489,0x2e82,0x2134,0xb489,0x2e82,0x2138, 0xb489,0x2e82,0x2156,0xb489,0x49c2,0x225c,0xb489,0x49c2,0x225e,0x3489,0xcf82,0x2696,0xb489,0xd5c2,0x2698,0x348b, -0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,0,0xe622, -0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe622,0x41,0x308,0x8608,0x3bc,0xe622, -0x41,0x30a,0x8602,0x3f4,0xca22,0x43,0x327,0x8602,0x3c10,0xe622,0x45,0x302,0x600,0x3d80,0x602,0x3d7c, -0x606,0x3d88,0x8612,0x3d84,0xe622,0x49,0x308,0x8602,0x3c5c,0xe622,0x4f,0x302,0x600,0x3da4,0x602,0x3da0, -0x606,0x3dac,0x8612,0x3da8,0xe622,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c,0xe622,0x4f,0x308, -0x8608,0x454,0xe622,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe622,0x61,0x302, -0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe622,0x61,0x308,0x8608,0x3be,0xe622,0x61,0x30a, -0x8602,0x3f6,0xca22,0x63,0x327,0x8602,0x3c12,0xe622,0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a, -0x8612,0x3d86,0xe622,0x69,0x308,0x8602,0x3c5e,0xe622,0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae, -0x8612,0x3daa,0xe622,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe622,0x6f,0x308,0x8608,0x456, -0xe622,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe622,0x41,0x306,0x600,0x3d60, -0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe622,0x61,0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612, -0x3d66,0xe622,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe622,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe622, -0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe622,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe622,0x53,0x301, -0x860e,0x3cc8,0xe622,0x73,0x301,0x860e,0x3cca,0xe622,0x53,0x30c,0x860e,0x3ccc,0xe622,0x73,0x30c,0x860e, -0x3cce,0xe622,0x55,0x303,0x8602,0x3cf0,0xe622,0x75,0x303,0x8602,0x3cf2,0xe622,0x55,0x304,0x8610,0x3cf4, -0xe622,0x75,0x304,0x8610,0x3cf6,0xd822,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc, -0x8646,0x3dc4,0xd822,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd822, -0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd822,0x75,0x31b,0x600, -0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca22,0x4f,0x328,0x8608,0x3d8,0xca22,0x6f, -0x328,0x8608,0x3da,0xe622,0x41,0x307,0x8608,0x3c0,0xe622,0x61,0x307,0x8608,0x3c2,0xca22,0x45,0x327, -0x860c,0x3c38,0xca22,0x65,0x327,0x860c,0x3c3a,0xe622,0x4f,0x307,0x8608,0x460,0xe622,0x6f,0x307,0x8608, -0x462,0xe622,0x3b1,0x301,0x868a,0x3f68,0xe622,0x3b7,0x301,0x868a,0x3f88,0xe622,0x3b9,0x308,0x600,0x3fa4, -0x602,0x720,0x8684,0x3fae,0xe622,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce,0xe622,0x3c9,0x301, -0x868a,0x3fe8,0x22,0xcc6,0xcc2,0x99aa,0x1996,0x22,0xdd9,0xdcf,0x9b94,0x1bba,0xdc22,0x4c,0x323,0x8608, -0x3c70,0xdc22,0x6c,0x323,0x8608,0x3c72,0xdc22,0x52,0x323,0x8608,0x3cb8,0xdc22,0x72,0x323,0x8608,0x3cba, -0xdc22,0x53,0x323,0x860e,0x3cd0,0xdc22,0x73,0x323,0x860e,0x3cd2,0xdc22,0x41,0x323,0x604,0x3d58,0x860c, -0x3d6c,0xdc22,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc22,0x45,0x323,0x8604,0x3d8c,0xdc22,0x65,0x323, -0x8604,0x3d8e,0xdc22,0x4f,0x323,0x8604,0x3db0,0xdc22,0x6f,0x323,0x8604,0x3db2,0xe622,0x3b1,0x313,0x600, -0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe622,0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f, -0x868a,0x3f02,0x1f00,0xe663,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe663,0x3b1,0x314,0x300,0x868a,0x3f06, -0x1f00,0xe663,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe663,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe663, -0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe663,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe622,0x391,0x313,0x600, -0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe622,0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f, -0x868a,0x3f12,0x1f08,0xe663,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe663,0x391,0x314,0x300,0x868a,0x3f16, -0x1f08,0xe663,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe663,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe663, -0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe663,0x391,0x314,0x342,0x868a,0x3f1e,0xe622,0x3b5,0x313,0x600, -0x3e24,0x8602,0x3e28,0xe622,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe622,0x395,0x313,0x600,0x3e34,0x8602, -0x3e38,0xe622,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe622,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684, -0x3e4d,0x868a,0x3f20,0xe622,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe663, -0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe663,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20,0xe663,0x3b7,0x313, -0x301,0x868a,0x3f28,0x1f21,0xe663,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe663,0x3b7,0x313,0x342,0x868a, -0x3f2c,0x1f21,0xe663,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe622,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684, -0x3e5d,0x868a,0x3f30,0xe622,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe663, -0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe663,0x397,0x314,0x300,0x868a,0x3f36,0x1f28,0xe663,0x397,0x313, -0x301,0x868a,0x3f38,0x1f29,0xe663,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe663,0x397,0x313,0x342,0x868a, -0x3f3c,0x1f29,0xe663,0x397,0x314,0x342,0x868a,0x3f3e,0xe622,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684, -0x3e6c,0xe622,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe622,0x399,0x313,0x600,0x3e74,0x602, -0x3e78,0x8684,0x3e7c,0xe622,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe622,0x3bf,0x313,0x600, -0x3e84,0x8602,0x3e88,0xe622,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe622,0x39f,0x313,0x600,0x3e94,0x8602, -0x3e98,0xe622,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe622,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684, -0x3eac,0xe622,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe622,0x3a5,0x314,0x600,0x3eb6,0x602, -0x3eba,0x8684,0x3ebe,0xe622,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe622,0x3c9, -0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe663,0x3c9,0x313,0x300,0x868a,0x3f44, -0x1f61,0xe663,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe663,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe663, -0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe663,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61,0xe663,0x3c9,0x314, -0x342,0x868a,0x3f4e,0xe622,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe622,0x3a9, -0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe663,0x3a9,0x313,0x300,0x868a,0x3f54, -0x1f69,0xe663,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe663,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe663, -0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe663,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69,0xe663,0x3a9,0x314, -0x342,0x868a,0x3f5e,0xe622,0x3b1,0x300,0x868a,0x3f64,0xe622,0x3b7,0x300,0x868a,0x3f84,0xe622,0x3c9,0x300, -0x868a,0x3fe4,0xe622,0x3b1,0x342,0x868a,0x3f6e,0xe622,0x3b7,0x342,0x868a,0x3f8e,0xe622,0x3c9,0x342,0x868a, -0x3fee,0xe622,0x41,0x300,0xe622,0x41,0x301,0xe622,0x41,0x303,0xe622,0x45,0x300,0xe622,0x45,0x301, -0xe622,0x45,0x308,0xe622,0x49,0x300,0xe622,0x49,0x301,0xe622,0x49,0x302,0xe622,0x4e,0x303,0xe622, -0x4f,0x300,0xe622,0x4f,0x301,0xe622,0x55,0x300,0xe622,0x55,0x301,0xe622,0x55,0x302,0xe622,0x59, -0x301,0xe622,0x61,0x300,0xe622,0x61,0x301,0xe622,0x61,0x303,0xe622,0x65,0x300,0xe622,0x65,0x301, -0xe622,0x65,0x308,0xe622,0x69,0x300,0xe622,0x69,0x301,0xe622,0x69,0x302,0xe622,0x6e,0x303,0xe622, -0x6f,0x300,0xe622,0x6f,0x301,0xe622,0x75,0x300,0xe622,0x75,0x301,0xe622,0x75,0x302,0xe622,0x79, -0x301,0xe622,0x79,0x308,0xe622,0x41,0x304,0xe622,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61,0x328, -0xe622,0x43,0x301,0xe622,0x63,0x301,0xe622,0x43,0x302,0xe622,0x63,0x302,0xe622,0x43,0x307,0xe622, -0x63,0x307,0xe622,0x43,0x30c,0xe622,0x63,0x30c,0xe622,0x44,0x30c,0xe622,0x64,0x30c,0xe622,0x45, -0x306,0xe622,0x65,0x306,0xe622,0x45,0x307,0xe622,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65,0x328, -0xe622,0x45,0x30c,0xe622,0x65,0x30c,0xe622,0x47,0x302,0xe622,0x67,0x302,0xe622,0x47,0x306,0xe622, -0x67,0x306,0xe622,0x47,0x307,0xe622,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe622,0x48, -0x302,0xe622,0x68,0x302,0xe622,0x49,0x303,0xe622,0x69,0x303,0xe622,0x49,0x304,0xe622,0x69,0x304, -0xe622,0x49,0x306,0xe622,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe622,0x49,0x307,0xe602, -0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe622,0x4c,0x301,0xe622,0x6c, -0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe622,0x4c,0x30c,0xe622,0x6c,0x30c,0xe622,0x4e,0x301, -0xe622,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe622,0x4e,0x30c,0xe622,0x6e,0x30c,0xe622, -0x4f,0x306,0xe622,0x6f,0x306,0xe622,0x4f,0x30b,0xe622,0x6f,0x30b,0xe622,0x52,0x301,0xe622,0x72, -0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe622,0x52,0x30c,0xe622,0x72,0x30c,0xe622,0x53,0x302, -0xe622,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327,0xe622, -0x54,0x30c,0xe622,0x74,0x30c,0xe622,0x55,0x306,0xe622,0x75,0x306,0xe622,0x55,0x30a,0xe622,0x75, -0x30a,0xe622,0x55,0x30b,0xe622,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe622,0x57,0x302, -0xe622,0x77,0x302,0xe622,0x59,0x302,0xe622,0x79,0x302,0xe622,0x59,0x308,0xe622,0x5a,0x301,0xe622, -0x7a,0x301,0xe622,0x5a,0x307,0xe622,0x7a,0x307,0xe622,0x5a,0x30c,0xe622,0x7a,0x30c,0xe622,0x41, -0x30c,0xe622,0x61,0x30c,0xe622,0x49,0x30c,0xe622,0x69,0x30c,0xe622,0x4f,0x30c,0xe622,0x6f,0x30c, -0xe622,0x55,0x30c,0xe622,0x75,0x30c,0xdc,0xe663,0x55,0x308,0x304,0xfc,0xe663,0x75,0x308,0x304, -0xdc,0xe663,0x55,0x308,0x301,0xfc,0xe663,0x75,0x308,0x301,0xdc,0xe663,0x55,0x308,0x30c,0xfc, -0xe663,0x75,0x308,0x30c,0xdc,0xe663,0x55,0x308,0x300,0xfc,0xe663,0x75,0x308,0x300,0xc4,0xe663, -0x41,0x308,0x304,0xe4,0xe663,0x61,0x308,0x304,0x226,0xe663,0x41,0x307,0x304,0x227,0xe663,0x61, -0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe622,0x47,0x30c,0xe622,0x67,0x30c,0xe622,0x4b, -0x30c,0xe622,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602,0x1b7, -0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe622,0x47,0x301,0xe622,0x67,0x301,0xe622,0x4e,0x300, -0xe622,0x6e,0x300,0xc5,0xe663,0x41,0x30a,0x301,0xe5,0xe663,0x61,0x30a,0x301,0xe602,0xc6,0x301, -0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe622,0x41,0x30f,0xe622,0x61,0x30f,0xe622, -0x41,0x311,0xe622,0x61,0x311,0xe622,0x45,0x30f,0xe622,0x65,0x30f,0xe622,0x45,0x311,0xe622,0x65, -0x311,0xe622,0x49,0x30f,0xe622,0x69,0x30f,0xe622,0x49,0x311,0xe622,0x69,0x311,0xe622,0x4f,0x30f, -0xe622,0x6f,0x30f,0xe622,0x4f,0x311,0xe622,0x6f,0x311,0xe622,0x52,0x30f,0xe622,0x72,0x30f,0xe622, -0x52,0x311,0xe622,0x72,0x311,0xe622,0x55,0x30f,0xe622,0x75,0x30f,0xe622,0x55,0x311,0xe622,0x75, -0x311,0xdc22,0x53,0x326,0xdc22,0x73,0x326,0xdc22,0x54,0x326,0xdc22,0x74,0x326,0xe622,0x48,0x30c, -0xe622,0x68,0x30c,0xd6,0xe663,0x4f,0x308,0x304,0xf6,0xe663,0x6f,0x308,0x304,0xd5,0xe663,0x4f, -0x303,0x304,0xf5,0xe663,0x6f,0x303,0x304,0x22e,0xe663,0x4f,0x307,0x304,0x22f,0xe663,0x6f,0x307, -0x304,0xe622,0x59,0x304,0xe622,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395,0x301, -0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301,0x3ca, -0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9,0x301, -0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602,0x3d2, -0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a,0x301, -0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300,0xe602, -0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602,0x443, -0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410,0x306, -0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306,0xe602, -0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602,0x437, -0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e,0x308, -0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308,0xe602, -0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602,0x443, -0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe622,0x627,0x653, -0xe622,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654,0xe602, -0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,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,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5,2, -0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47,0xd3e, -2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,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,0xdc22,0x41,0x325,0xdc22,0x61,0x325,0xe622,0x42,0x307,0xe622,0x62,0x307,0xdc02,0x42, -0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301,0xe7, -0xe643,0x63,0x327,0x301,0xe622,0x44,0x307,0xe622,0x64,0x307,0xdc22,0x44,0x323,0xdc22,0x64,0x323, -0xdc22,0x44,0x331,0xdc22,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc22,0x44,0x32d,0xdc22, -0x64,0x32d,0x112,0xe663,0x45,0x304,0x300,0x113,0xe663,0x65,0x304,0x300,0x112,0xe663,0x45,0x304, -0x301,0x113,0xe663,0x65,0x304,0x301,0xdc22,0x45,0x32d,0xdc22,0x65,0x32d,0xdc22,0x45,0x330,0xdc22, -0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307,0xe602, -0x66,0x307,0xe622,0x47,0x304,0xe622,0x67,0x304,0xe622,0x48,0x307,0xe622,0x68,0x307,0xdc22,0x48, -0x323,0xdc22,0x68,0x323,0xe622,0x48,0x308,0xe622,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68,0x327, -0xdc22,0x48,0x32e,0xdc22,0x68,0x32e,0xdc22,0x49,0x330,0xdc22,0x69,0x330,0xcf,0xe663,0x49,0x308, -0x301,0xef,0xe663,0x69,0x308,0x301,0xe622,0x4b,0x301,0xe622,0x6b,0x301,0xdc22,0x4b,0x323,0xdc22, -0x6b,0x323,0xdc22,0x4b,0x331,0xdc22,0x6b,0x331,0x1e36,0xe663,0x4c,0x323,0x304,0x1e37,0xe663,0x6c, -0x323,0x304,0xdc22,0x4c,0x331,0xdc22,0x6c,0x331,0xdc22,0x4c,0x32d,0xdc22,0x6c,0x32d,0xe622,0x4d, -0x301,0xe622,0x6d,0x301,0xe622,0x4d,0x307,0xe622,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d,0x323, -0xe622,0x4e,0x307,0xe622,0x6e,0x307,0xdc22,0x4e,0x323,0xdc22,0x6e,0x323,0xdc22,0x4e,0x331,0xdc22, -0x6e,0x331,0xdc22,0x4e,0x32d,0xdc22,0x6e,0x32d,0xd5,0xe663,0x4f,0x303,0x301,0xf5,0xe663,0x6f, -0x303,0x301,0xd5,0xe663,0x4f,0x303,0x308,0xf5,0xe663,0x6f,0x303,0x308,0x14c,0xe663,0x4f,0x304, -0x300,0x14d,0xe663,0x6f,0x304,0x300,0x14c,0xe663,0x4f,0x304,0x301,0x14d,0xe663,0x6f,0x304,0x301, -0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe622,0x52,0x307,0xe622, -0x72,0x307,0x1e5a,0xe663,0x52,0x323,0x304,0x1e5b,0xe663,0x72,0x323,0x304,0xdc22,0x52,0x331,0xdc22, -0x72,0x331,0xe622,0x53,0x307,0xe622,0x73,0x307,0x15a,0xe663,0x53,0x301,0x307,0x15b,0xe663,0x73, -0x301,0x307,0x160,0xe663,0x53,0x30c,0x307,0x161,0xe663,0x73,0x30c,0x307,0x1e62,0xe663,0x53,0x323, -0x307,0x1e63,0xe663,0x73,0x323,0x307,0xe622,0x54,0x307,0xe622,0x74,0x307,0xdc22,0x54,0x323,0xdc22, -0x74,0x323,0xdc22,0x54,0x331,0xdc22,0x74,0x331,0xdc22,0x54,0x32d,0xdc22,0x74,0x32d,0xdc22,0x55, -0x324,0xdc22,0x75,0x324,0xdc22,0x55,0x330,0xdc22,0x75,0x330,0xdc22,0x55,0x32d,0xdc22,0x75,0x32d, -0x168,0xe663,0x55,0x303,0x301,0x169,0xe663,0x75,0x303,0x301,0x16a,0xe663,0x55,0x304,0x308,0x16b, -0xe663,0x75,0x304,0x308,0xe622,0x56,0x303,0xe622,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76,0x323, -0xe622,0x57,0x300,0xe622,0x77,0x300,0xe622,0x57,0x301,0xe622,0x77,0x301,0xe622,0x57,0x308,0xe622, -0x77,0x308,0xe622,0x57,0x307,0xe622,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602,0x58, -0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe622,0x59,0x307,0xe622,0x79,0x307, -0xe622,0x5a,0x302,0xe622,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331,0xdc02, -0x7a,0x331,0xdc22,0x68,0x331,0xe622,0x74,0x308,0xe622,0x77,0x30a,0xe622,0x79,0x30a,0xe602,0x17f, -0x307,0xe622,0x41,0x309,0xe622,0x61,0x309,0xc2,0xe663,0x41,0x302,0x301,0xe2,0xe663,0x61,0x302, -0x301,0xc2,0xe663,0x41,0x302,0x300,0xe2,0xe663,0x61,0x302,0x300,0xc2,0xe663,0x41,0x302,0x309, -0xe2,0xe663,0x61,0x302,0x309,0xc2,0xe663,0x41,0x302,0x303,0xe2,0xe663,0x61,0x302,0x303,0x1ea0, -0xe663,0x41,0x323,0x302,0x1ea1,0xe663,0x61,0x323,0x302,0x102,0xe663,0x41,0x306,0x301,0x103,0xe663, -0x61,0x306,0x301,0x102,0xe663,0x41,0x306,0x300,0x103,0xe663,0x61,0x306,0x300,0x102,0xe663,0x41, -0x306,0x309,0x103,0xe663,0x61,0x306,0x309,0x102,0xe663,0x41,0x306,0x303,0x103,0xe663,0x61,0x306, -0x303,0x1ea0,0xe663,0x41,0x323,0x306,0x1ea1,0xe663,0x61,0x323,0x306,0xe622,0x45,0x309,0xe622,0x65, -0x309,0xe622,0x45,0x303,0xe622,0x65,0x303,0xca,0xe663,0x45,0x302,0x301,0xea,0xe663,0x65,0x302, -0x301,0xca,0xe663,0x45,0x302,0x300,0xea,0xe663,0x65,0x302,0x300,0xca,0xe663,0x45,0x302,0x309, -0xea,0xe663,0x65,0x302,0x309,0xca,0xe663,0x45,0x302,0x303,0xea,0xe663,0x65,0x302,0x303,0x1eb8, -0xe663,0x45,0x323,0x302,0x1eb9,0xe663,0x65,0x323,0x302,0xe622,0x49,0x309,0xe622,0x69,0x309,0xdc22, -0x49,0x323,0xdc22,0x69,0x323,0xe622,0x4f,0x309,0xe622,0x6f,0x309,0xd4,0xe663,0x4f,0x302,0x301, -0xf4,0xe663,0x6f,0x302,0x301,0xd4,0xe663,0x4f,0x302,0x300,0xf4,0xe663,0x6f,0x302,0x300,0xd4, -0xe663,0x4f,0x302,0x309,0xf4,0xe663,0x6f,0x302,0x309,0xd4,0xe663,0x4f,0x302,0x303,0xf4,0xe663, -0x6f,0x302,0x303,0x1ecc,0xe663,0x4f,0x323,0x302,0x1ecd,0xe663,0x6f,0x323,0x302,0x1a0,0xe663,0x4f, -0x31b,0x301,0x1a1,0xe663,0x6f,0x31b,0x301,0x1a0,0xe663,0x4f,0x31b,0x300,0x1a1,0xe663,0x6f,0x31b, -0x300,0x1a0,0xe663,0x4f,0x31b,0x309,0x1a1,0xe663,0x6f,0x31b,0x309,0x1a0,0xe663,0x4f,0x31b,0x303, -0x1a1,0xe663,0x6f,0x31b,0x303,0x1a0,0xdc63,0x4f,0x31b,0x323,0x1a1,0xdc63,0x6f,0x31b,0x323,0xdc22, -0x55,0x323,0xdc22,0x75,0x323,0xe622,0x55,0x309,0xe622,0x75,0x309,0x1af,0xe663,0x55,0x31b,0x301, -0x1b0,0xe663,0x75,0x31b,0x301,0x1af,0xe663,0x55,0x31b,0x300,0x1b0,0xe663,0x75,0x31b,0x300,0x1af, -0xe663,0x55,0x31b,0x309,0x1b0,0xe663,0x75,0x31b,0x309,0x1af,0xe663,0x55,0x31b,0x303,0x1b0,0xe663, -0x75,0x31b,0x303,0x1af,0xdc63,0x55,0x31b,0x323,0x1b0,0xdc63,0x75,0x31b,0x323,0xe622,0x59,0x300, -0xe622,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe622,0x59,0x309,0xe622,0x79,0x309,0xe622, -0x59,0x303,0xe622,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300,0x1f10, -0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19,0xe643, -0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643,0x3b9, -0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9,0x314, -0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313,0x300, -0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301,0x1f38, -0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41,0xe643, -0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643,0x39f, -0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f,0x314, -0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313,0x301, -0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342,0x1f59, -0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602,0x3b5, -0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf063,0x3b1,0x313,0x345,0x1f01, -0xf063,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2,0xf044, -0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2,0xf044, -0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2,0xf044, -0x3b1,0x314,0x342,0x345,0x1f08,0xf063,0x391,0x313,0x345,0x1f09,0xf063,0x391,0x314,0x345,0x1f0a,0x345, -2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c,0x345, -2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e,0x345, -2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20,0xf063, -0x3b7,0x313,0x345,0x1f21,0xf063,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300,0x345, -0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301,0x345, -0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342,0x345, -0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf063,0x397,0x313,0x345,0x1f29,0xf063,0x397, -0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397,0x314, -0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397,0x314, -0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397,0x314, -0x342,0x345,0x1f60,0xf063,0x3c9,0x313,0x345,0x1f61,0xf063,0x3c9,0x314,0x345,0x1f62,0x345,2,0xf044, -0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2,0xf044, -0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2,0xf044, -0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf063,0x3a9,0x313, -0x345,0x1f69,0xf063,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b,0x345, -2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d,0x345, -2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f,0x345, -2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1,0x300, -0x345,0xf022,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602,0x391, -0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf022,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043,0x3b7, -0x300,0x345,0xf022,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345,0xe602, -0x395,0x300,0xe602,0x397,0x300,0xf022,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602,0x1fbf, -0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342,0x3ca, -0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe,0x300, -0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5,0x308, -0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342,0xe602, -0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c,0xf043, -0x3c9,0x300,0x345,0xf022,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342,0x345, -0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf022,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338,0x102, -0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102,0x2208, -0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243,0x338, -0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338,0x102, -0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102,0x2273, -0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282,0x338, -0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338,0x102, -0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102,0x2292, -0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b,0x3099, -0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099,0x802, -0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802,0x3061, -0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f,0x309a, -0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099,0x802, -0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802,0x30ab, -0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5,0x3099, -0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099,0x802, -0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802,0x30cf, -0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8,0x3099, -0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099,0x802, -0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704,0xd804,0xdc99,0xd804,0xdcba, -0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27,4, -0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4,0xd805, -0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805,0xddb8, -0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,0xe6e6,0xe6a1,0x300,0xe6e6,0xe6a1,0x301,0xe6e6,0xe6a1,0x313, -0xe6e6,0xe6a2,0x308,0x301,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915,0x93c,0x702,0x916,0x93c, -0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c,0x702,0x92b,0x93c,0x702, -0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702,0xa32,0xa3c,0x702,0xa38, -0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b,0xa3c,0x702,0xb21,0xb3c, -0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7,2, -0xf5b,0xfb7,2,0xf40,0xfb5,0x8100,0x82a2,0xf71,0xf72,0x8100,0x84a2,0xf71,0xf74,0x8202,0xfb2,0xf80, -0x8202,0xfb3,0xf80,0x8100,0x82a2,0xf71,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7, -2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,0x3ac,0xe662,0x3b1,0x301,0x3ad,0xe642,0x3b5, -0x301,0x3ae,0xe662,0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5, -0x301,0x3ce,0xe662,0x3c9,0x301,0x386,0xe642,0x391,0x301,0x21,0x3b9,0x388,0xe642,0x395,0x301,0x389, -0xe642,0x397,0x301,0x390,1,0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643, -0x3c5,0x308,0x301,0x38e,0xe642,0x3a5,0x301,0x385,0xe642,0xa8,0x301,1,0x60,0x38c,0xe642,0x39f, -0x301,0x38f,0xe642,0x3a9,0x301,1,0xb4,0x21,0x3a9,0x21,0x4b,0xc5,0xe662,0x41,0x30a,1, -0x3008,1,0x3009,0x102,0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1, -1,0x4e32,1,0x53e5,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,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,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375, -1,0x4ee4,1,0x56f9,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,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,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,0x90de, -1,0x96b7,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,0x7e09,1,0x7e41,1,0x7f72,1,0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910, -1,0x8996,1,0x8b01,1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff, -1,0x983b,1,0x6075,2,0xd850,0xdeee,1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1, -0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,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,0x6160,1,0x6234,1,0x63c4,1,0x641c,1, -0x6452,1,0x6556,1,0x671b,1,0x6756,1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1, -0x77a7,1,0x7235,1,0x72af,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1, -0x76db,1,0x76f4,1,0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1, -0x7f3e,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1, -0x8aed,1,0x8b8a,1,0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x97db,1, -0x980b,1,0x9b12,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,0xe02, -0x5d9,0x5b4,0x1102,0x5f2,0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1, -0xfb49,0x1943,0x5e9,0x5bc,0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1, -0x5bc,0x1502,0x5d2,0x5bc,0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc, -0x1502,0x5d8,0x5bc,0x1502,0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502, -0x5de,0x5bc,0x1502,0x5e0,0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6, -0x5bc,0x1502,0x5e7,0x5bc,0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9, -0x1702,0x5d1,0x5bf,0x1702,0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834, -0xdd58,0xd834,0xdd65,0xd834,0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834, -0xdd5f,0xd834,0xdd6f,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4, -0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd71,0xd834,0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804, -0xd834,0xddb9,0xd834,0xdd65,0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834, -0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834, -0xdd6e,0xd834,0xddbb,0xd834,0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834, -0xdd6f,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2, -0xd840,0xdd22,1,0x4f60,1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e, -2,0xd841,0xde3a,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,2,0xd864,0xdddf, -1,0x51f5,1,0x5203,1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515, -1,0x5305,1,0x5306,1,0x5349,1,0x535a,1,0x5373,1,0x537d,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,0x55ab,1,0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651, -1,0x5674,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,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8, -1,0x5bf3,2,0xd846,0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1, -0x5c60,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,2,0xd868, -0xdf92,1,0x5efe,2,0xd848,0xdf31,1,0x8201,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,2,0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1, -0x617a,1,0x61b2,1,0x61a4,1,0x61af,1,0x61de,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,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8, -1,0x6649,1,0x3b19,1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c, -1,0x80ad,1,0x43d9,1,0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1, -0x67fa,1,0x6785,1,0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,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,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,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1, -0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f, -0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,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,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,0x7447,1,0x745c, -1,0x7485,1,0x74ca,1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92, -2,0xd848,0xdd9f,1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc, -1,0x4008,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e, -1,0x771f,1,0x778b,1,0x4046,1,0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2, -0xd855,0xde26,2,0xd855,0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f, -2,0xd856,0xdd7c,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,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,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,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7, -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, -0x8667,1,0x8669,1,0x86a9,1,0x8688,1,0x870e,1,0x86e2,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,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,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,0x9829,2,0xd865,0xddb6,1,0x98e2, -1,0x4b33,1,0x9929,1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,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 +0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,2,0xe602, +0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe602,0x41,0x308,0x8608,0x3bc,0xe602, +0x41,0x30a,0x8602,0x3f4,0xca02,0x43,0x327,0x8602,0x3c10,0xe602,0x45,0x302,0x600,0x3d80,0x602,0x3d7c, +0x606,0x3d88,0x8612,0x3d84,0xe602,0x49,0x308,0x8602,0x3c5c,0xe602,0x4f,0x302,0x600,0x3da4,0x602,0x3da0, +0x606,0x3dac,0x8612,0x3da8,0xe602,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c,0xe602,0x4f,0x308, +0x8608,0x454,0xe602,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe602,0x61,0x302, +0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe602,0x61,0x308,0x8608,0x3be,0xe602,0x61,0x30a, +0x8602,0x3f6,0xca02,0x63,0x327,0x8602,0x3c12,0xe602,0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a, +0x8612,0x3d86,0xe602,0x69,0x308,0x8602,0x3c5e,0xe602,0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae, +0x8612,0x3daa,0xe602,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe602,0x6f,0x308,0x8608,0x456, +0xe602,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe602,0x41,0x306,0x600,0x3d60, +0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe602,0x61,0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612, +0x3d66,0xe602,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe602,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe602, +0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe602,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe602,0x53,0x301, +0x860e,0x3cc8,0xe602,0x73,0x301,0x860e,0x3cca,0xe602,0x53,0x30c,0x860e,0x3ccc,0xe602,0x73,0x30c,0x860e, +0x3cce,0xe602,0x55,0x303,0x8602,0x3cf0,0xe602,0x75,0x303,0x8602,0x3cf2,0xe602,0x55,0x304,0x8610,0x3cf4, +0xe602,0x75,0x304,0x8610,0x3cf6,0xd802,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc, +0x8646,0x3dc4,0xd802,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd802, +0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd802,0x75,0x31b,0x600, +0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca02,0x4f,0x328,0x8608,0x3d8,0xca02,0x6f, +0x328,0x8608,0x3da,0xe602,0x41,0x307,0x8608,0x3c0,0xe602,0x61,0x307,0x8608,0x3c2,0xca02,0x45,0x327, +0x860c,0x3c38,0xca02,0x65,0x327,0x860c,0x3c3a,0xe602,0x4f,0x307,0x8608,0x460,0xe602,0x6f,0x307,0x8608, +0x462,0xe602,0x3b1,0x301,0x868a,0x3f68,0xe602,0x3b7,0x301,0x868a,0x3f88,0xe602,0x3b9,0x308,0x600,0x3fa4, +0x602,0x720,0x8684,0x3fae,0xe602,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce,0xe602,0x3c9,0x301, +0x868a,0x3fe8,2,0xcc6,0xcc2,0x99aa,0x1996,2,0xdd9,0xdcf,0x9b94,0x1bba,0xdc02,0x4c,0x323,0x8608, +0x3c70,0xdc02,0x6c,0x323,0x8608,0x3c72,0xdc02,0x52,0x323,0x8608,0x3cb8,0xdc02,0x72,0x323,0x8608,0x3cba, +0xdc02,0x53,0x323,0x860e,0x3cd0,0xdc02,0x73,0x323,0x860e,0x3cd2,0xdc02,0x41,0x323,0x604,0x3d58,0x860c, +0x3d6c,0xdc02,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc02,0x45,0x323,0x8604,0x3d8c,0xdc02,0x65,0x323, +0x8604,0x3d8e,0xdc02,0x4f,0x323,0x8604,0x3db0,0xdc02,0x6f,0x323,0x8604,0x3db2,0xe602,0x3b1,0x313,0x600, +0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe602,0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f, +0x868a,0x3f02,0x1f00,0xe643,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe643,0x3b1,0x314,0x300,0x868a,0x3f06, +0x1f00,0xe643,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe643,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe643, +0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe643,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe602,0x391,0x313,0x600, +0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe602,0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f, +0x868a,0x3f12,0x1f08,0xe643,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe643,0x391,0x314,0x300,0x868a,0x3f16, +0x1f08,0xe643,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe643,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe643, +0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe643,0x391,0x314,0x342,0x868a,0x3f1e,0xe602,0x3b5,0x313,0x600, +0x3e24,0x8602,0x3e28,0xe602,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe602,0x395,0x313,0x600,0x3e34,0x8602, +0x3e38,0xe602,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe602,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684, +0x3e4d,0x868a,0x3f20,0xe602,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe643, +0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe643,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20,0xe643,0x3b7,0x313, +0x301,0x868a,0x3f28,0x1f21,0xe643,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe643,0x3b7,0x313,0x342,0x868a, +0x3f2c,0x1f21,0xe643,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe602,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684, +0x3e5d,0x868a,0x3f30,0xe602,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe643, +0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe643,0x397,0x314,0x300,0x868a,0x3f36,0x1f28,0xe643,0x397,0x313, +0x301,0x868a,0x3f38,0x1f29,0xe643,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe643,0x397,0x313,0x342,0x868a, +0x3f3c,0x1f29,0xe643,0x397,0x314,0x342,0x868a,0x3f3e,0xe602,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684, +0x3e6c,0xe602,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe602,0x399,0x313,0x600,0x3e74,0x602, +0x3e78,0x8684,0x3e7c,0xe602,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe602,0x3bf,0x313,0x600, +0x3e84,0x8602,0x3e88,0xe602,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe602,0x39f,0x313,0x600,0x3e94,0x8602, +0x3e98,0xe602,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe602,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684, +0x3eac,0xe602,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe602,0x3a5,0x314,0x600,0x3eb6,0x602, +0x3eba,0x8684,0x3ebe,0xe602,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe602,0x3c9, +0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe643,0x3c9,0x313,0x300,0x868a,0x3f44, +0x1f61,0xe643,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe643,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe643, +0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe643,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61,0xe643,0x3c9,0x314, +0x342,0x868a,0x3f4e,0xe602,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe602,0x3a9, +0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe643,0x3a9,0x313,0x300,0x868a,0x3f54, +0x1f69,0xe643,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe643,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe643, +0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe643,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69,0xe643,0x3a9,0x314, +0x342,0x868a,0x3f5e,0xe602,0x3b1,0x300,0x868a,0x3f64,0xe602,0x3b7,0x300,0x868a,0x3f84,0xe602,0x3c9,0x300, +0x868a,0x3fe4,0xe602,0x3b1,0x342,0x868a,0x3f6e,0xe602,0x3b7,0x342,0x868a,0x3f8e,0xe602,0x3c9,0x342,0x868a, +0x3fee,3,0xe602,0x41,0x300,0xe602,0x41,0x301,0xe602,0x41,0x303,0xe602,0x45,0x300,0xe602,0x45, +0x301,0xe602,0x45,0x308,0xe602,0x49,0x300,0xe602,0x49,0x301,0xe602,0x49,0x302,0xe602,0x4e,0x303, +0xe602,0x4f,0x300,0xe602,0x4f,0x301,0xe602,0x55,0x300,0xe602,0x55,0x301,0xe602,0x55,0x302,0xe602, +0x59,0x301,0xe602,0x61,0x300,0xe602,0x61,0x301,0xe602,0x61,0x303,0xe602,0x65,0x300,0xe602,0x65, +0x301,0xe602,0x65,0x308,0xe602,0x69,0x300,0xe602,0x69,0x301,0xe602,0x69,0x302,0xe602,0x6e,0x303, +0xe602,0x6f,0x300,0xe602,0x6f,0x301,0xe602,0x75,0x300,0xe602,0x75,0x301,0xe602,0x75,0x302,0xe602, +0x79,0x301,0xe602,0x79,0x308,0xe602,0x41,0x304,0xe602,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61, +0x328,0xe602,0x43,0x301,0xe602,0x63,0x301,0xe602,0x43,0x302,0xe602,0x63,0x302,0xe602,0x43,0x307, +0xe602,0x63,0x307,0xe602,0x43,0x30c,0xe602,0x63,0x30c,0xe602,0x44,0x30c,0xe602,0x64,0x30c,0xe602, +0x45,0x306,0xe602,0x65,0x306,0xe602,0x45,0x307,0xe602,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65, +0x328,0xe602,0x45,0x30c,0xe602,0x65,0x30c,0xe602,0x47,0x302,0xe602,0x67,0x302,0xe602,0x47,0x306, +0xe602,0x67,0x306,0xe602,0x47,0x307,0xe602,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe602, +0x48,0x302,0xe602,0x68,0x302,0xe602,0x49,0x303,0xe602,0x69,0x303,0xe602,0x49,0x304,0xe602,0x69, +0x304,0xe602,0x49,0x306,0xe602,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe602,0x49,0x307, +0xe602,0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe602,0x4c,0x301,0xe602, +0x6c,0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe602,0x4c,0x30c,0xe602,0x6c,0x30c,0xe602,0x4e, +0x301,0xe602,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe602,0x4e,0x30c,0xe602,0x6e,0x30c, +0xe602,0x4f,0x306,0xe602,0x6f,0x306,0xe602,0x4f,0x30b,0xe602,0x6f,0x30b,0xe602,0x52,0x301,0xe602, +0x72,0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe602,0x52,0x30c,0xe602,0x72,0x30c,0xe602,0x53, +0x302,0xe602,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327, +0xe602,0x54,0x30c,0xe602,0x74,0x30c,0xe602,0x55,0x306,0xe602,0x75,0x306,0xe602,0x55,0x30a,0xe602, +0x75,0x30a,0xe602,0x55,0x30b,0xe602,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe602,0x57, +0x302,0xe602,0x77,0x302,0xe602,0x59,0x302,0xe602,0x79,0x302,0xe602,0x59,0x308,0xe602,0x5a,0x301, +0xe602,0x7a,0x301,0xe602,0x5a,0x307,0xe602,0x7a,0x307,0xe602,0x5a,0x30c,0xe602,0x7a,0x30c,0xe602, +0x41,0x30c,0xe602,0x61,0x30c,0xe602,0x49,0x30c,0xe602,0x69,0x30c,0xe602,0x4f,0x30c,0xe602,0x6f, +0x30c,0xe602,0x55,0x30c,0xe602,0x75,0x30c,0xdc,0xe643,0x55,0x308,0x304,0xfc,0xe643,0x75,0x308, +0x304,0xdc,0xe643,0x55,0x308,0x301,0xfc,0xe643,0x75,0x308,0x301,0xdc,0xe643,0x55,0x308,0x30c, +0xfc,0xe643,0x75,0x308,0x30c,0xdc,0xe643,0x55,0x308,0x300,0xfc,0xe643,0x75,0x308,0x300,0xc4, +0xe643,0x41,0x308,0x304,0xe4,0xe643,0x61,0x308,0x304,0x226,0xe643,0x41,0x307,0x304,0x227,0xe643, +0x61,0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe602,0x47,0x30c,0xe602,0x67,0x30c,0xe602, +0x4b,0x30c,0xe602,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602, +0x1b7,0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe602,0x47,0x301,0xe602,0x67,0x301,0xe602,0x4e, +0x300,0xe602,0x6e,0x300,0xc5,0xe643,0x41,0x30a,0x301,0xe5,0xe643,0x61,0x30a,0x301,0xe602,0xc6, +0x301,0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe602,0x41,0x30f,0xe602,0x61,0x30f, +0xe602,0x41,0x311,0xe602,0x61,0x311,0xe602,0x45,0x30f,0xe602,0x65,0x30f,0xe602,0x45,0x311,0xe602, +0x65,0x311,0xe602,0x49,0x30f,0xe602,0x69,0x30f,0xe602,0x49,0x311,0xe602,0x69,0x311,0xe602,0x4f, +0x30f,0xe602,0x6f,0x30f,0xe602,0x4f,0x311,0xe602,0x6f,0x311,0xe602,0x52,0x30f,0xe602,0x72,0x30f, +0xe602,0x52,0x311,0xe602,0x72,0x311,0xe602,0x55,0x30f,0xe602,0x75,0x30f,0xe602,0x55,0x311,0xe602, +0x75,0x311,0xdc02,0x53,0x326,0xdc02,0x73,0x326,0xdc02,0x54,0x326,0xdc02,0x74,0x326,0xe602,0x48, +0x30c,0xe602,0x68,0x30c,0xd6,0xe643,0x4f,0x308,0x304,0xf6,0xe643,0x6f,0x308,0x304,0xd5,0xe643, +0x4f,0x303,0x304,0xf5,0xe643,0x6f,0x303,0x304,0x22e,0xe643,0x4f,0x307,0x304,0x22f,0xe643,0x6f, +0x307,0x304,0xe602,0x59,0x304,0xe602,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395, +0x301,0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301, +0x3ca,0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9, +0x301,0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602, +0x3d2,0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a, +0x301,0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300, +0xe602,0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602, +0x443,0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410, +0x306,0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306, +0xe602,0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602, +0x437,0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e, +0x308,0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308, +0xe602,0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602, +0x443,0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe602,0x627, +0x653,0xe602,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654, +0xe602,0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,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,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5, +2,0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47, +0xd3e,2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,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,0xdc02,0x41,0x325,0xdc02,0x61,0x325,0xe602,0x42,0x307,0xe602,0x62,0x307,0xdc02, +0x42,0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301, +0xe7,0xe643,0x63,0x327,0x301,0xe602,0x44,0x307,0xe602,0x64,0x307,0xdc02,0x44,0x323,0xdc02,0x64, +0x323,0xdc02,0x44,0x331,0xdc02,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc02,0x44,0x32d, +0xdc02,0x64,0x32d,0x112,0xe643,0x45,0x304,0x300,0x113,0xe643,0x65,0x304,0x300,0x112,0xe643,0x45, +0x304,0x301,0x113,0xe643,0x65,0x304,0x301,0xdc02,0x45,0x32d,0xdc02,0x65,0x32d,0xdc02,0x45,0x330, +0xdc02,0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307, +0xe602,0x66,0x307,0xe602,0x47,0x304,0xe602,0x67,0x304,0xe602,0x48,0x307,0xe602,0x68,0x307,0xdc02, +0x48,0x323,0xdc02,0x68,0x323,0xe602,0x48,0x308,0xe602,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68, +0x327,0xdc02,0x48,0x32e,0xdc02,0x68,0x32e,0xdc02,0x49,0x330,0xdc02,0x69,0x330,0xcf,0xe643,0x49, +0x308,0x301,0xef,0xe643,0x69,0x308,0x301,0xe602,0x4b,0x301,0xe602,0x6b,0x301,0xdc02,0x4b,0x323, +0xdc02,0x6b,0x323,0xdc02,0x4b,0x331,0xdc02,0x6b,0x331,0x1e36,0xe643,0x4c,0x323,0x304,0x1e37,0xe643, +0x6c,0x323,0x304,0xdc02,0x4c,0x331,0xdc02,0x6c,0x331,0xdc02,0x4c,0x32d,0xdc02,0x6c,0x32d,0xe602, +0x4d,0x301,0xe602,0x6d,0x301,0xe602,0x4d,0x307,0xe602,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d, +0x323,0xe602,0x4e,0x307,0xe602,0x6e,0x307,0xdc02,0x4e,0x323,0xdc02,0x6e,0x323,0xdc02,0x4e,0x331, +0xdc02,0x6e,0x331,0xdc02,0x4e,0x32d,0xdc02,0x6e,0x32d,0xd5,0xe643,0x4f,0x303,0x301,0xf5,0xe643, +0x6f,0x303,0x301,0xd5,0xe643,0x4f,0x303,0x308,0xf5,0xe643,0x6f,0x303,0x308,0x14c,0xe643,0x4f, +0x304,0x300,0x14d,0xe643,0x6f,0x304,0x300,0x14c,0xe643,0x4f,0x304,0x301,0x14d,0xe643,0x6f,0x304, +0x301,0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe602,0x52,0x307, +0xe602,0x72,0x307,0x1e5a,0xe643,0x52,0x323,0x304,0x1e5b,0xe643,0x72,0x323,0x304,0xdc02,0x52,0x331, +0xdc02,0x72,0x331,0xe602,0x53,0x307,0xe602,0x73,0x307,0x15a,0xe643,0x53,0x301,0x307,0x15b,0xe643, +0x73,0x301,0x307,0x160,0xe643,0x53,0x30c,0x307,0x161,0xe643,0x73,0x30c,0x307,0x1e62,0xe643,0x53, +0x323,0x307,0x1e63,0xe643,0x73,0x323,0x307,0xe602,0x54,0x307,0xe602,0x74,0x307,0xdc02,0x54,0x323, +0xdc02,0x74,0x323,0xdc02,0x54,0x331,0xdc02,0x74,0x331,0xdc02,0x54,0x32d,0xdc02,0x74,0x32d,0xdc02, +0x55,0x324,0xdc02,0x75,0x324,0xdc02,0x55,0x330,0xdc02,0x75,0x330,0xdc02,0x55,0x32d,0xdc02,0x75, +0x32d,0x168,0xe643,0x55,0x303,0x301,0x169,0xe643,0x75,0x303,0x301,0x16a,0xe643,0x55,0x304,0x308, +0x16b,0xe643,0x75,0x304,0x308,0xe602,0x56,0x303,0xe602,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76, +0x323,0xe602,0x57,0x300,0xe602,0x77,0x300,0xe602,0x57,0x301,0xe602,0x77,0x301,0xe602,0x57,0x308, +0xe602,0x77,0x308,0xe602,0x57,0x307,0xe602,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602, +0x58,0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe602,0x59,0x307,0xe602,0x79, +0x307,0xe602,0x5a,0x302,0xe602,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331, +0xdc02,0x7a,0x331,0xdc02,0x68,0x331,0xe602,0x74,0x308,0xe602,0x77,0x30a,0xe602,0x79,0x30a,0xe602, +0x17f,0x307,0xe602,0x41,0x309,0xe602,0x61,0x309,0xc2,0xe643,0x41,0x302,0x301,0xe2,0xe643,0x61, +0x302,0x301,0xc2,0xe643,0x41,0x302,0x300,0xe2,0xe643,0x61,0x302,0x300,0xc2,0xe643,0x41,0x302, +0x309,0xe2,0xe643,0x61,0x302,0x309,0xc2,0xe643,0x41,0x302,0x303,0xe2,0xe643,0x61,0x302,0x303, +0x1ea0,0xe643,0x41,0x323,0x302,0x1ea1,0xe643,0x61,0x323,0x302,0x102,0xe643,0x41,0x306,0x301,0x103, +0xe643,0x61,0x306,0x301,0x102,0xe643,0x41,0x306,0x300,0x103,0xe643,0x61,0x306,0x300,0x102,0xe643, +0x41,0x306,0x309,0x103,0xe643,0x61,0x306,0x309,0x102,0xe643,0x41,0x306,0x303,0x103,0xe643,0x61, +0x306,0x303,0x1ea0,0xe643,0x41,0x323,0x306,0x1ea1,0xe643,0x61,0x323,0x306,0xe602,0x45,0x309,0xe602, +0x65,0x309,0xe602,0x45,0x303,0xe602,0x65,0x303,0xca,0xe643,0x45,0x302,0x301,0xea,0xe643,0x65, +0x302,0x301,0xca,0xe643,0x45,0x302,0x300,0xea,0xe643,0x65,0x302,0x300,0xca,0xe643,0x45,0x302, +0x309,0xea,0xe643,0x65,0x302,0x309,0xca,0xe643,0x45,0x302,0x303,0xea,0xe643,0x65,0x302,0x303, +0x1eb8,0xe643,0x45,0x323,0x302,0x1eb9,0xe643,0x65,0x323,0x302,0xe602,0x49,0x309,0xe602,0x69,0x309, +0xdc02,0x49,0x323,0xdc02,0x69,0x323,0xe602,0x4f,0x309,0xe602,0x6f,0x309,0xd4,0xe643,0x4f,0x302, +0x301,0xf4,0xe643,0x6f,0x302,0x301,0xd4,0xe643,0x4f,0x302,0x300,0xf4,0xe643,0x6f,0x302,0x300, +0xd4,0xe643,0x4f,0x302,0x309,0xf4,0xe643,0x6f,0x302,0x309,0xd4,0xe643,0x4f,0x302,0x303,0xf4, +0xe643,0x6f,0x302,0x303,0x1ecc,0xe643,0x4f,0x323,0x302,0x1ecd,0xe643,0x6f,0x323,0x302,0x1a0,0xe643, +0x4f,0x31b,0x301,0x1a1,0xe643,0x6f,0x31b,0x301,0x1a0,0xe643,0x4f,0x31b,0x300,0x1a1,0xe643,0x6f, +0x31b,0x300,0x1a0,0xe643,0x4f,0x31b,0x309,0x1a1,0xe643,0x6f,0x31b,0x309,0x1a0,0xe643,0x4f,0x31b, +0x303,0x1a1,0xe643,0x6f,0x31b,0x303,0x1a0,0xdc43,0x4f,0x31b,0x323,0x1a1,0xdc43,0x6f,0x31b,0x323, +0xdc02,0x55,0x323,0xdc02,0x75,0x323,0xe602,0x55,0x309,0xe602,0x75,0x309,0x1af,0xe643,0x55,0x31b, +0x301,0x1b0,0xe643,0x75,0x31b,0x301,0x1af,0xe643,0x55,0x31b,0x300,0x1b0,0xe643,0x75,0x31b,0x300, +0x1af,0xe643,0x55,0x31b,0x309,0x1b0,0xe643,0x75,0x31b,0x309,0x1af,0xe643,0x55,0x31b,0x303,0x1b0, +0xe643,0x75,0x31b,0x303,0x1af,0xdc43,0x55,0x31b,0x323,0x1b0,0xdc43,0x75,0x31b,0x323,0xe602,0x59, +0x300,0xe602,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe602,0x59,0x309,0xe602,0x79,0x309, +0xe602,0x59,0x303,0xe602,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300, +0x1f10,0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19, +0xe643,0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643, +0x3b9,0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9, +0x314,0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313, +0x300,0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301, +0x1f38,0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41, +0xe643,0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643, +0x39f,0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f, +0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313, +0x301,0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342, +0x1f59,0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602, +0x3b5,0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf043,0x3b1,0x313,0x345, +0x1f01,0xf043,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2, +0xf044,0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2, +0xf044,0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2, +0xf044,0x3b1,0x314,0x342,0x345,0x1f08,0xf043,0x391,0x313,0x345,0x1f09,0xf043,0x391,0x314,0x345,0x1f0a, +0x345,2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c, +0x345,2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e, +0x345,2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20, +0xf043,0x3b7,0x313,0x345,0x1f21,0xf043,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300, +0x345,0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301, +0x345,0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342, +0x345,0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf043,0x397,0x313,0x345,0x1f29,0xf043, +0x397,0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397, +0x314,0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397, +0x314,0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397, +0x314,0x342,0x345,0x1f60,0xf043,0x3c9,0x313,0x345,0x1f61,0xf043,0x3c9,0x314,0x345,0x1f62,0x345,2, +0xf044,0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2, +0xf044,0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2, +0xf044,0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf043,0x3a9, +0x313,0x345,0x1f69,0xf043,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b, +0x345,2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d, +0x345,2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f, +0x345,2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1, +0x300,0x345,0xf002,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602, +0x391,0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf002,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043, +0x3b7,0x300,0x345,0xf002,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345, +0xe602,0x395,0x300,0xe602,0x397,0x300,0xf002,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602, +0x1fbf,0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342, +0x3ca,0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe, +0x300,0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5, +0x308,0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342, +0xe602,0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c, +0xf043,0x3c9,0x300,0x345,0xf002,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342, +0x345,0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf002,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338, +0x102,0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102, +0x2208,0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243, +0x338,0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338, +0x102,0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102, +0x2273,0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282, +0x338,0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338, +0x102,0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102, +0x2292,0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b, +0x3099,0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099, +0x802,0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802, +0x3061,0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f, +0x309a,0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099, +0x802,0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802, +0x30ab,0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5, +0x3099,0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099, +0x802,0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802, +0x30cf,0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8, +0x3099,0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099, +0x802,0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704,0xd804,0xdc99,0xd804, +0xdcba,0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27, +4,0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4, +0xd805,0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805, +0xddb8,0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915, +0x93c,0x702,0x916,0x93c,0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c, +0x702,0x92b,0x93c,0x702,0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702, +0xa32,0xa3c,0x702,0xa38,0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b, +0xa3c,0x702,0xb21,0xb3c,0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7, +2,0xf56,0xfb7,2,0xf5b,0xfb7,2,0xf40,0xfb5,0x8202,0xfb2,0xf80,0x8202,0xfb3,0xf80,2, +0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7,2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90, +0xfb5,1,0x3b9,1,0x60,1,0xb4,1,0x3a9,1,0x4b,1,0x3008,1,0x3009,0x102, +0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1,1,0x4e32,1,0x53e5, +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,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,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375,1,0x4ee4,1,0x56f9, +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,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,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,0x90de,1,0x96b7,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,0x7e09,1,0x7e41, +1,0x7f72,1,0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910,1,0x8996,1,0x8b01, +1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff,1,0x983b,1,0x6075, +2,0xd850,0xdeee,1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1,0x4f80,1,0x5145,1, +0x5180,1,0x52c7,1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,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,0x6160,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1,0x6556,1, +0x671b,1,0x6756,1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1,0x77a7,1,0x7235,1, +0x72af,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76db,1,0x76f4,1, +0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1,0x7f3e,1,0x8352,1, +0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1,0x8aed,1,0x8b8a,1, +0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x97db,1,0x980b,1,0x9b12,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,0xe02,0x5d9,0x5b4,0x1102,0x5f2, +0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1,0xfb49,0x1943,0x5e9,0x5bc, +0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1,0x5bc,0x1502,0x5d2,0x5bc, +0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc,0x1502,0x5d8,0x5bc,0x1502, +0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502,0x5de,0x5bc,0x1502,0x5e0, +0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6,0x5bc,0x1502,0x5e7,0x5bc, +0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9,0x1702,0x5d1,0x5bf,0x1702, +0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834,0xdd58,0xd834,0xdd65,0xd834, +0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xdd5f,0xd834,0xdd6f,4, +0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4,0xd846,0xd834,0xdd58,0xd834, +0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0xd834, +0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804,0xd834,0xddb9,0xd834,0xdd65, +0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834, +0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbb,0xd834, +0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834,0xdd6f,4,0xd846,0xd834, +0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60, +1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e,2,0xd841,0xde3a,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,2,0xd864,0xdddf,1,0x51f5,1,0x5203, +1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515,1,0x5305,1,0x5306, +1,0x5349,1,0x535a,1,0x5373,1,0x537d,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,0x55ab,1,0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651,1,0x5674,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,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5bf3,2,0xd846, +0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,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,2,0xd868,0xdf92,1,0x5efe,2, +0xd848,0xdf31,1,0x8201,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,2,0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1,0x617a,1,0x61b2,1, +0x61a4,1,0x61af,1,0x61de,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,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8,1,0x6649,1,0x3b19, +1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c,1,0x80ad,1,0x43d9, +1,0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1, +0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,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,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,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1, +0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e, +1,0x6fc6,1,0x7039,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, +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,0x7447,1,0x745c,1,0x7485,1,0x74ca, +1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,2,0xd848,0xdd9f,1, +0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc,1,0x4008,2,0xd854, +0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e,1,0x771f,1,0x778b, +1,0x4046,1,0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2,0xd855,0xde26,2,0xd855, +0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,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,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,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,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,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,0x8667,1,0x8669,1, +0x86a9,1,0x8688,1,0x870e,1,0x86e2,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,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, +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,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929, +1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,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,0x3ac,0xe642,0x3b1,0x301,0x3ad,0xe642,0x3b5,0x301,0x3ae,0xe642, +0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5,0x301,0x3ce,0xe642, +0x3c9,0x301,0x386,0xe642,0x391,0x301,0x388,0xe642,0x395,0x301,0x389,0xe642,0x397,0x301,0x390,1, +0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643,0x3c5,0x308,0x301,0x38e,0xe642, +0x3a5,0x301,0x385,0xe642,0xa8,0x301,0x38c,0xe642,0x39f,0x301,0x38f,0xe642,0x3a9,0x301,0xc5,0xe642, +0x41,0x30a,0xe6e6,0xe681,0x300,0xe6e6,0xe681,0x301,0xe6e6,0xe681,0x313,0xe6e6,0xe682,0x308,0x301,0x8100, +0x8282,0xf71,0xf72,0x8100,0x8482,0xf71,0xf74,0x8100,0x8282,0xf71,0xf80,0 }; static const uint8_t norm2_nfc_data_smallFCD[256]={ -0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x44,0x66,0x5b, +0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x46,0x66,0x5b, 0x12,0,0,4,0,0,0,0x43,0x20,2,0x29,0xae,0xc2,0xc0,0xff,0xff, 0xc0,0x72,0xbf,0,0,0,0,0,0,0,0x40,0,0x80,0x88,0,0, 0xfe,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1135,13 +1143,13 @@ static const UTrie2 norm2_nfc_data_trie={ norm2_nfc_data_trieIndex+2720, NULL, 2720, - 6932, + 7056, 0x188, 0xb1c, - 0x0, - 0x0, + 0x1, + 0x1, 0x30000, - 0x25b0, + 0x262c, NULL, 0, FALSE, FALSE, 0, NULL }; diff --git a/deps/icu-small/source/common/norm2allmodes.h b/deps/icu-small/source/common/norm2allmodes.h index 9516817e4aa8f3..682ece28f13092 100644 --- a/deps/icu-small/source/common/norm2allmodes.h +++ b/deps/icu-small/source/common/norm2allmodes.h @@ -5,7 +5,7 @@ * Copyright (C) 2014, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* -* loadednormalizer2impl.h +* norm2allmodes.h * * created on: 2014sep07 * created by: Markus W. Scherer @@ -18,7 +18,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/unistr.h" #include "cpputils.h" #include "normalizer2impl.h" @@ -210,8 +212,8 @@ class DecomposeNormalizer2 : public Normalizer2WithImpl { virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO; } - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundary(c, TRUE); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundary(c, FALSE); } + virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundaryBefore(c); } + virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundaryAfter(c); } virtual UBool isInert(UChar32 c) const { return impl.isDecompInert(c); } }; @@ -224,19 +226,35 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.compose(src, limit, onlyContiguous, TRUE, buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. + + void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + const uint8_t *s = reinterpret_cast(src.data()); + impl.composeUTF8(options, onlyContiguous, s, s + src.length(), + &sink, edits, errorCode); + sink.Flush(); + } + virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.composeAndAppend(src, limit, doNormalize, onlyContiguous, safeMiddle, buffer, errorCode); } virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return FALSE; } @@ -252,8 +270,16 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { } return impl.compose(sArray, sArray+s.length(), onlyContiguous, FALSE, buffer, errorCode); } + virtual UBool + isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const U_OVERRIDE { + if(U_FAILURE(errorCode)) { + return FALSE; + } + const uint8_t *s = reinterpret_cast(sp.data()); + return impl.composeUTF8(0, onlyContiguous, s, s + sp.length(), nullptr, nullptr, errorCode); + } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return UNORM_MAYBE; } @@ -267,21 +293,21 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { return qcResult; } virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const U_OVERRIDE { return impl.composeQuickCheck(src, limit, onlyContiguous, NULL); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { + virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const U_OVERRIDE { return impl.getCompQuickCheck(impl.getNorm16(c)); } - virtual UBool hasBoundaryBefore(UChar32 c) const { + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { return impl.hasCompBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { - return impl.hasCompBoundaryAfter(c, onlyContiguous, FALSE); + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasCompBoundaryAfter(c, onlyContiguous); } - virtual UBool isInert(UChar32 c) const { - return impl.hasCompBoundaryAfter(c, onlyContiguous, TRUE); + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isCompInert(c, onlyContiguous); } const UBool onlyContiguous; diff --git a/deps/icu-small/source/common/normalizer2.cpp b/deps/icu-small/source/common/normalizer2.cpp index dfdaa3bdce5f24..133770cbc4d9aa 100644 --- a/deps/icu-small/source/common/normalizer2.cpp +++ b/deps/icu-small/source/common/normalizer2.cpp @@ -20,7 +20,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/unistr.h" #include "unicode/unorm.h" #include "cstring.h" @@ -42,6 +44,20 @@ U_NAMESPACE_BEGIN Normalizer2::~Normalizer2() {} +void +Normalizer2::normalizeUTF8(uint32_t /*options*/, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr) { + errorCode = U_UNSUPPORTED_ERROR; + return; + } + UnicodeString src16 = UnicodeString::fromUTF8(src); + normalize(src16, errorCode).toUTF8(sink); +} + UBool Normalizer2::getRawDecomposition(UChar32, UnicodeString &) const { return FALSE; @@ -57,6 +73,11 @@ Normalizer2::getCombiningClass(UChar32 /*c*/) const { return 0; } +UBool +Normalizer2::isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const { + return U_SUCCESS(errorCode) && isNormalized(UnicodeString::fromUTF8(s), errorCode); +} + // Normalizer2 implementation for the old UNORM_NONE. class NoopNormalizer2 : public Normalizer2 { virtual ~NoopNormalizer2(); @@ -64,7 +85,7 @@ class NoopNormalizer2 : public Normalizer2 { virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&dest!=&src) { dest=src; @@ -74,10 +95,27 @@ class NoopNormalizer2 : public Normalizer2 { } return dest; } + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if(U_SUCCESS(errorCode)) { + if (edits != nullptr) { + if ((options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + edits->addUnchanged(src.length()); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(src.data(), src.length()); + } + sink.Flush(); + } + } + virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -90,7 +128,7 @@ class NoopNormalizer2 : public Normalizer2 { virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -101,25 +139,29 @@ class NoopNormalizer2 : public Normalizer2 { return first; } virtual UBool - getDecomposition(UChar32, UnicodeString &) const { + getDecomposition(UChar32, UnicodeString &) const U_OVERRIDE { return FALSE; } - // No need to override the default getRawDecomposition(). + // No need to U_OVERRIDE the default getRawDecomposition(). + virtual UBool + isNormalized(const UnicodeString &, UErrorCode &errorCode) const U_OVERRIDE { + return U_SUCCESS(errorCode); + } virtual UBool - isNormalized(const UnicodeString &, UErrorCode &) const { - return TRUE; + isNormalizedUTF8(StringPiece, UErrorCode &errorCode) const U_OVERRIDE { + return U_SUCCESS(errorCode); } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &, UErrorCode &) const { + quickCheck(const UnicodeString &, UErrorCode &) const U_OVERRIDE { return UNORM_YES; } virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const { + spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const U_OVERRIDE { return s.length(); } - virtual UBool hasBoundaryBefore(UChar32) const { return TRUE; } - virtual UBool hasBoundaryAfter(UChar32) const { return TRUE; } - virtual UBool isInert(UChar32) const { return TRUE; } + virtual UBool hasBoundaryBefore(UChar32) const U_OVERRIDE { return TRUE; } + virtual UBool hasBoundaryAfter(UChar32) const U_OVERRIDE { return TRUE; } + virtual UBool isInert(UChar32) const U_OVERRIDE { return TRUE; } }; NoopNormalizer2::~NoopNormalizer2() {} diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index 41305cc5878187..15b4a528934779 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -20,10 +20,15 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/bytestream.h" +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/udata.h" #include "unicode/ustring.h" #include "unicode/utf16.h" +#include "unicode/utf8.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "mutex.h" #include "normalizer2impl.h" @@ -35,8 +40,142 @@ U_NAMESPACE_BEGIN +namespace { + +/** + * UTF-8 lead byte for minNoMaybeCP. + * Can be lower than the actual lead byte for c. + * Typically U+0300 for NFC/NFD, U+00A0 for NFKC/NFKD, U+0041 for NFKC_Casefold. + */ +inline uint8_t leadByteForCP(UChar32 c) { + if (c <= 0x7f) { + return (uint8_t)c; + } else if (c <= 0x7ff) { + return (uint8_t)(0xc0+(c>>6)); + } else { + // Should not occur because ccc(U+0300)!=0. + return 0xe0; + } +} + +/** + * Returns the code point from one single well-formed UTF-8 byte sequence + * between cpStart and cpLimit. + * + * UTrie2 UTF-8 macros do not assemble whole code points (for efficiency). + * When we do need the code point, we call this function. + * We should not need it for normalization-inert data (norm16==0). + * Illegal sequences yield the error value norm16==0 just like real normalization-inert code points. + */ +UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) { + // Similar to U8_NEXT_UNSAFE(s, i, c). + U_ASSERT(cpStart < cpLimit); + uint8_t c = *cpStart; + switch(cpLimit-cpStart) { + case 1: + return c; + case 2: + return ((c&0x1f)<<6) | (cpStart[1]&0x3f); + case 3: + // no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) + return (UChar)((c<<12) | ((cpStart[1]&0x3f)<<6) | (cpStart[2]&0x3f)); + case 4: + return ((c&7)<<18) | ((cpStart[1]&0x3f)<<12) | ((cpStart[2]&0x3f)<<6) | (cpStart[3]&0x3f); + default: + U_ASSERT(FALSE); // Should not occur. + return U_SENTINEL; + } +} + +/** + * Returns the last code point in [start, p[ if it is valid and in U+1000..U+D7FF. + * Otherwise returns a negative value. + */ +UChar32 previousHangulOrJamo(const uint8_t *start, const uint8_t *p) { + if ((p - start) >= 3) { + p -= 3; + uint8_t l = *p; + uint8_t t1, t2; + if (0xe1 <= l && l <= 0xed && + (t1 = (uint8_t)(p[1] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(p[2] - 0x80)) <= 0x3f && + (l < 0xed || t1 <= 0x1f)) { + return ((l & 0xf) << 12) | (t1 << 6) | t2; + } + } + return U_SENTINEL; +} + +/** + * Returns the offset from the Jamo T base if [src, limit[ starts with a single Jamo T code point. + * Otherwise returns a negative value. + */ +int32_t getJamoTMinusBase(const uint8_t *src, const uint8_t *limit) { + // Jamo T: E1 86 A8..E1 87 82 + if ((limit - src) >= 3 && *src == 0xe1) { + if (src[1] == 0x86) { + uint8_t t = src[2]; + // The first Jamo T is U+11A8 but JAMO_T_BASE is 11A7. + // Offset 0 does not correspond to any conjoining Jamo. + if (0xa8 <= t && t <= 0xbf) { + return t - 0xa7; + } + } else if (src[1] == 0x87) { + uint8_t t = src[2]; + if ((int8_t)t <= (int8_t)0x82) { + return t - (0xa7 - 0x40); + } + } + } + return -1; +} + +void +appendCodePointDelta(const uint8_t *cpStart, const uint8_t *cpLimit, int32_t delta, + ByteSink &sink, Edits *edits) { + char buffer[U8_MAX_LENGTH]; + int32_t length; + int32_t cpLength = (int32_t)(cpLimit - cpStart); + if (cpLength == 1) { + // The builder makes ASCII map to ASCII. + buffer[0] = (uint8_t)(*cpStart + delta); + length = 1; + } else { + int32_t trail = *(cpLimit-1) + delta; + if (0x80 <= trail && trail <= 0xbf) { + // The delta only changes the last trail byte. + --cpLimit; + length = 0; + do { buffer[length++] = *cpStart++; } while (cpStart < cpLimit); + buffer[length++] = (uint8_t)trail; + } else { + // Decode the code point, add the delta, re-encode. + UChar32 c = codePointFromValidUTF8(cpStart, cpLimit) + delta; + length = 0; + U8_APPEND_UNSAFE(buffer, length, c); + } + } + if (edits != nullptr) { + edits->addReplace(cpLength, length); + } + sink.Append(buffer, length); +} + +} // namespace + // ReorderingBuffer -------------------------------------------------------- *** +ReorderingBuffer::ReorderingBuffer(const Normalizer2Impl &ni, UnicodeString &dest, + UErrorCode &errorCode) : + impl(ni), str(dest), + start(str.getBuffer(8)), reorderStart(start), limit(start), + remainingCapacity(str.getCapacity()), lastCC(0) { + if (start == nullptr && U_SUCCESS(errorCode)) { + // getBuffer() already did str.setToBogus() + errorCode = U_MEMORY_ALLOCATION_ERROR; + } +} + UBool ReorderingBuffer::init(int32_t destCapacity, UErrorCode &errorCode) { int32_t length=str.length(); start=str.getBuffer(destCapacity); @@ -69,6 +208,32 @@ UBool ReorderingBuffer::equals(const UChar *otherStart, const UChar *otherLimit) 0==u_memcmp(start, otherStart, length); } +UBool ReorderingBuffer::equals(const uint8_t *otherStart, const uint8_t *otherLimit) const { + U_ASSERT((otherLimit - otherStart) <= INT32_MAX); // ensured by caller + int32_t length = (int32_t)(limit - start); + int32_t otherLength = (int32_t)(otherLimit - otherStart); + // For equal strings, UTF-8 is at least as long as UTF-16, and at most three times as long. + if (otherLength < length || (otherLength / 3) > length) { + return FALSE; + } + // Compare valid strings from between normalization boundaries. + // (Invalid sequences are normalization-inert.) + for (int32_t i = 0, j = 0;;) { + if (i >= length) { + return j >= otherLength; + } else if (j >= otherLength) { + return FALSE; + } + // Not at the end of either string yet. + UChar32 c, other; + U16_NEXT_UNSAFE(start, i, c); + U8_NEXT_UNSAFE(otherStart, j, other); + if (c != other) { + return FALSE; + } + } +} + UBool ReorderingBuffer::appendSupplementary(UChar32 c, uint8_t cc, UErrorCode &errorCode) { if(remainingCapacity<2 && !resize(2, errorCode)) { return FALSE; @@ -216,16 +381,12 @@ uint8_t ReorderingBuffer::previousCC() { return 0; } UChar32 c=*--codePointStart; - if(c>DELTA_SHIFT)-MAX_DELTA-1; normTrie=inTrie; maybeYesCompositions=inExtraData; - extraData=maybeYesCompositions+(MIN_NORMAL_MAYBE_YES-minMaybeYes); + extraData=maybeYesCompositions+((MIN_NORMAL_MAYBE_YES-minMaybeYes)>>OFFSET_SHIFT); smallFCD=inSmallFCD; - - // Build tccc180[]. - // gennorm2 enforces lccc=0 for c>=1) { - if((c&0xff)==0) { - bits=smallFCD[c>>8]; // one byte per 0x100 code points - } - if(bits&1) { - for(int i=0; i<0x20; ++i, ++c) { - tccc180[c]=(uint8_t)getFCD16FromNormData(c); - } - } else { - uprv_memset(tccc180+c, 0, 0x20); - c+=0x20; - } - } -} - -uint8_t Normalizer2Impl::getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, const UChar *cpLimit) const { - UChar32 c; - if(cpStart==(cpLimit-1)) { - c=*cpStart; - } else { - c=U16_GET_SUPPLEMENTARY(cpStart[0], cpStart[1]); - } - uint16_t prevNorm16=getNorm16(c); - if(prevNorm16<=minYesNo) { - return 0; // yesYes and Hangul LV/LVT have ccc=tccc=0 - } else { - return (uint8_t)(*getMapping(prevNorm16)>>8); // tccc from yesNo - } } -namespace { - class LcccContext { public: LcccContext(const Normalizer2Impl &ni, UnicodeSet &s) : impl(ni), set(s) {} void handleRange(UChar32 start, UChar32 end, uint16_t norm16) { - if(impl.isAlgorithmicNoNo(norm16)) { - // Range of code points with same-norm16-value algorithmic decompositions. - // They might have different non-zero FCD16 values. - do { - uint16_t fcd16=impl.getFCD16(start); - if(fcd16>0xff) { set.add(start); } - } while(++start<=end); - } else { + if (norm16 > Normalizer2Impl::MIN_NORMAL_MAYBE_YES && + norm16 != Normalizer2Impl::JAMO_VT) { + set.add(start, end); + } else if (impl.minNoNoCompNoMaybeCC <= norm16 && norm16 < impl.limitNoNo) { uint16_t fcd16=impl.getFCD16(start); if(fcd16>0xff) { set.add(start, end); } } @@ -335,6 +464,8 @@ class LcccContext { UnicodeSet &set; }; +namespace { + struct PropertyStartsContext { PropertyStartsContext(const Normalizer2Impl &ni, const USetAdder *adder) : impl(ni), sa(adder) {} @@ -359,7 +490,8 @@ enumNorm16PropertyStartsRange(const void *context, UChar32 start, UChar32 end, u const PropertyStartsContext *ctx=(const PropertyStartsContext *)context; const USetAdder *sa=ctx->sa; sa->add(sa->set, start); - if(start!=end && ctx->impl.isAlgorithmicNoNo((uint16_t)value)) { + if (start != end && ctx->impl.isAlgorithmicNoNo((uint16_t)value) && + (value & Normalizer2Impl::DELTA_TCCC_MASK) > Normalizer2Impl::DELTA_TCCC_1) { // Range of code points with same-norm16-value algorithmic decompositions. // They might have different non-zero FCD16 values. uint16_t prevFCD16=ctx->impl.getFCD16(start); @@ -391,7 +523,6 @@ U_CDECL_END void Normalizer2Impl::addLcccChars(UnicodeSet &set) const { - /* add the start code point of each same-value range of each trie */ LcccContext context(*this, set); utrie2_enum(normTrie, NULL, enumLcccRange, &context); } @@ -568,77 +699,174 @@ Normalizer2Impl::decompose(const UChar *src, const UChar *limit, // fail the quick check loop and/or where the quick check loop's overhead // is unlikely to be amortized. // Called by the compose() and makeFCD() implementations. -UBool Normalizer2Impl::decomposeShort(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const { +const UChar * +Normalizer2Impl::decomposeShort(const UChar *src, const UChar *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } while(src= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { return buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode); - } else if(isHangul(norm16)) { + } + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getNorm16(c); + } + if (norm16 < minYesNo) { + // c does not decompose + return buffer.append(c, 0, errorCode); + } else if(isHangulLV(norm16) || isHangulLVT(norm16)) { + // Hangul syllable: decompose algorithmically + UChar jamos[3]; + return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + int32_t length=firstUnit&MAPPING_LENGTH_MASK; + uint8_t leadCC, trailCC; + trailCC=(uint8_t)(firstUnit>>8); + if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { + leadCC=(uint8_t)(*(mapping-1)>>8); + } else { + leadCC=0; + } + return buffer.append((const UChar *)mapping+1, length, leadCC, trailCC, errorCode); +} + +const uint8_t * +Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } + while (src < limit) { + const uint8_t *prevSrc = src; + uint16_t norm16; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + // Get the decomposition and the lead and trail cc's. + UChar32 c = U_SENTINEL; + if (norm16 >= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { + // No boundaries around this character. + c = codePointFromValidUTF8(prevSrc, src); + if (!buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode)) { + return nullptr; + } + continue; + } + // Maps to an isCompYesAndZeroCC. + if (stopAtCompBoundary) { + return prevSrc; + } + c = codePointFromValidUTF8(prevSrc, src); + c = mapAlgorithmic(c, norm16); + norm16 = getNorm16(c); + } else if (stopAtCompBoundary && norm16 < minNoNoCompNoMaybeCC) { + return prevSrc; + } + // norm16!=INERT guarantees that [prevSrc, src[ is valid UTF-8. + // We do not see invalid UTF-8 here because + // its norm16==INERT is normalization-inert, + // so it gets copied unchanged in the fast path, + // and we stop the slow path where invalid UTF-8 begins. + U_ASSERT(norm16 != INERT); + if (norm16 < minYesNo) { + if (c < 0) { + c = codePointFromValidUTF8(prevSrc, src); + } + // does not decompose + if (!buffer.append(c, 0, errorCode)) { + return nullptr; + } + } else if (isHangulLV(norm16) || isHangulLVT(norm16)) { // Hangul syllable: decompose algorithmically - UChar jamos[3]; - return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - norm16=getNorm16(c); + if (c < 0) { + c = codePointFromValidUTF8(prevSrc, src); + } + char16_t jamos[3]; + if (!buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode)) { + return nullptr; + } } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - int32_t length=firstUnit&MAPPING_LENGTH_MASK; - uint8_t leadCC, trailCC; - trailCC=(uint8_t)(firstUnit>>8); - if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - leadCC=(uint8_t)(*(mapping-1)>>8); + // The character decomposes, get everything from the variable-length extra data. + const uint16_t *mapping = getMapping(norm16); + uint16_t firstUnit = *mapping; + int32_t length = firstUnit & MAPPING_LENGTH_MASK; + uint8_t trailCC = (uint8_t)(firstUnit >> 8); + uint8_t leadCC; + if (firstUnit & MAPPING_HAS_CCC_LCCC_WORD) { + leadCC = (uint8_t)(*(mapping-1) >> 8); } else { - leadCC=0; + leadCC = 0; + } + if (!buffer.append((const char16_t *)mapping+1, length, leadCC, trailCC, errorCode)) { + return nullptr; } - return buffer.append((const UChar *)mapping+1, length, leadCC, trailCC, errorCode); + } + if (stopAtCompBoundary && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return src; } } + return src; } const UChar * Normalizer2Impl::getDecomposition(UChar32 c, UChar buffer[4], int32_t &length) const { - const UChar *decomp=NULL; uint16_t norm16; - for(;;) { - if(c>7)&1)-1; - uint16_t rm0=*rawMapping; - if(rm0<=MAPPING_LENGTH_MASK) { - length=rm0; - return (const UChar *)rawMapping-rm0; - } else { - // Copy the normal mapping and replace its first two code units with rm0. - buffer[0]=(UChar)rm0; - u_memcpy(buffer+1, (const UChar *)mapping+1+2, mLength-2); - length=mLength-1; - return buffer; - } + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + int32_t mLength=firstUnit&MAPPING_LENGTH_MASK; // length of normal mapping + if(firstUnit&MAPPING_HAS_RAW_MAPPING) { + // Read the raw mapping from before the firstUnit and before the optional ccc/lccc word. + // Bit 7=MAPPING_HAS_CCC_LCCC_WORD + const uint16_t *rawMapping=mapping-((firstUnit>>7)&1)-1; + uint16_t rm0=*rawMapping; + if(rm0<=MAPPING_LENGTH_MASK) { + length=rm0; + return (const UChar *)rawMapping-rm0; } else { - length=mLength; - return (const UChar *)mapping+1; + // Copy the normal mapping and replace its first two code units with rm0. + buffer[0]=(UChar)rm0; + u_memcpy(buffer+1, (const UChar *)mapping+1+2, mLength-2); + length=mLength-1; + return buffer; } + } else { + length=mLength; + return (const UChar *)mapping+1; } } @@ -717,43 +942,60 @@ void Normalizer2Impl::decomposeAndAppend(const UChar *src, const UChar *limit, } } -// Note: hasDecompBoundary() could be implemented as aliases to -// hasFCDBoundaryBefore() and hasFCDBoundaryAfter() -// at the cost of building the FCD trie for a decomposition normalizer. -UBool Normalizer2Impl::hasDecompBoundary(UChar32 c, UBool before) const { - for(;;) { - if(cMIN_NORMAL_MAYBE_YES) { - return FALSE; // ccc!=0 - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { - return FALSE; - } - if(!before) { - // decomp after-boundary: same as hasFCDBoundaryAfter(), - // fcd16<=1 || trailCC==0 - if(firstUnit>0x1ff) { - return FALSE; // trailCC>1 - } - if(firstUnit<=0xff) { - return TRUE; // trailCC==0 - } - // if(trailCC==1) test leadCC==0, same as checking for before-boundary - } - // TRUE if leadCC==0 (hasFCDBoundaryBefore()) - return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; - } +UBool Normalizer2Impl::hasDecompBoundaryBefore(UChar32 c) const { + return c < minLcccCP || (c <= 0xffff && !singleLeadMightHaveNonZeroFCD16(c)) || + norm16HasDecompBoundaryBefore(getNorm16(c)); +} + +UBool Normalizer2Impl::norm16HasDecompBoundaryBefore(uint16_t norm16) const { + if (norm16 < minNoNoCompNoMaybeCC) { + return TRUE; } + if (norm16 >= limitNoNo) { + return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + // TRUE if leadCC==0 (hasFCDBoundaryBefore()) + return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; +} + +UBool Normalizer2Impl::hasDecompBoundaryAfter(UChar32 c) const { + if (c < minDecompNoCP) { + return TRUE; + } + if (c <= 0xffff && !singleLeadMightHaveNonZeroFCD16(c)) { + return TRUE; + } + return norm16HasDecompBoundaryAfter(getNorm16(c)); +} + +UBool Normalizer2Impl::norm16HasDecompBoundaryAfter(uint16_t norm16) const { + if(norm16 <= minYesNo || isHangulLVT(norm16)) { + return TRUE; + } + if (norm16 >= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { + return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } + // Maps to an isCompYesAndZeroCC. + return (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + // decomp after-boundary: same as hasFCDBoundaryAfter(), + // fcd16<=1 || trailCC==0 + if(firstUnit>0x1ff) { + return FALSE; // trailCC>1 + } + if(firstUnit<=0xff) { + return TRUE; // trailCC==0 + } + // if(trailCC==1) test leadCC==0, same as checking for before-boundary + // TRUE if leadCC==0 (hasFCDBoundaryBefore()) + return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; } /* @@ -1031,6 +1273,7 @@ Normalizer2Impl::composePair(UChar32 a, UChar32 b) const { if(isInert(norm16)) { return U_SENTINEL; } else if(norm16minYesNo) { // composite 'a' has both mapping & compositions list list+= // mapping pointer - 1+ // +1 to skip the first unit with the mapping lenth + 1+ // +1 to skip the first unit with the mapping length (*list&MAPPING_LENGTH_MASK); // + mapping length } } } else if(norm16=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + // Medium-fast path: Handle cases that do not require full decomposition and recomposition. + if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (!doCompose) { + return FALSE; } - // Set prevBoundary to the last character in the quick check loop. - prevBoundary=src-1; - if( U16_IS_TRAIL(*prevBoundary) && prevSrc(getMapping(norm16)); + int32_t length = *mapping++ & MAPPING_LENGTH_MASK; + if(!buffer.appendZeroCC(mapping, mapping + length, errorCode)) { + break; + } + prevBoundary = src; + continue; + } + } else if (norm16 >= minNoNoEmpty) { + // The current character maps to nothing. + // Simply omit it from the output if there is a boundary before _or_ after it. + // The character itself implies no boundaries. + if (hasCompBoundaryBefore(src, limit) || + hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) { + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + prevBoundary = src; + continue; + } } - // The start of the current character (c). - prevSrc=src; - } else if(src==limit) { - break; - } - - src+=U16_LENGTH(c); - /* - * isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. - * c is either a "noNo" (has a mapping) or a "maybeYes" (combines backward) - * or has ccc!=0. - * Check for Jamo V/T, then for regular characters. - * c is not a Hangul syllable or Jamo L because those have "yes" properties. - */ - if(isJamoVT(norm16) && prevBoundary!=prevSrc) { + // Other "noNo" type, or need to examine more text around this character: + // Fall through to the slow path. + } else if (isJamoVT(norm16) && prevBoundary != prevSrc) { UChar prev=*(prevSrc-1); - UBool needToDecompose=FALSE; if(c= 0) { + UChar32 syllable = Hangul::HANGUL_BASE + + (l*Hangul::JAMO_V_COUNT + (c-Hangul::JAMO_V_BASE)) * + Hangul::JAMO_T_COUNT + t; + --prevSrc; // Replace the Jamo L as well. + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + if(!buffer.appendBMP((UChar)syllable, 0, errorCode)) { + break; + } + prevBoundary = src; continue; } // If we see L+V+x where x!=T then we drop to the slow path, // decompose and recompose. // This is to deal with NFKC finding normal L and V but a - // compatibility variant of a T. We need to either fully compose that - // combination here (which would complicate the code and may not work - // with strange custom data) or use the slow path -- or else our replacing - // two input characters (L+V) with one output character (LV syllable) - // would violate the invariant that [prevBoundary..prevSrc[ has the same - // length as what we appended to the buffer since prevBoundary. - needToDecompose=TRUE; + // compatibility variant of a T. + // We need to either fully compose that combination here + // (which would complicate the code and may not work with strange custom data) + // or use the slow path. } - } else if(Hangul::isHangulWithoutJamoT(prev)) { - // c is a Jamo Trailing consonant, + } else if (Hangul::isHangulLV(prev)) { + // The current character is a Jamo Trailing consonant, // compose with previous Hangul LV that does not contain a Jamo T. - if(!doCompose) { + if (!doCompose) { return FALSE; } - buffer.setLastChar((UChar)(prev+c-Hangul::JAMO_T_BASE)); - prevBoundary=src; - continue; - } - if(!needToDecompose) { - // The Jamo V/T did not compose into a Hangul syllable. - if(doCompose) { - if(!buffer.appendBMP((UChar)c, 0, errorCode)) { - break; - } - } else { - prevCC=0; + UChar32 syllable = prev + c - Hangul::JAMO_T_BASE; + --prevSrc; // Replace the Hangul LV as well. + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; } + if(!buffer.appendBMP((UChar)syllable, 0, errorCode)) { + break; + } + prevBoundary = src; continue; } - } - /* - * Source buffer pointers: - * - * all done quick check current char not yet - * "yes" but (c) processed - * may combine - * forward - * [-------------[-------------[-------------[-------------[ - * | | | | | - * orig. src prevBoundary prevSrc src limit - * - * - * Destination buffer pointers inside the ReorderingBuffer: - * - * all done might take not filled yet - * characters for - * reordering - * [-------------[-------------[-------------[ - * | | | | - * start reorderStart limit | - * +remainingCap.+ - */ - if(norm16>=MIN_YES_YES_WITH_CC) { - uint8_t cc=(uint8_t)norm16; // cc!=0 - if( onlyContiguous && // FCC - (doCompose ? buffer.getLastCC() : prevCC)==0 && - prevBoundarycc - ) { + // No matching context, or may need to decompose surrounding text first: + // Fall through to the slow path. + } else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC + // One or more combining marks that do not combine-back: + // Check for canonical order, copy unchanged if ok and + // if followed by a character with a boundary-before. + uint8_t cc = getCCFromNormalYesOrMaybe(norm16); // cc!=0 + if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) { // Fails FCD test, need to decompose and contiguously recompose. - if(!doCompose) { + if (!doCompose) { return FALSE; } - } else if(doCompose) { - if(!buffer.append(c, cc, errorCode)) { - break; - } - continue; - } else if(prevCC<=cc) { - prevCC=cc; - continue; } else { - return FALSE; + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const UChar *nextSrc; + uint16_t n16; + for (;;) { + if (src == limit) { + if (doCompose) { + buffer.appendZeroCC(prevBoundary, limit, errorCode); + } + return TRUE; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U16_NEXT16(normTrie, nextSrc, limit, c, n16); + if (n16 >= MIN_YES_YES_WITH_CC) { + cc = getCCFromNormalYesOrMaybe(n16); + if (prevCC > cc) { + if (!doCompose) { + return FALSE; + } + break; + } + } else { + break; + } + src = nextSrc; + } + // src is after the last in-order combining mark. + // If there is a boundary here, then we continue with no change. + if (norm16HasCompBoundaryBefore(n16)) { + if (isCompYesAndZeroCC(n16)) { + src = nextSrc; + } + continue; + } + // Use the slow path. There is no boundary in [prevSrc, src[. } - } else if(!doCompose && !isMaybeOrNonZeroCC(norm16)) { - return FALSE; } - /* - * Find appropriate boundaries around this character, - * decompose the source text from between the boundaries, - * and recompose it. - * - * We may need to remove the last few characters from the ReorderingBuffer - * to account for source text that was copied or appended - * but needs to take part in the recomposition. - */ - - /* - * Find the last composition boundary in [prevBoundary..src[. - * It is either the decomposition of the current character (at prevSrc), - * or prevBoundary. - */ - if(hasCompBoundaryBefore(c, norm16)) { - prevBoundary=prevSrc; - } else if(doCompose) { - buffer.removeSuffix((int32_t)(prevSrc-prevBoundary)); - } - - // Find the next composition boundary in [src..limit[ - - // modifies src to point to the next starter. - src=(UChar *)findNextCompBoundary(src, limit); - - // Decompose [prevBoundary..src[ into the buffer and then recompose that part of it. + // Slow path: Find the nearest boundaries around the current character, + // decompose and recompose. + if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) { + const UChar *p = prevSrc; + UTRIE2_U16_PREV16(normTrie, prevBoundary, p, c, norm16); + if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + prevSrc = p; + } + } + if (doCompose && prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } int32_t recomposeStartIndex=buffer.length(); - if(!decomposeShort(prevBoundary, src, buffer, errorCode)) { + // We know there is not a boundary here. + decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + // Decompose until the next boundary. + src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + if (U_FAILURE(errorCode)) { break; } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return TRUE; + } recompose(buffer, recomposeStartIndex, onlyContiguous); if(!doCompose) { - if(!buffer.equals(prevBoundary, src)) { + if(!buffer.equals(prevSrc, src)) { return FALSE; } buffer.remove(); - prevCC=0; } - - // Move to the next starter. We never need to look back before this point again. prevBoundary=src; } return TRUE; @@ -1340,30 +1600,28 @@ const UChar * Normalizer2Impl::composeQuickCheck(const UChar *src, const UChar *limit, UBool onlyContiguous, UNormalizationCheckResult *pQCResult) const { - /* - * prevBoundary points to the last character before the current one - * that has a composition boundary before it with ccc==0 and quick check "yes". - */ const UChar *prevBoundary=src; UChar32 minNoMaybeCP=minCompNoMaybeCP; if(limit==NULL) { UErrorCode errorCode=U_ZERO_ERROR; src=copyLowPrefixFromNulTerminated(src, minNoMaybeCP, NULL, errorCode); - if(prevBoundary=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + uint16_t prevNorm16 = INERT; + if (prevBoundary != prevSrc) { + if (norm16HasCompBoundaryBefore(norm16)) { + prevBoundary = prevSrc; + } else { + const UChar *p = prevSrc; + uint16_t n16; + UTRIE2_U16_PREV16(normTrie, prevBoundary, p, c, n16); + if (norm16HasCompBoundaryAfter(n16, onlyContiguous)) { + prevBoundary = prevSrc; + } else { + prevBoundary = p; + prevNorm16 = n16; + } } - prevCC=0; - // The start of the current character (c). - prevSrc=src; } - src+=U16_LENGTH(c); - /* - * isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. - * c is either a "noNo" (has a mapping) or a "maybeYes" (combines backward) - * or has ccc!=0. - */ if(isMaybeOrNonZeroCC(norm16)) { uint8_t cc=getCCFromYesOrMaybe(norm16); - if( onlyContiguous && // FCC - cc!=0 && - prevCC==0 && - prevBoundarycc - ) { - // Fails FCD test. - } else if(prevCC<=cc || cc==0) { - prevCC=cc; - if(norm16 cc) { + // The [prevBoundary..prevSrc[ character + // passed the quick check "yes && ccc==0" test + // but is out of canonical order with the current combining mark. + } else { + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const UChar *nextSrc; + for (;;) { + if (norm16 < MIN_YES_YES_WITH_CC) { + if (pQCResult != nullptr) { + *pQCResult = UNORM_MAYBE; + } else { + return prevBoundary; + } + } + if (src == limit) { + return src; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U16_NEXT16(normTrie, nextSrc, limit, c, norm16); + if (isMaybeOrNonZeroCC(norm16)) { + cc = getCCFromYesOrMaybe(norm16); + if (!(prevCC <= cc || cc == 0)) { + break; + } } else { - return prevBoundary; + break; } + src = nextSrc; + } + // src is after the last in-order combining mark. + if (isCompYesAndZeroCC(norm16)) { + prevBoundary = src; + src = nextSrc; + continue; } - continue; } } if(pQCResult!=NULL) { @@ -1453,10 +1732,10 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit, ReorderingBuffer &buffer, UErrorCode &errorCode) const { if(!buffer.isEmpty()) { - const UChar *firstStarterInSrc=findNextCompBoundary(src, limit); + const UChar *firstStarterInSrc=findNextCompBoundary(src, limit, onlyContiguous); if(src!=firstStarterInSrc) { const UChar *lastStarterInDest=findPreviousCompBoundary(buffer.getStart(), - buffer.getLimit()); + buffer.getLimit(), onlyContiguous); int32_t destSuffixLength=(int32_t)(buffer.getLimit()-lastStarterInDest); UnicodeString middle(lastStarterInDest, destSuffixLength); buffer.removeSuffix(destSuffixLength); @@ -1481,91 +1760,349 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit, } } -/** - * Does c have a composition boundary before it? - * True if its decomposition begins with a character that has - * ccc=0 && NFC_QC=Yes (isCompYesAndZeroCC()). - * As a shortcut, this is true if c itself has ccc=0 && NFC_QC=Yes - * (isCompYesAndZeroCC()) so we need not decompose. - */ -UBool Normalizer2Impl::hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const { - for(;;) { - if(isCompYesAndZeroCC(norm16)) { +UBool +Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const { + U_ASSERT(limit != nullptr); + UnicodeString s16; + uint8_t minNoMaybeLead = leadByteForCP(minCompNoMaybeCP); + const uint8_t *prevBoundary = src; + + for (;;) { + // Fast path: Scan over a sequence of characters below the minimum "no or maybe" code point, + // or with (compYes && ccc==0) properties. + const uint8_t *prevSrc; + uint16_t norm16 = 0; + for (;;) { + if (src == limit) { + if (prevBoundary != limit && sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return TRUE; + } + if (*src < minNoMaybeLead) { + ++src; + } else { + prevSrc = src; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + if (!isCompYesAndZeroCC(norm16)) { + break; + } + } + } + // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + // Medium-fast path: Handle cases that do not require full decomposition and recomposition. + if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (sink == nullptr) { + return FALSE; + } + // Fast path for mapping a character that is immediately surrounded by boundaries. + // In this case, we need not decompose around the current character. + if (isDecompNoAlgorithmic(norm16)) { + // Maps to a single isCompYesAndZeroCC character + // which also implies hasCompBoundaryBefore. + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) || + hasCompBoundaryBefore(src, limit)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + appendCodePointDelta(prevSrc, src, getAlgorithmicDelta(norm16), *sink, edits); + prevBoundary = src; + continue; + } + } else if (norm16 < minNoNoCompBoundaryBefore) { + // The mapping is comp-normalized which also implies hasCompBoundaryBefore. + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) || + hasCompBoundaryBefore(src, limit)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + const uint16_t *mapping = getMapping(norm16); + int32_t length = *mapping++ & MAPPING_LENGTH_MASK; + if (!ByteSinkUtil::appendChange(prevSrc, src, (const UChar *)mapping, length, + *sink, edits, errorCode)) { + break; + } + prevBoundary = src; + continue; + } + } else if (norm16 >= minNoNoEmpty) { + // The current character maps to nothing. + // Simply omit it from the output if there is a boundary before _or_ after it. + // The character itself implies no boundaries. + if (hasCompBoundaryBefore(src, limit) || + hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + if (edits != nullptr) { + edits->addReplace((int32_t)(src - prevSrc), 0); + } + prevBoundary = src; + continue; + } + } + // Other "noNo" type, or need to examine more text around this character: + // Fall through to the slow path. + } else if (isJamoVT(norm16)) { + // Jamo L: E1 84 80..92 + // Jamo V: E1 85 A1..B5 + // Jamo T: E1 86 A8..E1 87 82 + U_ASSERT((src - prevSrc) == 3 && *prevSrc == 0xe1); + UChar32 prev = previousHangulOrJamo(prevBoundary, prevSrc); + if (prevSrc[1] == 0x85) { + // The current character is a Jamo Vowel, + // compose with previous Jamo L and following Jamo T. + UChar32 l = prev - Hangul::JAMO_L_BASE; + if ((uint32_t)l < Hangul::JAMO_L_COUNT) { + if (sink == nullptr) { + return FALSE; + } + int32_t t = getJamoTMinusBase(src, limit); + if (t >= 0) { + // The next character is a Jamo T. + src += 3; + } else if (hasCompBoundaryBefore(src, limit)) { + // No Jamo T follows, not even via decomposition. + t = 0; + } + if (t >= 0) { + UChar32 syllable = Hangul::HANGUL_BASE + + (l*Hangul::JAMO_V_COUNT + (prevSrc[2]-0xa1)) * + Hangul::JAMO_T_COUNT + t; + prevSrc -= 3; // Replace the Jamo L as well. + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + ByteSinkUtil::appendCodePoint(prevSrc, src, syllable, *sink, edits); + prevBoundary = src; + continue; + } + // If we see L+V+x where x!=T then we drop to the slow path, + // decompose and recompose. + // This is to deal with NFKC finding normal L and V but a + // compatibility variant of a T. + // We need to either fully compose that combination here + // (which would complicate the code and may not work with strange custom data) + // or use the slow path. + } + } else if (Hangul::isHangulLV(prev)) { + // The current character is a Jamo Trailing consonant, + // compose with previous Hangul LV that does not contain a Jamo T. + if (sink == nullptr) { + return FALSE; + } + UChar32 syllable = prev + getJamoTMinusBase(prevSrc, src); + prevSrc -= 3; // Replace the Hangul LV as well. + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + ByteSinkUtil::appendCodePoint(prevSrc, src, syllable, *sink, edits); + prevBoundary = src; + continue; + } + // No matching context, or may need to decompose surrounding text first: + // Fall through to the slow path. + } else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC + // One or more combining marks that do not combine-back: + // Check for canonical order, copy unchanged if ok and + // if followed by a character with a boundary-before. + uint8_t cc = getCCFromNormalYesOrMaybe(norm16); // cc!=0 + if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) { + // Fails FCD test, need to decompose and contiguously recompose. + if (sink == nullptr) { + return FALSE; + } + } else { + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const uint8_t *nextSrc; + uint16_t n16; + for (;;) { + if (src == limit) { + if (sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return TRUE; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U8_NEXT16(normTrie, nextSrc, limit, n16); + if (n16 >= MIN_YES_YES_WITH_CC) { + cc = getCCFromNormalYesOrMaybe(n16); + if (prevCC > cc) { + if (sink == nullptr) { + return FALSE; + } + break; + } + } else { + break; + } + src = nextSrc; + } + // src is after the last in-order combining mark. + // If there is a boundary here, then we continue with no change. + if (norm16HasCompBoundaryBefore(n16)) { + if (isCompYesAndZeroCC(n16)) { + src = nextSrc; + } + continue; + } + // Use the slow path. There is no boundary in [prevSrc, src[. + } + } + + // Slow path: Find the nearest boundaries around the current character, + // decompose and recompose. + if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) { + const uint8_t *p = prevSrc; + UTRIE2_U8_PREV16(normTrie, prevBoundary, p, norm16); + if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + prevSrc = p; + } + } + ReorderingBuffer buffer(*this, s16, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + // We know there is not a boundary here. + decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + // Decompose until the next boundary. + src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; return TRUE; - } else if(isMaybeOrNonZeroCC(norm16)) { - return FALSE; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - norm16=getNorm16(c); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { + } + recompose(buffer, 0, onlyContiguous); + if (!buffer.equals(prevSrc, src)) { + if (sink == nullptr) { return FALSE; } - if((firstUnit&MAPPING_HAS_CCC_LCCC_WORD) && (*(mapping-1)&0xff00)) { - return FALSE; // non-zero leadCC + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; } - int32_t i=1; // skip over the firstUnit - UChar32 c; - U16_NEXT_UNSAFE(mapping, i, c); - return isCompYesAndZeroCC(getNorm16(c)); + if (!ByteSinkUtil::appendChange(prevSrc, src, buffer.getStart(), buffer.length(), + *sink, edits, errorCode)) { + break; + } + prevBoundary = src; } } + return TRUE; } -UBool Normalizer2Impl::hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous, UBool testInert) const { - for(;;) { - uint16_t norm16=getNorm16(c); - if(isInert(norm16)) { - return TRUE; - } else if(norm16<=minYesNo) { - // Hangul: norm16==minYesNo - // Hangul LVT has a boundary after it. - // Hangul LV and non-inert yesYes characters combine forward. - return isHangul(norm16) && !Hangul::isHangulWithoutJamoT((UChar)c); - } else if(norm16>= (testInert ? minNoNo : minMaybeYes)) { - return FALSE; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data. - // If testInert, then c must be a yesNo character which has lccc=0, - // otherwise it could be a noNo. - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - // TRUE if - // not MAPPING_NO_COMP_BOUNDARY_AFTER - // (which is set if - // c is not deleted, and - // it and its decomposition do not combine forward, and it has a starter) - // and if FCC then trailCC<=1 - return - (firstUnit&MAPPING_NO_COMP_BOUNDARY_AFTER)==0 && - (!onlyContiguous || firstUnit<=0x1ff); - } +UBool Normalizer2Impl::hasCompBoundaryBefore(const UChar *src, const UChar *limit) const { + if (src == limit || *src < minCompNoMaybeCP) { + return TRUE; } + UChar32 c; + uint16_t norm16; + UTRIE2_U16_NEXT16(normTrie, src, limit, c, norm16); + return norm16HasCompBoundaryBefore(norm16); } -const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p) const { - BackwardUTrie2StringIterator iter(normTrie, start, p); +UBool Normalizer2Impl::hasCompBoundaryBefore(const uint8_t *src, const uint8_t *limit) const { + if (src == limit) { + return TRUE; + } uint16_t norm16; - do { - norm16=iter.previous16(); - } while(!hasCompBoundaryBefore(iter.codePoint, norm16)); - // We could also test hasCompBoundaryAfter() and return iter.codePointLimit, - // but that's probably not worth the extra cost. - return iter.codePointStart; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + return norm16HasCompBoundaryBefore(norm16); } -const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar *limit) const { - ForwardUTrie2StringIterator iter(normTrie, p, limit); +UBool Normalizer2Impl::hasCompBoundaryAfter(const UChar *start, const UChar *p, + UBool onlyContiguous) const { + if (start == p) { + return TRUE; + } + UChar32 c; uint16_t norm16; - do { - norm16=iter.next16(); - } while(!hasCompBoundaryBefore(iter.codePoint, norm16)); - return iter.codePointStart; + UTRIE2_U16_PREV16(normTrie, start, p, c, norm16); + return norm16HasCompBoundaryAfter(norm16, onlyContiguous); +} + +UBool Normalizer2Impl::hasCompBoundaryAfter(const uint8_t *start, const uint8_t *p, + UBool onlyContiguous) const { + if (start == p) { + return TRUE; + } + uint16_t norm16; + UTRIE2_U8_PREV16(normTrie, start, p, norm16); + return norm16HasCompBoundaryAfter(norm16, onlyContiguous); +} + +const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p, + UBool onlyContiguous) const { + BackwardUTrie2StringIterator iter(normTrie, start, p); + for(;;) { + uint16_t norm16=iter.previous16(); + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return iter.codePointLimit; + } + if (hasCompBoundaryBefore(iter.codePoint, norm16)) { + return iter.codePointStart; + } + } +} + +const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar *limit, + UBool onlyContiguous) const { + ForwardUTrie2StringIterator iter(normTrie, p, limit); + for(;;) { + uint16_t norm16=iter.next16(); + if (hasCompBoundaryBefore(iter.codePoint, norm16)) { + return iter.codePointStart; + } + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return iter.codePointLimit; + } + } +} + +uint8_t Normalizer2Impl::getPreviousTrailCC(const UChar *start, const UChar *p) const { + if (start == p) { + return 0; + } + int32_t i = (int32_t)(p - start); + UChar32 c; + U16_PREV(start, 0, i, c); + return (uint8_t)getFCD16(c); +} + +uint8_t Normalizer2Impl::getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const { + if (start == p) { + return 0; + } + int32_t i = (int32_t)(p - start); + UChar32 c; + U8_PREV(start, 0, i, c); + return (uint8_t)getFCD16(c); } // Note: normalizer2impl.cpp r30982 (2011-nov-27) @@ -1573,43 +2110,41 @@ const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar * // That provided faster access to FCD data than getFCD16FromNormData() // but required synchronization and consumed some 10kB of heap memory // in any process that uses FCD (e.g., via collation). -// tccc180[] and smallFCD[] are intended to help with any loss of performance, -// at least for Latin & CJK. +// minDecompNoCP etc. and smallFCD[] are intended to help with any loss of performance, +// at least for ASCII & CJK. // Gets the FCD value from the regular normalization data. uint16_t Normalizer2Impl::getFCD16FromNormData(UChar32 c) const { - // Only loops for 1:1 algorithmic mappings. - for(;;) { - uint16_t norm16=getNorm16(c); - if(norm16<=minYesNo) { - // no decomposition or Hangul syllable, all zeros - return 0; - } else if(norm16>=MIN_NORMAL_MAYBE_YES) { + uint16_t norm16=getNorm16(c); + if (norm16 >= limitNoNo) { + if(norm16>=MIN_NORMAL_MAYBE_YES) { // combining mark - norm16&=0xff; + norm16=getCCFromNormalYesOrMaybe(norm16); return norm16|(norm16<<8); } else if(norm16>=minMaybeYes) { return 0; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { - // A character that is deleted (maps to an empty string) must - // get the worst-case lccc and tccc values because arbitrary - // characters on both sides will become adjacent. - return 0x1ff; - } else { - norm16=firstUnit>>8; // tccc - if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - norm16|=*(mapping-1)&0xff00; // lccc - } - return norm16; + } else { // isDecompNoAlgorithmic(norm16) + uint16_t deltaTrailCC = norm16 & DELTA_TCCC_MASK; + if (deltaTrailCC <= DELTA_TCCC_1) { + return deltaTrailCC >> OFFSET_SHIFT; } + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getNorm16(c); } } + if(norm16<=minYesNo || isHangulLVT(norm16)) { + // no decomposition or Hangul syllable, all zeros + return 0; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + norm16=firstUnit>>8; // tccc + if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { + norm16|=*(mapping-1)&0xff00; // lccc + } + return norm16; } // Dual functionality: @@ -1624,7 +2159,7 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, const UChar *prevBoundary=src; int32_t prevFCD16=0; if(limit==NULL) { - src=copyLowPrefixFromNulTerminated(src, MIN_CCC_LCCC_CP, buffer, errorCode); + src=copyLowPrefixFromNulTerminated(src, minLcccCP, buffer, errorCode); if(U_FAILURE(errorCode)) { return src; } @@ -1653,7 +2188,7 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, for(;;) { // count code units with lccc==0 for(prevSrc=src; src!=limit;) { - if((c=*src)1) { - --prevBoundary; + if(prev1) { + --prevBoundary; + } } } else { const UChar *p=src-1; @@ -1748,7 +2287,8 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, * The source text does not fulfill the conditions for FCD. * Decompose and reorder a limited piece of the text. */ - if(!decomposeShort(prevBoundary, src, *buffer, errorCode)) { + decomposeShort(prevBoundary, src, FALSE, FALSE, *buffer, errorCode); + if (U_FAILURE(errorCode)) { break; } prevBoundary=src; @@ -1792,16 +2332,33 @@ void Normalizer2Impl::makeFCDAndAppend(const UChar *src, const UChar *limit, } const UChar *Normalizer2Impl::findPreviousFCDBoundary(const UChar *start, const UChar *p) const { - while(start

0xff) {} + while(startmakeCanonIterDataFromNorm16( - start, end, (uint16_t)value, *impl->fCanonIterData, errorCode); + InitCanonIterData::handleRange(impl, start, end, (uint16_t)value, errorCode); } return U_SUCCESS(errorCode); } +U_CDECL_END - -// UInitOnce instantiation function for CanonIterData - -static void U_CALLCONV -initCanonIterData(Normalizer2Impl *impl, UErrorCode &errorCode) { +void InitCanonIterData::doInit(Normalizer2Impl *impl, UErrorCode &errorCode) { U_ASSERT(impl->fCanonIterData == NULL); impl->fCanonIterData = new CanonIterData(errorCode); if (impl->fCanonIterData == NULL) { errorCode=U_MEMORY_ALLOCATION_ERROR; } if (U_SUCCESS(errorCode)) { - utrie2_enum(impl->getNormTrie(), NULL, enumCIDRangeHandler, impl); + utrie2_enum(impl->normTrie, NULL, enumCIDRangeHandler, impl); utrie2_freeze(impl->fCanonIterData->trie, UTRIE2_32_VALUE_BITS, &errorCode); } if (U_FAILURE(errorCode)) { @@ -1881,12 +2447,15 @@ initCanonIterData(Normalizer2Impl *impl, UErrorCode &errorCode) { } } -U_CDECL_END +void InitCanonIterData::handleRange( + Normalizer2Impl *impl, UChar32 start, UChar32 end, uint16_t value, UErrorCode &errorCode) { + impl->makeCanonIterDataFromNorm16(start, end, value, *impl->fCanonIterData, errorCode); +} -void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, uint16_t norm16, +void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, const uint16_t norm16, CanonIterData &newData, UErrorCode &errorCode) const { - if(norm16==0 || (minYesNo<=norm16 && norm16=minMaybeYes) { + if(isMaybeOrNonZeroCC(norm16)) { // not a segment starter if it occurs in a decomposition or has cc!=0 newValue|=CANON_NOT_SEGMENT_STARTER; if(norm16 minYesNo) { // c decomposes, get everything from the variable-length extra data const uint16_t *mapping=getMapping(norm16_2); uint16_t firstUnit=*mapping; @@ -2017,7 +2590,7 @@ unorm2_swap(const UDataSwapper *ds, uint8_t *outBytes; const int32_t *inIndexes; - int32_t indexes[Normalizer2Impl::IX_MIN_MAYBE_YES+1]; + int32_t indexes[Normalizer2Impl::IX_TOTAL_SIZE+1]; int32_t i, offset, nextOffset, size; @@ -2029,12 +2602,13 @@ unorm2_swap(const UDataSwapper *ds, /* check data format and format version */ pInfo=(const UDataInfo *)((const char *)inData+4); + uint8_t formatVersion0=pInfo->formatVersion[0]; if(!( pInfo->dataFormat[0]==0x4e && /* dataFormat="Nrm2" */ pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - (pInfo->formatVersion[0]==1 || pInfo->formatVersion[0]==2) + (1<=formatVersion0 && formatVersion0<=3) )) { udata_printError(ds, "unorm2_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as Normalizer2 data\n", pInfo->dataFormat[0], pInfo->dataFormat[1], @@ -2048,10 +2622,18 @@ unorm2_swap(const UDataSwapper *ds, outBytes=(uint8_t *)outData+headerSize; inIndexes=(const int32_t *)inBytes; + int32_t minIndexesLength; + if(formatVersion0==1) { + minIndexesLength=Normalizer2Impl::IX_MIN_MAYBE_YES+1; + } else if(formatVersion0==2) { + minIndexesLength=Normalizer2Impl::IX_MIN_YES_NO_MAPPINGS_ONLY+1; + } else { + minIndexesLength=Normalizer2Impl::IX_MIN_LCCC_CP+1; + } if(length>=0) { length-=headerSize; - if(length<(int32_t)sizeof(indexes)) { + if(length=MIN_NORMAL_MAYBE_YES) { - return (uint8_t)norm16; + return getCCFromNormalYesOrMaybe(norm16); } if(norm16> OFFSET_SHIFT); + } static uint8_t getCCFromYesOrMaybe(uint16_t norm16) { - return norm16>=MIN_NORMAL_MAYBE_YES ? (uint8_t)norm16 : 0; + return norm16>=MIN_NORMAL_MAYBE_YES ? getCCFromNormalYesOrMaybe(norm16) : 0; + } + uint8_t getCCFromYesOrMaybeCP(UChar32 c) const { + if (c < minCompNoMaybeCP) { return 0; } + return getCCFromYesOrMaybe(getNorm16(c)); } /** @@ -272,10 +295,8 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0. */ uint16_t getFCD16(UChar32 c) const { - if(c<0) { + if(c1) for quick FCC boundary-after tests. + DELTA_TCCC_0=0, + DELTA_TCCC_1=2, + DELTA_TCCC_GT_1=4, + DELTA_TCCC_MASK=6, + DELTA_SHIFT=3, - enum { - MIN_YES_YES_WITH_CC=0xff01, - JAMO_VT=0xff00, - MIN_NORMAL_MAYBE_YES=0xfe00, - JAMO_L=1, MAX_DELTA=0x40 }; @@ -394,21 +419,32 @@ class U_COMMON_API Normalizer2Impl : public UObject { IX_MIN_COMP_NO_MAYBE_CP, // Norm16 value thresholds for quick check combinations and types of extra data. - IX_MIN_YES_NO, // Mappings & compositions in [minYesNo..minYesNoMappingsOnly[. + + /** Mappings & compositions in [minYesNo..minYesNoMappingsOnly[. */ + IX_MIN_YES_NO, + /** Mappings are comp-normalized. */ IX_MIN_NO_NO, IX_LIMIT_NO_NO, IX_MIN_MAYBE_YES, - IX_MIN_YES_NO_MAPPINGS_ONLY, // Mappings only in [minYesNoMappingsOnly..minNoNo[. - - IX_RESERVED15, + /** Mappings only in [minYesNoMappingsOnly..minNoNo[. */ + IX_MIN_YES_NO_MAPPINGS_ONLY, + /** Mappings are not comp-normalized but have a comp boundary before. */ + IX_MIN_NO_NO_COMP_BOUNDARY_BEFORE, + /** Mappings do not have a comp boundary before. */ + IX_MIN_NO_NO_COMP_NO_MAYBE_CC, + /** Mappings to the empty string. */ + IX_MIN_NO_NO_EMPTY, + + IX_MIN_LCCC_CP, + IX_RESERVED19, IX_COUNT }; enum { MAPPING_HAS_CCC_LCCC_WORD=0x80, MAPPING_HAS_RAW_MAPPING=0x40, - MAPPING_NO_COMP_BOUNDARY_AFTER=0x20, + // unused bit 0x20, MAPPING_LENGTH_MASK=0x1f }; @@ -457,6 +493,12 @@ class U_COMMON_API Normalizer2Impl : public UObject { UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + + /** sink==nullptr: isNormalized() */ + UBool composeUTF8(uint32_t options, UBool onlyContiguous, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, icu::Edits *edits, UErrorCode &errorCode) const; + const UChar *makeFCD(const UChar *src, const UChar *limit, ReorderingBuffer *buffer, UErrorCode &errorCode) const; void makeFCDAndAppend(const UChar *src, const UChar *limit, @@ -465,27 +507,42 @@ class U_COMMON_API Normalizer2Impl : public UObject { ReorderingBuffer &buffer, UErrorCode &errorCode) const; - UBool hasDecompBoundary(UChar32 c, UBool before) const; + UBool hasDecompBoundaryBefore(UChar32 c) const; + UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const; + UBool hasDecompBoundaryAfter(UChar32 c) const; + UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const; UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); } UBool hasCompBoundaryBefore(UChar32 c) const { - return c=minMaybeYes; } - static UBool isInert(uint16_t norm16) { return norm16==0; } - static UBool isJamoL(uint16_t norm16) { return norm16==1; } + static UBool isInert(uint16_t norm16) { return norm16==INERT; } + static UBool isJamoL(uint16_t norm16) { return norm16==JAMO_L; } static UBool isJamoVT(uint16_t norm16) { return norm16==JAMO_VT; } - UBool isHangul(uint16_t norm16) const { return norm16==minYesNo; } + uint16_t hangulLVT() const { return minYesNoMappingsOnly|HAS_COMP_BOUNDARY_AFTER; } + UBool isHangulLV(uint16_t norm16) const { return norm16==minYesNo; } + UBool isHangulLVT(uint16_t norm16) const { + return norm16==hangulLVT(); + } UBool isCompYesAndZeroCC(uint16_t norm16) const { return norm16=MIN_YES_YES_WITH_CC || norm16=MIN_YES_YES_WITH_CC ? (uint8_t)norm16 : 0; + // return norm16>=MIN_YES_YES_WITH_CC ? getCCFromNormalYesOrMaybe(norm16) : 0; // } uint8_t getCCFromNoNo(uint16_t norm16) const { const uint16_t *mapping=getMapping(norm16); @@ -525,30 +582,47 @@ class U_COMMON_API Normalizer2Impl : public UObject { } } // requires that the [cpStart..cpLimit[ character passes isCompYesAndZeroCC() - uint8_t getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, const UChar *cpLimit) const; + uint8_t getTrailCCFromCompYesAndZeroCC(uint16_t norm16) const { + if(norm16<=minYesNo) { + return 0; // yesYes and Hangul LV have ccc=tccc=0 + } else { + // For Hangul LVT we harmlessly fetch a firstUnit with tccc=0 here. + return (uint8_t)(*getMapping(norm16)>>8); // tccc from yesNo + } + } + uint8_t getPreviousTrailCC(const UChar *start, const UChar *p) const; + uint8_t getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const; // Requires algorithmic-NoNo. UChar32 mapAlgorithmic(UChar32 c, uint16_t norm16) const { - return c+norm16-(minMaybeYes-MAX_DELTA-1); + return c+(norm16>>DELTA_SHIFT)-centerNoNoDelta; + } + UChar32 getAlgorithmicDelta(uint16_t norm16) const { + return (norm16>>DELTA_SHIFT)-centerNoNoDelta; } // Requires minYesNo>OFFSET_SHIFT); } const uint16_t *getCompositionsListForDecompYes(uint16_t norm16) const { - if(norm16==0 || MIN_NORMAL_MAYBE_YES<=norm16) { + if(norm16>OFFSET_SHIFT); + } /** * @param c code point must have compositions * @return compositions list pointer @@ -563,46 +637,78 @@ class U_COMMON_API Normalizer2Impl : public UObject { UChar32 minNeedDataCP, ReorderingBuffer *buffer, UErrorCode &errorCode) const; - UBool decomposeShort(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const; + const UChar *decomposeShort(const UChar *src, const UChar *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const; UBool decompose(UChar32 c, uint16_t norm16, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + const uint8_t *decomposeShort(const uint8_t *src, const uint8_t *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const; + static int32_t combine(const uint16_t *list, UChar32 trail); void addComposites(const uint16_t *list, UnicodeSet &set) const; void recompose(ReorderingBuffer &buffer, int32_t recomposeStartIndex, UBool onlyContiguous) const; - UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const; - const UChar *findPreviousCompBoundary(const UChar *start, const UChar *p) const; - const UChar *findNextCompBoundary(const UChar *p, const UChar *limit) const; + UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const { + return c -# include "unicode\uloc.h" +# include "unicode/uloc.h" #if U_PLATFORM_HAS_WINUWP_API == 0 # include "wintz.h" #else // U_PLATFORM_HAS_WINUWP_API typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef #include #include -#include -#include +#include +#include using namespace ABI::Windows::Foundation; using namespace Microsoft::WRL; @@ -675,6 +675,16 @@ extern U_IMPORT char *U_TZNAME[]; #if !UCONFIG_NO_FILE_IO && ((U_PLATFORM_IS_DARWIN_BASED && (U_PLATFORM != U_PF_IPHONE || defined(U_TIMEZONE))) || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U_PF_BSD || U_PLATFORM == U_PF_SOLARIS) /* These platforms are likely to use Olson timezone IDs. */ +/* common targets of the symbolic link at TZDEFAULT are: + * "/usr/share/zoneinfo/" default, older Linux distros, macOS to 10.12 + * "../usr/share/zoneinfo/" newer Linux distros: Red Hat Enterprise Linux 7, Ubuntu 16, SuSe Linux 12 + * "/usr/share/lib/zoneinfo/" Solaris + * "../usr/share/lib/zoneinfo/" Solaris + * "/var/db/timezone/zoneinfo/" macOS 10.13 + * To avoid checking lots of paths, just check that the target path + * before the ends with "/zoneinfo/", and the is valid. + */ + #define CHECK_LOCALTIME_LINK 1 #if U_PLATFORM_IS_DARWIN_BASED #include @@ -682,12 +692,12 @@ extern U_IMPORT char *U_TZNAME[]; #elif U_PLATFORM == U_PF_SOLARIS #define TZDEFAULT "/etc/localtime" #define TZZONEINFO "/usr/share/lib/zoneinfo/" -#define TZZONEINFO2 "../usr/share/lib/zoneinfo/" #define TZ_ENV_CHECK "localtime" #else #define TZDEFAULT "/etc/localtime" #define TZZONEINFO "/usr/share/zoneinfo/" #endif +#define TZZONEINFOTAIL "/zoneinfo/" #if U_HAVE_DIRENT_H #define TZFILE_SKIP "posixrules" /* tz file to skip when searching. */ /* Some Linux distributions have 'localtime' in /usr/share/zoneinfo @@ -939,30 +949,30 @@ static CharString *gSearchTZFileResult = NULL; * This function is not thread safe - it uses a global, gSearchTZFileResult, to hold its results. */ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { - DIR* dirp = opendir(path); - DIR* subDirp = NULL; + DIR* dirp = NULL; struct dirent* dirEntry = NULL; - char* result = NULL; + UErrorCode status = U_ZERO_ERROR; + + /* Save the current path */ + CharString curpath(path, -1, status); + if (U_FAILURE(status)) { + goto cleanupAndReturn; + } + + dirp = opendir(path); if (dirp == NULL) { - return result; + goto cleanupAndReturn; } if (gSearchTZFileResult == NULL) { gSearchTZFileResult = new CharString; if (gSearchTZFileResult == NULL) { - return NULL; + goto cleanupAndReturn; } ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); } - /* Save the current path */ - UErrorCode status = U_ZERO_ERROR; - CharString curpath(path, -1, status); - if (U_FAILURE(status)) { - return NULL; - } - /* Check each entry in the directory. */ while((dirEntry = readdir(dirp)) != NULL) { const char* dirName = dirEntry->d_name; @@ -971,15 +981,16 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { CharString newpath(curpath, status); newpath.append(dirName, -1, status); if (U_FAILURE(status)) { - return NULL; + break; } + DIR* subDirp = NULL; if ((subDirp = opendir(newpath.data())) != NULL) { /* If this new path is a directory, make a recursive call with the newpath. */ closedir(subDirp); newpath.append('/', status); if (U_FAILURE(status)) { - return NULL; + break; } result = searchForTZFile(newpath.data(), tzInfo); /* @@ -1003,7 +1014,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { gSearchTZFileResult->clear(); gSearchTZFileResult->append(zoneid, -1, status); if (U_FAILURE(status)) { - return NULL; + break; } result = gSearchTZFileResult->data(); /* Get out after the first one found. */ @@ -1012,7 +1023,11 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { } } } - closedir(dirp); + + cleanupAndReturn: + if (dirp) { + closedir(dirp); + } return result; } #endif @@ -1045,7 +1060,7 @@ uprv_getWindowsTimeZone() hr = timezone->GetTimeZone(timezoneString.GetAddressOf()); if (SUCCEEDED(hr)) { - int32_t length = wcslen(timezoneString.GetRawBuffer(NULL)); + int32_t length = static_cast(wcslen(timezoneString.GetRawBuffer(NULL))); char* asciiId = (char*)uprv_calloc(length + 1, sizeof(char)); if (asciiId != nullptr) { @@ -1064,6 +1079,7 @@ uprv_getWindowsTimeZone() U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { + (void)n; // Avoid unreferenced parameter warning. const char *tzid = NULL; #if U_PLATFORM_USES_ONLY_WIN32_API #if U_PLATFORM_HAS_WINUWP_API > 0 @@ -1125,24 +1141,15 @@ uprv_tzname(int n) */ int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)-1); if (0 < ret) { - int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO); + int32_t tzZoneInfoTailLen = uprv_strlen(TZZONEINFOTAIL); gTimeZoneBuffer[ret] = 0; - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, tzZoneInfoLen) == 0 - && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) - { - return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); - } -#if U_PLATFORM == U_PF_SOLARIS - else + char * tzZoneInfoTailPtr = uprv_strstr(gTimeZoneBuffer, TZZONEINFOTAIL); + + if (tzZoneInfoTailPtr != NULL + && isValidOlsonID(tzZoneInfoTailPtr + tzZoneInfoTailLen)) { - tzZoneInfoLen = uprv_strlen(TZZONEINFO2); - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO2, tzZoneInfoLen) == 0 - && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) - { - return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); - } + return (gTimeZoneBufferPtr = tzZoneInfoTailPtr + tzZoneInfoTailLen); } -#endif } else { #if defined(SEARCH_TZFILE) DefaultTZInfo* tzInfo = (DefaultTZInfo*)uprv_malloc(sizeof(DefaultTZInfo)); @@ -1228,7 +1235,7 @@ UInitOnce gTimeZoneFilesInitOnce = U_INITONCE_INITIALIZER; static CharString *gTimeZoneFilesDirectory = NULL; #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API - static char *gCorrectedPOSIXLocale = NULL; /* Sometimes heap allocated */ + static const char *gCorrectedPOSIXLocale = NULL; /* Sometimes heap allocated */ static bool gCorrectedPOSIXLocaleHeapAllocated = false; #endif @@ -1251,7 +1258,7 @@ static UBool U_CALLCONV putil_cleanup(void) #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API if (gCorrectedPOSIXLocale && gCorrectedPOSIXLocaleHeapAllocated) { - uprv_free(gCorrectedPOSIXLocale); + uprv_free(const_cast(gCorrectedPOSIXLocale)); gCorrectedPOSIXLocale = NULL; gCorrectedPOSIXLocaleHeapAllocated = false; } @@ -1287,7 +1294,7 @@ u_setDataDirectory(const char *directory) { #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) { char *p; - while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) { + while((p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } } @@ -1445,7 +1452,7 @@ static void setTimeZoneFilesDir(const char *path, UErrorCode &status) { gTimeZoneFilesDirectory->append(path, status); #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) char *p = gTimeZoneFilesDirectory->data(); - while (p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) { + while ((p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } #endif @@ -1809,6 +1816,8 @@ The leftmost codepage (.xxx) wins. } // Now normalize the resulting name + correctedPOSIXLocale = static_cast(uprv_malloc(POSIX_LOCALE_CAPACITY + 1)); + /* TODO: Should we just exit on memory allocation failure? */ if (correctedPOSIXLocale) { int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); @@ -2326,19 +2335,16 @@ u_getVersion(UVersionInfo versionArray) { * icucfg.h dependent code */ -#if U_ENABLE_DYLOAD - -#if HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API +#if U_ENABLE_DYLOAD && HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API #if HAVE_DLFCN_H - #ifdef __MVS__ #ifndef __SUSV3 #define __SUSV3 1 #endif #endif #include -#endif +#endif /* HAVE_DLFCN_H */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2378,38 +2384,10 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return uret.fp; } -#else - -/* null (nonexistent) implementation. */ - -U_INTERNAL void * U_EXPORT2 -uprv_dl_open(const char *libName, UErrorCode *status) { - if(U_FAILURE(*status)) return NULL; - *status = U_UNSUPPORTED_ERROR; - return NULL; -} - -U_INTERNAL void U_EXPORT2 -uprv_dl_close(void *lib, UErrorCode *status) { - if(U_FAILURE(*status)) return; - *status = U_UNSUPPORTED_ERROR; - return; -} - - -U_INTERNAL UVoidFunction* U_EXPORT2 -uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { - if(U_SUCCESS(*status)) { - *status = U_UNSUPPORTED_ERROR; - } - return (UVoidFunction*)NULL; -} - +#elif U_ENABLE_DYLOAD && U_PLATFORM_USES_ONLY_WIN32_API && !U_PLATFORM_HAS_WINUWP_API - -#endif - -#elif U_PLATFORM_USES_ONLY_WIN32_API +/* Windows API implementation. */ +// Note: UWP does not expose/allow these APIs, so the UWP version gets the null implementation. */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2436,7 +2414,6 @@ uprv_dl_close(void *lib, UErrorCode *status) { return; } - U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { HMODULE handle = (HMODULE)lib; @@ -2458,10 +2435,9 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return addr; } - #else -/* No dynamic loading set. */ +/* No dynamic loading, null (nonexistent) implementation. */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2479,7 +2455,6 @@ uprv_dl_close(void *lib, UErrorCode *status) { return; } - U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { (void)lib; @@ -2490,7 +2465,7 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return (UVoidFunction*)NULL; } -#endif /* U_ENABLE_DYLOAD */ +#endif /* * Hey, Emacs, please set the following: diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index b797a9a280f401..56ea8df00959d1 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -72,15 +72,6 @@ typedef size_t uintptr_t; #endif -/** - * \def U_HAVE_MSVC_2003_OR_EARLIER - * Flag for workaround of MSVC 2003 optimization bugs - * @internal - */ -#if !defined(U_HAVE_MSVC_2003_OR_EARLIER) && defined(_MSC_VER) && (_MSC_VER < 1400) -#define U_HAVE_MSVC_2003_OR_EARLIER -#endif - /*===========================================================================*/ /** @{ Information about POSIX support */ /*===========================================================================*/ @@ -120,15 +111,15 @@ typedef size_t uintptr_t; /* Use the predefined value. */ #elif U_PLATFORM == U_PF_ANDROID # define U_TIMEZONE timezone +#elif defined(__UCLIBC__) + // uClibc does not have __timezone or _timezone. +#elif defined(_NEWLIB_VERSION) +# define U_TIMEZONE _timezone +#elif defined(__GLIBC__) + // glibc +# define U_TIMEZONE __timezone #elif U_PLATFORM_IS_LINUX_BASED -# if defined(__UCLIBC__) - /* uClibc does not have __timezone or _timezone. */ -# elif defined(_NEWLIB_VERSION) -# define U_TIMEZONE _timezone -# elif defined(__GLIBC__) - /* glibc */ -# define U_TIMEZONE __timezone -# endif + // not defined #elif U_PLATFORM_USES_ONLY_WIN32_API # define U_TIMEZONE _timezone #elif U_PLATFORM == U_PF_BSD && !defined(__NetBSD__) @@ -214,7 +205,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_STD_ATOMICS * Defines whether the standard C++11 is available. - * ICU will use this when avialable, + * ICU will use this when available, * otherwise will fall back to compiler or platform specific alternatives. * @internal */ @@ -239,7 +230,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_CLANG_ATOMICS - * Defines whether Clang c11 style built-in atomics are avaialable. + * Defines whether Clang c11 style built-in atomics are available. * These are used in preference to gcc atomics when both are available. */ #ifdef U_HAVE_CLANG_ATOMICS @@ -277,7 +268,7 @@ typedef size_t uintptr_t; /** * Platform utilities isolates the platform dependencies of the - * libarary. For each platform which this code is ported to, these + * library. For each platform which this code is ported to, these * functions may have to be re-implemented. */ @@ -425,7 +416,7 @@ U_INTERNAL const char* U_EXPORT2 uprv_getDefaultCodepage(void); /** * Please use uloc_getDefault() instead. - * Return the default locale ID string by querying ths system, or + * Return the default locale ID string by querying the system, or * zero if one cannot be found. * This function can call setlocale() on Unix platforms. Please read the * platform documentation on setlocale() before calling this function. diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index 2a501bf1671072..54b289e24d1e0a 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -7,7 +7,7 @@ *************************************************************************** */ // -// file: rbbi.c Contains the implementation of the rule based break iterator +// file: rbbi.cpp Contains the implementation of the rule based break iterator // runtime engine and the API implementation for // class RuleBasedBreakIterator // @@ -21,18 +21,19 @@ #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 "unicode/udata.h" + +#include "brkeng.h" +#include "ucln_cmn.h" #include "cmemory.h" #include "cstring.h" -#include "umutex.h" -#include "ucln_cmn.h" -#include "brkeng.h" - +#include "rbbidata.h" +#include "rbbi_cache.h" +#include "rbbirb.h" #include "uassert.h" -#include "uvector.h" +#include "umutex.h" +#include "uvectr32.h" // if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included. #if U_LOCAL_SERVICE_HOOK @@ -40,16 +41,16 @@ #endif #ifdef RBBI_DEBUG -static UBool fTrace = FALSE; +static UBool gTrace = FALSE; #endif U_NAMESPACE_BEGIN // The state number of the starting state -#define START_STATE 1 +constexpr int32_t START_STATE = 1; // The state-transition value indicating "stop" -#define STOP_STATE 0 +constexpr int32_t STOP_STATE = 0; UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) @@ -63,9 +64,8 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) * Constructs a RuleBasedBreakIterator that uses the already-created * tables object that is passed in as a parameter. */ -RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) -{ - init(); +RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) { + init(status); fData = new RBBIDataWrapper(data, status); // status checked in constructor if (U_FAILURE(status)) {return;} if(fData == 0) { @@ -81,7 +81,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, uint32_t ruleLength, UErrorCode &status) { - init(); + init(status); if (U_FAILURE(status)) { return; } @@ -111,7 +111,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, //------------------------------------------------------------------------------- RuleBasedBreakIterator::RuleBasedBreakIterator(UDataMemory* udm, UErrorCode &status) { - init(); + init(status); fData = new RBBIDataWrapper(udm, status); // status checked in constructor if (U_FAILURE(status)) {return;} if(fData == 0) { @@ -131,7 +131,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status) { - init(); + init(status); if (U_FAILURE(status)) {return;} RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *) RBBIRuleBuilder::createRuleBasedBreakIterator(rules, &parseError, status); @@ -153,7 +153,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, // of rules. //------------------------------------------------------------------------------- RuleBasedBreakIterator::RuleBasedBreakIterator() { - init(); + UErrorCode status = U_ZERO_ERROR; + init(status); } @@ -166,7 +167,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator() { RuleBasedBreakIterator::RuleBasedBreakIterator(const RuleBasedBreakIterator& other) : BreakIterator(other) { - this->init(); + UErrorCode status = U_ZERO_ERROR; + this->init(status); *this = other; } @@ -181,7 +183,7 @@ RuleBasedBreakIterator::~RuleBasedBreakIterator() { } fCharIter = NULL; delete fSCharIter; - fCharIter = NULL; + fSCharIter = NULL; delete fDCharIter; fDCharIter = NULL; @@ -191,18 +193,17 @@ RuleBasedBreakIterator::~RuleBasedBreakIterator() { fData->removeReference(); fData = NULL; } - if (fCachedBreakPositions) { - uprv_free(fCachedBreakPositions); - fCachedBreakPositions = NULL; - } - if (fLanguageBreakEngines) { - delete fLanguageBreakEngines; - fLanguageBreakEngines = NULL; - } - if (fUnhandledBreakEngine) { - delete fUnhandledBreakEngine; - fUnhandledBreakEngine = NULL; - } + delete fBreakCache; + fBreakCache = NULL; + + delete fDictionaryCache; + fDictionaryCache = NULL; + + delete fLanguageBreakEngines; + fLanguageBreakEngines = NULL; + + delete fUnhandledBreakEngine; + fUnhandledBreakEngine = NULL; } /** @@ -214,7 +215,8 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { if (this == &that) { return *this; } - reset(); // Delete break cache information + BreakIterator::operator=(that); + fBreakType = that.fBreakType; if (fLanguageBreakEngines != NULL) { delete fLanguageBreakEngines; @@ -244,6 +246,17 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { fData = that.fData->addReference(); } + fPosition = that.fPosition; + fRuleStatusIndex = that.fRuleStatusIndex; + fDone = that.fDone; + + // TODO: both the dictionary and the main cache need to be copied. + // Current position could be within a dictionary range. Trying to continue + // the iteration without the caches present would go to the rules, with + // the assumption that the current position is on a rule boundary. + fBreakCache->reset(fPosition, fRuleStatusIndex); + fDictionaryCache->reset(); + return *this; } @@ -255,33 +268,43 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { // Initializes all fields, leaving the object in a consistent state. // //----------------------------------------------------------------------------- -void RuleBasedBreakIterator::init() { - UErrorCode status = U_ZERO_ERROR; - fText = utext_openUChars(NULL, NULL, 0, &status); +void RuleBasedBreakIterator::init(UErrorCode &status) { + fText = NULL; fCharIter = NULL; fSCharIter = NULL; fDCharIter = NULL; fData = NULL; - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; + fPosition = 0; + fRuleStatusIndex = 0; + fDone = false; fDictionaryCharCount = 0; fBreakType = UBRK_WORD; // Defaulting BreakType to word gives reasonable // dictionary behavior for Break Iterators that are // built from rules. Even better would be the ability to // declare the type in the rules. - fCachedBreakPositions = NULL; - fLanguageBreakEngines = NULL; - fUnhandledBreakEngine = NULL; - fNumCachedBreakPositions = 0; - fPositionInCache = 0; + fLanguageBreakEngines = NULL; + fUnhandledBreakEngine = NULL; + fBreakCache = NULL; + fDictionaryCache = NULL; + + if (U_FAILURE(status)) { + return; + } + + fText = utext_openUChars(NULL, NULL, 0, &status); + fDictionaryCache = new DictionaryCache(this, status); + fBreakCache = new BreakCache(this, status); + if (U_SUCCESS(status) && (fText == NULL || fDictionaryCache == NULL || fBreakCache == NULL)) { + status = U_MEMORY_ALLOCATION_ERROR; + } #ifdef RBBI_DEBUG static UBool debugInitDone = FALSE; if (debugInitDone == FALSE) { char *debugEnv = getenv("U_RBBIDEBUG"); if (debugEnv && uprv_strstr(debugEnv, "trace")) { - fTrace = TRUE; + gTrace = TRUE; } debugInitDone = TRUE; } @@ -311,16 +334,28 @@ RuleBasedBreakIterator::operator==(const BreakIterator& that) const { if (typeid(*this) != typeid(that)) { return FALSE; } + if (this == &that) { + return TRUE; + } + + // The base class BreakIterator carries no state that participates in equality, + // and does not implement an equality function that would otherwise be + // checked at this point. const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that; if (!utext_equals(fText, that2.fText)) { // The two break iterators are operating on different text, - // or have a different interation position. + // or have a different iteration position. + // Note that fText's position is always the same as the break iterator's position. return FALSE; }; - // TODO: need a check for when in a dictionary region at different offsets. + if (!(fPosition == that2.fPosition && + fRuleStatusIndex == that2.fRuleStatusIndex && + fDone == that2.fDone)) { + return FALSE; + } if (that2.fData == fData || (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) { @@ -348,7 +383,8 @@ void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { if (U_FAILURE(status)) { return; } - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); fText = utext_clone(fText, ut, FALSE, TRUE, &status); // Set up a dummy CharacterIterator to be returned if anyone @@ -382,27 +418,6 @@ UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const } - -/** - * Returns the description used to create this iterator - */ -const UnicodeString& -RuleBasedBreakIterator::getRules() const { - if (fData != NULL) { - return fData->getRuleSourceString(); - } else { - static const UnicodeString *s; - if (s == NULL) { - // TODO: something more elegant here. - // perhaps API should return the string by value. - // Note: thread unsafe init & leak are semi-ok, better than - // what was before. Sould be cleaned up, though. - s = new UnicodeString; - } - return *s; - } -} - //======================================================================= // BreakIterator overrides //======================================================================= @@ -430,7 +445,8 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { fCharIter = newText; UErrorCode status = U_ZERO_ERROR; - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); 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. @@ -449,7 +465,8 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { void RuleBasedBreakIterator::setText(const UnicodeString& newText) { UErrorCode status = U_ZERO_ERROR; - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); fText = utext_openConstUnicodeString(fText, &newText, &status); // Set up a character iterator on the string. @@ -509,13 +526,12 @@ RuleBasedBreakIterator &RuleBasedBreakIterator::refreshInputText(UText *input, U * @return The new iterator position, which is zero. */ int32_t RuleBasedBreakIterator::first(void) { - reset(); - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - //if (fText == NULL) - // return BreakIterator::DONE; - - utext_setNativeIndex(fText, 0); + UErrorCode status = U_ZERO_ERROR; + if (!fBreakCache->seek(0)) { + fBreakCache->populateNear(0, status); + } + fBreakCache->current(); + U_ASSERT(fPosition == 0); return 0; } @@ -524,17 +540,12 @@ int32_t RuleBasedBreakIterator::first(void) { * @return The text's past-the-end offset. */ int32_t RuleBasedBreakIterator::last(void) { - reset(); - if (fText == NULL) { - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - return BreakIterator::DONE; - } - - fLastStatusIndexValid = FALSE; - int32_t pos = (int32_t)utext_nativeLength(fText); - utext_setNativeIndex(fText, pos); - return pos; + int32_t endPos = (int32_t)utext_nativeLength(fText); + UBool endShouldBeBoundary = isBoundary(endPos); // Has side effect of setting iterator position. + (void)endShouldBeBoundary; + U_ASSERT(endShouldBeBoundary); + U_ASSERT(fPosition == endPos); + return endPos; } /** @@ -547,14 +558,17 @@ int32_t RuleBasedBreakIterator::last(void) { * the current one. */ int32_t RuleBasedBreakIterator::next(int32_t n) { - int32_t result = current(); - while (n > 0) { - result = next(); - --n; - } - while (n < 0) { - result = previous(); - ++n; + int32_t result = 0; + if (n > 0) { + for (; n > 0 && result != UBRK_DONE; --n) { + result = next(); + } + } else if (n < 0) { + for (; n < 0 && result != UBRK_DONE; ++n) { + result = previous(); + } + } else { + result = current(); } return result; } @@ -564,396 +578,120 @@ int32_t RuleBasedBreakIterator::next(int32_t n) { * @return The position of the first boundary after this one. */ int32_t RuleBasedBreakIterator::next(void) { - // 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(); - fDictionaryCharCount = 0; - int32_t result = handleNext(fData->fForwardTable); - if (fDictionaryCharCount > 0) { - result = checkDictionary(startPos, result, FALSE); - } - return result; + fBreakCache->next(); + return fDone ? UBRK_DONE : fPosition; } /** - * Advances the iterator backwards, to the last boundary preceding this one. - * @return The position of the last boundary position preceding this one. + * Move the iterator backwards, to the boundary preceding the current one. + * + * Starts from the current position within fText. + * Starting position need not be on a boundary. + * + * @return The position of the boundary position immediately preceding the starting position. */ 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; - // If we're at the beginning of the cache, need to reevaluate the - // rule status - if (fPositionInCache <= 0) { - fLastStatusIndexValid = FALSE; - } - 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 || (startPos = current()) == 0) { - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - return BreakIterator::DONE; - } - - if (fData->fSafeRevTable != NULL || fData->fSafeFwdTable != NULL) { - result = handlePrevious(fData->fReverseTable); - if (fDictionaryCharCount > 0) { - result = checkDictionary(result, startPos, TRUE); - } - return result; - } - - // old rule syntax - // set things up. handlePrevious() will back us up to some valid - // 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(); - - (void)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; - - // iterate forward from the known break position until we pass our - // starting point. The last break position before the starting - // point is our return value - - for (;;) { - result = next(); - if (result == BreakIterator::DONE || result >= start) { - break; - } - lastResult = result; - lastTag = fLastRuleStatusIndex; - breakTagValid = TRUE; - } - - // 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 - // 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 position, - // 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. - 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; + UErrorCode status = U_ZERO_ERROR; + fBreakCache->previous(status); + return fDone ? UBRK_DONE : fPosition; } /** * Sets the iterator to refer to the first boundary position following * the specified position. - * @offset The position from which to begin searching for a break position. + * @param startPos The position from which to begin searching for a break position. * @return The position of the first break after the current position. */ -int32_t RuleBasedBreakIterator::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 +int32_t RuleBasedBreakIterator::following(int32_t startPos) { + // if the supplied position is before the beginning, return the // text's starting offset - if (fText == NULL || offset >= utext_nativeLength(fText)) { - last(); - return next(); - } - else if (offset < 0) { + if (startPos < 0) { return first(); } // Move requested offset to a code point start. It might be on a trail surrogate, - // or on a trail byte if the input is UTF-8. - utext_setNativeIndex(fText, offset); - offset = (int32_t)utext_getNativeIndex(fText); - - // 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(); - } - } - - // Set our internal iteration position (temporarily) - // to the position passed in. If this is the _beginning_ position, - // then we can just use next() to get our return value - - int32_t result = 0; + // or on a trail byte if the input is UTF-8. Or it may be beyond the end of the text. + utext_setNativeIndex(fText, startPos); + startPos = (int32_t)utext_getNativeIndex(fText); - if (fData->fSafeRevTable != NULL) { - // new rule syntax - 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 - // TODO: is this still needed, with move to code point boundary handled above? - (void)UTEXT_NEXT32(fText); - // handlePrevious will move most of the time to < 1 boundary away - handlePrevious(fData->fSafeRevTable); - int32_t result = next(); - while (result <= offset) { - result = next(); - } - return result; - } - if (fData->fSafeFwdTable != NULL) { - // backup plan if forward safe table is not available - utext_setNativeIndex(fText, offset); - (void)UTEXT_PREVIOUS32(fText); - // handle next will give result >= offset - handleNext(fData->fSafeFwdTable); - // previous will give result 0 or 1 boundary away from offset, - // most of the time - // we have to - int32_t oldresult = previous(); - while (oldresult > offset) { - int32_t result = previous(); - if (result <= offset) { - return oldresult; - } - oldresult = result; - } - int32_t result = next(); - if (result <= offset) { - return next(); - } - return result; - } - // otherwise, we have to sync up first. Use handlePrevious() to back - // 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 - // from here until we've passed the starting position. The position - // we stop on will be the first break position after the specified one. - // old rule syntax - - utext_setNativeIndex(fText, offset); - if (offset==0 || - (offset==1 && utext_getNativeIndex(fText)==0)) { - return next(); - } - result = previous(); - - while (result != BreakIterator::DONE && result <= offset) { - result = next(); - } - - return result; + UErrorCode status = U_ZERO_ERROR; + fBreakCache->following(startPos, status); + return fDone ? UBRK_DONE : fPosition; } /** * Sets the iterator to refer to the last boundary position before the * specified position. - * @offset The position to begin searching for a break from. + * @param offset The position to begin searching for a break from. * @return The position of the last boundary before the starting position. */ int32_t RuleBasedBreakIterator::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 > utext_nativeLength(fText)) { return last(); } - else if (offset < 0) { - return first(); - } // Move requested offset to a code point start. It might be on a trail surrogate, // or on a trail byte if the input is UTF-8. - utext_setNativeIndex(fText, offset); - offset = (int32_t)utext_getNativeIndex(fText); - - // 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; - // If we're at the beginning of the cache, need to reevaluate the - // rule status - if (fPositionInCache <= 0) { - fLastStatusIndexValid = FALSE; - } - utext_setNativeIndex(fText, fCachedBreakPositions[fPositionInCache]); - return fCachedBreakPositions[fPositionInCache]; - } - else { - reset(); - } - } - - // if we start by updating the current iteration position to the - // position specified by the caller, we can just use previous() - // to carry out this operation - - if (fData->fSafeFwdTable != NULL) { - // new rule syntax - 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. - (void)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, - // rather than adjusting the position unconditionally? - // (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. - (void)UTEXT_PREVIOUS32(fText); - handleNext(fData->fSafeFwdTable); - int32_t result = (int32_t)UTEXT_GETNATIVEINDEX(fText); - while (result >= offset) { - result = previous(); - } - return result; - } - if (fData->fSafeRevTable != NULL) { - // backup plan if forward safe table is not available - // 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); - (void)UTEXT_NEXT32(fText); - - // handle previous will give result <= offset - handlePrevious(fData->fSafeRevTable); - - // next will give result 0 or 1 boundary away from offset, - // most of the time - // we have to - int32_t oldresult = next(); - while (oldresult < offset) { - int32_t result = next(); - if (result >= offset) { - return oldresult; - } - oldresult = result; - } - int32_t result = previous(); - if (result >= offset) { - return previous(); - } - return result; - } - - // old rule syntax utext_setNativeIndex(fText, offset); - return previous(); + int32_t adjustedOffset = utext_getNativeIndex(fText); + + UErrorCode status = U_ZERO_ERROR; + fBreakCache->preceding(adjustedOffset, status); + return fDone ? UBRK_DONE : fPosition; } /** * Returns true if the specfied position is a boundary position. As a side * effect, leaves the iterator pointing to the first boundary position at * or after "offset". + * * @param offset the offset to check. * @return True if "offset" is a boundary position. */ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { - // the beginning index of the iterator is always a boundary position by definition - if (offset == 0) { - first(); // For side effects on current position, tag values. - return TRUE; - } - - 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 < 0) { first(); // For side effects on current position, tag values. return FALSE; } - if (offset > utext_nativeLength(fText)) { - last(); // For side effects on current position, tag values. - return FALSE; + // Adjust offset to be on a code point boundary and not beyond the end of the text. + // Note that isBoundary() is always be false for offsets that are not on code point boundaries. + // But we still need the side effect of leaving iteration at the following boundary. + + utext_setNativeIndex(fText, offset); + int32_t adjustedOffset = utext_getNativeIndex(fText); + + bool result = false; + UErrorCode status = U_ZERO_ERROR; + if (fBreakCache->seek(adjustedOffset) || fBreakCache->populateNear(adjustedOffset, status)) { + result = (fBreakCache->current() == 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 - utext_previous32From(fText, offset); - int32_t backOne = (int32_t)UTEXT_GETNATIVEINDEX(fText); - UBool result = following(backOne) == offset; + if (result && adjustedOffset < offset && utext_char32At(fText, offset) == U_SENTINEL) { + // Original offset is beyond the end of the text. Return FALSE, it's not a boundary, + // but the iteration position remains set to the end of the text, which is a boundary. + return FALSE; + } + if (!result) { + // Not on a boundary. isBoundary() must leave iterator on the following boundary. + // Cache->seek(), above, left us on the preceding boundary, so advance one. + next(); + } return result; } + /** * Returns the current iteration position. * @return The current iteration position. */ int32_t RuleBasedBreakIterator::current(void) const { - int32_t pos = (int32_t)UTEXT_GETNATIVEINDEX(fText); - return pos; + return fPosition; } + //======================================================================= // implementation //======================================================================= @@ -1020,15 +758,11 @@ struct LookAheadResults { //----------------------------------------------------------------------------------- // -// 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. +// handleNext() +// Run the state machine to find a boundary // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { +int32_t RuleBasedBreakIterator::handleNext() { int32_t state; uint16_t category = 0; RBBIRunMode mode; @@ -1038,25 +772,29 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { LookAheadResults lookAheadMatches; int32_t result = 0; int32_t initialPosition = 0; + const RBBIStateTable *statetable = fData->fForwardTable; const char *tableData = statetable->fTableData; uint32_t tableRowLen = statetable->fRowLen; - #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPuts("Handle Next pos char state category"); } #endif - // No matter what, handleNext alway correctly sets the break tag value. - fLastStatusIndexValid = TRUE; - fLastRuleStatusIndex = 0; + // handleNext alway sets the break tag value. + // Set the default for it. + fRuleStatusIndex = 0; + + fDictionaryCharCount = 0; // if we're already at the end of the text, return DONE. - initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText); + initialPosition = fPosition; + UTEXT_SETNATIVEINDEX(fText, initialPosition); result = initialPosition; c = UTEXT_NEXT32(fText); - if (fData == NULL || c==U_SENTINEL) { - return BreakIterator::DONE; + if (c==U_SENTINEL) { + fDone = TRUE; + return UBRK_DONE; } // Set the initial state for the state machine @@ -1100,10 +838,10 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // 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); + category = UTRIE2_GET16(fData->fTrie, c); // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators (subclasses). + // Counter is only used by dictionary based iteration. // Chars that need to be handled by a dictionary have a flag bit set // in their category values. // @@ -1115,7 +853,7 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { } #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf(" %4ld ", utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); @@ -1144,7 +882,7 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { if (mode != RBBI_START) { result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } - fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. + fRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. } int16_t completedRule = row->fAccepting; @@ -1152,8 +890,8 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // Lookahead match is completed. int32_t lookaheadResult = lookAheadMatches.getPosition(completedRule); if (lookaheadResult >= 0) { - fLastRuleStatusIndex = row->fTagIdx; - UTEXT_SETNATIVEINDEX(fText, lookaheadResult); + fRuleStatusIndex = row->fTagIdx; + fPosition = lookaheadResult; return lookaheadResult; } } @@ -1182,8 +920,6 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { mode = RBBI_RUN; } } - - } // The state machine is done. Check whether it found a match... @@ -1192,15 +928,16 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // (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_NEXT32(fText); - result = (int32_t)UTEXT_GETNATIVEINDEX(fText); + utext_setNativeIndex(fText, initialPosition); + utext_next32(fText); + result = (int32_t)utext_getNativeIndex(fText); + fRuleStatusIndex = 0; } // Leave the iterator at our result position. - UTEXT_SETNATIVEINDEX(fText, result); + fPosition = result; #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); } #endif @@ -1213,13 +950,11 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // // handlePrevious() // -// Iterate backwards, according to the logic of the reverse rules. -// This version handles the exact style backwards rules. -// +// Iterate backwards using the safe reverse rules. // The logic of this function is very similar to handleNext(), above. // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) { +int32_t RuleBasedBreakIterator::handlePrevious(int32_t fromPosition) { int32_t state; uint16_t category = 0; RBBIRunMode mode; @@ -1229,19 +964,14 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) int32_t result = 0; int32_t initialPosition = 0; + const RBBIStateTable *stateTable = fData->fSafeRevTable; + UTEXT_SETNATIVEINDEX(fText, fromPosition); #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { 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; - fLastRuleStatusIndex = 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; @@ -1255,10 +985,10 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // Set the initial state for the state machine state = START_STATE; row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + (stateTable->fTableData + (stateTable->fRowLen * state)); category = 3; mode = RBBI_RUN; - if (statetable->fFlags & RBBI_BOF_REQUIRED) { + if (stateTable->fFlags & RBBI_BOF_REQUIRED) { category = 2; mode = RBBI_START; } @@ -1273,12 +1003,6 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // 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 (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); - (void)UTEXT_PREVIOUS32(fText); // TODO: shouldn't be necessary. We're already at beginning. Check. - } break; } // Run the loop one last time with the fake end-of-input character category. @@ -1297,22 +1021,13 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // 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; - } + // And off the dictionary flag bit. For reverse iteration it is not used. + category = UTRIE2_GET16(fData->fTrie, c); + category &= ~0x4000; } #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf(" %4d ", (int32_t)utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); @@ -1332,7 +1047,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) U_ASSERT(categoryfHeader->fCatCount); state = row->fNextState[category]; /*Not accessing beyond memory*/ row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + (stateTable->fTableData + (stateTable->fRowLen * state)); if (row->fAccepting == -1) { // Match found, common case. @@ -1386,10 +1101,8 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } - // Leave the iterator at our result position. - UTEXT_SETNATIVEINDEX(fText, result); #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); } #endif @@ -1397,20 +1110,6 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) } -void -RuleBasedBreakIterator::reset() -{ - if (fCachedBreakPositions) { - uprv_free(fCachedBreakPositions); - } - fCachedBreakPositions = NULL; - fNumCachedBreakPositions = 0; - fDictionaryCharCount = 0; - fPositionInCache = 0; -} - - - //------------------------------------------------------------------------------- // // getRuleStatus() Return the break rule tag associated with the current @@ -1418,64 +1117,27 @@ RuleBasedBreakIterator::reset() // position by iterating forwards, the value will have been // cached by the handleNext() function. // -// If no cached status value is available, the status is -// found by doing a previous() followed by a next(), which -// leaves the iterator where it started, and computes the -// status while doing the next(). -// //------------------------------------------------------------------------------- -void RuleBasedBreakIterator::makeRuleStatusValid() { - if (fLastStatusIndexValid == FALSE) { - // No cached status is available. - if (fText == NULL || current() == 0) { - // At start of text, or there is no text. Status is always zero. - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - } else { - // 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 - // unused local variables on gcc. Logically, it isn't needed. - U_ASSERT(pa == pb); - } - } - } - U_ASSERT(fLastRuleStatusIndex >= 0 && fLastRuleStatusIndex < fData->fStatusMaxIdx); -} - int32_t RuleBasedBreakIterator::getRuleStatus() const { - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - nonConstThis->makeRuleStatusValid(); // fLastRuleStatusIndex indexes to the start of the appropriate status record // (the number of status values.) // This function returns the last (largest) of the array of status values. - int32_t idx = fLastRuleStatusIndex + fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t idx = fRuleStatusIndex + fData->fRuleStatusTable[fRuleStatusIndex]; int32_t tagVal = fData->fRuleStatusTable[idx]; return tagVal; } - - int32_t RuleBasedBreakIterator::getRuleStatusVec( - int32_t *fillInVec, int32_t capacity, UErrorCode &status) -{ + int32_t *fillInVec, int32_t capacity, UErrorCode &status) { if (U_FAILURE(status)) { return 0; } - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - nonConstThis->makeRuleStatusValid(); - int32_t numVals = fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t numVals = fData->fRuleStatusTable[fRuleStatusIndex]; int32_t numValsToCopy = numVals; if (numVals > capacity) { status = U_BUFFER_OVERFLOW_ERROR; @@ -1483,7 +1145,7 @@ int32_t RuleBasedBreakIterator::getRuleStatusVec( } int i; for (i=0; ifRuleStatusTable[fLastRuleStatusIndex + i + 1]; + fillInVec[i] = fData->fRuleStatusTable[fRuleStatusIndex + i + 1]; } return numVals; } @@ -1531,205 +1193,25 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void * /*stackBuffer* return (RuleBasedBreakIterator *)clonedBI; } - -//------------------------------------------------------------------------------- -// -// isDictionaryChar Return true if the category lookup for this char -// indicates that it is in the set of dictionary lookup -// chars. -// -// This function is intended for use by dictionary based -// break iterators. -// -//------------------------------------------------------------------------------- -/*UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) { - if (fData == NULL) { - return FALSE; - } - uint16_t category; - UTRIE_GET16(&fData->fTrie, c, category); - return (category & 0x4000) != 0; -}*/ - - -//------------------------------------------------------------------------------- -// -// 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. - reset(); - - // note: code segment below assumes that dictionary chars are in the - // startPos-endPos range - // value returned should be next character in sequence - if ((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; - - uint16_t category; - int32_t current; - UErrorCode status = U_ZERO_ERROR; - UStack breaks(status); - int32_t foundBreakCount = 0; - UChar32 c = utext_current32(fText); - - UTRIE_GET16(&fData->fTrie, c, category); - - // 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. - // Note: we always do this in the forward direction, so that the break - // cache is built in the right order. - if (reverse) { - utext_setNativeIndex(fText, rangeStart); - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - while(U_SUCCESS(status)) { - 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, FALSE, 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) { - U_ASSERT(foundBreakCount == breaks.size()); - 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); - } - else { - return following(startPos); - } - } - // If the allocation failed, just fall through to the "no breaks found" case. - } - - // If we get here, there were no language-based breaks. Set the text pointer - // to the original proposed break. - utext_setNativeIndex(fText, reverse ? startPos : endPos); - return (reverse ? startPos : endPos); -} - U_NAMESPACE_END -static icu::UStack *gLanguageBreakFactories = NULL; +static icu::UStack *gLanguageBreakFactories = nullptr; +static const icu::UnicodeString *gEmptyString = nullptr; static icu::UInitOnce gLanguageBreakFactoriesInitOnce = U_INITONCE_INITIALIZER; +static icu::UInitOnce gRBBIInitOnce = U_INITONCE_INITIALIZER; /** * Release all static memory held by breakiterator. */ U_CDECL_BEGIN -static UBool U_CALLCONV breakiterator_cleanup_dict(void) { - if (gLanguageBreakFactories) { - delete gLanguageBreakFactories; - gLanguageBreakFactories = NULL; - } +static UBool U_CALLCONV rbbi_cleanup(void) { + delete gLanguageBreakFactories; + gLanguageBreakFactories = nullptr; + delete gEmptyString; + gEmptyString = nullptr; gLanguageBreakFactoriesInitOnce.reset(); + gRBBIInitOnce.reset(); return TRUE; } U_CDECL_END @@ -1741,6 +1223,11 @@ static void U_CALLCONV _deleteFactory(void *obj) { U_CDECL_END U_NAMESPACE_BEGIN +static void U_CALLCONV rbbiInit() { + gEmptyString = new UnicodeString(); + ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup); +} + static void U_CALLCONV initLanguageFactories() { UErrorCode status = U_ZERO_ERROR; U_ASSERT(gLanguageBreakFactories == NULL); @@ -1755,7 +1242,7 @@ static void U_CALLCONV initLanguageFactories() { } #endif } - ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR_DICT, breakiterator_cleanup_dict); + ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup); } @@ -1853,7 +1340,24 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { void RuleBasedBreakIterator::setBreakType(int32_t type) { fBreakType = type; - reset(); +} + +void RuleBasedBreakIterator::dumpCache() { + fBreakCache->dumpCache(); +} + +/** + * Returns the description used to create this iterator + */ + +const UnicodeString& +RuleBasedBreakIterator::getRules() const { + if (fData != NULL) { + return fData->getRuleSourceString(); + } else { + umtx_initOnce(gRBBIInitOnce, &rbbiInit); + return *gEmptyString; + } } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp new file mode 100644 index 00000000000000..9d716bb34274c4 --- /dev/null +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -0,0 +1,630 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// file: rbbi_cache.cpp + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/ubrk.h" +#include "unicode/rbbi.h" + +#include "rbbi_cache.h" + +#include "brkeng.h" +#include "cmemory.h" +#include "rbbidata.h" +#include "rbbirb.h" +#include "uassert.h" +#include "uvectr32.h" + +U_NAMESPACE_BEGIN + +/* + * DictionaryCache implementation + */ + +RuleBasedBreakIterator::DictionaryCache::DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status) : + fBI(bi), fBreaks(NULL), fPositionInCache(-1), + fStart(0), fLimit(0), fFirstRuleStatusIndex(0), fOtherRuleStatusIndex(0) { + fBreaks = new UVector32(status); +} + +RuleBasedBreakIterator::DictionaryCache::~DictionaryCache() { + delete fBreaks; + fBreaks = NULL; +} + +void RuleBasedBreakIterator::DictionaryCache::reset() { + fPositionInCache = -1; + fStart = 0; + fLimit = 0; + fFirstRuleStatusIndex = 0; + fOtherRuleStatusIndex = 0; + fBreaks->removeAllElements(); +} + +UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_t *result, int32_t *statusIndex) { + if (fromPos >= fLimit || fromPos < fStart) { + fPositionInCache = -1; + return FALSE; + } + + // Sequential iteration, move from previous boundary to the following + + int32_t r = 0; + if (fPositionInCache >= 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) { + ++fPositionInCache; + if (fPositionInCache >= fBreaks->size()) { + fPositionInCache = -1; + return FALSE; + } + r = fBreaks->elementAti(fPositionInCache); + U_ASSERT(r > fromPos); + *result = r; + *statusIndex = fOtherRuleStatusIndex; + return TRUE; + } + + // Random indexing. Linear search for the boundary following the given position. + + for (fPositionInCache = 0; fPositionInCache < fBreaks->size(); ++fPositionInCache) { + r= fBreaks->elementAti(fPositionInCache); + if (r > fromPos) { + *result = r; + *statusIndex = fOtherRuleStatusIndex; + return TRUE; + } + } + U_ASSERT(FALSE); + fPositionInCache = -1; + return FALSE; +} + + +UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_t *result, int32_t *statusIndex) { + if (fromPos <= fStart || fromPos > fLimit) { + fPositionInCache = -1; + return FALSE; + } + + if (fromPos == fLimit) { + fPositionInCache = fBreaks->size() - 1; + if (fPositionInCache >= 0) { + U_ASSERT(fBreaks->elementAti(fPositionInCache) == fromPos); + } + } + + int32_t r; + if (fPositionInCache > 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) { + --fPositionInCache; + r = fBreaks->elementAti(fPositionInCache); + U_ASSERT(r < fromPos); + *result = r; + *statusIndex = ( r== fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + return TRUE; + } + + if (fPositionInCache == 0) { + fPositionInCache = -1; + return FALSE; + } + + for (fPositionInCache = fBreaks->size()-1; fPositionInCache >= 0; --fPositionInCache) { + r = fBreaks->elementAti(fPositionInCache); + if (r < fromPos) { + *result = r; + *statusIndex = ( r == fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + return TRUE; + } + } + U_ASSERT(FALSE); + fPositionInCache = -1; + return FALSE; +} + +void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPos, int32_t endPos, + int32_t firstRuleStatus, int32_t otherRuleStatus) { + if ((endPos - startPos) <= 1) { + return; + } + + reset(); + fFirstRuleStatusIndex = firstRuleStatus; + fOtherRuleStatusIndex = otherRuleStatus; + + int32_t rangeStart = startPos; + int32_t rangeEnd = endPos; + + uint16_t category; + int32_t current; + UErrorCode status = U_ZERO_ERROR; + int32_t foundBreakCount = 0; + UText *text = fBI->fText; + + // 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. + + utext_setNativeIndex(text, rangeStart); + UChar32 c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + + while(U_SUCCESS(status)) { + while((current = (int32_t)UTEXT_GETNATIVEINDEX(text)) < rangeEnd && (category & 0x4000) == 0) { + utext_next32(text); // TODO: cleaner loop structure. + c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + } + if (current >= rangeEnd) { + break; + } + + // We now have a dictionary character. Get the appropriate language object + // to deal with it. + const LanguageBreakEngine *lbe = fBI->getLanguageBreakEngine(c); + + // Ask the language object if there are any breaks. It will add them to the cache and + // leave the text pointer on the other side of its range, ready to search for the next one. + if (lbe != NULL) { + foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBI->fBreakType, *fBreaks); + } + + // Reload the loop variables for the next go-round + c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + } + + // If we found breaks, ensure that the first and last entries are + // the original starting and ending position. And initialize the + // cache iteration position to the first entry. + + // printf("foundBreakCount = %d\n", foundBreakCount); + if (foundBreakCount > 0) { + U_ASSERT(foundBreakCount == fBreaks->size()); + if (startPos < fBreaks->elementAti(0)) { + // The dictionary did not place a boundary at the start of the segment of text. + // Add one now. This should not commonly happen, but it would be easy for interactions + // of the rules for dictionary segments and the break engine implementations to + // inadvertently cause it. Cover it here, just in case. + fBreaks->insertElementAt(startPos, 0, status); + } + if (endPos > fBreaks->peeki()) { + fBreaks->push(endPos, status); + } + fPositionInCache = 0; + // Note: Dictionary matching may extend beyond the original limit. + fStart = fBreaks->elementAti(0); + fLimit = fBreaks->peeki(); + } else { + // there were no language-based breaks, even though the segment contained + // dictionary characters. Subsequent attempts to fetch boundaries from the dictionary cache + // for this range will fail, and the calling code will fall back to the rule based boundaries. + } +} + + +/* + * BreakCache implemetation + */ + +RuleBasedBreakIterator::BreakCache::BreakCache(RuleBasedBreakIterator *bi, UErrorCode &status) : + fBI(bi), fSideBuffer(status) { + reset(); +} + + +RuleBasedBreakIterator::BreakCache::~BreakCache() { +} + + +void RuleBasedBreakIterator::BreakCache::reset(int32_t pos, int32_t ruleStatus) { + fStartBufIdx = 0; + fEndBufIdx = 0; + fTextIdx = pos; + fBufIdx = 0; + fBoundaries[0] = pos; + fStatuses[0] = (uint16_t)ruleStatus; +} + + +int32_t RuleBasedBreakIterator::BreakCache::current() { + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + fBI->fDone = FALSE; + return fTextIdx; +} + + +void RuleBasedBreakIterator::BreakCache::following(int32_t startPos, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (startPos == fTextIdx || seek(startPos) || populateNear(startPos, status)) { + // startPos is in the cache. Do a next() from that position. + // TODO: an awkward set of interactions with bi->fDone + // seek() does not clear it; it can't because of interactions with populateNear(). + // next() does not clear it in the fast-path case, where everything matters. Maybe it should. + // So clear it here, for the case where seek() succeeded on an iterator that had previously run off the end. + fBI->fDone = false; + next(); + } + return; +} + + +void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (startPos == fTextIdx || seek(startPos) || populateNear(startPos, status)) { + if (startPos == fTextIdx) { + previous(status); + } else { + // seek() leaves the BreakCache positioned at the preceding boundary + // if the requested position is between two bounaries. + // current() pushes the BreakCache position out to the BreakIterator itself. + U_ASSERT(startPos > fTextIdx); + current(); + } + } + return; +} + + +/* + * Out-of-line code for BreakCache::next(). + * Cache does not already contain the boundary + */ +void RuleBasedBreakIterator::BreakCache::nextOL() { + fBI->fDone = !populateFollowing(); + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + return; +} + + +void RuleBasedBreakIterator::BreakCache::previous(UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + int32_t initialBufIdx = fBufIdx; + if (fBufIdx == fStartBufIdx) { + // At start of cache. Prepend to it. + populatePreceding(status); + } else { + // Cache already holds the next boundary + fBufIdx = modChunkSize(fBufIdx - 1); + fTextIdx = fBoundaries[fBufIdx]; + } + fBI->fDone = (fBufIdx == initialBufIdx); + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + return; +} + + +UBool RuleBasedBreakIterator::BreakCache::seek(int32_t pos) { + if (pos < fBoundaries[fStartBufIdx] || pos > fBoundaries[fEndBufIdx]) { + return FALSE; + } + if (pos == fBoundaries[fStartBufIdx]) { + // Common case: seek(0), from BreakIterator::first() + fBufIdx = fStartBufIdx; + fTextIdx = fBoundaries[fBufIdx]; + return TRUE; + } + if (pos == fBoundaries[fEndBufIdx]) { + fBufIdx = fEndBufIdx; + fTextIdx = fBoundaries[fBufIdx]; + return TRUE; + } + + int32_t min = fStartBufIdx; + int32_t max = fEndBufIdx; + while (min != max) { + int32_t probe = (min + max + (min>max ? CACHE_SIZE : 0)) / 2; + probe = modChunkSize(probe); + if (fBoundaries[probe] > pos) { + max = probe; + } else { + min = modChunkSize(probe + 1); + } + } + U_ASSERT(fBoundaries[max] > pos); + fBufIdx = modChunkSize(max - 1); + fTextIdx = fBoundaries[fBufIdx]; + U_ASSERT(fTextIdx <= pos); + return TRUE; +} + + +UBool RuleBasedBreakIterator::BreakCache::populateNear(int32_t position, UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + U_ASSERT(position < fBoundaries[fStartBufIdx] || position > fBoundaries[fEndBufIdx]); + + // Find a boundary somewhere in the vicinity of the requested position. + // Depending on the safe rules and the text data, it could be either before, at, or after + // the requested position. + + + // If the requested position is not near already cached positions, clear the existing cache, + // find a near-by boundary and begin new cache contents there. + + if ((position < fBoundaries[fStartBufIdx] - 15) || position > (fBoundaries[fEndBufIdx] + 15)) { + int32_t aBoundary = 0; + int32_t ruleStatusIndex = 0; + // TODO: check for position == length of text. Although may still need to back up to get rule status. + if (position > 20) { + int32_t backupPos = fBI->handlePrevious(position); + fBI->fPosition = backupPos; + aBoundary = fBI->handleNext(); // Ignore dictionary, just finding a rule based boundary. + ruleStatusIndex = fBI->fRuleStatusIndex; + } + reset(aBoundary, ruleStatusIndex); // Reset cache to hold aBoundary as a single starting point. + } + + // Fill in boundaries between existing cache content and the new requested position. + + if (fBoundaries[fEndBufIdx] < position) { + // The last position in the cache precedes the requested position. + // Add following position(s) to the cache. + while (fBoundaries[fEndBufIdx] < position) { + if (!populateFollowing()) { + U_ASSERT(false); + return false; + } + } + fBufIdx = fEndBufIdx; // Set iterator position to the end of the buffer. + fTextIdx = fBoundaries[fBufIdx]; // Required because populateFollowing may add extra boundaries. + while (fTextIdx > position) { // Move backwards to a position at or preceding the requested pos. + previous(status); + } + return true; + } + + if (fBoundaries[fStartBufIdx] > position) { + // The first position in the cache is beyond the requested position. + // back up more until we get a boundary <= the requested position. + while (fBoundaries[fStartBufIdx] > position) { + populatePreceding(status); + } + fBufIdx = fStartBufIdx; // Set iterator position to the start of the buffer. + fTextIdx = fBoundaries[fBufIdx]; // Required because populatePreceding may add extra boundaries. + while (fTextIdx < position) { // Move forwards to a position at or following the requested pos. + next(); + } + if (fTextIdx > position) { + // If position is not itself a boundary, the next() loop above will overshoot. + // Back up one, leaving cache position at the boundary preceding the requested position. + previous(status); + } + return true; + } + + U_ASSERT(fTextIdx == position); + return true; +} + + + +UBool RuleBasedBreakIterator::BreakCache::populateFollowing() { + int32_t fromPosition = fBoundaries[fEndBufIdx]; + int32_t fromRuleStatusIdx = fStatuses[fEndBufIdx]; + int32_t pos = 0; + int32_t ruleStatusIdx = 0; + + if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) { + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + return TRUE; + } + + fBI->fPosition = fromPosition; + pos = fBI->handleNext(); + if (pos == UBRK_DONE) { + return FALSE; + } + + ruleStatusIdx = fBI->fRuleStatusIndex; + if (fBI->fDictionaryCharCount > 0) { + // The text segment obtained from the rules includes dictionary characters. + // Subdivide it, with subdivided results going into the dictionary cache. + fBI->fDictionaryCache->populateDictionary(fromPosition, pos, fromRuleStatusIdx, ruleStatusIdx); + if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) { + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + return TRUE; + // TODO: may want to move a sizable chunk of dictionary cache to break cache at this point. + // But be careful with interactions with populateNear(). + } + } + + // Rule based segment did not include dictionary characters. + // Or, it did contain dictionary chars, but the dictionary segmenter didn't handle them, + // meaning that we didn't take the return, above. + // Add its end point to the cache. + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + + // Add several non-dictionary boundaries at this point, to optimize straight forward iteration. + // (subsequent calls to BreakIterator::next() will take the fast path, getting cached results. + // + for (int count=0; count<6; ++count) { + pos = fBI->handleNext(); + if (pos == UBRK_DONE || fBI->fDictionaryCharCount > 0) { + break; + } + addFollowing(pos, fBI->fRuleStatusIndex, RetainCachePosition); + } + + return TRUE; +} + + +UBool RuleBasedBreakIterator::BreakCache::populatePreceding(UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + + int32_t fromPosition = fBoundaries[fStartBufIdx]; + if (fromPosition == 0) { + return FALSE; + } + + int32_t position = 0; + int32_t positionStatusIdx = 0; + + if (fBI->fDictionaryCache->preceding(fromPosition, &position, &positionStatusIdx)) { + addPreceding(position, positionStatusIdx, UpdateCachePosition); + return TRUE; + } + + int32_t backupPosition = fromPosition; + + // Find a boundary somewhere preceding the first already-cached boundary + do { + backupPosition = backupPosition - 30; + if (backupPosition <= 0) { + backupPosition = 0; + } else { + backupPosition = fBI->handlePrevious(backupPosition); + } + if (backupPosition == UBRK_DONE || backupPosition == 0) { + position = 0; + positionStatusIdx = 0; + } else { + fBI->fPosition = backupPosition; // TODO: pass starting position in a clearer way. + position = fBI->handleNext(); + positionStatusIdx = fBI->fRuleStatusIndex; + + } + } while (position >= fromPosition); + + // Find boundaries between the one we just located and the first already-cached boundary + // Put them in a side buffer, because we don't yet know where they will fall in the circular cache buffer.. + + fSideBuffer.removeAllElements(); + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + + do { + int32_t prevPosition = fBI->fPosition = position; + int32_t prevStatusIdx = positionStatusIdx; + position = fBI->handleNext(); + positionStatusIdx = fBI->fRuleStatusIndex; + if (position == UBRK_DONE) { + break; + } + + UBool segmentHandledByDictionary = FALSE; + if (fBI->fDictionaryCharCount != 0) { + // Segment from the rules includes dictionary characters. + // Subdivide it, with subdivided results going into the dictionary cache. + int32_t dictSegEndPosition = position; + fBI->fDictionaryCache->populateDictionary(prevPosition, dictSegEndPosition, prevStatusIdx, positionStatusIdx); + while (fBI->fDictionaryCache->following(prevPosition, &position, &positionStatusIdx)) { + segmentHandledByDictionary = true; + U_ASSERT(position > prevPosition); + if (position >= fromPosition) { + break; + } + U_ASSERT(position <= dictSegEndPosition); + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + prevPosition = position; + } + U_ASSERT(position==dictSegEndPosition || position>=fromPosition); + } + + if (!segmentHandledByDictionary && position < fromPosition) { + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + } + } while (position < fromPosition); + + // Move boundaries from the side buffer to the main circular buffer. + UBool success = FALSE; + if (!fSideBuffer.isEmpty()) { + positionStatusIdx = fSideBuffer.popi(); + position = fSideBuffer.popi(); + addPreceding(position, positionStatusIdx, UpdateCachePosition); + success = TRUE; + } + + while (!fSideBuffer.isEmpty()) { + positionStatusIdx = fSideBuffer.popi(); + position = fSideBuffer.popi(); + if (!addPreceding(position, positionStatusIdx, RetainCachePosition)) { + // No space in circular buffer to hold a new preceding result while + // also retaining the current cache (iteration) position. + // Bailing out is safe; the cache will refill again if needed. + break; + } + } + + return success; +} + + +void RuleBasedBreakIterator::BreakCache::addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) { + U_ASSERT(position > fBoundaries[fEndBufIdx]); + U_ASSERT(ruleStatusIdx <= UINT16_MAX); + int32_t nextIdx = modChunkSize(fEndBufIdx + 1); + if (nextIdx == fStartBufIdx) { + fStartBufIdx = modChunkSize(fStartBufIdx + 6); // TODO: experiment. Probably revert to 1. + } + fBoundaries[nextIdx] = position; + fStatuses[nextIdx] = ruleStatusIdx; + fEndBufIdx = nextIdx; + if (update == UpdateCachePosition) { + // Set current position to the newly added boundary. + fBufIdx = nextIdx; + fTextIdx = position; + } else { + // Retaining the original cache position. + // Check if the added boundary wraps around the buffer, and would over-write the original position. + // It's the responsibility of callers of this function to not add too many. + U_ASSERT(nextIdx != fBufIdx); + } +} + +bool RuleBasedBreakIterator::BreakCache::addPreceding(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) { + U_ASSERT(position < fBoundaries[fStartBufIdx]); + U_ASSERT(ruleStatusIdx <= UINT16_MAX); + int32_t nextIdx = modChunkSize(fStartBufIdx - 1); + if (nextIdx == fEndBufIdx) { + if (fBufIdx == fEndBufIdx && update == RetainCachePosition) { + // Failure. The insertion of the new boundary would claim the buffer position that is the + // current iteration position. And we also want to retain the current iteration position. + // (The buffer is already completely full of entries that precede the iteration position.) + return false; + } + fEndBufIdx = modChunkSize(fEndBufIdx - 1); + } + fBoundaries[nextIdx] = position; + fStatuses[nextIdx] = ruleStatusIdx; + fStartBufIdx = nextIdx; + if (update == UpdateCachePosition) { + fBufIdx = nextIdx; + fTextIdx = position; + } + return true; +} + + +void RuleBasedBreakIterator::BreakCache::dumpCache() { +#ifdef RBBI_DEBUG + RBBIDebugPrintf("fTextIdx:%d fBufIdx:%d\n", fTextIdx, fBufIdx); + for (int32_t i=fStartBufIdx; ; i=modChunkSize(i+1)) { + RBBIDebugPrintf("%d %d\n", i, fBoundaries[i]); + if (i == fEndBufIdx) { + break; + } + } +#endif +} + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_BREAK_ITERATION diff --git a/deps/icu-small/source/common/rbbi_cache.h b/deps/icu-small/source/common/rbbi_cache.h new file mode 100644 index 00000000000000..b8a18d81deb1d9 --- /dev/null +++ b/deps/icu-small/source/common/rbbi_cache.h @@ -0,0 +1,203 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// file: rbbi_cache.h +// +#ifndef RBBI_CACHE_H +#define RBBI_CACHE_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/rbbi.h" +#include "unicode/uobject.h" + +#include "uvectr32.h" + +U_NAMESPACE_BEGIN + +/* DictionaryCache stores the boundaries obtained from a run of dictionary characters. + * Dictionary boundaries are moved first to this cache, then from here + * to the main BreakCache, where they may inter-leave with non-dictionary + * boundaries. The public BreakIterator API always fetches directly + * from the main BreakCache, not from here. + * + * In common situations, the number of boundaries in a single dictionary run + * should be quite small, it will be terminated by punctuation, spaces, + * or any other non-dictionary characters. The main BreakCache may end + * up with boundaries from multiple dictionary based runs. + * + * The boundaries are stored in a simple ArrayList (vector), with the + * assumption that they will be accessed sequentially. + */ +class RuleBasedBreakIterator::DictionaryCache: public UMemory { + public: + DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status); + ~DictionaryCache(); + + void reset(); + + UBool following(int32_t fromPos, int32_t *pos, int32_t *statusIndex); + UBool preceding(int32_t fromPos, int32_t *pos, int32_t *statusIndex); + + /** + * Populate the cache with the dictionary based boundaries within a region of text. + * @param startPos The start position of a range of text + * @param endPos The end position of a range of text + * @param firstRuleStatus The rule status index that applies to the break at startPos + * @param otherRuleStatus The rule status index that applies to boundaries other than startPos + * @internal + */ + void populateDictionary(int32_t startPos, int32_t endPos, + int32_t firstRuleStatus, int32_t otherRuleStatus); + + + + RuleBasedBreakIterator *fBI; + + UVector32 *fBreaks; // A vector containing the boundaries. + int32_t fPositionInCache; // Index in fBreaks of last boundary returned by following() + // or preceding(). Optimizes sequential access. + int32_t fStart; // Text position of first boundary in cache. + int32_t fLimit; // Last boundary in cache. Which is the limit of the + // text segment being handled by the dictionary. + int32_t fFirstRuleStatusIndex; // Rule status info for first boundary. + int32_t fOtherRuleStatusIndex; // Rule status info for 2nd through last boundaries. +}; + + +/* + * class BreakCache + * + * Cache of break boundary positions and rule status values. + * Break iterator API functions, next(), previous(), etc., will use cached results + * when possible, and otherwise cache new results as they are obtained. + * + * Uniformly caches both dictionary and rule based (non-dictionary) boundaries. + * + * The cache is implemented as a single circular buffer. + */ + +/* + * size of the circular cache buffer. + */ + +class RuleBasedBreakIterator::BreakCache: public UMemory { + public: + BreakCache(RuleBasedBreakIterator *bi, UErrorCode &status); + virtual ~BreakCache(); + void reset(int32_t pos = 0, int32_t ruleStatus = 0); + void next() { if (fBufIdx == fEndBufIdx) { + nextOL(); + } else { + fBufIdx = modChunkSize(fBufIdx + 1); + fTextIdx = fBI->fPosition = fBoundaries[fBufIdx]; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + } + }; + + + void nextOL(); + void previous(UErrorCode &status); + + // Move the iteration state to the position following the startPosition. + // Input position must be pinned to the input length. + void following(int32_t startPosition, UErrorCode &status); + + void preceding(int32_t startPosition, UErrorCode &status); + + /* + * Update the state of the public BreakIterator (fBI) to reflect the + * current state of the break iterator cache (this). + */ + int32_t current(); + + /** + * Add boundaries to the cache near the specified position. + * The given position need not be a boundary itself. + * The input position must be within the range of the text, and + * on a code point boundary. + * If the requested position is a break boundary, leave the iteration + * position on it. + * If the requested position is not a boundary, leave the iteration + * position on the preceding boundary and include both the the + * preceding and following boundaries in the cache. + * Additional boundaries, either preceding or following, may be added + * to the cache as a side effect. + * + * Return FALSE if the operation failed. + */ + UBool populateNear(int32_t position, UErrorCode &status); + + /** + * Add boundary(s) to the cache following the current last boundary. + * Return FALSE if at the end of the text, and no more boundaries can be added. + * Leave iteration position at the first newly added boundary, or unchanged if no boundary was added. + */ + UBool populateFollowing(); + + /** + * Add one or more boundaries to the cache preceding the first currently cached boundary. + * Leave the iteration position on the first added boundary. + * Return false if no boundaries could be added (if at the start of the text.) + */ + UBool populatePreceding(UErrorCode &status); + + enum UpdatePositionValues { + RetainCachePosition = 0, + UpdateCachePosition = 1 + }; + + /* + * Add the boundary following the current position. + * The current position can be left as it was, or changed to the newly added boundary, + * as specified by the update parameter. + */ + void addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update); + + + /* + * Add the boundary preceding the current position. + * The current position can be left as it was, or changed to the newly added boundary, + * as specified by the update parameter. + */ + bool addPreceding(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update); + + /** + * Set the cache position to the specified position, or, if the position + * falls between to cached boundaries, to the preceding boundary. + * Fails if the requested position is outside of the range of boundaries currently held by the cache. + * The startPosition must be on a code point boundary. + * + * Return TRUE if successful, FALSE if the specified position is after + * the last cached boundary or before the first. + */ + UBool seek(int32_t startPosition); + + void dumpCache(); + + private: + static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); }; + + static constexpr int32_t CACHE_SIZE = 128; + static_assert((CACHE_SIZE & (CACHE_SIZE-1)) == 0, "CACHE_SIZE must be power of two."); + + RuleBasedBreakIterator *fBI; + int32_t fStartBufIdx; + int32_t fEndBufIdx; // inclusive + + int32_t fTextIdx; + int32_t fBufIdx; + + int32_t fBoundaries[CACHE_SIZE]; + uint16_t fStatuses[CACHE_SIZE]; + + UVector32 fSideBuffer; +}; + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_BREAK_ITERATION + +#endif // RBBI_CACHE_H diff --git a/deps/icu-small/source/common/rbbicst.pl b/deps/icu-small/source/common/rbbicst.pl old mode 100755 new mode 100644 diff --git a/deps/icu-small/source/common/rbbidata.cpp b/deps/icu-small/source/common/rbbidata.cpp index ecdc8f416560d4..d66eca82f80b39 100644 --- a/deps/icu-small/source/common/rbbidata.cpp +++ b/deps/icu-small/source/common/rbbidata.cpp @@ -14,7 +14,7 @@ #include "unicode/utypes.h" #include "rbbidata.h" #include "rbbirb.h" -#include "utrie.h" +#include "utrie2.h" #include "udatamem.h" #include "cmemory.h" #include "cstring.h" @@ -23,23 +23,6 @@ #include "uassert.h" -//----------------------------------------------------------------------------------- -// -// Trie access folding function. Copied as-is from properties code in uchar.c -// -//----------------------------------------------------------------------------------- -U_CDECL_BEGIN -static int32_t U_CALLCONV -getFoldingOffset(uint32_t data) { - /* if bit 15 is set, then the folding offset is in bits 14..0 of the 16-bit trie result */ - if(data&0x8000) { - return (int32_t)(data&0x7fff); - } else { - return 0; - } -} -U_CDECL_END - U_NAMESPACE_BEGIN //----------------------------------------------------------------------------- @@ -71,9 +54,8 @@ RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { dh->info.dataFormat[0] == 0x42 && // dataFormat="Brk " dh->info.dataFormat[1] == 0x72 && dh->info.dataFormat[2] == 0x6b && - dh->info.dataFormat[3] == 0x20) - // Note: info.fFormatVersion is duplicated in the RBBIDataHeader, and is - // validated when checking that. + dh->info.dataFormat[3] == 0x20 && + isDataVersionAcceptable(dh->info.formatVersion)) ) { status = U_INVALID_FORMAT_ERROR; return; @@ -84,6 +66,11 @@ RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { fUDataMem = udm; } +UBool RBBIDataWrapper::isDataVersionAcceptable(const UVersionInfo version) { + return RBBI_DATA_FORMAT_VERSION[0] == version[0]; +} + + //----------------------------------------------------------------------------- // // init(). Does most of the work of construction, shared between the @@ -96,10 +83,11 @@ void RBBIDataWrapper::init0() { fReverseTable = NULL; fSafeFwdTable = NULL; fSafeRevTable = NULL; - fRuleSource = NULL; + fRuleSource = NULL; fRuleStatusTable = NULL; - fUDataMem = NULL; - fRefCount = 0; + fTrie = NULL; + fUDataMem = NULL; + fRefCount = 0; fDontFreeData = TRUE; } @@ -108,8 +96,7 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { return; } fHeader = data; - if (fHeader->fMagic != 0xb1a0 || fHeader->fFormatVersion[0] != 3) - { + if (fHeader->fMagic != 0xb1a0 || !isDataVersionAcceptable(fHeader->fFormatVersion)) { status = U_INVALID_FORMAT_ERROR; return; } @@ -131,16 +118,23 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { fSafeRevTable = (RBBIStateTable *)((char *)data + fHeader->fSRTable); } + // Rule Compatibility Hacks + // If a rule set includes reverse rules but does not explicitly include safe reverse rules, + // the reverse rules are to be treated as safe reverse rules. + + if (fSafeRevTable == NULL && fReverseTable != NULL) { + fSafeRevTable = fReverseTable; + fReverseTable = NULL; + } - utrie_unserialize(&fTrie, - (uint8_t *)data + fHeader->fTrie, - fHeader->fTrieLen, - &status); + fTrie = utrie2_openFromSerialized(UTRIE2_16_VALUE_BITS, + (uint8_t *)data + fHeader->fTrie, + fHeader->fTrieLen, + NULL, // *actual length + &status); if (U_FAILURE(status)) { return; } - fTrie.getFoldingOffset=getFoldingOffset; - fRuleSource = (UChar *)((char *)data + fHeader->fRuleSource); fRuleString.setTo(TRUE, fRuleSource, -1); @@ -165,6 +159,8 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { //----------------------------------------------------------------------------- RBBIDataWrapper::~RBBIDataWrapper() { U_ASSERT(fRefCount == 0); + utrie2_close(fTrie); + fTrie = NULL; if (fUDataMem) { udata_close(fUDataMem); } else if (!fDontFreeData) { @@ -323,7 +319,7 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6b && pInfo->dataFormat[3]==0x20 && - pInfo->formatVersion[0]==3 )) { + RBBIDataWrapper::isDataVersionAcceptable(pInfo->formatVersion) )) { udata_printError(ds, "ubrk_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], @@ -344,17 +340,11 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD // // Get the RRBI Data Header, and check that it appears to be OK. // - // Note: ICU 3.2 and earlier, RBBIDataHeader::fDataFormat was actually - // an int32_t with a value of 1. Starting with ICU 3.4, - // RBBI's fDataFormat matches the dataFormat field from the - // UDataInfo header, four int8_t bytes. The value is {3,1,0,0} - // const uint8_t *inBytes =(const uint8_t *)inData+headerSize; RBBIDataHeader *rbbiDH = (RBBIDataHeader *)inBytes; if (ds->readUInt32(rbbiDH->fMagic) != 0xb1a0 || - rbbiDH->fFormatVersion[0] != 3 || - ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) - { + !RBBIDataWrapper::isDataVersionAcceptable(rbbiDH->fFormatVersion) || + ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) { udata_printError(ds, "ubrk_swap(): RBBI Data header is invalid.\n"); *status=U_UNSUPPORTED_ERROR; return 0; @@ -451,8 +441,8 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD } // Trie table for character categories - utrie_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), - outBytes+ds->readUInt32(rbbiDH->fTrie), status); + utrie2_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), + outBytes+ds->readUInt32(rbbiDH->fTrie), status); // Source Rules Text. It's UChar data ds->swapArray16(ds, inBytes+ds->readUInt32(rbbiDH->fRuleSource), ds->readUInt32(rbbiDH->fRuleSourceLen), diff --git a/deps/icu-small/source/common/rbbidata.h b/deps/icu-small/source/common/rbbidata.h index d33ef7d45e5dc9..75427863d9fa2a 100644 --- a/deps/icu-small/source/common/rbbidata.h +++ b/deps/icu-small/source/common/rbbidata.h @@ -51,22 +51,23 @@ ubrk_swap(const UDataSwapper *ds, #include "unicode/uobject.h" #include "unicode/unistr.h" +#include "unicode/uversion.h" #include "umutex.h" -#include "utrie.h" +#include "utrie2.h" U_NAMESPACE_BEGIN +// The current RBBI data format version. +static const uint8_t RBBI_DATA_FORMAT_VERSION[] = {4, 0, 0, 0}; + /* * The following structs map exactly onto the raw data from ICU common data file. */ struct RBBIDataHeader { uint32_t fMagic; /* == 0xbla0 */ - uint8_t fFormatVersion[4]; /* Data Format. Same as the value in struct UDataInfo */ + UVersionInfo fFormatVersion; /* Data Format. Same as the value in struct UDataInfo */ /* if there is one associated with this data. */ /* (version originates in rbbi, is copied to UDataInfo) */ - /* For ICU 3.2 and earlier, this field was */ - /* uint32_t fVersion */ - /* with a value of 1. */ uint32_t fLength; /* Total length in bytes of this RBBI Data, */ /* including all sections, not just the header. */ uint32_t fCatCount; /* Number of character categories. */ @@ -152,6 +153,8 @@ class RBBIDataWrapper : public UMemory { RBBIDataWrapper(UDataMemory* udm, UErrorCode &status); ~RBBIDataWrapper(); + static UBool isDataVersionAcceptable(const UVersionInfo version); + void init0(); void init(const RBBIDataHeader *data, UErrorCode &status); RBBIDataWrapper *addReference(); @@ -181,11 +184,11 @@ class RBBIDataWrapper : public UMemory { /* number of int32_t values in the rule status table. Used to sanity check indexing */ int32_t fStatusMaxIdx; - UTrie fTrie; + UTrie2 *fTrie; private: u_atomic_int32_t fRefCount; - UDataMemory *fUDataMem; + UDataMemory *fUDataMem; UnicodeString fRuleString; UBool fDontFreeData; diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index b94ae9605f737b..c67f6f8166c0a0 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -24,16 +24,16 @@ #include "unicode/uchriter.h" #include "unicode/parsepos.h" #include "unicode/parseerr.h" + #include "cmemory.h" #include "cstring.h" - #include "rbbirb.h" #include "rbbinode.h" - #include "rbbiscan.h" #include "rbbisetb.h" #include "rbbitblb.h" #include "rbbidata.h" +#include "uassert.h" U_NAMESPACE_BEGIN @@ -164,8 +164,13 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { int32_t statusTableSize = align8(fRuleStatusVals->size() * sizeof(int32_t)); int32_t rulesSize = align8((strippedRules.length()+1) * sizeof(UChar)); - int32_t totalSize = headerSize + forwardTableSize + reverseTableSize - + safeFwdTableSize + safeRevTableSize + (void)safeFwdTableSize; + + int32_t totalSize = headerSize + + forwardTableSize + + /* reverseTableSize */ 0 + + /* safeFwdTableSize */ 0 + + (safeRevTableSize ? safeRevTableSize : reverseTableSize) + statusTableSize + trieSize + rulesSize; RBBIDataHeader *data = (RBBIDataHeader *)uprv_malloc(totalSize); @@ -177,23 +182,45 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { data->fMagic = 0xb1a0; - data->fFormatVersion[0] = 3; - data->fFormatVersion[1] = 1; - data->fFormatVersion[2] = 0; - data->fFormatVersion[3] = 0; + data->fFormatVersion[0] = RBBI_DATA_FORMAT_VERSION[0]; + data->fFormatVersion[1] = RBBI_DATA_FORMAT_VERSION[1]; + data->fFormatVersion[2] = RBBI_DATA_FORMAT_VERSION[2]; + data->fFormatVersion[3] = RBBI_DATA_FORMAT_VERSION[3]; data->fLength = totalSize; data->fCatCount = fSetBuilder->getNumCharCategories(); + // Only save the forward table and the safe reverse table, + // because these are the only ones used at run-time. + // + // For the moment, we still build the other tables if they are present in the rule source files, + // for backwards compatibility. Old rule files need to work, and this is the simplest approach. + // + // Additional backwards compatibility consideration: if no safe rules are provided, consider the + // reverse rules to actually be the safe reverse rules. + data->fFTable = headerSize; data->fFTableLen = forwardTableSize; + + // Do not save Reverse Table. data->fRTable = data->fFTable + forwardTableSize; - data->fRTableLen = reverseTableSize; - data->fSFTable = data->fRTable + reverseTableSize; - data->fSFTableLen = safeFwdTableSize; - data->fSRTable = data->fSFTable + safeFwdTableSize; - data->fSRTableLen = safeRevTableSize; + data->fRTableLen = 0; + + // Do not save the Safe Forward table. + data->fSFTable = data->fRTable + 0; + data->fSFTableLen = 0; + + data->fSRTable = data->fSFTable + 0; + if (safeRevTableSize > 0) { + data->fSRTableLen = safeRevTableSize; + } else if (reverseTableSize > 0) { + data->fSRTableLen = reverseTableSize; + } else { + U_ASSERT(FALSE); // Rule build should have failed for lack of a reverse table + // before reaching this point. + } - data->fTrie = data->fSRTable + safeRevTableSize; + + data->fTrie = data->fSRTable + data->fSRTableLen; data->fTrieLen = fSetBuilder->getTrieSize(); data->fStatusTable = data->fTrie + trieSize; data->fStatusTableLen= statusTableSize; @@ -203,9 +230,14 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { uprv_memset(data->fReserved, 0, sizeof(data->fReserved)); fForwardTables->exportTable((uint8_t *)data + data->fFTable); - fReverseTables->exportTable((uint8_t *)data + data->fRTable); - fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); - fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); + // fReverseTables->exportTable((uint8_t *)data + data->fRTable); + // fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); + if (safeRevTableSize > 0) { + fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); + } else { + fReverseTables->exportTable((uint8_t *)data + data->fSRTable); + } + fSetBuilder->serializeTrie ((uint8_t *)data + data->fTrie); int32_t *ruleStatusTable = (int32_t *)((uint8_t *)data + data->fStatusTable); diff --git a/deps/icu-small/source/common/rbbirb.h b/deps/icu-small/source/common/rbbirb.h index 3cde8da3cc47a5..6fbdbff7449a9f 100644 --- a/deps/icu-small/source/common/rbbirb.h +++ b/deps/icu-small/source/common/rbbirb.h @@ -15,6 +15,9 @@ #define RBBIRB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + #include "unicode/uobject.h" #include "unicode/rbbi.h" #include "unicode/uniset.h" @@ -207,4 +210,7 @@ struct RBBISetTableEl { #endif U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ + #endif diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index 6688c965c3f721..1653a0c7bc7fe2 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -47,6 +47,7 @@ // //------------------------------------------------------------------------------ static const UChar gRuleSet_rule_char_pattern[] = { + // Characters that may appear as literals in patterns without escaping or quoting. // [ ^ [ \ p { Z } \ u 0 0 2 0 0x5b, 0x5e, 0x5b, 0x5c, 0x70, 0x7b, 0x5a, 0x7d, 0x5c, 0x75, 0x30, 0x30, 0x32, 0x30, // - \ u 0 0 7 f ] - [ \ p @@ -558,6 +559,10 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) fRB->fDefaultTree = &fRB->fSafeRevTree; } else if (opt == UNICODE_STRING("lookAheadHardBreak", 18)) { fRB->fLookAheadHardBreak = TRUE; + } else if (opt == UNICODE_STRING("quoted_literals_only", 20)) { + fRuleSets[kRuleSet_rule_char-128].clear(); + } else if (opt == UNICODE_STRING("unquoted_literals", 17)) { + fRuleSets[kRuleSet_rule_char-128].applyPattern(UnicodeString(gRuleSet_rule_char_pattern), *fRB->fStatus); } else { error(U_BRK_UNRECOGNIZED_OPTION); } diff --git a/deps/icu-small/source/common/rbbisetb.cpp b/deps/icu-small/source/common/rbbisetb.cpp index d17916c9e9e1ba..c172da00df7964 100644 --- a/deps/icu-small/source/common/rbbisetb.cpp +++ b/deps/icu-small/source/common/rbbisetb.cpp @@ -35,7 +35,7 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/uniset.h" -#include "utrie.h" +#include "utrie2.h" #include "uvector.h" #include "uassert.h" #include "cmemory.h" @@ -44,43 +44,6 @@ #include "rbbisetb.h" #include "rbbinode.h" - -//------------------------------------------------------------------------ -// -// getFoldedRBBIValue Call-back function used during building of Trie table. -// Folding value: just store the offset (16 bits) -// if there is any non-0 entry. -// (It'd really be nice if the Trie builder would provide a -// simple default, so this function could go away from here.) -// -//------------------------------------------------------------------------ -/* folding value: just store the offset (16 bits) if there is any non-0 entry */ -U_CDECL_BEGIN -static uint32_t U_CALLCONV -getFoldedRBBIValue(UNewTrie *trie, UChar32 start, int32_t offset) { - uint32_t value; - UChar32 limit; - UBool inBlockZero; - - limit=start+0x400; - while(startfNext) { - utrie_setRange32(fTrie, rlRange->fStartChar, rlRange->fEndChar+1, rlRange->fNum, TRUE); + fTrie = utrie2_open(0, // Initial value for all code points. + 0, // Error value for out-of-range input. + fStatus); + + for (rlRange = fRangeList; rlRange!=0 && U_SUCCESS(*fStatus); rlRange=rlRange->fNext) { + utrie2_setRange32(fTrie, + rlRange->fStartChar, // Range start + rlRange->fEndChar, // Range end (inclusive) + rlRange->fNum, // value for range + TRUE, // Overwrite previously written values + fStatus); } } - //----------------------------------------------------------------------------------- // // getTrieSize() Return the size that will be required to serialize the Trie. // //----------------------------------------------------------------------------------- -int32_t RBBISetBuilder::getTrieSize() /*const*/ { - fTrieSize = utrie_serialize(fTrie, - NULL, // Buffer - 0, // Capacity - getFoldedRBBIValue, - TRUE, // Reduce to 16 bits - fStatus); +int32_t RBBISetBuilder::getTrieSize() { + if (U_FAILURE(*fStatus)) { + return 0; + } + utrie2_freeze(fTrie, UTRIE2_16_VALUE_BITS, fStatus); + fTrieSize = utrie2_serialize(fTrie, + NULL, // Buffer + 0, // Capacity + fStatus); + if (*fStatus == U_BUFFER_OVERFLOW_ERROR) { + *fStatus = U_ZERO_ERROR; + } // RBBIDebugPrintf("Trie table size is %d\n", trieSize); return fTrieSize; } @@ -327,12 +295,10 @@ int32_t RBBISetBuilder::getTrieSize() /*const*/ { // //----------------------------------------------------------------------------------- void RBBISetBuilder::serializeTrie(uint8_t *where) { - utrie_serialize(fTrie, - where, // Buffer - fTrieSize, // Capacity - getFoldedRBBIValue, - TRUE, // Reduce to 16 bits - fStatus); + utrie2_serialize(fTrie, + where, // Buffer + fTrieSize, // Capacity + fStatus); } //------------------------------------------------------------------------ diff --git a/deps/icu-small/source/common/rbbisetb.h b/deps/icu-small/source/common/rbbisetb.h index a7d1e7af3bcfb2..7cedb45b33550f 100644 --- a/deps/icu-small/source/common/rbbisetb.h +++ b/deps/icu-small/source/common/rbbisetb.h @@ -13,12 +13,14 @@ #define RBBISETB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + #include "unicode/uobject.h" #include "rbbirb.h" +#include "utrie2.h" #include "uvector.h" -struct UNewTrie; - U_NAMESPACE_BEGIN // @@ -109,8 +111,8 @@ class RBBISetBuilder : public UMemory { RangeDescriptor *fRangeList; // Head of the linked list of RangeDescriptors - UNewTrie *fTrie; // The mapping TRIE that is the end result of processing - uint32_t fTrieSize; // the Unicode Sets. + UTrie2 *fTrie; // The mapping TRIE that is the end result of processing + uint32_t fTrieSize; // the Unicode Sets. // Groups correspond to character categories - // groups of ranges that are in the same original UnicodeSets. @@ -129,4 +131,7 @@ class RBBISetBuilder : public UMemory { U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ + #endif diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 8d6856d371c4c7..98f21510e7d42c 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -11,37 +11,37 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={9,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0xa,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6060,0x5ce8,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5802b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6028,0x5cb0,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x6302b6}; -static const uint16_t ubidi_props_trieIndex[11884]={ +static const uint16_t ubidi_props_trieIndex[11856]={ 0x36a,0x372,0x37a,0x382,0x39a,0x3a2,0x3aa,0x3b2,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x38a,0x392, 0x38a,0x392,0x38a,0x392,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0,0x3dc,0x3e4,0x3ec,0x3f4,0x3ef,0x3f7, 0x38a,0x392,0x38a,0x392,0x3ff,0x407,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x40d,0x415,0x41d,0x425, 0x42d,0x435,0x43d,0x445,0x44b,0x453,0x45b,0x463,0x46b,0x473,0x479,0x481,0x489,0x491,0x499,0x4a1, 0x4ad,0x4a9,0x4b5,0x4bd,0x41f,0x4cd,0x4d5,0x4c5,0x4dd,0x4df,0x4e7,0x4ef,0x4f7,0x4f8,0x500,0x508, 0x510,0x4f8,0x518,0x51d,0x510,0x4f8,0x525,0x52d,0x4f7,0x535,0x53d,0x4ef,0x542,0x38a,0x54a,0x54e, -0x556,0x557,0x55f,0x567,0x4f7,0x56f,0x577,0x4ef,0x57f,0x581,0x500,0x4ef,0x38a,0x38a,0x589,0x38a, -0x38a,0x58f,0x597,0x38a,0x38a,0x59b,0x5a3,0x38a,0x5a7,0x5ae,0x38a,0x5b6,0x5be,0x5c5,0x541,0x38a, -0x38a,0x5cd,0x5d5,0x5dd,0x5e5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5ed,0x38a,0x5f5,0x38a,0x38a,0x38a, -0x5fd,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x605,0x38a,0x38a,0x38a,0x60d,0x60d,0x504,0x504,0x38a,0x613,0x61b,0x5f5, -0x631,0x623,0x623,0x639,0x640,0x629,0x38a,0x38a,0x38a,0x648,0x650,0x38a,0x38a,0x38a,0x652,0x65a, -0x662,0x38a,0x669,0x671,0x38a,0x679,0x38a,0x38a,0x681,0x684,0x542,0x68c,0x401,0x694,0x38a,0x69b, -0x38a,0x6a0,0x38a,0x38a,0x38a,0x38a,0x6a6,0x6ae,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x6b6, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6be,0x6c6,0x6ca, -0x6e2,0x6e8,0x6d2,0x6da,0x6f0,0x6f8,0x6fc,0x5c8,0x704,0x70c,0x714,0x38a,0x71c,0x65a,0x65a,0x65a, -0x72c,0x734,0x73c,0x744,0x749,0x751,0x759,0x724,0x761,0x769,0x38a,0x76f,0x776,0x65a,0x65a,0x65a, -0x65a,0x56d,0x77c,0x65a,0x784,0x38a,0x38a,0x657,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x78c,0x65a,0x65a,0x65a,0x65a,0x65a,0x792,0x65a,0x65a,0x79a,0x7a2, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x65a,0x65a,0x65a,0x7b2,0x7b9,0x7c1,0x7aa, -0x7d1,0x7d9,0x7e1,0x7e8,0x7f0,0x7f8,0x7ff,0x7c9,0x65a,0x65a,0x65a,0x807,0x80d,0x813,0x81b,0x820, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x827,0x38a,0x38a,0x38a,0x82f,0x38a,0x38a,0x38a,0x3d8, -0x837,0x83f,0x76c,0x38a,0x842,0x65a,0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x849,0x84f, -0x85f,0x857,0x38a,0x38a,0x867,0x5fd,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x82e, -0x3bf,0x38a,0x86f,0x877,0x38a,0x87f,0x820,0x38a,0x38a,0x38a,0x38a,0x887,0x38a,0x38a,0x652,0x3b0, +0x556,0x557,0x55f,0x567,0x4f7,0x56f,0x577,0x4ef,0x401,0x57b,0x500,0x4ef,0x38a,0x38a,0x583,0x38a, +0x38a,0x589,0x591,0x38a,0x38a,0x595,0x59d,0x38a,0x5a1,0x5a8,0x38a,0x5b0,0x5b8,0x5bf,0x541,0x38a, +0x38a,0x5c7,0x5cf,0x5d7,0x5df,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5e7,0x38a,0x5ef,0x38a,0x38a,0x38a, +0x5f7,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x5ff,0x38a,0x38a,0x38a,0x607,0x607,0x504,0x504,0x38a,0x60d,0x615,0x5ef, +0x62b,0x61d,0x61d,0x633,0x63a,0x623,0x38a,0x38a,0x38a,0x642,0x64a,0x38a,0x38a,0x38a,0x64c,0x654, +0x65c,0x38a,0x663,0x66b,0x38a,0x673,0x38a,0x38a,0x534,0x67b,0x542,0x683,0x401,0x68b,0x38a,0x692, +0x38a,0x697,0x38a,0x38a,0x38a,0x38a,0x69d,0x6a5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x6ad, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6b5,0x6bd,0x6c1, +0x6d9,0x6df,0x6c9,0x6d1,0x6e7,0x6ef,0x6f3,0x5c2,0x6fb,0x703,0x70b,0x38a,0x713,0x654,0x654,0x654, +0x723,0x72b,0x733,0x73b,0x740,0x748,0x750,0x71b,0x758,0x760,0x38a,0x766,0x76d,0x654,0x654,0x654, +0x654,0x56d,0x773,0x654,0x77b,0x38a,0x38a,0x651,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x783,0x654,0x654,0x654,0x654,0x654,0x789,0x654,0x654,0x791,0x799, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x654,0x654,0x654,0x7a9,0x7b0,0x7b8,0x7a1, +0x7c8,0x7d0,0x7d8,0x7df,0x7e7,0x7ef,0x7f6,0x7c0,0x654,0x654,0x654,0x7fe,0x804,0x80a,0x812,0x817, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x81e,0x38a,0x38a,0x38a,0x826,0x38a,0x38a,0x38a,0x3d8, +0x82e,0x836,0x763,0x38a,0x839,0x654,0x654,0x657,0x654,0x654,0x654,0x654,0x654,0x654,0x840,0x846, +0x856,0x84e,0x38a,0x38a,0x85e,0x5f7,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x825, +0x3bf,0x38a,0x866,0x86e,0x38a,0x876,0x817,0x38a,0x38a,0x38a,0x38a,0x87e,0x38a,0x38a,0x64c,0x3b0, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -54,7 +54,7 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x65a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x654, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -98,10 +98,10 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x86f,0x65a,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x88e,0x38a,0x38a,0x893,0x557,0x38a,0x38a,0x5a9,0x65a,0x651,0x38a,0x38a,0x89b,0x38a,0x38a,0x38a, -0x8a3,0x8aa,0x623,0x8b2,0x38a,0x38a,0x8b9,0x8c1,0x38a,0x8c8,0x8cf,0x38a,0x4dd,0x8d4,0x38a,0x4f6, -0x38a,0x8dc,0x8e4,0x4f8,0x38a,0x8e8,0x4f7,0x8f0,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8f7, +0x38a,0x38a,0x38a,0x38a,0x866,0x654,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x885,0x38a,0x38a,0x88a,0x557,0x38a,0x38a,0x5a3,0x654,0x64b,0x38a,0x38a,0x892,0x38a,0x38a,0x38a, +0x89a,0x8a1,0x61d,0x8a9,0x38a,0x38a,0x579,0x8b1,0x38a,0x8b8,0x8bf,0x38a,0x4dd,0x8c4,0x38a,0x4f6, +0x38a,0x8cc,0x8d4,0x4f8,0x38a,0x8d8,0x4f7,0x8e0,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8e7, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -141,9 +141,9 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x90b,0x8ff,0x903,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x913,0x489,0x489,0x489,0x489,0x91b,0x91f, -0x927,0x92f,0x933,0x93b,0x489,0x489,0x489,0x93f,0x947,0x37a,0x94f,0x957,0x38a,0x38a,0x38a,0x95f, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8fb,0x8ef,0x8f3,0x489,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x903,0x489,0x489,0x489,0x489,0x90b,0x90f, +0x917,0x91f,0x923,0x92b,0x489,0x489,0x489,0x92f,0x937,0x37a,0x93f,0x947,0x38a,0x38a,0x38a,0x94f, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0xe28,0xe28,0xe68,0xea8,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xee0,0xf20,0xf60,0xf70,0xfb0,0xfbc, @@ -180,61 +180,61 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x967,0x38a,0x65a,0x65a,0x96f,0x5fd,0x38a,0x4f0, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x977,0x38a,0x38a,0x38a,0x97e,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x957,0x38a,0x654,0x654,0x95f,0x5f7,0x38a,0x4f0, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x967,0x38a,0x38a,0x38a,0x96e,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x986,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x98e,0x992,0x41f,0x41f,0x41f,0x41f,0x9a2,0x99a,0x41f,0x9aa,0x41f,0x41f,0x9b2,0x9b8,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x976,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x97e,0x982,0x41f,0x41f,0x41f,0x41f,0x992,0x98a,0x41f,0x99a,0x41f,0x41f,0x9a2,0x9a8,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x9c0,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x4f7,0x8bb,0x9c8,0x9cf,0x401,0x9d2,0x38a,0x38a,0x4dd,0x9da,0x38a,0x9e0,0x401,0x9e5,0x60f,0x38a, -0x38a,0x9ed,0x38a,0x38a,0x38a,0x38a,0x82f,0x9f5,0x401,0x4f8,0x556,0x9fc,0x38a,0x38a,0x38a,0x38a, -0x38a,0x8bb,0xa04,0x38a,0x38a,0xa08,0xa10,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa14,0xa1c,0x38a, -0x38a,0xa24,0x556,0xa2c,0x38a,0xa32,0x38a,0x38a,0x5ed,0xa3a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa42,0xa46,0xa4e,0x38a,0xa55,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa5c,0x38a,0x38a,0xa64,0xa6a, -0x38a,0x38a,0x38a,0xa70,0xa78,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa7c,0x38a,0xa82,0x38a, +0x41f,0x41f,0x41f,0x9b0,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x4f7,0x9b8,0x9bf,0x9c6,0x401,0x9c9,0x38a,0x38a,0x4dd,0x9d1,0x38a,0x9d7,0x401,0x9dc,0x609,0x38a, +0x38a,0x9e4,0x38a,0x38a,0x38a,0x38a,0x826,0x9ec,0x401,0x4f8,0x556,0x9f3,0x38a,0x38a,0x38a,0x38a, +0x38a,0x9b8,0x9fb,0x38a,0x38a,0x9ff,0xa07,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa0b,0xa13,0x38a, +0x38a,0xa1b,0x556,0xa23,0x38a,0xa29,0x38a,0x38a,0x5e7,0xa31,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa39,0xa3d,0xa45,0x38a,0xa4c,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa53,0x38a,0x38a,0xa61,0xa5b, +0x38a,0x38a,0x38a,0xa69,0xa71,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa75,0x38a,0xa7b,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0xa88,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0xa81,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x511,0xa90,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x511,0xa89,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0xa97,0xa9f,0xaa5,0x38a,0x38a,0x65a,0x65a,0xaad,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a, -0x65a,0xab5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xabb,0x38a,0xac2, -0x38a,0xabe,0x38a,0xac5,0x38a,0xacd,0xad1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xad9,0x3d8,0xae0,0xae7,0xaef,0x38a,0x38a,0x38a, +0x38a,0x38a,0xa90,0xa98,0xa9e,0x38a,0x38a,0x654,0x654,0xaa6,0x38a,0x38a,0x38a,0x38a,0x38a,0x654, +0x654,0xaae,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xab4,0x38a,0xabb, +0x38a,0xab7,0x38a,0xabe,0x38a,0xac6,0xaca,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xad2,0x3d8,0xad9,0xae0,0xae8,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xaf7,0xaff,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xaf0,0xaf8,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xb07,0x41f,0xb0f, -0xb0f,0xb16,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xb00,0x41f,0xb08, +0xb08,0xb0f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xb1e,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x65a,0xb26,0x65a,0x65a,0x65d,0xb2b,0xb2f,0x849,0xb37, -0x38a,0x38a,0xb3d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x76d,0x38a,0x38a,0x38a,0x38a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0xb45,0xb4d,0x65a, -0x65a,0x65a,0x65d,0x65a,0x65a,0xb45,0x38a,0xb26,0x65a,0xb55,0x65a,0xb5d,0x84b,0x38a,0x38a,0xb26, -0xb61,0xb69,0x65f,0x65c,0x38a,0xb71,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xb17,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x654,0xb1f,0x654,0x654,0x657,0xb24,0xb28,0x840,0xb30, +0x38a,0x38a,0xb36,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x764,0x38a,0x38a,0x38a,0x38a,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0xb3e,0xb46,0x654, +0x654,0x654,0x657,0x654,0x654,0xb3e,0x38a,0xb1f,0x654,0xb4e,0x654,0xb56,0x842,0x38a,0x38a,0xb1f, +0xb5a,0xb62,0x659,0x656,0x38a,0xb6a,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb79,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb72,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb79,0xb89,0xb81,0xb81,0xb81,0xb8a,0xb8a,0xb8a,0xb8a,0x3d8, -0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0xb92,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb72,0xb82,0xb7a,0xb7a,0xb7a,0xb83,0xb83,0xb83,0xb83,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0xb8b,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4,4,4,0xa,0xa, 0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2,2,2,2,2, @@ -319,7 +319,7 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1, 0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,1,1,1,0xb1,0xb1,0xb1, -1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +1,1,1,1,0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd, 0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0xb1,0xb1,5,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, @@ -348,8 +348,8 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 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,0x11,0x11, -0x11,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,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,0,0, 0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, 0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, @@ -367,215 +367,211 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 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,0x11,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,0x11, -0x11,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,0x310a,0xf20a,0x310a,0xf20a,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,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,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,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,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,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,0xb1,0xb1,0xb1,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,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, -0,0xb1,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,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,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0x310a, -0xf20a,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,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,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,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,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,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,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,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,0x40,0x40,0x40,0xb1,0x40,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,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,0,0,0,0,0,0xb1,0, +0,0xb1,0xb1,0,0,0,0,0,0,0xb1,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,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1, -0xb1,0xb1,0x12,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,0x40,0x40,0x40,0x40,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +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,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,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,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,0x310a,0xf20a,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,0xb1,0xb1,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,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,0x40,0x40,0x40,0xb1,0x40,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,0x4a,0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,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, +0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,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, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0,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,0xa,0xa,0xa,0xa,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,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,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,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,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0xb1,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,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,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, -0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,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,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0, +0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x11,0x11, -0x11,0x11,0,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,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,0xa,0xa,0xa,0xa,6,0x310a,0xf20a,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,0xb2,0x12,0x814,0x815, -0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2, -2,2,3,3,0xa,0x310a,0xf20a,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, -2,2,2,2,2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,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, -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, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -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,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,0xa,0,0, -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,0xa,0xa,0xa,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,0,0,0xb1,0xb1, +0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0, +0,0,0,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,0xb1,0xb1,0,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,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,0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa,0xa,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,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, -0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a, -0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa, -0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a, -0x100a,0x100a,0x100a,0xa,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a, -0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a, -0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa, -0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a, -0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2, +0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2,2,2,3,3, +0xa,0x310a,0xf20a,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,2,2,2,2, +2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,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,4,4,4,4,4,4,4,4,4,4,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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,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,0xa,0,0,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,0xa,0xa,0xa,0,0,0,0,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,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a, +0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a, +0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4, +0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa, +0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a, +0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,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,0x310a,0xf20a,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,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,0xa,0xa,0xa,0,0,0,0,0, +0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,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, -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,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa, -0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,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,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a, -0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, -0xf20a,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,0x310a,0xf20a,0x310a,0xf20a, -0x100a,0xa,0xa,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,0x100a,0x100a, +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,0xa,0xa,0xa,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,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,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a, +0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,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, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, +0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,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,0xa,0xa, +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,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,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,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, -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,0,0,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,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,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,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,0xa,0xa,0xa,0, -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,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,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,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,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,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,0xa,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0, -0,0,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa, -0xa,0,0,0,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,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,0xb1,0xb1,0xa,0xa,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,0,0,0,0, -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, +0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,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,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,0xa,0xa,0xa,0xa,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,0,0xb1,0xb1,0xb1,0xb1,0xa, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0, -0,0,0,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,0xb1,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, -4,4,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,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,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, +0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,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,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,0xa,0,0,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0,0,0,0xa,0xa, +0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa,0xa,0,0,0, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,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,0xb1,0xb1,0xa,0xa,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,0,0,0,0,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,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,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,0xa,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,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,0xb1,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,4,4,0,0, +0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,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,0xb1,0xb1,0xb1,0xb1,0,0, @@ -642,123 +638,125 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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,0,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,0xb1,0xb1,0, -0,0xb1,0xb1,0,0,0xa0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,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,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,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,0,0,0xb1,0,0xb1,0xb1,0,0,0,0, -0,0,0xb1,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,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,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,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,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1, -0xb1,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,0xb1,0,0,0xb1,0xb1,0, +0,0xa0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +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,0,0,0,0,0xb1, 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,0xb1,0xb1,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,0xb1,0xb1,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,0,0,0,0,0xb1, +0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,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,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,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,0x11,0x11,0x11,0x11,0x11,0x11,0, -0,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11, -0x11,0,0,0x11,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0x11, -0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0, -0,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0x11,0x11,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,0xb1,0xb1,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,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0, +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,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,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,0xb1, +0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, 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,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0x11,0,0x11,0x11,0,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0,0x11,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,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,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +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,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb2,0xb2,0xb2,0xb2,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,0, +0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,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,0xb1,0,0,0,0,0,0,0,0,0,0xb2, -0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,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,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,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,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,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,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,0x100a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a,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,0x100a,0,0,0,0,0,0,0,0, -0,0,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,0x100a,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x100a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x100a,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,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,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0xb1,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,0xb1,0xb1,0xb1,0xb1,0xb1,0,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, -0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0,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,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,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,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,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,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,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,2,2,2,2, -2,2,2,2,2,2,2,0xa,0xa,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +2,2,2,2,2,2,2,2,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0xb1,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,0xb1,0xb1,0xb1,0xb1,0xb1, +0,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, -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,0,0,0,0,0,0,0, -0,0,0,0,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, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +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,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0xb1,0,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, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0xb1,0xb1,0xb1,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,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,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, +2,2,2,2,2,2,2,2,2,2,2,0xa,0xa,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,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,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,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +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,0,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,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,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,0,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,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,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,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,0,0,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,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, +0,0,0,0,0,0,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,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,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,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,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,0,0,0,0 }; static const uint32_t ubidi_props_mirrors[26]={ @@ -803,7 +801,7 @@ static const uint8_t ubidi_props_jgArray[672]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x5d,0x5a,0x60,0x63,0x5e,0x5f,0x59,0x61,0x5b,0x5c,0x62,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -828,13 +826,13 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_trieIndex+3496, NULL, 3496, - 8388, + 8360, 0x1a0, 0xe28, 0x0, 0x0, 0x110000, - 0x2e68, + 0x2e4c, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ucase.cpp b/deps/icu-small/source/common/ucase.cpp index 566014245f0fc2..1f41dbf6de3edb 100644 --- a/deps/icu-small/source/common/ucase.cpp +++ b/deps/icu-small/source/common/ucase.cpp @@ -961,6 +961,7 @@ ucase_toFullLower(UChar32 c, 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE */ + *pString=nullptr; return 0; /* remove the dot (continue without output) */ } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, context)) { /* @@ -1059,6 +1060,7 @@ toUpperOrTitle(UChar32 c, 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE */ + *pString=nullptr; return 0; /* remove the dot (continue without output) */ } else { /* no known conditional special case mapping, use a normal mapping */ diff --git a/deps/icu-small/source/common/ucase.h b/deps/icu-small/source/common/ucase.h index e15bae6604daef..9d6365eadfcca2 100644 --- a/deps/icu-small/source/common/ucase.h +++ b/deps/icu-small/source/common/ucase.h @@ -61,7 +61,7 @@ enum { /** * Bit mask for getting just the options from a string compare options word * that are relevant for case-insensitive string comparison. - * See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. + * See stringoptions.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. * @internal */ #define _STRCASECMP_OPTIONS_MASK 0xffff @@ -69,10 +69,16 @@ enum { /** * Bit mask for getting just the options from a string compare options word * that are relevant for case folding (of a single string or code point). - * See uchar.h. + * + * Currently only bit 0 for U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * It is conceivable that at some point we might use one more bit for using uppercase sharp s. + * It is conceivable that at some point we might want the option to use only simple case foldings + * when operating on strings. + * + * See stringoptions.h. * @internal */ -#define _FOLD_CASE_OPTIONS_MASK 0xff +#define _FOLD_CASE_OPTIONS_MASK 7 /* single-code point functions */ diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index 3663592173cc66..fe620efc6e2cbc 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -11,36 +11,36 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={9,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={0xa,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6c6c,0x5a10,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6dfc,0x5ba0,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[11520]={ +static const uint16_t ucase_props_trieIndex[11720]={ 0x327,0x32f,0x337,0x33f,0x34d,0x355,0x35d,0x365,0x36d,0x375,0x37c,0x384,0x38c,0x394,0x39c,0x3a4, 0x3aa,0x3b2,0x3ba,0x3c2,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x412,0x41a,0x422, 0x42a,0x432,0x43a,0x442,0x44a,0x452,0x45a,0x462,0x45e,0x466,0x46b,0x473,0x47a,0x482,0x48a,0x492, 0x49a,0x4a2,0x4aa,0x4b2,0x346,0x34e,0x4b7,0x4bf,0x4c4,0x4cc,0x4d4,0x4dc,0x4db,0x4e3,0x4e8,0x4f0, 0x4f7,0x4fe,0x502,0x346,0x346,0x327,0x512,0x50a,0x51a,0x51c,0x524,0x52c,0x530,0x531,0x539,0x541, -0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x541,0x530,0x562,0x56a,0x541,0x56f,0x346,0x577,0x346, -0x4a1,0x4dd,0x57f,0x541,0x530,0x562,0x586,0x541,0x530,0x346,0x539,0x541,0x346,0x346,0x58c,0x346, -0x346,0x592,0x599,0x346,0x346,0x59d,0x5a5,0x346,0x5a9,0x5b0,0x346,0x5b7,0x5bf,0x5c6,0x5ce,0x346, -0x346,0x5d3,0x5db,0x5e3,0x5eb,0x5f3,0x5fb,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x5ff,0x346,0x346,0x60f,0x617,0x607, +0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x566,0x530,0x56e,0x576,0x541,0x57b,0x346,0x583,0x346, +0x4a1,0x4dd,0x58b,0x541,0x530,0x56e,0x592,0x541,0x59a,0x59c,0x539,0x541,0x346,0x346,0x5a4,0x346, +0x346,0x5aa,0x5b1,0x346,0x346,0x5b5,0x5bd,0x346,0x5c1,0x5c8,0x346,0x5cf,0x5d7,0x5de,0x5e6,0x346, +0x346,0x5eb,0x5f3,0x5fb,0x603,0x60b,0x613,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x617,0x346,0x346,0x627,0x62f,0x61f, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x61f,0x61f,0x53d,0x53d,0x346,0x625,0x62d,0x346, -0x635,0x346,0x63d,0x346,0x548,0x643,0x346,0x346,0x346,0x64b,0x346,0x346,0x346,0x346,0x346,0x346, -0x652,0x346,0x659,0x661,0x346,0x669,0x346,0x346,0x671,0x674,0x67c,0x682,0x68a,0x692,0x346,0x699, -0x346,0x69e,0x346,0x6a4,0x6ac,0x346,0x6b0,0x6b8,0x6c0,0x6c5,0x6c8,0x6d0,0x6e0,0x6d8,0x6f0,0x6e8, -0x36d,0x6f8,0x36d,0x700,0x703,0x36d,0x70b,0x36d,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743,0x74b, -0x753,0x75a,0x346,0x762,0x76a,0x346,0x772,0x77a,0x782,0x78a,0x792,0x79a,0x7a2,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x637,0x637,0x53d,0x53d,0x346,0x63d,0x645,0x346, +0x64d,0x346,0x655,0x346,0x548,0x65b,0x346,0x346,0x346,0x663,0x346,0x346,0x346,0x346,0x346,0x346, +0x66a,0x346,0x671,0x679,0x346,0x681,0x346,0x346,0x56d,0x689,0x691,0x697,0x59a,0x69f,0x346,0x6a6, +0x346,0x6ab,0x346,0x6b1,0x6b9,0x346,0x6bd,0x6c5,0x6cd,0x6d2,0x6d5,0x6dd,0x6ed,0x6e5,0x6fd,0x6f5, +0x36d,0x705,0x36d,0x70d,0x710,0x36d,0x718,0x36d,0x720,0x728,0x730,0x738,0x740,0x748,0x750,0x758, +0x760,0x767,0x346,0x76f,0x777,0x346,0x77f,0x787,0x78f,0x797,0x79f,0x7a7,0x7af,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x7a5,0x7ab,0x7b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x7b2,0x7b8,0x7be,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x7b9,0x7be,0x7c2,0x7ca,0x36d,0x36d,0x36d,0x7d2,0x7da,0x7e2,0x346,0x7e7,0x346,0x346,0x346,0x7ef, -0x346,0x63a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x52f,0x7f7,0x346,0x346,0x7fe,0x346,0x346,0x806,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x7c6,0x7cb,0x7cf,0x7d7,0x36d,0x36d,0x36d,0x7df,0x7e7,0x7ef,0x346,0x7f4,0x346,0x346,0x346,0x7fc, +0x346,0x652,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x52f,0x804,0x346,0x346,0x80b,0x346,0x346,0x813,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, @@ -96,12 +96,12 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x80e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x81b,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6a4,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x814,0x346,0x81c,0x821,0x829,0x346,0x346,0x831,0x839,0x841,0x36d,0x846,0x84e,0x854,0x346,0x85a, -0x862,0x548,0x346,0x346,0x346,0x346,0x869,0x871,0x346,0x878,0x87f,0x346,0x51a,0x884,0x88c,0x548, -0x346,0x892,0x89a,0x89e,0x346,0x8a6,0x8ae,0x8b6,0x346,0x8bc,0x8c0,0x8c8,0x8d8,0x8d0,0x346,0x8e0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x821,0x346,0x829,0x82e,0x836,0x346,0x346,0x83e,0x846,0x84e,0x36d,0x853,0x85b,0x861,0x346,0x867, +0x86f,0x548,0x346,0x346,0x346,0x346,0x876,0x87e,0x346,0x885,0x88c,0x346,0x51a,0x891,0x899,0x548, +0x346,0x89f,0x8a7,0x8ab,0x346,0x8b3,0x8bb,0x8c3,0x346,0x8c9,0x8cd,0x8d5,0x8e5,0x8dd,0x346,0x8ed, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, @@ -141,15 +141,15 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8e8,0x346,0x346,0x346,0x346,0x8f0,0x68a,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8f5,0x346,0x346,0x346,0x346,0x8fd,0x59a,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x8f5,0x8fd,0x901,0x346,0x346,0x346,0x346,0x329,0x32f,0x909,0x911,0x918,0x4dd,0x346,0x346,0x920, +0x902,0x90a,0x90e,0x346,0x346,0x346,0x346,0x329,0x32f,0x916,0x91e,0x925,0x4dd,0x346,0x346,0x92d, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0xd1c,0xd1c,0xd34,0xd74,0xdb4,0xdf0,0xe30,0xe70,0xea8,0xee8,0xf28,0xf68,0xfa8,0xfe8,0x1028,0x1068, 0x10a8,0x10e8,0x1128,0x1168,0x1178,0x11ac,0x11e8,0x1228,0x1268,0x12a8,0xd18,0x12dc,0x1310,0x1350,0x136c,0x13a0, -0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab5,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf5,0x188,0x188,0xb2a,0xb69,0xba9,0xbe3,0xc1a,0x188, +0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab7,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf7,0x188,0x188,0xb2c,0xb6b,0xbab,0xbe5,0xc1c,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, @@ -174,50 +174,50 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0xc5a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x63e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x928,0x346,0x346,0x346,0x92b,0x346,0x346,0x346, -0x346,0x933,0x939,0x93d,0x346,0x346,0x941,0x945,0x94b,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0xc5c,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x656,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x935,0x346,0x346,0x346,0x938,0x346,0x346,0x346, +0x346,0x940,0x946,0x94a,0x346,0x346,0x94e,0x952,0x958,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x953,0x957,0x346,0x346,0x346,0x346,0x346,0x95f,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x967,0x96b,0x973,0x977,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x960,0x964,0x346,0x346,0x346,0x346,0x346,0x96c,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x974,0x978,0x980,0x984,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x530,0x97c,0x983,0x985,0x68a,0x98d,0x346,0x346,0x995,0x99c,0x346,0x988,0x68a,0x9a2,0x9aa, -0x346,0x346,0x9af,0x346,0x346,0x346,0x346,0x329,0x9b7,0x68a,0x531,0x9bf,0x9c6,0x346,0x346,0x346, -0x346,0x346,0x97c,0x9ce,0x346,0x346,0x9d2,0x9da,0x346,0x346,0x346,0x346,0x346,0x346,0x9de,0x9e6, -0x346,0x346,0x9ee,0x4a1,0x346,0x346,0x9f6,0x346,0x346,0x9fc,0xa04,0x346,0x346,0x346,0x346,0x346, -0x346,0xa0c,0xa14,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa1c,0x346,0x346, -0x8f0,0xa24,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa2a,0x346,0xa30,0x671, +0x346,0x530,0x989,0x990,0x59b,0x59a,0x994,0x346,0x346,0x99c,0x9a3,0x346,0x9a9,0x59a,0x9ae,0x9b6, +0x346,0x346,0x9bb,0x346,0x346,0x346,0x346,0x329,0x9c3,0x59a,0x531,0x9cb,0x9d2,0x346,0x346,0x346, +0x346,0x346,0x989,0x9da,0x346,0x346,0x9de,0x9e6,0x346,0x346,0x346,0x346,0x346,0x346,0x9ea,0x9f2, +0x346,0x346,0x9fa,0x4a1,0x346,0x346,0xa02,0x346,0x346,0xa08,0xa10,0x346,0x346,0x346,0x346,0x346, +0x346,0xa18,0xa20,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa28,0xa2c,0xa34,0x346, +0xa3b,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa42,0x346,0x346, +0x8fd,0xa4a,0x346,0x346,0x346,0xa50,0xa58,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa5c,0x346, +0xa62,0x56d,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0xa68,0x346,0x346,0x59a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0xa36,0x346,0x346,0x4a1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa70,0x56d,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa3e,0x671,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa78,0xa80,0xa86,0x346,0x346,0x346,0x346,0xa8e,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa96,0xa9e,0xaa3,0xaa9, +0xab1,0xab9,0xac1,0xa9a,0xac9,0xad1,0xad9,0xae0,0xa9b,0xa96,0xa9e,0xa99,0xaa9,0xa9c,0xa97,0xae8, +0xa9a,0xaf0,0xaf8,0xb00,0xb07,0xaf3,0xafb,0xb03,0xb0a,0xaf6,0xb12,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x846,0xb1a,0x846,0xb21,0xb28, +0xb30,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0xa46,0xa4e,0xa54,0x346,0x346,0x346,0x346,0xa5c,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa64,0xa6c,0xa71,0xa77,0xa7f,0xa87, -0xa8f,0xa68,0xa97,0xa9f,0xaa7,0xaae,0xa69,0xa64,0xa6c,0xa67,0xa77,0xa6a,0xa65,0xab6,0xa68,0xabe, -0xac6,0xace,0xad5,0xac1,0xac9,0xad1,0xad8,0xac4,0xae0,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x839,0xae8,0x839,0xaef,0xaf6,0xafe,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb38,0xb40,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb06,0xb0e,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb44,0x346,0xb4c,0xb54,0xb5b, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb12,0x346,0xb1a,0xb22,0xb29,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0xa92,0xb63,0xb63,0xb69,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x99e,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x846,0x846,0x846, +0x346,0x346,0x346,0x346,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0xa6c,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0xa60,0xb31,0xb31,0xb37,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x997,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x839,0x839,0x839,0x346,0x346, -0x346,0x346,0x839,0x839,0x839,0x839,0x839,0x839,0x839,0xa3a,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x326,0x326,0,0,0,0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,4,0,0,0,0,0,0,4,0,0,0,0,0, @@ -361,6 +361,9 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0, 0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4, 4,0,0,0,0,0x64,0,0,0,0,0,0,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,0,0,0,0,0,0,0, +0,0,4,4,4,4,4,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,0x64,0,0,4,0,4,4,4,4,0,0,0, 0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,4,0, @@ -371,6 +374,9 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0,0,4,4,4,0,4,4,4,0x64,0,0,0,0,0,0, 0,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,4,0, 0,0,0,0,4,0x64,0,0,0,0,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,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0, 0,0,4,4,4,0,4,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,4,0,0,4,4,4,4, @@ -428,211 +434,208 @@ static const uint16_t ucase_props_trieIndex[11520]={ 4,0,0,0,0,0,0,4,4,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0,0,0x64,0,0,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x64,4,0,4,4,4,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,0x64,0,4,4,4,4,4,0,4,0,0,0, -0,0,4,0,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,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,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,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0, -4,4,0x60,0x64,4,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,0,0, -0,4,0,4,4,4,0x60,0x60,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,0x64, +0x44,0x64,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x64,0,4,4,4,4,4,0, +4,0,0,0,0,0,4,0,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,0,4,4,4,4,4,4,0,0, -0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64, -0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0x64,0,0, -0,0,0,0,0x44,0,0,0,0x44,0x44,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +4,4,0,0,4,4,0x60,0x64,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0, +4,4,0,0,0,4,0,4,4,4,0x60,0x60,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +0,0,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,0,0,0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44, +0x64,0x64,0x64,0x64,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0, +0,0x64,0,0,0,0,0,0,0x44,0,0,0,0x44,0x44,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,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x25,5,5,5,5,5,5,5,5,1, +1,1,1,1,1,1,1,1,1,1,1,1,5,0x60b9,1,1, +1,0x60f9,1,1,5,5,5,5,0x25,5,5,5,0x25,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x25,5,5,5,5,5,5,5,5,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,0x60b9,1,1,1,0x60f9,1,1, -5,5,5,5,0x25,5,5,5,0x25,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x21,1,1,1,1,5,5,5,5,5, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x44,0x64,0x64,0x44,0x64, -0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64, -0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89, +5,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x21,1,1,1,1,5, +5,5,5,5,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0,0x44, +0x64,0x64,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x6839,0x409,0x6939,0x409, -0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x2509,0x2509,0x2b09,0x2b09, -0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0,0x6d59,0x6e39,0x6f19,0x6ff9, -0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b,0x7b59,0x7c39,0x7d19,0x7df9, -0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b,0x8959,0x8a39,0x8b19,0x8bf9, -0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b,0x409,0x409,0x9759,0x9859, -0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4,4,4,0x9e19,0x9f19, -0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4,0x409,0x409,0xa439,0xa599, -0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4,0x409,0x409,0xa999,0xaaf9, -0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4,0,0,0xaff9,0xb0f9, -0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,4,4,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,0,4,0,0,4, -0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4, -4,4,4,4,4,4,4,4,0,0x25,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,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,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44, -0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4,4,0x64,0x64,0x44, -0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,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,0xb61a,0, -2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,2,1,0,0,0, -0,1,0,0,1,1,2,2,0,0,0,0,0,2,1,1, -0x21,0x21,0,0,0,0,0xf209,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, -0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809, -0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a,0xff89,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, -0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xf309,0xf309,0xf309,0xf309, -0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0, +0x6839,0x409,0x6939,0x409,0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x2509,0x2509,0x2b09,0x2b09,0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0, +0x6d59,0x6e39,0x6f19,0x6ff9,0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b, +0x7b59,0x7c39,0x7d19,0x7df9,0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b, +0x8959,0x8a39,0x8b19,0x8bf9,0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b, +0x409,0x409,0x9759,0x9859,0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4, +4,4,0x9e19,0x9f19,0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4, +0x409,0x409,0xa439,0xa599,0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4, +0x409,0x409,0xa999,0xaaf9,0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4, +0,0,0xaff9,0xb0f9,0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,4,4,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, +4,0,0,4,0,0,4,4,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,0,4,4,4,4,4,4,4,4,4,4,0,0x25,0,0, +0,0,0,0,0,0,0,0,0,0,0,5,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,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64, +0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4, +4,0x64,0x64,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,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,0xb61a,0,2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,2, +1,0,0,0,0,1,0,0,1,1,2,2,0,0,0,0, +0,2,1,1,0x21,0x21,0,0,0,0,0xf209,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809, +0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a, +0xff89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a, +0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, +0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309, +0xf309,0xf309,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, 0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, -0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, +0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809, 0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, -0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da,0xb81a,0xb859,0xb899,0x8a, -0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89,1,0x8a,0xff89,1, -1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89,1,0,0,0, -0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89,0,0,0,0, -0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19,0xbb59,0xbb99,0xbbd9,0xbc19, -0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19,0xbf59,0xbf99,0xbfd9,0xc019, -0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319,0xc359,0xc399,0,0xc3d9, -0,0,0,0,0,0xc419,0,0,0,0,0,0,0,0,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,0x64,0x44,0x44,0x44,0x44, +0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da, +0xb81a,0xb859,0xb899,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89, +1,0x8a,0xff89,1,1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89, +1,0,0,0,0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89, +0,0,0,0,0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19, +0xbb59,0xbb99,0xbbd9,0xbc19,0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19, +0xbf59,0xbf99,0xbfd9,0xc019,0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319, +0xc359,0xc399,0,0xc3d9,0,0,0,0,0,0xc419,0,0,0,0,0,0, +0,0,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,0x64, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60,0,4,4,4, -4,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60, +0,4,4,4,4,4,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,0x64,0x64,4,4,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x64,0x64,4,4,4,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,4,4,4,0,0,0,0,0,0,0,0,0, -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,4,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9,0x8a,0xff89,0x8a,0xff89, +0,4,0,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,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -5,5,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,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, +0x8a,0xff89,0x8a,0xff89,5,5,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,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,4,4, -4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1,1,1,1,1, -1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a,0xc65a,0xc69a,0xc6da,0, -0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,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,1,0,0,0,0,0,0,0,4,0,0,0,0x64,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,0x64,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,4,4,4,0x64,0x64,0x64,0,0, +4,4,4,4,4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1, +1,1,1,1,1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89, +1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a, +0xc65a,0xc69a,0xc6da,0,0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,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,1,0,0,0,0,0,0,0,4,0, +0,0,0x64,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,0x64,4,0,0, 0,0,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,0,0x60, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,4,4,4,4,0,0,4,0,0,0, -0x60,0,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,4,4,4,4,4,4,0,0,4,4,0,0,4,4,0, -0,0,0,0,0,0,0,0,0,0,0,4,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0x64, +0x64,0x64,0,0,0,0,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,0,0x60,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,4,4,4,4,0,0, +4,0,0,0,0x60,0,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,4,4,4,4,4,4,0,0,4,4,0, +0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +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,4,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,0x44,0,0x44,0x44, +0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,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,4,4,0,0,0,0,0,4, +4,0,0x64,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,0xc819,1,1,1,1,1,1,1,4, +5,5,5,5,1,1,1,1,1,1,0,0,0,0,0,0, +0,0,0,0,0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79, +0xccd9,0xcd39,0xcd99,0xcdf9,0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79, +0xded9,0xdf39,0xdf99,0xdff9,0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479, +0xe4d9,0xe539,0xe599,0xe5f9,0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279, +0xd2d9,0xd339,0xd399,0xd3f9,0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879, +0xd8d9,0xd939,0xd999,0xd9f9,0,0,0,0,0,4,0,0,4,0,0,0, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0, +0,0,0,0,0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,0,0,0,0, +0,0,0x64,0,0,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,0,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0,0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0,0,0,0,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,0x44,0,0x44,0x44,0x64,0,0,0x44, -0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,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,4,4,0,0,0,0,0,4,4,0,0x64,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,0xc819,1,1,1,1,1,1,1,4,5,5,5,5, -1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79,0xccd9,0xcd39,0xcd99,0xcdf9, -0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79,0xded9,0xdf39,0xdf99,0xdff9, -0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479,0xe4d9,0xe539,0xe599,0xe5f9, -0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279,0xd2d9,0xd339,0xd399,0xd3f9, -0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879,0xd8d9,0xd939,0xd999,0xd9f9, -0,0,0,0,0,4,0,0,4,0,0,0,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0,0,0,0,0, -0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,0,0,0,0,0,0,0x64,0, -0,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,0,0,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64, -0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0, -0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0, -0,0,0,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,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,0, -0x64,0,0,0,0,0,0,0,0,0,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,4,4,4, +0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, 0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0xec09,0xec09,0xec09,0xec09, 0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0, 0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,4,4,4, -0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0, +0,4,4,4,0,4,4,0,0,0,0,0,4,0x64,4,0x44, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64, +0,0,0,0,0,0x44,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0, -0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x200a,0x200a,0x200a,0x200a, 0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a, -0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe009,0xe009,0xe009,0xe009, +0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a, +0x200a,0x200a,0x200a,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009, -0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0, -0,0,0,0,0,0,0,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,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009, +0xe009,0xe009,0xe009,0,0,0,0,0,0,0,0,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,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,0,0,0x64,0x64,0, -0,4,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,0,0,0x64,0x64,0,0,4,0,0, +0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4, -4,4,4,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,0x64, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,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,0,0x60,0,0,0,0,0,0,0, 0,0,0x64,4,4,0,0,0,0,0,0,0,0,0,0,0, @@ -663,79 +666,89 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0,4,4,4,4,4,4,0,0,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,0,4,4,4,4,4,4,0,0x64, -4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4, -4,0,4,4,0,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0,0,0, +0,0,0,4,0x64,4,4,4,4,0,0,4,4,4,4,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,4,4,4,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, +4,4,4,0,4,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0, +4,4,4,4,4,4,0,0x64,4,4,4,4,4,4,4,4, +0,0,4,4,4,4,4,4,4,0,4,4,0,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,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,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,0,4,0,4,4,0,4, +4,4,0x64,4,0x64,0x64,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, +0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,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, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0x64,0,0,0,0,0,0,0x60,0x60,0x64, -0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4, -4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44, -0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0x64,0, +0,0,0,0,0,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60, +0x60,0x60,0x60,4,4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0,0, 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,1,1,1,1,1,1,1,1,0x21,0x21,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,0x21,0x21,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,0x21,0x21,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,0x21,0x21,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,0x21,0x21,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,0x21,0x21,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,0x21,0x21,1,1,1,1,1,1,1,1, +1,0,0x21,0x21,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,0x21,0x21, +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,0x21,0x21,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,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,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,0x21,0x21,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,0x21,0x21, +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,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, +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, -1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,0, +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,4,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,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,0,0,0,0,0,0,0,0,4,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,4,4,4,4,4, +0,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, -4,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,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,0,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0,0x44,0x44, -0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0, -0,0,0,0,0,0,0,0,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0, +0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, 0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, +0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, 0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, -0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x64,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,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,0,0,0,0,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,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,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[1948]={ @@ -900,13 +913,13 @@ static const UCaseProps ucase_props_singleton={ ucase_props_trieIndex+3228, NULL, 3228, - 8292, + 8492, 0x188, 0xd18, 0x0, 0x0, 0xe0800, - 0x2cfc, + 0x2dc4, NULL, 0, FALSE, FALSE, 0, NULL }, { 3,0,0,0 } diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index 391140d6c5e2b9..8eec93c6e3ea3b 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -20,8 +20,11 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" +#include "unicode/bytestream.h" #include "unicode/casemap.h" #include "unicode/edits.h" +#include "unicode/stringoptions.h" +#include "unicode/stringpiece.h" #include "unicode/ubrk.h" #include "unicode/uloc.h" #include "unicode/ustring.h" @@ -32,6 +35,7 @@ #include "unicode/utf.h" #include "unicode/utf8.h" #include "unicode/utf16.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "uassert.h" @@ -39,27 +43,6 @@ #include "ucasemap_imp.h" #include "ustr_imp.h" -U_NAMESPACE_BEGIN - -namespace { - -// TODO: share with UTF-16? inline in ucasemap_imp.h? -int32_t checkOverflowAndEditsError(int32_t destIndex, int32_t destCapacity, - Edits *edits, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode)) { - if (destIndex > destCapacity) { - errorCode = U_BUFFER_OVERFLOW_ERROR; - } else if (edits != NULL) { - edits->copyErrorTo(errorCode); - } - } - return destIndex; -} - -} // namespace - -U_NAMESPACE_END - U_NAMESPACE_USE /* UCaseMap service object -------------------------------------------------- */ @@ -150,148 +133,39 @@ ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode) { /* TODO(markus): Move to a new, separate utf8case.cpp file. */ +namespace { + /* append a full case mapping result, see UCASE_MAX_STRING_LENGTH */ -static inline int32_t -appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - int32_t result, const UChar *s, - int32_t cpLength, uint32_t options, icu::Edits *edits) { - UChar32 c; - int32_t length; - UErrorCode errorCode; +inline UBool +appendResult(int32_t cpLength, int32_t result, const UChar *s, + ByteSink &sink, uint32_t options, icu::Edits *edits, UErrorCode &errorCode) { + U_ASSERT(U_SUCCESS(errorCode)); /* decode the result */ if(result<0) { /* (not) original code point */ if(edits!=NULL) { edits->addUnchanged(cpLength); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } } - c=~result; - if(destIndex(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - if(edits!=NULL) { - edits->addReplace(cpLength, length); - } - // We might have an overflow, but we know the actual length. - return destIndex+length; - } else if(destIndexaddReplace(cpLength, 1); - } - return destIndex; + return ByteSinkUtil::appendChange(cpLength, s, result, sink, edits, errorCode); } else { - c=result; - length=U8_LENGTH(c); - if(edits!=NULL) { - edits->addReplace(cpLength, length); - } + ByteSinkUtil::appendCodePoint(cpLength, result, sink, edits); } } - // c>=0 single code point - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - - if(destIndex> 6) | 0xc0); } -static inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } - -static inline int32_t -appendTwoBytes(uint8_t *dest, int32_t destIndex, int32_t destCapacity, UChar32 c) { - U_ASSERT(0x370 <= c && c <= 0x3ff); // 2-byte UTF-8, main Greek block - if(2>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - int32_t limit=destIndex+2; - if(limit<=destCapacity) { - dest+=destIndex; - dest[0]=getTwoByteLead(c); - dest[1]=getTwoByteTrail(c); - } - return limit; -} +inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } -static inline int32_t -appendTwoBytes(uint8_t *dest, int32_t destIndex, int32_t destCapacity, const char *s) { - if(2>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - int32_t limit=destIndex+2; - if(limit<=destCapacity) { - dest+=destIndex; - dest[0]=(uint8_t)s[0]; - dest[1]=(uint8_t)s[1]; - } - return limit; -} - -static inline int32_t -appendUnchanged(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - const uint8_t *s, int32_t length, uint32_t options, icu::Edits *edits) { - if(length>0) { - if(edits!=NULL) { - edits->addUnchanged(length); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } - } - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, s, length); - } - destIndex+=length; - } - return destIndex; -} +} // namespace static UChar32 U_CALLCONV utf8_caseContextIterator(void *context, int8_t dir) { @@ -329,17 +203,15 @@ utf8_caseContextIterator(void *context, int8_t dir) { * Case-maps [srcStart..srcLimit[ but takes * context [0..srcLength[ into account. */ -static int32_t +static void _caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, - uint8_t *dest, int32_t destCapacity, const uint8_t *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { /* case mapping loop */ int32_t srcIndex=srcStart; - int32_t destIndex=0; - while(srcIndexcpStart=cpStart=srcIndex; UChar32 c; @@ -347,45 +219,32 @@ _caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, csc->cpLimit=srcIndex; if(c<0) { // Malformed UTF-8. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+cpStart, srcIndex-cpStart, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - continue; - } - const UChar *s; - c=map(c, utf8_caseContextIterator, csc, &s, caseLocale); - destIndex = appendResult(dest, destIndex, destCapacity, c, s, - srcIndex - cpStart, options, edits); - if (destIndex < 0) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + ByteSinkUtil::appendUnchanged(src+cpStart, srcIndex-cpStart, + sink, options, edits, errorCode); + } else { + const UChar *s; + c=map(c, utf8_caseContextIterator, csc, &s, caseLocale); + appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode); } } - - return destIndex; } #if !UCONFIG_NO_BREAK_ITERATION -U_CFUNC int32_t U_CALLCONV +U_CFUNC void U_CALLCONV ucasemap_internalUTF8ToTitle( int32_t caseLocale, uint32_t options, BreakIterator *iter, - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { - if(U_FAILURE(errorCode)) { - return 0; + if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) { + return; } /* set up local variables */ UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - int32_t destIndex=0; int32_t prev=0; UBool isFirstIndex=TRUE; @@ -404,45 +263,36 @@ ucasemap_internalUTF8ToTitle( } /* - * 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[ + * Segment [prev..index[ into 3 parts: + * a) skipped characters (copy as-is) [prev..titleStart[ + * b) first letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ if(prevaddReplace(1, 1); - } + ByteSinkUtil::appendCodePoint(1, 0x004A, sink, edits); titleLimit++; } else if (src[titleStart+1] == 0x004A) { // Keep the capital J from getting lowercased. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+titleStart+1, 1, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!ByteSinkUtil::appendUnchanged(src+titleStart+1, 1, + sink, options, edits, errorCode)) { + return; } titleLimit++; } @@ -495,26 +335,18 @@ ucasemap_internalUTF8ToTitle( if(titleLimit nextIndex || @@ -662,148 +492,146 @@ int32_t toUpper(uint32_t options, edits->addUnchanged(oldLength); } // Write unchanged text? - change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0; + change = (options & U_OMIT_UNCHANGED_TEXT) == 0; } } if (change) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, upper); - if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0308"); // restore or add a dialytika + ByteSinkUtil::appendTwoBytes(upper, sink); + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + sink.Append(u8"\u0308", 2); // restore or add a dialytika } - if (destIndex >= 0 && addTonos) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0301"); + if (addTonos) { + sink.Append(u8"\u0301", 2); } - while (destIndex >= 0 && numYpogegrammeni > 0) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0399"); + while (numYpogegrammeni > 0) { + sink.Append(u8"\u0399", 2); --numYpogegrammeni; } - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } } } else if(c>=0) { const UChar *s; c=ucase_toFullUpper(c, NULL, NULL, &s, UCASE_LOC_GREEK); - destIndex = appendResult(dest, destIndex, destCapacity, c, s, - nextIndex - i, options, edits); - if (destIndex < 0) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!appendResult(nextIndex - i, c, s, sink, options, edits, errorCode)) { + return; } } else { // Malformed UTF-8. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+i, nextIndex-i, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!ByteSinkUtil::appendUnchanged(src+i, nextIndex-i, + sink, options, edits, errorCode)) { + return; } } i = nextIndex; state = nextState; } - - return destIndex; } } // namespace GreekUpper U_NAMESPACE_END -static int32_t U_CALLCONV +static void U_CALLCONV ucasemap_internalUTF8ToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - int32_t destIndex = _caseMap( + _caseMap( caseLocale, options, ucase_toFullLower, - dest, destCapacity, src, &csc, 0, srcLength, - edits, errorCode); - return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); + sink, edits, errorCode); } -static int32_t U_CALLCONV +static void U_CALLCONV ucasemap_internalUTF8ToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { - int32_t destIndex; if (caseLocale == UCASE_LOC_GREEK) { - destIndex = GreekUpper::toUpper(options, dest, destCapacity, - src, srcLength, edits, errorCode); + GreekUpper::toUpper(options, src, srcLength, sink, edits, errorCode); } else { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - destIndex = _caseMap( + _caseMap( caseLocale, options, ucase_toFullUpper, - dest, destCapacity, src, &csc, 0, srcLength, - edits, errorCode); + sink, edits, errorCode); } - return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } -static int32_t U_CALLCONV +static void U_CALLCONV ucasemap_internalUTF8Fold(int32_t /* caseLocale */, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { /* case mapping loop */ int32_t srcIndex = 0; - int32_t destIndex = 0; - while (srcIndex < srcLength) { + while (U_SUCCESS(errorCode) && srcIndex < srcLength) { int32_t cpStart = srcIndex; UChar32 c; U8_NEXT(src, srcIndex, srcLength, c); if(c<0) { // Malformed UTF-8. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+cpStart, srcIndex-cpStart, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - continue; - } - const UChar *s; - c = ucase_toFullFolding(c, &s, options); - destIndex = appendResult(dest, destIndex, destCapacity, c, s, - srcIndex - cpStart, options, edits); - if (destIndex < 0) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + ByteSinkUtil::appendUnchanged(src+cpStart, srcIndex-cpStart, + sink, options, edits, errorCode); + } else { + const UChar *s; + c = ucase_toFullFolding(c, &s, options); + appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode); } } +} - return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); +void +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { + /* check argument values */ + if (U_FAILURE(errorCode)) { + return; + } + if ((src == nullptr && srcLength != 0) || srcLength < -1) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + // Get the string length. + if (srcLength == -1) { + srcLength = (int32_t)uprv_strlen((const char *)src); + } + + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, errorCode); + sink.Flush(); + if (U_SUCCESS(errorCode)) { + if (edits != nullptr) { + edits->copyErrorTo(errorCode); + } + } } -U_CFUNC int32_t +int32_t ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, + char *dest, int32_t destCapacity, + const char *src, int32_t srcLength, UTF8CaseMapper *stringCaseMapper, icu::Edits *edits, UErrorCode &errorCode) { - int32_t destLength; - /* check argument values */ if(U_FAILURE(errorCode)) { return 0; } if( destCapacity<0 || (dest==NULL && destCapacity>0) || - src==NULL || - srcLength<-1 + (src==NULL && srcLength!=0) || srcLength<-1 ) { errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; @@ -823,12 +651,21 @@ ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_P return 0; } - if(edits!=NULL) { + CheckedArrayByteSink sink(dest, destCapacity); + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } - destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR - dest, destCapacity, src, srcLength, edits, errorCode); - return u_terminateChars((char *)dest, destCapacity, destLength, &errorCode); + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, errorCode); + sink.Flush(); + if (U_SUCCESS(errorCode)) { + if (sink.Overflowed()) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + } else if (edits != nullptr) { + edits->copyErrorTo(errorCode); + } + } + return u_terminateChars(dest, destCapacity, sink.NumberOfBytesAppended(), &errorCode); } /* public API functions */ @@ -840,8 +677,8 @@ ucasemap_utf8ToLower(const UCaseMap *csm, UErrorCode *pErrorCode) { return ucasemap_mapUTF8( csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToLower, NULL, *pErrorCode); } @@ -852,8 +689,8 @@ ucasemap_utf8ToUpper(const UCaseMap *csm, UErrorCode *pErrorCode) { return ucasemap_mapUTF8( csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToUpper, NULL, *pErrorCode); } @@ -864,13 +701,43 @@ ucasemap_utf8FoldCase(const UCaseMap *csm, UErrorCode *pErrorCode) { return ucasemap_mapUTF8( UCASE_LOC_ROOT, csm->options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8Fold, NULL, *pErrorCode); } U_NAMESPACE_BEGIN +void CaseMap::utf8ToLower( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8ToLower, sink, edits, errorCode); +} + +void CaseMap::utf8ToUpper( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8ToUpper, sink, edits, errorCode); +} + +void CaseMap::utf8Fold( + uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8Fold, sink, edits, errorCode); +} + int32_t CaseMap::utf8ToLower( const char *locale, uint32_t options, const char *src, int32_t srcLength, @@ -878,8 +745,8 @@ int32_t CaseMap::utf8ToLower( UErrorCode &errorCode) { return ucasemap_mapUTF8( ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToLower, edits, errorCode); } @@ -890,8 +757,8 @@ int32_t CaseMap::utf8ToUpper( UErrorCode &errorCode) { return ucasemap_mapUTF8( ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToUpper, edits, errorCode); } @@ -902,8 +769,8 @@ int32_t CaseMap::utf8Fold( UErrorCode &errorCode) { return ucasemap_mapUTF8( UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8Fold, edits, errorCode); } diff --git a/deps/icu-small/source/common/ucasemap_imp.h b/deps/icu-small/source/common/ucasemap_imp.h index 79204226b00900..99a64902794e7d 100644 --- a/deps/icu-small/source/common/ucasemap_imp.h +++ b/deps/icu-small/source/common/ucasemap_imp.h @@ -9,16 +9,26 @@ #include "unicode/utypes.h" #include "unicode/ucasemap.h" +#include "unicode/uchar.h" #include "ucase.h" -#ifndef U_COMPARE_IGNORE_CASE -/* see also unorm.h */ /** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. + * Bit mask for the titlecasing iterator options bit field. + * Currently only 3 out of 8 values are used: + * 0 (words), U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * See stringoptions.h. + * @internal */ -#define U_COMPARE_IGNORE_CASE 0x10000 -#endif +#define U_TITLECASE_ITERATOR_MASK 0xe0 + +/** + * Bit mask for the titlecasing index adjustment options bit set. + * Currently two bits are defined: + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED. + * See stringoptions.h. + * @internal + */ +#define U_TITLECASE_ADJUSTMENT_MASK 0x600 /** * Internal API, used by u_strcasecmp() etc. @@ -32,7 +42,7 @@ u_strcmpFold(const UChar *s1, int32_t length1, UErrorCode *pErrorCode); /** - * Interanl API, used for detecting length of + * Internal API, used for detecting length of * shared prefix case-insensitively. * @param s1 input string 1 * @param length1 length of string 1, or -1 (NULL terminated) @@ -61,6 +71,44 @@ uprv_haveProperties(UErrorCode *pErrorCode); #ifdef __cplusplus +U_NAMESPACE_BEGIN + +class BreakIterator; // unicode/brkiter.h +class ByteSink; +class Locale; // unicode/locid.h + +/** Returns TRUE if the options are valid. Otherwise FALSE, and sets an error. */ +inline UBool ustrcase_checkTitleAdjustmentOptions(uint32_t options, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((options & U_TITLECASE_ADJUSTMENT_MASK) == U_TITLECASE_ADJUSTMENT_MASK) { + // Both options together. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return FALSE; + } + return TRUE; +} + +inline UBool ustrcase_isLNS(UChar32 c) { + // Letter, number, symbol, + // or a private use code point because those are typically used as letters or numbers. + // Consider modifier letters only if they are cased. + const uint32_t LNS = (U_GC_L_MASK|U_GC_N_MASK|U_GC_S_MASK|U_GC_CO_MASK) & ~U_GC_LM_MASK; + int gc = u_charType(c); + return (U_MASK(gc) & LNS) != 0 || (gc == U_MODIFIER_LETTER && ucase_getType(c) != UCASE_NONE); +} + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Returns nullptr if error. Pass in either locale or locID, not both. */ +U_CFUNC +BreakIterator *ustrcase_getTitleBreakIterator( + const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, + LocalPointer &ownedIter, UErrorCode &errorCode); + +#endif + +U_NAMESPACE_END + #include "unicode/unistr.h" // for UStringCaseMapper /* @@ -163,39 +211,43 @@ ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITE * UTF-8 version of UStringCaseMapper. * All error checking must be done. * The UCaseMap must be fully initialized, with locale and/or iter set as needed. - * src and dest must not overlap. */ -typedef int32_t U_CALLCONV +typedef void U_CALLCONV UTF8CaseMapper(int32_t caseLocale, uint32_t options, #if !UCONFIG_NO_BREAK_ITERATION icu::BreakIterator *iter, #endif - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode); #if !UCONFIG_NO_BREAK_ITERATION /** Implements UTF8CaseMapper. */ -U_CFUNC int32_t U_CALLCONV +U_CFUNC void U_CALLCONV ucasemap_internalUTF8ToTitle(int32_t caseLocale, uint32_t options, icu::BreakIterator *iter, - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode); #endif +void +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode); + /** * Implements argument checking and buffer handling * for UTF-8 string case mapping as a common function. */ -U_CFUNC int32_t +int32_t ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, + char *dest, int32_t destCapacity, + const char *src, int32_t srcLength, UTF8CaseMapper *stringCaseMapper, icu::Edits *edits, UErrorCode &errorCode); diff --git a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp index a253850fa290cf..c21dfb7698a8ad 100644 --- a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp @@ -31,6 +31,29 @@ U_NAMESPACE_BEGIN +void CaseMap::utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return; + } + UText utext = UTEXT_INITIALIZER; + utext_openUTF8(&utext, src.data(), src.length(), &errorCode); + LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); + if (iter == nullptr) { + utext_close(&utext); + return; + } + iter->setText(&utext, errorCode); + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, iter, + src.data(), src.length(), + ucasemap_internalUTF8ToTitle, sink, edits, errorCode); + utext_close(&utext); +} + int32_t CaseMap::utf8ToTitle( const char *locale, uint32_t options, BreakIterator *iter, const char *src, int32_t srcLength, @@ -42,19 +65,16 @@ int32_t CaseMap::utf8ToTitle( UText utext=UTEXT_INITIALIZER; utext_openUTF8(&utext, src, srcLength, &errorCode); LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); if(iter==NULL) { - iter=BreakIterator::createWordInstance(Locale(locale), errorCode); - ownedIter.adoptInstead(iter); - } - if(U_FAILURE(errorCode)) { utext_close(&utext); return 0; } iter->setText(&utext, errorCode); int32_t length=ucasemap_mapUTF8( ustrcase_getCaseLocale(locale), options, iter, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToTitle, edits, errorCode); utext_close(&utext); return length; @@ -88,17 +108,24 @@ ucasemap_utf8ToTitle(UCaseMap *csm, } UText utext=UTEXT_INITIALIZER; utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode); - if(csm->iter==NULL) { - csm->iter=BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode); - } if (U_FAILURE(*pErrorCode)) { return 0; } + if(csm->iter==NULL) { + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + if (iter == nullptr) { + utext_close(&utext); + return 0; + } + csm->iter = ownedIter.orphan(); + } csm->iter->setText(&utext, *pErrorCode); int32_t length=ucasemap_mapUTF8( csm->caseLocale, csm->options, csm->iter, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToTitle, NULL, *pErrorCode); utext_close(&utext); return length; diff --git a/deps/icu-small/source/common/uchar.cpp b/deps/icu-small/source/common/uchar.cpp index 03592fe036a61b..c3f037d73eeda9 100644 --- a/deps/icu-small/source/common/uchar.cpp +++ b/deps/icu-small/source/common/uchar.cpp @@ -729,8 +729,5 @@ upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { } /* add the start code point of each same-value range of the properties vectors trie */ - if(propsVectorsColumns>0) { - /* if propsVectorsColumns==0 then the properties vectors trie may not be there at all */ - utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); - } + utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); } diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index fd74402e2d8cfb..94de36673d72e3 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -11,145 +11,145 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={9,0,0,0}; +static const UVersionInfo dataVersion={0xa,0,0,0}; -static const uint16_t propsTrie_index[20780]={ -0x44e,0x456,0x45e,0x466,0x47e,0x486,0x48e,0x496,0x49e,0x4a6,0x4ac,0x4b4,0x4bc,0x4c4,0x4cc,0x4d4, -0x4da,0x4e2,0x4ea,0x4f2,0x4f5,0x4fd,0x505,0x50d,0x515,0x51d,0x519,0x521,0x529,0x531,0x536,0x53e, -0x546,0x54e,0x552,0x55a,0x562,0x56a,0x572,0x57a,0x576,0x57e,0x583,0x58b,0x591,0x599,0x5a1,0x5a9, -0x5b1,0x5b9,0x5c1,0x5c9,0x5ce,0x5d6,0x5d9,0x5e1,0x5e9,0x5f1,0x5f7,0x5ff,0x5fe,0x606,0x60e,0x616, -0x626,0x61e,0x62e,0x46e,0x46e,0x63e,0x646,0x636,0x656,0x658,0x660,0x64e,0x670,0x676,0x67e,0x668, -0x68e,0x694,0x69c,0x686,0x6ac,0x6b2,0x6ba,0x6a4,0x6ca,0x6d0,0x6d8,0x6c2,0x6e8,0x6f0,0x6f8,0x6e0, -0x708,0x70e,0x716,0x700,0x726,0x72c,0x734,0x71e,0x744,0x749,0x751,0x73c,0x761,0x768,0x770,0x759, -0x5fa,0x778,0x780,0x46e,0x788,0x790,0x798,0x46e,0x7a0,0x7a8,0x7b0,0x7b5,0x7bd,0x7c4,0x7cc,0x46e, -0x5b9,0x7d4,0x7dc,0x7e4,0x7ec,0x546,0x7fc,0x7f4,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x802,0x5b9,0x80a,0x800,0x812,0x5b9,0x80e,0x5b9,0x818,0x820,0x828,0x546,0x546,0x830, -0x838,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x83d,0x845,0x5b9,0x5b9,0x84d,0x855,0x85d,0x865,0x86d,0x5b9,0x875,0x87d,0x885, -0x895,0x5b9,0x89d,0x89f,0x8a7,0x88d,0x5b9,0x8aa,0x8be,0x8b2,0x8ba,0x8c6,0x5b9,0x8ce,0x8d4,0x8dc, -0x8e4,0x5b9,0x8f4,0x8fc,0x904,0x8ec,0x46e,0x46e,0x914,0x917,0x91f,0x90c,0x92f,0x927,0x5b9,0x936, -0x5b9,0x945,0x93e,0x94d,0x955,0x46e,0x95d,0x965,0x4ee,0x96d,0x970,0x976,0x97d,0x970,0x515,0x985, -0x49e,0x49e,0x49e,0x49e,0x98d,0x49e,0x49e,0x49e,0x99d,0x9a5,0x9ad,0x9b5,0x9bd,0x9c1,0x9c9,0x995, -0x9e1,0x9e9,0x9d1,0x9d9,0x9f1,0x9f9,0xa01,0xa09,0xa21,0xa11,0xa19,0xa29,0xa31,0xa40,0xa45,0xa38, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa55,0xa5d,0x8dc,0xa60,0xa68,0xa6f,0xa74,0xa7c, -0x8dc,0xa82,0xa81,0xa92,0xa95,0x8dc,0x8dc,0xa8a,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xaa4,0xaac,0xa9c, -0x8dc,0x8dc,0x8dc,0xab1,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xab7,0xabf,0x8dc,0xac7,0xace, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xa4d,0xa4d,0xa4d,0xa4d,0xad6,0xa4d,0xadd,0xae4, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0x8dc,0xaec,0xaf3,0xaf7,0xafd,0xb03,0xb0b,0xb10, -0x546,0xb20,0xb18,0xb28,0x49e,0x49e,0x49e,0xb30,0x4ee,0xb38,0x5b9,0xb3e,0xb4e,0xb46,0xb46,0x515, -0xb56,0xb5e,0xb66,0x46e,0xb6e,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0xb83, -0xb93,0xb8b,0x5fa,0x5b9,0xb9b,0x838,0x5b9,0xba3,0xbab,0xbb0,0x5b9,0x5b9,0xbb5,0x5a5,0x8dc,0xbbc, -0xbc4,0xbcc,0xbd2,0x8dc,0xbcc,0xbda,0x8dc,0xbc4,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0xbe2,0x5b9,0x5b9,0x5b9,0xbea,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xbf0,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xbf5,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x8dc,0x8dc, -0xbfd,0x5b9,0xc00,0x5b9,0xc08,0xc0e,0xc16,0xc1e,0xc23,0x5b9,0x5b9,0xc27,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc2e,0x5b9,0xc35,0xc3b,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc43,0x5b9,0x5b9,0x5b9,0xc4b,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc4d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc54,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0xc5b,0x5b9,0x5b9,0x5b9,0xc62,0xc6a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc6f,0x5b9,0x5b9,0xc77,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7b,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc81,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0xc87,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xc8f,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xc94,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc99,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xca6,0xcad,0xcb1,0x5b9,0x5b9,0x5b9,0xcb8,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x46e, -0xcc6,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xcbe,0x8dc,0xcce,0x94d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0xcd3,0xcdb,0x49e,0xceb,0xce3,0x5b9,0x5b9,0xcf3,0xcfb,0xd0b,0x49e,0xd10,0xd18,0xd1e,0x46e,0xd03, -0xd26,0xd2e,0x5b9,0xd36,0xd46,0xd49,0xd3e,0xd51,0x60e,0xd59,0xd60,0xd68,0x656,0xd78,0xd70,0xd80, -0x5b9,0xd88,0xd90,0xd98,0x5b9,0xda0,0xda8,0xdb0,0xdb8,0xdc0,0xdc4,0xdcc,0x4ee,0x4ee,0x5b9,0xdd4, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xddc,0xde3,0x89e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x5b9,0x5b9,0x5b9,0xdfb,0x5b9,0xcb9,0xe02,0xe07, -0x5b9,0x5b9,0x5b9,0xe0f,0x5b9,0x5b9,0x8a9,0x46e,0xe25,0xe15,0xe1d,0x5b9,0x5b9,0xe2d,0xe35,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xe3a,0xe42,0x5b9,0xe46,0x5b9,0xe4c,0xe50, -0xe58,0xe60,0xe67,0xe6f,0x5b9,0x5b9,0x5b9,0xe75,0xe8d,0x45e,0xe95,0xe9d,0xea2,0x8be,0xe7d,0xe85, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0x11b8,0x11b8,0x11f8,0x1238,0x1278,0x12b0,0x12f0,0x1330,0x1368,0x13a8,0x13d4,0x1414,0x1454,0x1464,0x14a4,0x14d8, -0x1518,0x1548,0x1588,0x15c8,0x15d8,0x160c,0x1644,0x1684,0x16c4,0x1704,0x1738,0x1764,0x17a4,0x17dc,0x17f8,0x1838, +static const uint16_t propsTrie_index[21148]={ +0x45c,0x464,0x46c,0x474,0x48c,0x494,0x49c,0x4a4,0x4ac,0x4b4,0x4ba,0x4c2,0x4ca,0x4d2,0x4da,0x4e2, +0x4e8,0x4f0,0x4f8,0x500,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x527,0x52f,0x537,0x53f,0x544,0x54c, +0x554,0x55c,0x560,0x568,0x570,0x578,0x580,0x588,0x584,0x58c,0x591,0x599,0x59f,0x5a7,0x5af,0x5b7, +0x5bf,0x5c7,0x5cf,0x5d7,0x5dc,0x5e4,0x5e7,0x5ef,0x5f7,0x5ff,0x605,0x60d,0x60c,0x614,0x61c,0x624, +0x634,0x62c,0x63c,0x644,0x47c,0x654,0x65c,0x64c,0x66c,0x66e,0x676,0x664,0x686,0x68c,0x694,0x67e, +0x6a4,0x6aa,0x6b2,0x69c,0x6c2,0x6c8,0x6d0,0x6ba,0x6e0,0x6e6,0x6ee,0x6d8,0x6fe,0x706,0x70e,0x6f6, +0x71e,0x724,0x72c,0x716,0x73c,0x742,0x74a,0x734,0x75a,0x75f,0x767,0x752,0x777,0x77e,0x786,0x76f, +0x608,0x78e,0x796,0x47c,0x79e,0x7a6,0x7ae,0x47c,0x7b6,0x7be,0x7c6,0x7cb,0x7d3,0x7da,0x7e2,0x47c, +0x5c7,0x7ea,0x7f2,0x7fa,0x802,0x554,0x812,0x80a,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x818,0x5c7,0x820,0x816,0x828,0x5c7,0x824,0x5c7,0x82e,0x836,0x83e,0x554,0x554,0x846, +0x84e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x853,0x85b,0x5c7,0x5c7,0x863,0x86b,0x873,0x87b,0x883,0x5c7,0x88b,0x893,0x89b, +0x8ab,0x5c7,0x8b3,0x8b5,0x8bd,0x8a3,0x5c7,0x8c0,0x8d4,0x8c8,0x8d0,0x8dc,0x5c7,0x8e4,0x8ea,0x8f2, +0x8fa,0x5c7,0x90a,0x912,0x91a,0x902,0x47c,0x47c,0x92a,0x92d,0x935,0x922,0x945,0x93d,0x5c7,0x94c, +0x5c7,0x95b,0x954,0x963,0x96b,0x47c,0x973,0x97b,0x4fc,0x983,0x986,0x98c,0x993,0x986,0x523,0x99b, +0x4ac,0x4ac,0x4ac,0x4ac,0x9a3,0x4ac,0x4ac,0x4ac,0x9b3,0x9bb,0x9c3,0x9cb,0x9d3,0x9d7,0x9df,0x9ab, +0x9f7,0x9ff,0x9e7,0x9ef,0xa07,0xa0f,0xa17,0xa1f,0xa37,0xa27,0xa2f,0xa3f,0xa47,0xa56,0xa5b,0xa4e, +0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa6b,0xa73,0x8f2,0xa76,0xa7e,0xa85,0xa8a,0xa92, +0x8f2,0xa99,0xa98,0xaa9,0xaac,0x8f2,0x8f2,0xaa1,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xabb,0xac3,0xab3, +0x8f2,0x8f2,0x8f2,0xac8,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xace,0xad6,0x8f2,0xade,0xae5, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xa63,0xa63,0xa63,0xa63,0xaed,0xa63,0xaf4,0xafb, +0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0x8f2,0xb03,0xb0a,0xb0e,0xb14,0xb1a,0xb22,0xb27, +0x554,0xb37,0xb2f,0xb3f,0x4ac,0x4ac,0x4ac,0xb47,0x4fc,0xb4f,0x5c7,0xb55,0xb65,0xb5d,0xb5d,0x523, +0xb6d,0xb75,0xb7d,0x47c,0xb85,0x8f2,0x8f2,0xb8c,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xb94,0xb9a, +0xbaa,0xba2,0x608,0x5c7,0xbb2,0x84e,0x5c7,0xbba,0xbc2,0xbc7,0x5c7,0x5c7,0xbcc,0x5b3,0x8f2,0xbd3, +0xa93,0xbdb,0xbe1,0x8f2,0xbdb,0xbe9,0x8f2,0xa93,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2, +0xbf1,0x5c7,0x5c7,0x5c7,0xbf9,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,0xbff,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc04,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,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,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,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8c0,0x8f2,0x8f2, +0xc0c,0x5c7,0xc0f,0x5c7,0xc17,0xc1d,0xc25,0xc2d,0xc32,0x5c7,0x5c7,0xc36,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc3d,0x5c7,0xc44,0xc4a,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc52,0x5c7,0x5c7,0x5c7,0xc5a,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc5c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc63,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0xc6a,0x5c7,0x5c7,0x5c7,0xc71,0xc79,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,0xc7e,0x5c7,0x5c7,0xc86,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,0x5c7,0x5c7,0x5c7,0xc8a,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,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,0xc8d,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,0x5c7,0x5c7,0x5c7,0xc90,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0xc96,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,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xc9e,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,0xca3,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,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,0x5c7,0x5c7,0x5c7,0xca8,0x5c7,0x5c7,0x5c7,0xcad,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,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xcb5,0xcbc,0xcc0,0x5c7,0x5c7,0x5c7,0xcc7,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,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x644, +0xcd5,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,0x5c7,0x5c7,0x5c7,0xccd,0x8f2,0xcdd,0x963,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0xce2,0xcea,0x4ac,0xcfa,0xcf2,0x5c7,0x5c7,0xd02,0xd0a,0xd1a,0x4ac,0xd1f,0xd27,0xd2d,0x47c,0xd12, +0xd35,0xd3d,0x5c7,0xd45,0xd55,0xd58,0xd4d,0xd60,0x61c,0xd68,0xd6f,0xd77,0x66c,0xd87,0xd7f,0xd8f, +0x5c7,0xd97,0xd9f,0xda7,0x5c7,0xdaf,0xdb7,0xdbf,0xdc7,0xdcf,0xdd3,0xddb,0x4fc,0x4fc,0x5c7,0xde3, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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, +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,0xdeb,0xdf2,0x8b4, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0x5c7,0x5c7,0x5c7,0xe0a,0x5c7,0xcc8,0xe11,0xe16, +0x5c7,0x5c7,0x5c7,0xe1e,0x5c7,0x5c7,0x8bf,0x47c,0xe34,0xe24,0xe2c,0x5c7,0x5c7,0xe3c,0xe44,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xe49,0xe51,0x5c7,0xe55,0x5c7,0xe5b,0xe5f, +0xe67,0xe6f,0xe76,0xe7e,0x5c7,0x5c7,0x5c7,0xe84,0xe9c,0x46c,0xea4,0xeac,0xeb1,0x8d4,0xe8c,0xe94, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0x11f0,0x11f0,0x1230,0x1270,0x12b0,0x12e8,0x1328,0x1368,0x13a0,0x13e0,0x140c,0x144c,0x148c,0x149c,0x14dc,0x1510, +0x1550,0x1580,0x15c0,0x1600,0x1610,0x1644,0x167c,0x16bc,0x16fc,0x173c,0x1770,0x179c,0x17dc,0x1814,0x1830,0x1870, 0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xbdd,0xa40,0xa40,0xa40,0xa40,0xc1d,0x1db,0x1db, 0xc5d,0xc9d,0xa40,0xa40,0xa40,0xa40,0xcdd,0xcfd,0xa40,0xa40,0xd3d,0xd7d,0xdbd,0xdfd,0xe3d,0xe7d, 0xebd,0xef4,0x1db,0x1db,0xf18,0xf4c,0x1db,0xf74,0x1db,0x1db,0x1db,0x1db,0xfa1,0x1db,0x1db,0x1db, -0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0xa40,0xa40,0xa40,0xa40,0xa40,0x1078, +0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0x1db,0x1db,0x1db,0x106e,0xa40,0x10ae, 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,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -172,1117 +172,1136 @@ static const uint16_t propsTrie_index[20780]={ 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,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0x10b8,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0x10ee,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, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x112e, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0xeaa,0xeb1,0xeb9,0x46e,0x5b9,0x5b9,0x5b9,0x5a5,0xec9,0xec1,0xee0,0xed1,0xed8,0xee8,0xb6a,0xef0, -0x46e,0x46e,0x46e,0x46e,0xd68,0x5b9,0xef8,0xf00,0x5b9,0xf08,0xf10,0xf14,0xf1c,0x5b9,0xf24,0x46e, -0x546,0x550,0xf2c,0x5b9,0xf30,0xf38,0xf48,0xf40,0x5b9,0xf50,0x5b9,0xf57,0x46e,0x46e,0x46e,0x46e, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x8aa,0xe4c,0x46e,0x46e,0x46e,0x46e, -0xf67,0xf5f,0xf6a,0xf72,0x8be,0xf7a,0x46e,0xf82,0xf8a,0xf92,0x46e,0x46e,0x5b9,0xfa2,0xfaa,0xf9a, -0xfba,0xfc1,0xfb2,0xfc9,0xfd1,0x46e,0xfe1,0xfd9,0x5b9,0xfe4,0xfec,0xff4,0xffc,0x1004,0x46e,0x46e, -0x5b9,0x5b9,0x100c,0x46e,0x546,0x1014,0x4ee,0x101c,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x1024,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x1034,0x5ef,0x103c,0x102c,0x92f,0x1044,0x104c,0x1052,0x106a,0x105a,0x1062,0x106e,0x92f,0x107e,0x1076,0x1086, -0x1096,0x108e,0x46e,0x46e,0x109d,0x10a5,0x611,0x10ad,0x10bd,0x6b2,0x10c5,0x10b5,0x46e,0x46e,0x46e,0x46e, -0x5b9,0x10cd,0x10d5,0x46e,0x5b9,0x10dd,0x10e5,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x10ed,0x10f5,0x46e, -0x5b9,0x10fd,0x1105,0x110d,0x5b9,0x111d,0x1115,0x46e,0x112d,0x1125,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x546,0x4ee,0x1135,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x5b9,0x113d,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1153,0x1158,0x1145,0x114d,0x1168, -0x1160,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8a9,0x46e,0x46e,0x46e,0x1178,0x1180,0x1188,0x1170,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1190,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1198,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x119a, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x113d,0x8be, -0x11a2,0x46e,0x46e,0xe42,0x11aa,0x5b9,0x11ba,0x11c2,0x11ca,0x11b2,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x11d2,0x11d7,0x11df,0x46e,0x46e,0x11e7,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ef,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x11f7,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x11ff,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x1207,0x120c,0x1214,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0x8dc,0x121c,0x8dc,0x1223,0x122b,0x1231,0x8dc,0x1237,0x8dc,0x8dc,0x123f, -0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0xa7e,0x1247,0x46e,0x46e,0x46e,0x46e,0x1257,0x125e,0x1263, -0x1269,0x1271,0x1279,0x1281,0x125b,0x1289,0x1291,0x1299,0x129e,0x1270,0x1257,0x125e,0x125a,0x1269,0x12a6,0x1258, -0x12a9,0x125b,0x12b1,0x12b9,0x12c1,0x12c8,0x12b4,0x12bc,0x12c4,0x12cb,0x12b7,0x12d3,0x124f,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x515,0x12e3,0x515, -0x12ea,0x12f1,0x12db,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x12f8,0x1300,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x1308,0x46e,0x546,0x1318,0x1310,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1328,0x1330,0x1338, -0x1340,0x1348,0x1350,0x46e,0x1320,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x1358,0x8dc, -0x8dc,0xb75,0x135d,0x1361,0xb7d,0x1369,0x136e,0x8dc,0x1358,0x8dc,0x1236,0x46e,0x1376,0x137e,0x1382,0x138a, -0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x1392,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0xa7f,0x139a,0x8dc,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x13a2,0x46e,0x1358,0x8dc,0x13aa, -0x8dc,0x13b2,0xb7f,0x46e,0x46e,0x13ba,0x13c2,0x13ca,0x46e,0xb7e,0x46e,0xee8,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x13d2,0x5b9,0x5b9, -0x13d9,0x5b9,0x5b9,0x5b9,0x13e1,0x5b9,0x13e9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc5f,0x5b9,0x5b9, -0x13f1,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x13f9,0x1401,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1408,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x140f,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x1416,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x141a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ff,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x1422,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1432,0x142a,0x142a,0x142a,0x46e,0x46e,0x46e,0x46e, -0x515,0x515,0x515,0x515,0x515,0x515,0x515,0x143a,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x1442,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x112e, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0xeb9,0xec0,0xec8,0x47c,0x5c7,0x5c7,0x5c7,0x5b3,0xed8,0xed0,0xeef,0xee0,0xee7,0xef7,0xb81,0xeff, +0x47c,0x47c,0x47c,0x47c,0xd77,0x5c7,0xf07,0xf0f,0x5c7,0xf17,0xf1f,0xf23,0xf2b,0x5c7,0xf33,0x47c, +0x554,0x55e,0xf3b,0x5c7,0xf3f,0xf47,0xf57,0xf4f,0x5c7,0xf5f,0x5c7,0xf66,0x47c,0x47c,0x47c,0x47c, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xb65,0x8c0,0xe5b,0x47c,0x47c,0x47c,0x47c, +0xf76,0xf6e,0xf79,0xf81,0x8d4,0xf89,0x47c,0xf91,0xf99,0xfa1,0x47c,0x47c,0x5c7,0xfb1,0xfb9,0xfa9, +0xfc9,0xfd0,0xfc1,0xfd8,0xfe0,0x47c,0xff0,0xfe8,0x5c7,0xff3,0xffb,0x1003,0x100b,0x1013,0x47c,0x47c, +0x5c7,0x5c7,0x101b,0x47c,0x554,0x1023,0x4fc,0x102b,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x1033,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x1043,0x5fd,0x104b,0x103b,0x945,0x1053,0x105b,0x1061,0x1079,0x1069,0x1071,0x107d,0x945,0x108d,0x1085,0x1095, +0x10a5,0x109d,0x47c,0x47c,0x10ac,0x10b4,0x61f,0x10bc,0x10cc,0x6c8,0x10d4,0x10c4,0x47c,0x47c,0x47c,0x47c, +0x5c7,0x10dc,0x10e4,0x47c,0x5c7,0x10ec,0x10f4,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x10fc,0x1104,0x47c, +0x5c7,0x110c,0x1114,0x111c,0x5c7,0x112c,0x1124,0x47c,0x113c,0x1134,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x554,0x4fc,0x1144,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x115c,0x114c,0x1154,0x5c7,0x116c, +0x1164,0x5c7,0x1174,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x118a,0x118f,0x117c,0x1184,0x119f, +0x1197,0x47c,0x47c,0x11ae,0x11b2,0x11a6,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,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,0x8bf,0x47c,0x47c,0x47c,0x11c2,0x11ca,0x11d2,0x11ba,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11da,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,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,0x5c7,0x11e2,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11e4, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1174,0x8d4, +0x11ec,0x47c,0x47c,0xe51,0x11f4,0x5c7,0x1204,0x120c,0x1214,0x11fc,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x121c,0x1221,0x1229,0x47c,0x47c,0x1231,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,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,0x1239,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x1241,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8d4,0x47c,0x47c,0xe51,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x8b4,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x1249,0x124e,0x1256,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0xb94,0x8f2,0x125e,0x8f2,0x1265,0x126d,0x1273,0x8f2,0x1279,0x8f2,0x8f2,0x1281, +0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0xa95,0x1289,0x47c,0x47c,0x47c,0x47c,0x1299,0x12a0,0x12a5, +0x12ab,0x12b3,0x12bb,0x12c3,0x129d,0x12cb,0x12d3,0x12db,0x12e0,0x12b2,0x1299,0x12a0,0x129c,0x12ab,0x12e8,0x129a, +0x12eb,0x129d,0x12f3,0x12fb,0x1303,0x130a,0x12f6,0x12fe,0x1306,0x130d,0x12f9,0x1315,0x1291,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x523,0x1325,0x523, +0x132c,0x1333,0x131d,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x133a,0x1342,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x134a,0x47c,0x554,0x135a,0x1352,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x136a,0x1372,0x137a, +0x1382,0x138a,0x1392,0x47c,0x1362,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x139a,0x8f2, +0x8f2,0xb8c,0x139f,0x13a3,0xb94,0x13ab,0x13b0,0x8f2,0x139a,0x8f2,0x1278,0x47c,0x13b8,0x13c0,0x13c4,0x13cc, +0x13d4,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x13dc,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x13e4,0x13ec,0x8f2,0x8f2,0x8f2,0xb8c,0x8f2,0x8f2,0x13e4,0x47c,0x139a,0x8f2,0x13f4, +0x8f2,0x13fc,0xb96,0x47c,0x47c,0x139a,0xa93,0x1401,0x1406,0x140e,0x47c,0x1416,0xa99,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x141e,0x5c7,0x5c7, +0x1425,0x5c7,0x5c7,0x5c7,0x142d,0x5c7,0x1435,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc6e,0x5c7,0x5c7, +0x143d,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1445,0x144d,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,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xcad,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,0x5c7,0x5c7,0x5c7,0x1454,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x145b,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,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x1462,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,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xb65,0x47c,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,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,0x1466,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xf3f,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,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,0x146e,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,0x1476,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7, +0x5c7,0x5c7,0x147e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xf3f,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x148e,0x1486, +0x1486,0x1486,0x47c,0x47c,0x47c,0x47c,0x523,0x523,0x523,0x523,0x523,0x523,0x523,0x1496,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0x149e,0x45b,0x45b, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17, -0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17,0x17,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x14,0x17,0x15,0x1a,0x16,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,0xf,0,0,0,0,0,0,0,0, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17, +0x17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x14,0x17,0x15,0x1a,0x16, +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,0xf, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 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,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17, -0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a,0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17, -0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, -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,0x18, -2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17,0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a, +0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17,0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x18,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,0x18,2,2,2,2,2,2,2,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,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,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,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,1,2,1,2,1,1,2,1,2,1,2,2, -2,1,1,2,1,2,1,1,2,1,1,1,2,2,1,1, -1,1,2,1,1,2,1,1,1,2,2,2,1,1,2,1, -1,2,1,2,1,2,1,1,2,1,2,2,1,2,1,1, -2,1,1,1,2,1,2,1,1,2,2,5,1,2,2,2, -5,5,5,5,1,3,2,1,3,2,1,3,2,1,2,1, -2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2, +1,1,2,1,2,1,2,2,2,1,1,2,1,2,1,1, +2,1,1,1,2,2,1,1,1,1,2,1,1,2,1,1, +1,2,2,2,1,1,2,1,1,2,1,2,1,2,1,1, +2,1,2,2,1,2,1,1,2,1,1,1,2,1,2,1, +1,2,2,5,1,2,2,2,5,5,5,5,1,3,2,1, +3,2,1,3,2,1,2,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,2,1,3,2,1,2,1,1, 1,2,1,2,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,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,1,2,2,2,2,2, -2,2,1,1,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, +1,2,1,2,2,2,2,2,2,2,1,1,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, -2,2,2,2,2,2,2,2,5,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, -4,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, +5,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,4,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,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,1,2,1,2,4,0x1a,1,2,0,0,4,2, -2,2,0x17,1,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,1,2,2,1,1,1,2,2,2, +6,6,6,6,6,6,6,6,6,6,6,6,1,2,1,2, +4,0x1a,1,2,0,0,4,2,2,2,0x17,1,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,1, +2,2,1,1,1,2,2,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,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, +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,1,1,1,1, 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,2,2, -2,2,2,2,2,2,2,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, 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,0x1b,6,6,6,6,6, -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,1,2, +1,2,0x1b,6,6,6,6,6,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,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,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,1,1,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, +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,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,1,1,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,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0x17,0x13,0, -0,0x1b,0x1b,0x19,0,6,6,6,6,6,6,6,6,6,6,6, +2,2,2,2,0,0x17,0x13,0,0,0x1b,0x1b,0x19,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,0x13,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,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,0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19, -0x17,0x17,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,0x17, -0x10,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,6,6,6,6,6,6,6,0x13,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,5, -5,5,5,5,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,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,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,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, +0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19,0x17,0x17,0x1b,0x1b,6,6,6,6, +6,6,6,6,6,6,6,0x17,0x10,0,0x17,0x17,5,5,5,5, +5,5,5,5,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,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,6,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,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,5, 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,0x1b,6,6,6,6,6,6,4,4,6,6,0x1b,6,6, -6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,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,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, +0x17,5,6,6,6,6,6,6,6,0x10,0x1b,6,6,6,6,6, +6,4,4,6,6,0x1b,6,6,6,6,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,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, +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,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,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,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,5,5,5,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,6,6,6,6,6,6,6,6,4,4,0x1b,0x17, -0x17,0x17,4,0,0,0,0,0,6,6,6,6,4,6,6,6, -4,6,6,6,6,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,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,6,6, -6,6,4,6,6,6,6,6,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,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,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,6,0,0,0x17,0,6,6,0x10,6,6,6,6,6, +5,5,5,5,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, +6,6,6,6,4,6,6,6,4,6,6,6,6,6,0,0, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,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,6,6,6,6,4,6,6,6,6,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,6,6,6,0,0,0x17,0, +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, +6,6,0x10,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,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,0,0,0,0,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,5,5,6,6,0x17,0x17,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,4,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,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,5,5,5,6,8,6,5,8,8, -8,6,6,6,6,6,6,6,6,8,8,8,8,6,8,8, -5,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5, -5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb,0x3ccb,0x94b,0x1b,0x19,0,0,0,0, -5,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,5,5,5,5,0,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,6,6,6,6,6,6,6,6,6,6,6,6, +5,5,6,6,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x17,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +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,5, +5,5,6,8,6,5,8,8,8,6,6,6,6,6,6,6, +6,8,8,8,8,6,8,8,5,6,6,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb, +0x3ccb,0x94b,0x1b,0x19,5,0x17,0,0,5,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,5,5,0,0,6,5,8,8, +8,6,6,6,6,0,0,8,8,0,0,8,8,6,5,0, +0,0,0,0,0,0,0,8,0,0,0,0,5,5,0,5, +0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +6,6,5,5,5,6,0,0,0,0,0,0,0,0,0,0, +0,6,6,8,0,5,5,5,5,5,5,0,0,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, -5,5,0,0,6,5,8,8,8,6,6,6,6,0,0,8, -8,0,0,8,8,6,5,0,0,0,0,0,0,0,0,8, -0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,6,5,5,5,6,0,0, -0,0,0,0,0,0,0,0,0,6,6,8,0,5,5,5, -5,5,5,0,0,0,0,5,5,0,0,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,0, +5,5,0,0,6,0,8,8,8,6,6,0,0,0,0,6, +6,0,0,6,6,6,0,0,0,6,0,0,0,0,0,0, +0,5,5,5,5,0,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x19,0,0,0,0,0,0, +0,5,6,6,6,6,6,6,0,6,6,8,0,5,5,5, +5,5,5,5,5,5,0,5,5,5,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,5,0,5,5,0,5,5,0,0,6,0,8,8, -8,6,6,0,0,0,0,6,6,0,0,6,6,6,0,0, -0,6,0,0,0,0,0,0,0,5,5,5,5,0,5,0, +5,0,5,5,0,5,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,6,0,6,6,8,0,8,8,6,0,0, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x17,0x19,0,0,0,0,0,0,0,5,0,0,0,0,0,0, -0,6,6,8,0,5,5,5,5,5,5,5,5,5,0,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0,0,0,0,0,0,0,0, +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,5,0,5,5,5, -5,5,0,0,6,5,8,8,8,6,6,6,6,6,0,6, -6,8,0,8,8,6,0,0,5,0,0,0,0,0,0,0, +5,5,0,0,6,5,8,6,8,6,6,6,6,0,0,8, +8,0,0,8,8,6,0,0,0,0,0,0,0,0,6,8, +0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x19,0x1b,0,0,0,0,0,0,0,6,5,0,5,5,5, +5,5,5,0,0,0,5,5,5,0,5,5,5,5,0,0, +0,5,5,0,5,0,5,5,0,0,0,5,5,0,0,0, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0,0,8,8,6,8,8,0,0,0,8,8, +8,0,8,8,8,6,0,0,5,0,0,0,0,0,0,8, 0,0,0,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb, -0,0,0,0,0,0,0,0,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,5,0,5,5,5,5,5,0,0,6,5,8,6, -8,6,6,6,6,0,0,8,8,0,0,8,8,6,0,0, -0,0,0,0,0,0,6,8,0,0,0,0,5,5,0,5, -0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x1b,0,0,0,0,0, -0,0,6,5,0,5,5,5,5,5,5,0,0,0,5,5, -5,0,5,5,5,5,0,0,0,5,5,0,5,0,5,5, -0,0,0,5,5,0,0,0,5,5,5,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,0,0,8,8, -6,8,8,0,0,0,8,8,8,0,8,8,8,6,0,0, -5,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0, -5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b, -6,8,8,8,0,5,5,5,5,5,5,5,5,0,5,5, -5,0,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,0,0,0,5,6,6,6,8,8,8,8,0,6,6, -6,0,6,6,6,6,0,0,0,0,0,0,0,6,6,0, -5,5,5,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,5,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,6,8,8,0,5,5,5, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0, +0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8,0,5,5,5, 5,5,5,5,5,0,5,5,5,0,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,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,5,0,0,0,5,6,6, +6,8,8,8,8,0,6,6,6,0,6,6,6,6,0,0, +0,0,0,0,0,6,6,0,5,5,5,0,0,0,0,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,5,5,5,5,5,5, -0,6,8,8,0,5,5,5,5,5,5,5,5,0,5,5, +0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,6,8,8,0,5,5,5,5,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,5,5,5,5,5,5,0, -0,5,8,8,8,6,6,6,6,0,8,8,8,0,8,8, -8,6,5,0x1b,0,0,0,0,5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b, -0x364b,0xc94b,0x350b,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0,0,8,8,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,8,8,0,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,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,0,5,0,0, -5,5,5,5,5,5,5,0,0,0,6,0,0,0,0,8, -8,8,6,6,6,0,6,0,8,8,8,8,8,8,8,8, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,6,5,5,6,6,6,6,6,6,6,0,0,0,0,0x19, -5,5,5,5,5,5,4,6,6,6,6,6,6,6,6,0x17, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0,0,0,0, -0,5,5,0,5,0,0,5,5,0,5,0,0,5,0,0, -0,0,0,0,5,5,5,5,0,5,5,5,5,5,5,5, -0,5,5,5,0,5,0,5,0,0,5,5,0,5,5,5, -5,6,5,5,6,6,6,6,6,6,0,6,6,5,0,0, -5,5,5,5,5,0,4,0,6,6,6,6,6,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,5,5,5,5, -5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b, -0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6,0x1b,6,0x14,0x15,0x14,0x15,8,8, -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,5, -5,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,8,6,6,6,6,6,0x17,6,6,5,5,5,5, -5,6,6,6,6,6,6,6,6,6,6,6,0,6,6,6, +5,0,5,5,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,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb, +0x3fcb,0x1b,5,5,5,5,5,5,6,6,8,8,0,5,5,5, +5,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,5,5,5,5,5,5,6,6,5,8,8,8,6,6,6, +6,0,8,8,8,0,8,8,8,6,5,0x1b,0,0,0,0, +5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b,0x364b,0xc94b,0x350b,5,0,0,0,0, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,8,8, +0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8, +0,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,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,0,5,0,0,5,5,5,5,5,5,5,0, +0,0,6,0,0,0,0,8,8,8,6,6,6,0,6,0, +8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6, +6,6,6,0,0,0,0,0x19,5,5,5,5,5,5,4,6, +6,6,6,6,6,6,6,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0,0,0,0,0,5,5,0,5,0,0,5, +5,0,5,0,0,5,0,0,0,0,0,0,5,5,5,5, +0,5,5,5,5,5,5,5,0,5,5,5,0,5,0,5, +0,0,5,5,0,5,5,5,5,6,5,5,6,6,6,6, +6,6,0,6,6,5,0,0,5,5,5,5,5,0,4,0, +6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b, +6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6, +0x1b,6,0x14,0x15,0x14,0x15,8,8,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,5,5,0,0,0,0,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,8,6,6,6,6, +6,0x17,6,6,5,5,5,5,5,6,6,6,6,6,6,6, +6,6,6,6,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,6,6,6,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b, -0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,6, -6,8,6,6,6,6,6,6,8,6,6,8,8,6,6,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,8,8,6,6,5,5,5,5,6,6, -6,5,8,8,8,5,5,8,8,8,8,8,8,8,5,5, -5,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5, -5,5,6,8,8,6,6,8,8,8,8,8,8,6,5,8, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,8,8,8,6,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,5,5,5,5,0x17,4,5,5,5, -1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,0, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b, +0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,8,8,6,6,6,6,8,6,6,6,6,6,6, +8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,5,5,8,8, +6,6,5,5,5,5,6,6,6,5,8,8,8,5,5,8, +8,8,8,8,8,8,5,5,5,6,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,5,6,8,8,6,6,8, +8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,8,8,8,6,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,5, +5,5,5,0x17,4,5,5,5,1,1,1,1,1,1,0,1, +0,0,0,0,0,1,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,0, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, -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,5,5,5,5,5,5,5,5,0,0,6,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, -0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0, +5,0,5,5,5,5,0,0,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,5,5,5,5,5, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0,0,2,2,2,2,2,2,0,0, -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,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0xc,5,5,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,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0x17, -0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,6,6,6,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,6,6,6,0x17,0x17,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,6,6,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,5,5,5,0,6,6,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,6,6,8,6,6,6,6,6, -6,6,8,8,8,8,8,8,8,8,6,8,8,6,6,6, -6,6,6,6,6,6,6,6,0x17,0x17,0x17,4,0x17,0x17,0x17,0x19, -5,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,6,5,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x17,0x17,6, -6,6,0x10,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,4,5,5,5,5,5,5,5,5, +5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,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,0,0, +2,2,2,2,2,2,0,0,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,0x17,0x17,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0xc,5,5,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,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,6,6, +6,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,6,6, +6,0x17,0x17,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,6,6, +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,5,5,5,0,6,6, +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,0,0,0,0,0,0,0,0,5,5,5,5, -5,6,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,0,0, -0,0,0,0,0,0,0,0,6,6,6,8,8,8,8,6, -6,8,8,8,0,0,0,0,8,8,6,8,8,8,8,8, -8,6,6,6,0,0,0,0,0x1b,0,0,0,0x17,0x17,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,5,5, +6,6,8,6,6,6,6,6,6,6,8,8,8,8,8,8, +8,8,6,8,8,6,6,6,6,6,6,6,6,6,6,6, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,6,5,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, +0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,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,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,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,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x30b,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,0x1b,0x1b,0x1b, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,5,5,5,5,5,6,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,6,6,8,8,6,0,0,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0, +5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, +6,6,6,8,8,8,8,6,6,8,8,8,0,0,0,0, +8,8,6,8,8,8,8,8,8,6,6,6,0,0,0,0, +0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,8,6,8,6,6,6,6,6,6,6,0, -6,8,6,8,8,6,6,6,6,6,6,6,6,8,8,8, -8,8,8,6,6,6,6,6,6,6,6,6,6,0,0,6, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -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, -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,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,8,6,6, -6,6,8,8,6,6,8,6,6,6,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,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,5,6,8, -6,6,8,8,8,6,8,6,6,6,8,8,0,0,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,8,8,8,8,8,8,8,8, -6,6,6,6,6,6,6,6,8,8,6,6,0,0,0,0x17, -0x17,0x17,0x17,0x17,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,4,4, -4,4,0x17,0x17,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,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0, -0,0,0,0,6,6,6,0x17,6,6,6,6,6,6,6,6, -6,6,6,6,6,8,6,6,6,6,6,6,6,5,5,5, -5,6,5,5,5,5,8,8,6,5,5,0,6,6,0,0, -0,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, +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,0,0, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +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,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x30b,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,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,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,4, +0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,7,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,8,6,8, +6,6,6,6,6,6,6,0,6,8,6,8,8,6,6,6, +6,6,6,6,6,8,8,8,8,8,8,6,6,6,6,6, +6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,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,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,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, +0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8,6,6,8,6, +6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, +5,5,5,5,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,5,6,8,6,6,8,8,8,6,8,6, +6,6,8,8,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,5,5,5, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5, +8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17,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,4,4,4,4,0x17,0x17,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,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,6,6,6,0x17, +6,6,6,6,6,6,6,6,6,6,6,6,6,8,6,6, +6,6,6,6,6,5,5,5,5,6,5,5,5,5,8,8, +6,5,5,8,6,6,0,0,0,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,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,4, -4,4,4,4,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,0,6, -6,6,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, -2,2,1,2,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,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,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,0x10,0,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x2cb,4,0,0,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,4,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,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,0,4,4,4,4,4,4,4,4,4,4,4,4, -4,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +4,4,4,4,4,4,4,4,4,4,4,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,4,4,4,4,4,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,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,2,2,1,2,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,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,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, +0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x2cb,4,0,0, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4,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,0x2cb,0x30b,0x34b,0x38b, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,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,0x19,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,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,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,0x1b,0x358b,0x360b,0x364b,0x348b,0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb, -0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1, -1,1,2,2,1,1,1,2,0x1b,1,0x1b,0x1b,0x18,1,1,1, -1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a, -0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a, -0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1,2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b, -0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,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,0x18,0x18,0x18,0x18, -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,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +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,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,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,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,0x1b,0x358b,0x360b,0x364b,0x348b, +0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b, +0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,1,1,1,2, +0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1, +2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0,0x18,0x18,0x18,0x18, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,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,0x18,0x18,0x18,0x18,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,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,0x14,0x15,0x14,0x15, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,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,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,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,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,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,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0x1b,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, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b, -0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, -0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, +0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b, +0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,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, +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,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,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,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,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,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,0x14,0x15,0x14,0x15,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, -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,0x18, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,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,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,0x14,0x15,0x14,0x15,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,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +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,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,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,0,0,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,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,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,0,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,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,2,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, +0,0,0,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,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,2,1,1,1,2,2,1,2,1,2,1,2,1,1,1, -1,2,1,2,2,1,2,2,2,2,2,2,4,4,1,1, -1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6, -6,6,1,2,0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17, -2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,0,0,4,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,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,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,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17, -0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13, -0x17,0x17,0x13,0x17,0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x13,0x13,0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0,0,0, +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,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1, +1,2,2,1,2,1,2,1,2,1,1,1,1,2,1,2, +2,1,2,2,2,2,2,2,4,4,1,1,1,2,1,2, +2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2, +0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2, +2,2,0,2,0,0,0,0,0,2,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,4,0x17,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,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,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,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17, +0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17, +0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13, +0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, 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,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,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,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,0x1b,0x58a,0x5ca,0x60a, -0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4, -4,4,0x1b,0x1b,0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17, -0x1b,4,5,0x54a,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5, +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,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,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,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a, +0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4,4,4,0x1b,0x1b, +0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17,0x1b,4,5,0x54a, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,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,5,5,5,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,6,0x1a,0x1a,4,4,5,5,5,5,5, +5,5,5,0x17,4,4,4,5,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,0x17,4,4,4,5,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,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, +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,0, +0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +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,0x58b,0x5cb,0x60b,0x64b, +0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x7cb,0xa4b,0xccb,0xf4b, +0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b,0xc4b,0xc8b,0xccb,0xd0b, +0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb,0x100b,0x104b,0x108b,0x10cb, +0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -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, -0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b, -0xc4b,0xc8b,0xccb,0xd0b,0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb, -0x100b,0x104b,0x108b,0x10cb,0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5, +5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5,5, +5,5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5, +0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x705,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5, +5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, +0x685,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5, -5,5,5,5,0x685,5,0x645,5,5,5,5,5,5,5,5,5, +5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5, +5,5,5,0x7845,5,5,5,5,5,5,5,5,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x7985,5,5,5, +5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x7985,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7a85,5,5,5,5,5, +5,5,5,5,5,5,0x7a85,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845, -0xa45,0xcc5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,0x605,0x605, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x645, +5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845,0xa45,0xcc5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x605,0x605,0x605,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x585,5,5,5,5,5,5,5,0x585,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x585,5,5, +5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5, +5,5,0x585,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x785,0xa45,5,5,5,5,5,5,5,5, -5,5,5,5,0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5, +5,5,0x785,0xa45,5,5,5,5,5,5,5,5,5,5,5,5, +0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x745,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5, +5,5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x745,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x705,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5, +5,5,5,5,5,5,0x785,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5, -5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x7885,5,5,5, +5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5,0x645,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x5c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x7885,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5, +5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5, -0x1e45,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5, +5,5,5,5,5,5,0x6c5,5,5,5,5,5,0x1e45,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x545,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,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,4,0x17,0x17,0x17,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,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,4,4,6,6,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,5,6,7,7,7,0x17, -6,6,6,6,6,6,6,6,6,6,0x17,4,5,5,5,5, -5,5,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17, -0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,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,4,4,4,4,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,5,4,4,2,5,5,5,5,5,0x1a,0x1a,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -4,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2, -1,2,1,2,1,2,1,2,4,0x1a,0x1a,1,2,1,2,5, -1,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,1,1,1,1,0,1,1,1,1,1,2,1,2, -0,0,0,0,0,0,0,0,5,5,6,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,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b, -0x19,0x1b,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,8,8,8,8,6,6,0,0, -0,0,0,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,8,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,8,8,8,8,8,8,8,8, -8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,5,5,5,5,5,5,0x17,0x17,0x17,5, -0x17,5,0,0,5,5,5,5,5,5,6,6,6,6,6,6, -6,6,0x17,0x17,5,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,8,8,0,0,0,0,0,0,0,0,0,0,0,0x17, +5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,5,5, 5,5,5,5,5,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, -8,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, +5,5,0x545,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,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,4,0x17,0x17,0x17,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,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,4,4,6,6,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,5,6,7,7,7,0x17,6,6,6,6, +6,6,6,6,6,6,0x17,4,5,5,5,5,5,5,0x58a,0x5ca, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17,0x17,0x17,0x17,0x17, +0,0,0,0,0,0,0,0,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,4,4,4,4,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +4,4,2,5,5,5,5,5,0x1a,0x1a,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,4,2,2,2, +2,2,2,2,2,1,2,1,2,1,1,2,1,2,1,2, +1,2,1,2,4,0x1a,0x1a,1,2,1,2,5,1,2,1,2, +2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1, +1,1,1,0,1,1,1,1,1,2,1,2,0,0,0,0, +0,0,0,0,5,5,6,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,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,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,8,8,8,8,6,6,0,0,0,0,0,0, +0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,8,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,6,8,8,6,6,6,6,8,8,6,8,8,8, -5,5,5,5,5,6,4,5,5,5,5,5,5,5,5,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0, -5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,8, -8,6,6,8,8,6,6,0,0,0,0,0,0,0,0,0, -5,5,5,6,5,5,5,5,5,5,5,5,6,8,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -4,5,5,5,5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,5,6,6,6,5,5,6,6,5,5,5,5,5,6,6, -5,6,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,4,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,8,6,6,8,8, -0x17,0x17,5,4,4,8,6,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,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,0x1a,4,4,4,4, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,8,8,8,8,8,8,8,8,8,8,8,8, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,5,5,5,5,5,5,0x17,0x17,0x17,5,0x17,5,0,0, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,0x17,0x17, +5,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,8,8, +0,0,0,0,0,0,0,0,0,0,0,0x17,5,5,5,5, +5,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,8,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +8,8,6,6,6,6,8,8,6,8,8,8,5,5,5,5, +5,6,4,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0,5,5,5,5, +5,5,5,5,5,6,6,6,6,6,6,8,8,6,6,8, +8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,6, +5,5,5,5,5,5,5,5,6,8,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5, +5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,5,6,6, +6,5,5,6,6,5,5,5,5,5,6,6,5,6,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,4,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,8,6,6,8,8,0x17,0x17,5,4, +4,8,6,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -5,5,5,8,8,6,8,8,6,8,8,0x17,8,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -5,5,5,5,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,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,0x12,0x12,0x12,0x12, +2,2,2,2,2,2,2,0x1a,4,4,4,4,2,2,2,2, +2,2,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,5,5,5,8, +8,6,8,8,6,8,8,0x17,8,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, +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,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,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, +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,5,5,5,5, -5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,0x7c5, -5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7c5,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,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,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,5,5,5, -5,5,5,5,5,5,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,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,5,0x15,0x14,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,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,6,6,6,6,6,6,6,6,6,6,6,6, -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, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5,5,5,5,5, +5,5,5,0x605,5,5,5,5,5,5,5,0x7c5,5,5,5,5, +0x5c5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x7c5,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,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,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,5,5,5,5,5,5,5, +5,5,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,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,0,0x10,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,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, -0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,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,5,5,5,4,4,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,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b, -0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b, -0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b, -0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a, -0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, -0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a, -0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a, -0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,0x15,0x14,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,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, +6,6,6,6,6,6,6,6,6,6,6,6,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,0,0,0x10, +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, +0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,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,5, +5,5,4,4,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, +0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b, +0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, +0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b, +0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a,0x980a,0x980a,0x980a,0x980a, +0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34ca,0x344a,0x58a,0x68a, +0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a, +0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a,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,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,0x1b,0x1b,6,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0,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,6,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b, +0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb, +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,0x1bca,5,5, +5,5,5,5,5,5,0xb80a,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,6,6,6,6,6,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,0x58a,0x5ca,0x7ca, +0xa4a,0x1e4a,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,5,5,5,5, +5,5,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,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,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,2,2,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,2,2,2,2,2,2,2,2,5,5,5,5, +5,5,5,5,0,0,0,0,0,0,0,0,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,0x17,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,0,5, +5,0,0,0,5,0,0,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,0,0x17,0x58b,0x5cb,0x60b,0x7cb, +0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b, +0x68b,0x7cb,0xa4b,0x1e4b,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,0,5,5,0,0,0,0,0,0x58b, +0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b, +0,0,0,0x17,5,5,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,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b, +0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b, +0x4ecb,0x388b,0x3ccb,0x454b,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, +0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b, +0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, -0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0, -0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,0,0,0,0,6,6,6,0,0,0,0,6, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x11cb,0x17, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,6,6,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b, +5,5,5,5,5,6,6,0,0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,0x1b,5,5,5,5,5,5,5, 5,5,5,5,5,5,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,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,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, +5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -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,2,2,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -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,0x17,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,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,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,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,1,1,1,1,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,0, +0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b,0x30b,0x34b,0x38b,0x3cb, +0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b, +0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0,0x144b,0x16cb,0x194b,0x1bcb, +0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,8,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,6,6,6,6, +6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,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,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,5,5,5,5,5,5,5,6,6,6,6,6, +8,6,6,6,6,6,6,6,6,0,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,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,6,6,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,6,0x17,0x17,5,0,0,0,0,0, +0,0,0,0,8,5,5,5,5,0x17,0x17,0x17,0x17,0x17,6,6, +6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,0x17, +5,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,6, +6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b, +0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,0x17, +0x17,0x17,6,0,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,0,5,0,5,5,5,5,0,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,0x17,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,6,6,6,6,6,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,8,8,0,0,6,6,6,6,6,6,6,0,0,0, +6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, +6,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, +6,8,8,8,8,0,0,8,8,0,0,8,8,8,0,0, +5,0,0,0,0,0,0,8,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,0,5,5,0,0,0,5,0,0,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,0,0x17, -0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1b, -0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b, -0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,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,0,5,5,0,0, -0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb, -0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,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,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b, -0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b, -0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,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,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, -0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b, -0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b, -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,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,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,6,8,6,5,5,5,5,0x17,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17,0,0x17,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,0,0,0,0x58b, -0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,0x1b,5,5,5, +8,8,8,6,6,6,6,6,6,8,6,8,8,8,8,6, +6,8,6,6,5,5,0x17,5,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, +8,8,6,6,6,6,0,0,8,8,8,8,6,6,8,6, +6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,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,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +8,8,8,6,6,6,6,6,6,6,6,8,8,6,8,6, +6,0x17,0x17,0x17,5,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,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,6,8,6,8,8, +6,6,6,6,6,6,8,6,0,0,0,0,0,0,0,0, +8,8,6,6,6,6,8,6,6,6,6,6,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,5,5,5,5,5,5,5,0,0,0,6,6,6, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,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,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,6,6,6,6,6,6,8,5,6,6,6,6,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,6,0,0,0,0,0,0,0,0, +5,6,6,6,6,6,6,8,8,6,6,6,5,5,5,5, +5,6,6,6,6,6,6,8,8,6,6,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,0x17,0x17,0x17,0x17,0,0,0, -0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0,0,0,0,0,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,0,0,5,5,5,5,6,6,6,6,6,6, +6,6,6,6,6,6,6,8,6,6,0x17,0x17,0x17,0,0x17,0x17, +5,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, +5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb, +0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0, +0x17,0x17,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,5,5,5,5,5,5,8,6,6,6,6, +6,6,6,0,6,6,6,6,6,6,8,6,6,6,6,6, +6,6,6,6,0,8,6,6,6,6,6,6,6,8,6,6, +8,6,6,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,0,0,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,6, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,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,5,5,5,5,5,5,5,6,6,6,6,6,6,0, +0,0,6,0,6,6,0,6,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a, +0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,0,0,0,0,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a, +0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a, +0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a,0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a, +0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a,0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a, +0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca,5,5,5,5,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,1, -1,1,1,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,0,0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb, -0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0, -0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -8,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, -6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -8,8,8,6,6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17, -0x17,0x17,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,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,6, -6,6,6,6,8,6,6,6,6,6,6,6,6,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,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,6,6,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,6,0x17,0x17,5,0, -0,0,0,0,0,0,0,0,8,5,5,5,5,0x17,0x17,0x17, -0x17,0x17,6,6,6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,0x17,5,0x17,0x17,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, -6,6,6,6,6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0, 0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,8,8,6,8,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,6,0,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,0,5,0,5,5, -5,5,0,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,0x17,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,8,8,0,0,6,6,6,6,6,6, -6,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0, -0,0,0,0,6,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,6,8,8,8,8,0,0,8,8,0,0,8, -8,8,0,0,5,0,0,0,0,0,0,8,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,8,8,8,6,6,6,6, -6,6,6,6,8,8,6,6,6,8,6,5,5,5,5,0x17, -0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17, -0,0x17,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,8,6,8, -8,8,8,6,6,8,6,6,5,5,0x17,5,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,8,8,8,6,6,6,6,0,0,8,8,8,8, -6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, -6,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,8, -8,6,8,6,6,0x17,0x17,0x17,5,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +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,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,6, -8,6,8,8,6,6,6,6,6,6,8,6,0,0,0,0, -0,0,0,0,8,8,6,6,6,6,8,6,6,6,6,6, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, -0x17,0x17,0x17,0x1b,5,5,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,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, -0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,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,5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb, -0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb, -0x1e4b,0,0,0,0x17,0x17,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,5,5,5,5,5,5,8, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,8,6, -6,6,6,6,6,6,6,6,0,8,6,6,6,6,6,6, -6,8,6,6,8,6,6,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, -0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0, -0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, -0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a, -0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca, -0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a, -0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a, -0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a, -0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, 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,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +6,6,6,6,6,0x17,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, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0x17,0x17,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,6,6,6,6,6,0x17,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,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,6,6,6,6,6,6,6,0x17, -0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,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,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,8,8,8,8,8,8,8, +6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b, +4,4,4,4,0x17,0x1b,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b, +0x7a0b,0x7a8b,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,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +5,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,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,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,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,0,0,0,0,0,0,0,0,5,5,0,0, +8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,6,6,6,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,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,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, -5,5,5,5,5,5,5,5,5,5,0,0,0x1b,6,6,0x17, -0x10,0x10,0x10,0x10,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,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,0,0,0,0, +0,0,0,0,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,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,0,0,0x1b,6,6,0x17,0x10,0x10,0x10,0x10,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,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,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,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,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,0,0,0,0,0,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,0x58b,0x5cb,0x60b,0x64b, -0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,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,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,2,2,2,2,2,2,2,2,2,2, +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,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,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,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,1,1,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, -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, +1,1,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,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,1,1,2,2,2,2,2,2,0,0,1,1,1,1, +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,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,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, +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,1,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,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,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,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,6,6,6,6, +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,1,2, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0,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,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,0, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0,0,6,6,6,6,6, -6,6,0,6,6,0,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, -5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, -6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, -2,2,2,2,6,6,6,6,6,6,6,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +6,0,0,6,6,6,6,6,6,6,0,6,6,0,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,5,5,5,5,5,0,0,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6,6,6,6,0, +0,0,0,0,0,0,0,0,2,2,2,2,6,6,6,6, +6,6,6,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0x17,0x17,1,1,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, -0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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, -0,5,5,0,5,0,0,5,0,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,0,5,0,0,0,0, -0,0,5,0,0,0,0,5,0,5,0,5,0,5,5,5, -0,5,5,0,5,0,0,5,0,5,0,5,0,5,0,5, -0,5,5,0,5,0,0,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,5,5,5,0,5,0, -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,0,0,0,0, -0,5,5,5,0,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18,0x18,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,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,0,5,5,0,5,0,0,5, +0,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,0,5,0,0,0,0,0,0,5,0,0,0,0,5, +0,5,0,5,0,5,5,5,0,5,5,0,5,0,0,5, +0,5,0,5,0,5,0,5,0,5,5,0,5,0,0,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,5,5,5,0,5,0,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,0,0,0,0,0,5,5,5,0,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,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,0x2cb,0x2cb,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,0x54b,0,0,0,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,0,0,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,0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b, -0x54b,0,0,0,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,0,0,0,0,0,0,0x1b,0x1b, +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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,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, 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,0x1b, -0x1b,0,0,0,0,0,0,0,0x1b,0x1b,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,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +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,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a, +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, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -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,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0,0,0,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,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0,0,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,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,5,0x705,5,5,5,5,5,5, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,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,5,0x705,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, @@ -1302,6 +1321,10 @@ static const uint16_t propsTrie_index[20780]={ 5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,5, 5,5,5,5,5,0x645,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,0,5,5,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,0,0,0,0,0,0,0, +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,5,5,5,5,0x785,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, @@ -1317,156 +1340,156 @@ static const uint16_t propsTrie_index[20780]={ static const UTrie2 propsTrie={ propsTrie_index, - propsTrie_index+4408, + propsTrie_index+4464, NULL, - 4408, - 16372, + 4464, + 16684, 0xa40, - 0x11b8, + 0x11f0, 0x0, 0x0, 0x110000, - 0x5128, + 0x5298, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[29136]={ -0x4cf,0x4d7,0x4df,0x4e7,0x4ff,0x507,0x50f,0x517,0x51f,0x527,0x52f,0x537,0x53f,0x547,0x54f,0x557, -0x55e,0x566,0x56e,0x576,0x579,0x581,0x589,0x591,0x599,0x5a1,0x5a9,0x5b1,0x5b9,0x5c1,0x5c9,0x5d1, -0x5d9,0x5e1,0x5e8,0x5f0,0x5f8,0x600,0x608,0x610,0x618,0x620,0x625,0x62d,0x634,0x63c,0x644,0x64c, -0x654,0x65c,0x664,0x66c,0x673,0x67b,0x683,0x68b,0x693,0x69b,0x6a3,0x6ab,0x6b3,0x6bb,0x6c3,0x6cb, -0x195d,0xda7,0xe8f,0x6d3,0x4ef,0xeff,0xf07,0x1aeb,0x124c,0x1264,0x1254,0x125c,0x7cf,0x7d5,0x7dd,0x7e5, -0x7ed,0x7f3,0x7fb,0x803,0x80b,0x811,0x819,0x821,0x829,0x82f,0x837,0x83f,0x847,0x84f,0x857,0x85e, -0x866,0x86c,0x874,0x87c,0x884,0x88a,0x892,0x89a,0x8a2,0x8ba,0x8aa,0x8b2,0x8c2,0x8c9,0x8d1,0x8d9, -0x8e1,0x8e5,0x8ed,0x8f4,0x8fc,0x904,0x90c,0x914,0x156c,0x1574,0x91c,0x924,0x92c,0x934,0x93c,0x943, -0x15d2,0x15c2,0x15ca,0x18a0,0x18a8,0x1274,0x94b,0x126c,0x14b6,0x14b6,0x14b8,0x1288,0x1289,0x127c,0x127e,0x1280, -0x15da,0x15dc,0x953,0x15dc,0x95b,0x960,0x968,0x15e1,0x96e,0x15dc,0x974,0x97c,0xc7e,0x15e9,0x15e9,0x984, -0x15f9,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa, -0x15fa,0x15fa,0x15fa,0x15f1,0x98c,0x1602,0x1602,0x994,0xb8b,0xb93,0xb9b,0xba3,0x1612,0x160a,0x99c,0x9a4, -0x9ac,0x161c,0x1624,0x9b4,0x161a,0x9bc,0x1965,0xdaf,0xbab,0xbb3,0xbbb,0xbc0,0x1816,0xcb1,0xcb8,0x177e, -0xc4e,0x196d,0xdb7,0xdbf,0xdc7,0xdcf,0xfb7,0xfb7,0x1866,0x186b,0xceb,0xcf3,0x18dc,0x18e4,0x1a0e,0xe97, -0x18ec,0xd3b,0xd43,0x18f4,0x6db,0x4ef,0xf97,0xdd7,0x179e,0x1786,0x1796,0x178e,0x182e,0x1826,0x17ee,0xc5e, -0x1291,0x1291,0x1291,0x1291,0x1294,0x1291,0x1291,0x129c,0x9c4,0x12a4,0x9c8,0x9d0,0x12a4,0x9d8,0x9e0,0x9e8, -0x12b4,0x12ac,0x12bc,0x9f0,0x9f8,0xa00,0xa08,0xa10,0x12c4,0x12cc,0x12d4,0x12dc,0xa18,0x12e4,0x12eb,0x12f3, -0x12fb,0x1303,0x130b,0x1313,0x131b,0x1322,0x132a,0x1332,0x133a,0x1342,0x1345,0x1347,0x162c,0x1711,0x1717,0xa20, -0x134f,0xa28,0xa30,0x1469,0x146e,0x1471,0x1479,0x1357,0x1481,0x1481,0x1367,0x135f,0x136f,0x1377,0x137f,0x1387, -0x138f,0x1397,0x139f,0x13a7,0x171f,0x1776,0x18b0,0x19ee,0x13b7,0x13be,0x13c6,0x13ce,0x13af,0x13d6,0x1727,0x172e, -0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1736,0x1739,0x1736,0x1736,0x1741,0x1748,0x174a,0x1751, -0x1759,0x175d,0x175d,0x1760,0x175d,0x175d,0x1766,0x175d,0x17a6,0x185e,0x18b8,0xbc8,0xbce,0xbd4,0xbdc,0xbe1, -0x1806,0xc8e,0xc92,0x1873,0x17f6,0x17f6,0x17f6,0xc66,0x17fe,0xc86,0x1846,0xcdb,0xc6e,0xc76,0xc76,0x18fc, -0x1836,0x18c0,0xcc8,0xccb,0xa38,0x163c,0x163c,0xa40,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0xa48,0x6df, -0x149e,0x14c0,0xa50,0x14c8,0xa58,0x14d0,0x14d8,0x14e0,0xa60,0xa65,0x14e8,0x14ef,0xa6a,0xa72,0x1856,0xc56, -0xa7a,0x1546,0x154d,0x14f7,0x1555,0x155c,0x14ff,0xa82,0x1518,0x1518,0x151a,0x1507,0x150f,0x150f,0x1510,0x1564, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x1201,0x17ae,0x17ae, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1529,0x1211,0x1209, -0x1654,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a, -0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a, -0x165a,0x165a,0x165a,0x165a,0xa8a,0x1662,0xa92,0x1975,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908, -0x1904,0xd4b,0x1918,0x1910,0x191a,0x197d,0x197d,0xddf,0x180e,0x187b,0x18d0,0x18d4,0x18c8,0xcfb,0xd01,0xd04, -0x183e,0xcd3,0x1883,0xd0c,0x1922,0x1925,0xd53,0xde7,0x1935,0x192d,0xd5b,0xdef,0x1985,0x1989,0xdf7,0x105d, -0x193d,0xd63,0xd6b,0x1991,0x19a1,0x1999,0xdff,0xf5a,0xe9f,0xea7,0x1b5e,0x1015,0x1c03,0x1c03,0x19a9,0xe07, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, -0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, -0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, -0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, -0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, -0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, -0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, -0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, -0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, -0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, -0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, -0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, -0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, -0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, -0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, -0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, -0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, -0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, -0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0xa9a,0xe0f,0xe12, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c, -0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531, -0x1536,0x153e,0x176e,0x1219,0x184e,0x184e,0x121d,0x1224,0xaa2,0xaaa,0xab2,0x13f6,0x13fd,0x1405,0xaba,0x140d, -0x143e,0x143e,0x13e6,0x13ee,0x1415,0x1435,0x1436,0x1446,0x141d,0x13de,0xac2,0x1425,0xaca,0x142d,0xad2,0xad6, -0xce3,0x144e,0xade,0xae6,0x1456,0x145c,0x1461,0xaee,0xafe,0x14a6,0x14ae,0x1491,0x1496,0xb06,0xb0e,0xaf6, -0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c, -0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x1584,0x1584,0x1584,0x1584, -0x13bc,0x13bc,0x13fc,0x143c,0x147c,0x14bc,0x14fc,0x153c,0x1578,0x15b8,0x15e4,0x1624,0x1664,0x16a4,0x16e4,0x1724, -0x1764,0x17a0,0x17e0,0x1820,0x1860,0x1894,0x18d0,0x1910,0x1950,0x1990,0x19cc,0x1a0c,0x1a4c,0x1a8c,0x1acc,0x1b0c, -0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xe65,0xa40,0xa40,0xa40,0xa40,0xbfb,0x12fb,0x12fb, +static const uint16_t propsVectorsTrie_index[29236]={ +0x4c4,0x4cc,0x4d4,0x4dc,0x4f4,0x4fc,0x504,0x50c,0x514,0x51c,0x524,0x52c,0x534,0x53c,0x544,0x54c, +0x553,0x55b,0x563,0x56b,0x56e,0x576,0x57e,0x586,0x58e,0x596,0x59e,0x5a6,0x5ae,0x5b6,0x5be,0x5c6, +0x5ce,0x5d6,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61a,0x622,0x629,0x631,0x639,0x641, +0x649,0x651,0x659,0x661,0x668,0x670,0x678,0x680,0x688,0x690,0x698,0x6a0,0x6a8,0x6b0,0x6b8,0x6c0, +0x193e,0xd41,0xe2e,0x6c8,0x4e4,0xe95,0xe9d,0x1ad4,0x120d,0x1225,0x1215,0x121d,0x781,0x787,0x78f,0x797, +0x79f,0x7a5,0x7ad,0x7b5,0x7bd,0x7c3,0x7cb,0x7d3,0x7db,0x7e1,0x7e9,0x7f1,0x7f9,0x801,0x809,0x810, +0x818,0x81e,0x826,0x82e,0x836,0x83c,0x844,0x84c,0x854,0x122d,0x85c,0x864,0x86c,0x873,0x87b,0x883, +0x88b,0x88f,0x897,0x89e,0x8a6,0x8ae,0x8b6,0x8be,0x153d,0x1545,0x8c6,0x8ce,0x8d6,0x8de,0x8e6,0x8ed, +0x15a3,0x1593,0x159b,0x1879,0x1881,0x123d,0x8f5,0x1235,0x147f,0x147f,0x1481,0x1251,0x1252,0x1245,0x1247,0x1249, +0x15ab,0x15ad,0x8fd,0x15ad,0x905,0x90a,0x912,0x15b2,0x918,0x15ad,0x91e,0x926,0xc18,0x15ba,0x15ba,0x92e, +0x15ca,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, +0x15cb,0x15cb,0x15cb,0x15c2,0x936,0x15d3,0x15d3,0x93e,0xb25,0xb2d,0xb35,0xb3d,0x15e3,0x15db,0x946,0x94e, +0x956,0x15ed,0x15f5,0x95e,0x15eb,0x966,0x1946,0xd49,0xb45,0xb4d,0xb55,0xb5a,0x17e7,0xc4b,0xc52,0x174f, +0xbe8,0x194e,0xd51,0xd59,0xd61,0xd69,0xf4d,0xf4d,0x183f,0x1844,0xc85,0xc8d,0x18b5,0x18bd,0x19ef,0xe36, +0x18c5,0xcd5,0xcdd,0x18cd,0x6d0,0x4e4,0xf2d,0xd71,0x176f,0x1757,0x1767,0x175f,0x17ff,0x17f7,0x17bf,0xbf8, +0x125a,0x125a,0x125a,0x125a,0x125d,0x125a,0x125a,0x1265,0x96e,0x126d,0x972,0x97a,0x126d,0x982,0x98a,0x992, +0x127d,0x1275,0x1285,0x99a,0x9a2,0x128d,0x9aa,0x9b2,0x1295,0x129d,0x12a5,0x12ad,0x9ba,0x12b5,0x12bc,0x12c4, +0x12cc,0x12d4,0x12dc,0x12e4,0x12ec,0x12f3,0x12fb,0x1303,0x130b,0x1313,0x1316,0x1318,0x15fd,0x16e2,0x16e8,0x182f, +0x1320,0x9c2,0x9ca,0x143a,0x143f,0x1442,0x144a,0x1328,0x1452,0x1452,0x1338,0x1330,0x1340,0x1348,0x1350,0x1358, +0x1360,0x1368,0x1370,0x1378,0x16f0,0x1747,0x1889,0x19cf,0x1388,0x138f,0x1397,0x139f,0x1380,0x13a7,0x16f8,0x16ff, +0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1707,0x170a,0x1707,0x1707,0x1712,0x1719,0x171b,0x1722, +0x172a,0x172e,0x172e,0x1731,0x172e,0x172e,0x1737,0x172e,0x1777,0x1837,0x1891,0xb62,0xb68,0xb6e,0xb76,0xb7b, +0x17d7,0xc28,0xc2c,0x184c,0x17c7,0x17c7,0x17c7,0xc00,0x17cf,0xc20,0x1817,0xc75,0xc08,0xc10,0xc10,0x18d5, +0x1807,0x1899,0xc62,0xc65,0x9d2,0x160d,0x160d,0x9da,0x1615,0x1615,0x1615,0x1615,0x1615,0x1615,0x9e2,0x6d4, +0x1489,0x1491,0x9ea,0x1499,0x9f2,0x14a1,0x14a9,0x14b1,0x9fa,0x9ff,0x14b9,0x14c0,0xa04,0xa0c,0x1827,0xbf0, +0xa14,0x1517,0x151e,0x14c8,0x1526,0x152d,0x14d0,0xa1c,0x14e9,0x14e9,0x14eb,0x14d8,0x14e0,0x14e0,0x14e1,0x1535, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x11c2,0x177f,0x177f, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14fa,0x1936,0x11ca, +0x1625,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b, +0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b, +0x162b,0x162b,0x162b,0x162b,0xa24,0x1633,0xa2c,0x1956,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18dd,0xce5,0x18f1,0x18e9,0x18f3,0x195e,0x195e,0xd79,0x17df,0x1854,0x18a9,0x18ad,0x18a1,0xc95,0xc9b,0xc9e, +0x180f,0xc6d,0x185c,0xca6,0x18fb,0x18fe,0xced,0xd81,0x190e,0x1906,0xcf5,0xd89,0x1966,0x196a,0xd91,0xff3, +0x1916,0xcfd,0xd05,0x1972,0x1982,0x197a,0xd99,0xef0,0xe3e,0xe46,0x1b47,0xfab,0x1bec,0x1bec,0x198a,0xda1, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0xa34,0xda9,0xdac, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502, +0x1507,0x150f,0x173f,0x11d2,0x181f,0x181f,0x11d6,0x11dd,0xa3c,0xa44,0xa4c,0x13c7,0x13ce,0x13d6,0xa54,0x13de, +0x140f,0x140f,0x13b7,0x13bf,0x13e6,0x1406,0x1407,0x1417,0x13ee,0x13af,0xa5c,0x13f6,0xa64,0x13fe,0xa6c,0xa70, +0xc7d,0x141f,0xa78,0xa80,0x1427,0x142d,0x1432,0xa88,0xa98,0x146f,0x1477,0x1462,0x1467,0xaa0,0xaa8,0xa90, +0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d, +0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x1555,0x1555,0x1555,0x1555, +0x1390,0x1390,0x13d0,0x1410,0x1450,0x1490,0x14d0,0x1510,0x154c,0x158c,0x15b8,0x15f8,0x1638,0x1678,0x16b8,0x16f8, +0x1738,0x1774,0x17b4,0x17f4,0x1834,0x1868,0x18a4,0x18e4,0x1924,0x1964,0x19a0,0x19e0,0x1a20,0x1a60,0x1aa0,0x1ae0, +0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xe65,0xa40,0xa40,0xa40,0xa40,0xbfb,0x1290,0x1290, 0xea5,0xee5,0xa40,0xa40,0xa40,0xa40,0xc3b,0xc5b,0xa40,0xa40,0xc9b,0xcdb,0xd1b,0xe2d,0xded,0xd5d, -0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b, -0x123b,0x123b,0x123b,0x123b,0xf25,0x127b,0x10bb,0x10fb,0x12bb,0x1045,0x107b,0x107b,0x107b,0xf65,0xf85,0xfc5, +0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0, +0x11d0,0x11d0,0x11d0,0x11d0,0xf25,0x1210,0x1045,0x1085,0x1250,0x1090,0x12d0,0x12d0,0x12d0,0xf65,0xf85,0xfc5, 0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85, 0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0x1005, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -1491,2096 +1514,2109 @@ static const uint16_t propsVectorsTrie_index[29136]={ 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xd9d,0xdad,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,0xd1d, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x113b, -0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb, -0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x117b, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0xbe9,0xbf0,0xbf8,0xc00,0x17b6,0x17b6,0x17b6,0xc08,0xc10,0xc13,0x17e6,0x17de,0xc46,0xd73,0xd77,0xd7b, -0x4ef,0x4ef,0x4ef,0x4ef,0xd83,0x1945,0xd8b,0xfaf,0x166a,0xb16,0xb1c,0x106d,0xc1b,0x181e,0xcc0,0x4ef, -0x167f,0x1672,0x1677,0x17be,0xc23,0xc2b,0x11c6,0x11cc,0x1b46,0xfcc,0x1b36,0x6e7,0x4ef,0x4ef,0x4ef,0x4ef, -0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x101d,0x1025,0x102d,0x4ef,0x4ef,0x4ef,0x4ef, -0xc33,0xc36,0xe1a,0x1bae,0x1065,0x6ef,0x4ef,0x10fe,0xd14,0xd93,0x4ef,0x4ef,0x1afb,0xf62,0xf6a,0x1bee, -0xc9a,0xca1,0xca9,0x19b1,0x1b8e,0x4ef,0x1b6e,0x103d,0x19b9,0xe22,0xe2a,0xe32,0x108d,0x6f7,0x4ef,0x4ef, -0x19c1,0x19c1,0x6ff,0x4ef,0x1c1b,0x1116,0x1c13,0x111e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0xe3a,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x1a16,0x1a18,0xeaf,0xeb6,0x19d1,0x19c9,0xe42,0xf8f,0x1af3,0xf4a,0xf52,0x1035,0x1b0b,0x1b0f,0xf87,0x10ad, -0x1000,0x1005,0x707,0x4ef,0x1106,0x110e,0x1b56,0x100d,0xfe2,0xfe8,0xff0,0xff8,0x4ef,0x4ef,0x4ef,0x4ef, -0x1c5b,0x1c53,0x11b6,0x11be,0x1bd6,0x1bce,0x10d4,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1bbe,0x1095,0x109d,0x10a5, -0x1b86,0x1b7e,0x104d,0x11ae,0x1b17,0xf9f,0x70f,0x4ef,0x10e4,0x10ec,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x1be6,0x1bde,0x10dc,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x79a,0x79e,0x717,0x7a6,0x71e, -0x726,0x1bb6,0x1085,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1174,0x1179,0x1181,0x1188,0x11a0, -0x11a6,0x4ef,0x4ef,0x72e,0x732,0x73a,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x188b,0x188b,0x188b,0x188b,0x188b, -0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b, -0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x1890,0xd1c,0xd23,0xd23,0xd23,0x1898,0x1898,0x1898,0xd2b,0x1c0b, -0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x742,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9, -0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19db,0x19d9,0x19e3, -0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19e6,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x74a,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20, -0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0xebe,0x1055,0x752,0x4ef, -0x4ef,0x756,0xfa7,0x1ba6,0x1b9e,0x1075,0x107d,0x75e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x1b03,0x1b03,0xf72,0xf77,0xf7f,0x4ef,0x4ef,0x1198,0xec6,0xec7,0xec7,0xec7,0xec7, -0xec7,0xec7,0xec7,0x766,0x4ef,0x4ef,0x762,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7, -0x7b7,0x7b7,0x76e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1b3e,0x1b3e,0x1b3e,0xfbf,0xfc4, -0x776,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1687,0x1687,0x1687,0x1687,0x1687, -0x1687,0x1687,0xb24,0x1697,0xb2c,0x1698,0x168f,0x16a0,0x16a6,0x16ae,0xb34,0x17d6,0x17d6,0x77e,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x17c6,0x17c6,0xc3e,0xd33,0x4ef,0x4ef,0x4ef,0x4ef,0x16df,0x16e6,0xb3c,0x16e9,0xb44, -0xb4c,0xb54,0x16e3,0xb5c,0xb64,0xb6c,0x16e8,0x16f0,0x16df,0x16e6,0x16e2,0x16e9,0x16f1,0x16e0,0x16e7,0x16e3, -0xb73,0x16b6,0x16be,0x16c5,0x16cc,0x16b9,0x16c1,0x16c8,0x16cf,0xb7b,0x16d7,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33, -0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c23,0x1c26,0x1c23,0x1c2d,0x1164, -0x786,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1190,0x78e,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x792,0x10b5,0x1bc6,0x10bb, -0x1bc6,0x10c3,0x10c8,0x10cc,0x10cc,0x1126,0x112e,0x1136,0x113e,0x1146,0x114c,0x1154,0x115c,0x7ae,0x7ae,0x7ae, -0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae, -0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae, -0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7af,0xb83,0x16f9,0x16f9, -0x16f9,0x7bf,0x7bf,0x7bf,0x7bf,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x7c7,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,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,0x194d,0xd9b,0x1955, -0x1955,0xd9f,0xecf,0xed7,0xedf,0xe4a,0xe50,0x19fe,0xe58,0x19f6,0xe60,0xe64,0xe6b,0xe73,0xe7a,0xe82, -0xe87,0xe87,0xe87,0xe87,0xe87,0x1a4f,0x1a57,0x1a5f,0x1a63,0x1a6b,0x1a30,0x1a73,0x1a7b,0x1a5f,0x1a83,0x1a8b, -0x1a92,0x1a9a,0x1a38,0x1a5f,0x1a9d,0x1a40,0x1a47,0x1aa5,0x1aab,0x1b27,0x1b2e,0x1b1f,0x1ab3,0x1abb,0x1ac3,0x1acb, -0x1b96,0x1ad3,0x1adb,0xee7,0xeef,0x1a28,0x1a28,0x1a28,0xef7,0x1b4e,0x1b4e,0xfd4,0xfda,0x1b76,0x1b76,0x1b76, -0x1b76,0x1b76,0x1b76,0x1045,0x4ef,0x1c4b,0x1c43,0x116c,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0xf0f,0xf17,0xf1f, -0xf27,0xf2f,0xf37,0xf3e,0xf42,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6, -0x1bf6,0x1bf6,0x1bf6,0x1bfb,0x1bf6,0x1bf6,0x1bf6,0x10f4,0x10f6,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x11d4,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b, -0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x11dc,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x122c,0x11e4,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11ec,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709, -0x1709,0x1709,0x1709,0x1709,0x1709,0x1234,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11ed,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11ed,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x11f5,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x123c,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1244,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x1594,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x159c,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x4ce,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c7,0x2d0,0x2ca,0x2ca,0x2cd,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x7f5,0x7ef,0x7d4,0x7cb, -0x7c2,0x7bf,0x7b6,0x7d1,0x7bc,0x7c8,0x7cb,0x7e6,0x7dd,0x7ce,0x7f2,0x7c5,0x7b3,0x7b3,0x7b3,0x7b3, -0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7da,0x7d7,0x7e0,0x7e0,0x7e0,0x7ef,0x7b6,0x801,0x801,0x801, -0x801,0x801,0x801,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, -0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7bc,0x7c2,0x7c8,0x7ec,0x7b0,0x7e9,0x7fe,0x7fe,0x7fe, -0x7fe,0x7fe,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7bc,0x7e3,0x7b9,0x7e0,0x2c4,0,0,0,0, +0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150, +0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x10d0, +0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190, +0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1110, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0xb83,0xb8a,0xb92,0xb9a,0x1787,0x1787,0x1787,0xba2,0xbaa,0xbad,0x17b7,0x17af,0xbe0,0xd0d,0xd11,0xd15, +0x4e4,0x4e4,0x4e4,0x4e4,0xd1d,0x191e,0xd25,0xf45,0x163b,0xab0,0xab6,0x1003,0xbb5,0x17ef,0xc5a,0x4e4, +0x1650,0x1643,0x1648,0x178f,0xbbd,0xbc5,0x115c,0x1162,0x1b2f,0xf62,0x1b1f,0x6dc,0x4e4,0x4e4,0x4e4,0x4e4, +0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0xfb3,0xfbb,0xfc3,0x4e4,0x4e4,0x4e4,0x4e4, +0xbcd,0xbd0,0xdb4,0x1b97,0xffb,0x6e4,0x4e4,0x1094,0xcae,0xd2d,0x4e4,0x4e4,0x1ae4,0xef8,0xf00,0x1bd7, +0xc34,0xc3b,0xc43,0x1992,0x1b77,0x4e4,0x1b57,0xfd3,0x199a,0xdbc,0xdc4,0xdcc,0x1023,0x6ec,0x4e4,0x4e4, +0x19a2,0x19a2,0x6f4,0x4e4,0x1c04,0x10ac,0x1bfc,0x10b4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0xdd4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x19f7,0x19f9,0xe4e,0xe55,0x19aa,0x19b2,0xddc,0xf25,0x1adc,0xee0,0xee8,0xfcb,0x1af4,0x1af8,0xf1d,0x1043, +0xf96,0xf9b,0x6fc,0x4e4,0x109c,0x10a4,0x1b3f,0xfa3,0xf78,0xf7e,0xf86,0xf8e,0x4e4,0x4e4,0x4e4,0x4e4, +0x1c44,0x1c3c,0x114c,0x1154,0x1bbf,0x1bb7,0x106a,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1ba7,0x102b,0x1033,0x103b, +0x1b6f,0x1b67,0xfe3,0x1144,0x1b00,0xf35,0x704,0x4e4,0x107a,0x1082,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x1bcf,0x1bc7,0x1072,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1c6c,0x1c64,0x11a6,0x1c5c,0x119e, +0x70c,0x1b9f,0x101b,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x110a,0x110f,0x1117,0x111e,0x1136, +0x113c,0x4e4,0x4e4,0x1182,0x1186,0x118e,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1864,0x1864,0x1864,0x1864,0x1864, +0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864, +0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1869,0xcb6,0xcbd,0xcbd,0xcbd,0x1871,0x1871,0x1871,0xcc5,0x1bf4, +0x1bf4,0x1bf4,0x1bf4,0x1bf4,0x1bf4,0x714,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba, +0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19bc,0x19ba,0x19c4, +0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19c7,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x71c,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, +0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0xe5d,0xfeb,0x724,0x4e4, +0x4e4,0x728,0xf3d,0x1b8f,0x1b87,0x100b,0x1013,0x730,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x1aec,0x1aec,0xf08,0xf0d,0xf15,0x4e4,0x4e4,0x112e,0x1a11,0x1c74,0x1c74,0x1c74,0x1c74, +0x1c74,0x1c74,0x1c74,0x117a,0x738,0x4e4,0x73c,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84, +0x1c84,0x1c84,0x1196,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1b27,0x1b27,0x1b27,0xf55,0xf5a, +0x744,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1658,0x1658,0x1658,0x1658,0x1658, +0x1658,0x1658,0xabe,0x1668,0xac6,0x1669,0x1660,0x1671,0x1677,0x167f,0xace,0x17a7,0x17a7,0x74c,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x1797,0x1797,0xbd8,0xccd,0x4e4,0x4e4,0x4e4,0x4e4,0x16b0,0x16b7,0xad6,0x16ba,0xade, +0xae6,0xaee,0x16b4,0xaf6,0xafe,0xb06,0x16b9,0x16c1,0x16b0,0x16b7,0x16b3,0x16ba,0x16c2,0x16b1,0x16b8,0x16b4, +0xb0d,0x1687,0x168f,0x1696,0x169d,0x168a,0x1692,0x1699,0x16a0,0xb15,0x16a8,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c, +0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c0c,0x1c0f,0x1c0c,0x1c16,0x10fa, +0x754,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1126,0x75c,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x760,0x104b,0x1baf,0x1051, +0x1baf,0x1059,0x105e,0x1062,0x1062,0x10bc,0x10c4,0x10cc,0x10d4,0x10dc,0x10e2,0x10ea,0x10f2,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x769,0xb1d,0x16ca,0x16ca, +0x16ca,0x771,0x771,0x771,0x771,0x179f,0x179f,0x179f,0x179f,0x179f,0x179f,0x179f,0x779,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,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,0x1926,0xd35,0x192e, +0x192e,0xd39,0xe65,0xe6d,0xe75,0xde4,0xdea,0x19df,0xdf2,0x19d7,0xdfa,0xdfe,0xe05,0xe0d,0xe14,0xe1c, +0xe24,0xe26,0xe26,0xe26,0xe26,0x1a38,0x1a40,0x1a48,0x1a4c,0x1a54,0x1a19,0x1a5c,0x1a64,0x1a48,0x1a6c,0x1a74, +0x1a7b,0x1a83,0x1a21,0x1a48,0x1a86,0x1a29,0x1a30,0x1a8e,0x1a94,0x1b10,0x1b17,0x1b08,0x1a9c,0x1aa4,0x1aac,0x1ab4, +0x1b7f,0x1abc,0x1ac4,0xe7d,0xe85,0x1a09,0x1a09,0x1a09,0xe8d,0x1b37,0x1b37,0xf6a,0xf70,0x1b5f,0x1b5f,0x1b5f, +0x1b5f,0x1b5f,0x1b5f,0xfdb,0x4e4,0x1c34,0x1c2c,0x1102,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0xea5,0xead,0xeb5, +0xebd,0xec5,0xecd,0xed4,0xed8,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf, +0x1bdf,0x1bdf,0x1bdf,0x1be4,0x1bdf,0x1bdf,0x1bdf,0x108a,0x108c,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x116a,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54, +0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1172,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x11e5,0x11ae,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x11b6,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x11ed,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ba,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ba,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x11f5,0x1acc, +0x1acc,0x1acc,0x1acc,0x1acc,0x1acc,0x11fd,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1205,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1565, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x156d, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x285,0x28e,0x288,0x288,0x28b,0x282,0x282, +0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, +0x7b0,0x7aa,0x78f,0x786,0x77d,0x77a,0x771,0x78c,0x777,0x783,0x786,0x7a1,0x798,0x789,0x7ad,0x780, +0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x795,0x792,0x79b,0x79b,0x79b,0x7aa, +0x771,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6, +0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x777,0x77d,0x783,0x7a7,0x76b, +0x7a4,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3, +0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x777,0x79e,0x774,0x79b,0x282, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x2d3,0x2d3,0x2d3,0x2d3, -0x2d3,0x2e2,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3, -0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d6,0x64b,0x80a,0x80d, -0x651,0x80d,0x807,0x648,0x63f,0x2dc,0x65d,0x2df,0x810,0x636,0x654,0x804,0x64e,0x65a,0x63c,0x63c, -0x642,0x2d9,0x648,0x645,0x63f,0x63c,0x65d,0x2df,0x639,0x639,0x639,0x64b,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x666,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x666,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x2e8,0x657,0x666,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x666,0x660,0x663,0x663,0x2e5,0x2e5, -0x2e5,0x2e5,0x660,0x2e5,0x663,0x663,0x663,0x2e5,0x663,0x663,0x2e5,0x2e5,0x660,0x2e5,0x663,0x663, -0x2e5,0x2e5,0x2e5,0x657,0x660,0x663,0x663,0x2e5,0x663,0x2e5,0x660,0x2e5,0x2f4,0x66c,0x2f4,0x2eb, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f1,0x669,0x2f4,0x66c, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, -0x2f4,0x2eb,0x672,0x669,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x669,0x675,0x66f, -0x2f4,0x2eb,0x2f4,0x2eb,0x669,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x675,0x66f,0x672,0x669,0x2f4, -0x66c,0x2f4,0x2eb,0x2f4,0x66c,0x678,0x672,0x669,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x672,0x669, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, -0x2f4,0x2eb,0x672,0x669,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2ee,0x2f7,0x303,0x303,0x2f7, -0x303,0x2f7,0x303,0x303,0x2f7,0x303,0x303,0x303,0x2f7,0x2f7,0x303,0x303,0x303,0x303,0x2f7,0x303, -0x303,0x2f7,0x303,0x303,0x303,0x2f7,0x2f7,0x2f7,0x303,0x303,0x2f7,0x303,0x306,0x2fa,0x303,0x2f7, -0x303,0x2f7,0x303,0x303,0x2f7,0x303,0x2f7,0x2f7,0x303,0x2f7,0x303,0x306,0x2fa,0x303,0x303,0x303, -0x2f7,0x303,0x2f7,0x303,0x303,0x2f7,0x2f7,0x300,0x303,0x2f7,0x2f7,0x2f7,0x300,0x300,0x300,0x300, -0x309,0x309,0x2fd,0x309,0x309,0x2fd,0x309,0x309,0x2fd,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x306, -0x67b,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x2f7,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, -0x303,0x2f7,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x2fa,0x309,0x309,0x2fd, -0x306,0x2fa,0x9e4,0x9e4,0x9e7,0x9e1,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, -0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, -0x9e7,0x9e1,0x9e7,0x9e1,0x9e4,0x9de,0x9e7,0x9e1,0xba3,0xca5,0x9e4,0x9de,0x9e4,0x9de,0x9e7,0x9e1, -0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0xca5,0xca5,0xca5,0xd9e, -0xd9e,0xd9e,0xda1,0xda1,0xd9e,0xda1,0xda1,0xd9e,0xd9e,0xda1,0xee5,0xee8,0xee8,0xee8,0xee8,0xee5, -0xee8,0xee5,0xee8,0xee5,0xee8,0xee5,0xee8,0xee5,0x30c,0x67e,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x67e,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30f,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x9ea,0x9ea,0x9ea, -0x9ea,0x9ea,0xca8,0xca8,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31b,0x31b,0x318,0x318,0x684,0x318,0x31e,0x687,0x321,0x687,0x687,0x687, -0x321,0x687,0x31e,0x31e,0x68a,0x324,0x318,0x318,0x318,0x318,0x318,0x318,0x681,0x681,0x681,0x681, -0x315,0x681,0x318,0xb1c,0x327,0x327,0x327,0x327,0x327,0x312,0x312,0x312,0x312,0x312,0x9f3,0x9f3, -0x9f0,0x9ed,0x9f0,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, -0xcab,0xcab,0xcab,0xcab,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x690,0x690,0x948,0x690,0x690,0x94b,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xc5d,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xeac,0xeac,0xeac,0xeac, -0xeaf,0xd71,0xd71,0xd71,0x693,0x693,0xb22,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2, -0xca2,0xca2,0xca2,0xca2,0xf93,0xf90,0xf93,0xf90,0x333,0x33c,0xf93,0xf90,0x27,0x27,0x342,0xeeb, -0xeeb,0xeeb,0x32a,0x14e8,0x27,0x27,0x27,0x27,0x33f,0x32d,0x351,0x330,0x351,0x351,0x351,0x27, -0x351,0x27,0x351,0x351,0x348,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699, -0x699,0x699,0x699,0x699,0x699,0x699,0x27,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x351,0x351, -0x348,0x348,0x348,0x348,0x348,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696, -0x696,0x696,0x696,0x696,0x696,0x696,0x345,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x348,0x348, -0x348,0x348,0x348,0xf93,0x354,0x354,0x357,0x351,0x351,0x354,0x34b,0x9f6,0xbac,0xba9,0x34e,0x9f6, -0x34e,0x9f6,0x34e,0x9f6,0x34e,0x9f6,0x339,0x336,0x339,0x336,0x339,0x336,0x339,0x336,0x339,0x336, -0x339,0x336,0x339,0x336,0x354,0x354,0x34b,0x345,0xb5b,0xb58,0xba6,0xcb1,0xcae,0xcb4,0xcb1,0xcae, -0xda4,0xda7,0xda7,0xda7,0xa05,0x6a5,0x363,0x366,0x363,0x363,0x363,0x366,0x363,0x363,0x363,0x363, -0x366,0xa05,0x366,0x363,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a5,0x6a2,0x6a2, -0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2, -0x6a2,0x6a2,0x6a2,0x6a2,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69f,0x69c,0x69c, -0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c, -0x9ff,0x69f,0x35d,0x360,0x35d,0x35d,0x35d,0x360,0x35d,0x35d,0x35d,0x35d,0x360,0x9ff,0x360,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x366,0x360,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x35a,0x954,0x957,0x939,0x939,0x113d,0x9f9,0x9f9,0xbb2,0xbaf,0xa02,0x9fc,0xa02,0x9fc, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x366,0x360,0x363,0x35d,0xbb2,0xbaf,0x363,0x35d,0xbb2,0xbaf,0x363,0x35d,0xbb2,0xbaf,0xeee, -0x366,0x360,0x366,0x360,0x363,0x35d,0x366,0x360,0x363,0x35d,0x366,0x360,0x366,0x360,0x366,0x360, -0x363,0x35d,0x366,0x360,0x366,0x360,0x366,0x360,0x363,0x35d,0x366,0x360,0xa05,0x9ff,0x366,0x360, -0x366,0x360,0x366,0x360,0x366,0x360,0xdad,0xdaa,0x366,0x360,0xef1,0xeee,0xef1,0xeee,0xef1,0xeee, -0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b, -0xf1e,0xf1b,0xf1e,0xf1b,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e, -0x1011,0x100e,0x1011,0x100e,0x1176,0x1173,0x1350,0x134d,0x1521,0x151e,0x1521,0x151e,0x1521,0x151e,0x1521,0x151e, -0x2a,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,0x2a,0x2a,0x378,0x369,0x369, -0x369,0x36c,0x369,0x369,0x2a,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x372,0x2a,0x8be,0xa08,0x2a,0x2a,0x14eb,0x14eb,0x1404, -0x2d,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0xdb0,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0xef4,0x37b,0x37b,0x37b,0x387,0x37b, -0x37e,0x37b,0x37b,0x38a,0x97b,0xdb3,0xdb6,0xdb3,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -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,0x2d,0x2d,0x2d,0x2d,0x2d, -0x38d,0x38d,0x38d,0x384,0x381,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0xcb7,0xcb7,0xcb7,0xcb7,0x1407,0x14ee,0xf9c,0xf9c,0xf9c,0xf99,0xf99,0xdbf,0x8c4,0xcc6,0xcc3,0xcc3, -0xcba,0xcba,0xcba,0xcba,0xcba,0xcba,0xf96,0xf96,0xf96,0xf96,0xf96,0x8c1,0x14e2,0x30,0xdbc,0x8c7, -0x1317,0x3a8,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, -0x8ca,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x93f,0x93f,0x93f,0x93f,0x93f, -0x93f,0x93f,0x93f,0xb52,0xb52,0xb52,0xcba,0xcc0,0xcbd,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0x1314, -0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x3a2,0x39f,0x39c,0x399,0xbb5,0xbb5, -0x93c,0x3a8,0x3a8,0x3b4,0x3a8,0x3ae,0x3ae,0x3ae,0x3ae,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0xa0e,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0x3ab,0x3a8,0x3ab,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0x3a8,0x3a8,0x3a8,0x3ab, -0x3b7,0x3a8,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x390,0x399,0x396,0x396,0x393,0x393,0x393, -0x393,0x3b1,0x3b1,0x393,0x393,0x399,0x396,0x396,0x396,0x393,0xcc9,0xcc9,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0xa0e,0xa0e,0xa0e,0xa0b,0xa0b,0xcc9,0xa26,0xa26,0xa26,0xa20, -0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa1d,0xa20,0xa1d,0x33,0xa11,0xa23,0xa14,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xccc,0xccc,0xccc,0xa1a,0xa1a,0xa1a,0xa1a, -0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0x33,0x33,0xccc,0xccc,0xccc,0xe22,0xe22,0xe22,0xe22, -0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, -0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023, -0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0xa2c,0xa2c,0xa2c,0xa2c, -0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, -0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, -0xa2c,0xa2c,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xbb8,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf36,0xf36,0xf36,0xf36, -0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, -0xf3c,0xf3c,0xf30,0xf30,0xf33,0xf42,0xf3f,0x14a,0x14a,0x14a,0x14a,0x14a,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,0x1827,0x1827,0x1827,0x1827, -0x1827,0x1827,0x1827,0x1827,0x1827,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb2e,0xb2e,0xb31,0xb31, -0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0x9f,0x9f,0x9f,0x9f,0x15a5,0x15a5,0x15a5,0x15a5, -0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x15a2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x23d,0x23d,0x23d,0x23d, -0x23d,0x23d,0x23d,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x249,0x249,0x249,0x249, -0x249,0x249,0x249,0x249,0x249,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x21f,0x21f,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x14be,0x14be,0x14be,0x14be, -0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,3,0xc,0xf,0xf, -0xc,0x12,3,0x15,0,0,0,0,0,0,0,0,6,0x15,0x15,0x15, -0x15,0x15,0x15,0x18,0x18,0x15,0x15,0x15,6,6,6,6,0,0,9,9, -9,9,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18, -0x15,0x15,0xc,0xf,0xf,0,0x12,0x12,0x12,0xc,0xc,0,0,0,0,0, 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,6,6,6,6,6,0, -6,6,0,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0x15,0x15,0x15,0x15,0x15,0x15,0, -0,0,0x15,0,0x15,0x15,0,0x15,0x15,0x15,0x15,0x15,0x15,0x15,9,0x15, -0,0,0,0,0,0,0,0,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x21,0,0,0,0,0,0,0x1791,0x1791,0x1791,0x1791,0x264,0x264,0x264,0x264, -0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1c2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a, -0x164a,0x164a,0x237,0x237,0x237,0x237,0x1650,0x1650,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0,0,0,0,0x16fe,0x16fe,0x16fe,0x16fe,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xe19,0xe19,0xe16,0xe16,0xe16,0xe19,0x111,0x111, -0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x27c,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x182a,0x182a,0x288,0x182a,0x182a,0x288,0x182a,0x182a, -0x182a,0x182a,0x182a,0x288,0x288,0x288,0x288,0x288,0,0,0,0,0,0,0,0, +0x291,0x291,0x291,0x291,0x291,0x2a0,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x294,0x609,0x7c5,0x7c8,0x60f,0x7c8,0x7c2,0x606,0x5fd,0x29a,0x61b,0x29d,0x7cb,0x5f4,0x612,0x7bf, +0x60c,0x618,0x5fa,0x5fa,0x600,0x297,0x606,0x603,0x5fd,0x5fa,0x61b,0x29d,0x5f7,0x5f7,0x5f7,0x609, +0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x615,0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x624,0x61e, +0x621,0x621,0x2a3,0x2a3,0x2a3,0x2a3,0x61e,0x2a3,0x621,0x621,0x621,0x2a3,0x621,0x621,0x2a3,0x2a3, +0x61e,0x2a3,0x621,0x621,0x2a3,0x2a3,0x2a3,0x615,0x61e,0x621,0x621,0x2a3,0x621,0x2a3,0x61e,0x2a3, +0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9, +0x2af,0x627,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x627,0x633,0x62d,0x2b2,0x2a9,0x2b2,0x2a9,0x627,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x633, +0x62d,0x630,0x627,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x62a,0x636,0x630,0x627,0x2b2,0x62a,0x2b2,0x2a9, +0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2ac, +0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2c1,0x2b5,0x2b5,0x2c1,0x2c1, +0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2c1,0x2b5,0x2b5,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1, +0x2c4,0x2b8,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2b5,0x2c1,0x2b5,0x2c1,0x2c4, +0x2b8,0x2c1,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2b5,0x2be,0x2c1,0x2b5,0x2b5,0x2b5, +0x2be,0x2be,0x2be,0x2be,0x2c7,0x2c7,0x2bb,0x2c7,0x2c7,0x2bb,0x2c7,0x2c7,0x2bb,0x2c4,0x639,0x2c4, +0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2b5,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x2c1,0x2b5,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2b8,0x2c7,0x2c7,0x2bb,0x2c4,0x2b8,0x9a2,0x9a2,0x9a5,0x99f,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x9a5,0x99f,0x9a5,0x99f,0x9a2,0x99c,0x9a5,0x99f,0xb61,0xc63,0x9a2,0x99c, +0x9a2,0x99c,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f, +0xc63,0xc63,0xc63,0xd5c,0xd5c,0xd5c,0xd5f,0xd5f,0xd5c,0xd5f,0xd5f,0xd5c,0xd5c,0xd5f,0xea3,0xea6, +0xea6,0xea6,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0x2ca,0x63c,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x63c,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,0x2cd,0x2ca,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, +0x2ca,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0xc66,0xc66,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5, +0x2e5,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2d9,0x2d9,0x2d6,0x2d6,0x642,0x2d6,0x2dc,0x645, +0x2df,0x645,0x645,0x645,0x2df,0x645,0x2dc,0x2dc,0x648,0x2e2,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x63f,0x63f,0x63f,0x63f,0x2d3,0x63f,0x2d6,0xada,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2d0,0x2d0,0x2d0, +0x2d0,0x2d0,0x9b1,0x9b1,0x9ae,0x9ab,0x9ae,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69, +0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64e,0x64e,0x906,0x64e,0x64e,0x909,0xadd,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xc1b,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, +0xe6a,0xe6a,0xe6a,0xe6a,0xe6d,0xd2f,0xd2f,0xd2f,0x651,0x651,0xae0,0xc60,0xc60,0xc60,0xc60,0xc60, +0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xf51,0xf4e,0xf51,0xf4e,0x2f1,0x2fa,0xf51,0xf4e, +9,9,0x300,0xea9,0xea9,0xea9,0x2e8,0x14a6,9,9,9,9,0x2fd,0x2eb,0x30f,0x2ee, +0x30f,0x30f,0x30f,9,0x30f,9,0x30f,0x30f,0x306,0x657,0x657,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,9,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x30f,0x30f,0x306,0x306,0x306,0x306,0x306,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x303,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x306,0x306,0x306,0x306,0x306,0xf51,0x312,0x312,0x315,0x30f,0x30f,0x312,0x309,0x9b4, +0xb6a,0xb67,0x30c,0x9b4,0x30c,0x9b4,0x30c,0x9b4,0x30c,0x9b4,0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4, +0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4,0x312,0x312,0x309,0x303,0xb19,0xb16,0xb64,0xc6f, +0xc6c,0xc72,0xc6f,0xc6c,0xd62,0xd65,0xd65,0xd65,0x9c3,0x663,0x321,0x324,0x321,0x321,0x321,0x324, +0x321,0x321,0x321,0x321,0x324,0x9c3,0x324,0x321,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, +0x660,0x663,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, +0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x9bd,0x65d,0x31b,0x31e,0x31b,0x31b,0x31b,0x31e,0x31b,0x31b,0x31b,0x31b, +0x31e,0x9bd,0x31e,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x324,0x31e,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x318,0x912,0x915,0x8f7,0x8f7,0x10fb,0x9b7,0x9b7,0xb70,0xb6d, +0x9c0,0x9ba,0x9c0,0x9ba,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x324,0x31e,0x321,0x31b,0xb70,0xb6d,0x321,0x31b,0xb70,0xb6d,0x321, +0x31b,0xb70,0xb6d,0xeac,0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e,0x321,0x31b,0x324,0x31e, +0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e,0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e, +0x9c3,0x9bd,0x324,0x31e,0x324,0x31e,0x324,0x31e,0x324,0x31e,0xd6b,0xd68,0x324,0x31e,0xeaf,0xeac, +0xeaf,0xeac,0xeaf,0xeac,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9, +0xbdc,0xbd9,0xbdc,0xbd9,0xedc,0xed9,0xedc,0xed9,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc, +0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0x1134,0x1131,0x130e,0x130b,0x14df,0x14dc,0x14df,0x14dc, +0x14df,0x14dc,0x14df,0x14dc,0xc,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333, +0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0xc, +0xc,0x336,0x327,0x327,0x327,0x32a,0x327,0x327,0xc,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x330,0xc,0x870,0x9c6,0xc, +0xc,0x14a9,0x14a9,0x13c2,0xf,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x936,0x936,0xd6e,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0xeb2,0x339, +0x339,0x339,0x345,0x339,0x33c,0x339,0x339,0x348,0x939,0xd71,0xd74,0xd71,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, +0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xf, +0xf,0xf,0xf,0xf,0x34b,0x34b,0x34b,0x342,0x33f,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xc87,0xc87,0xc87,0xc87,0x13c5,0x14ac,0xf5a,0xf5a,0xf5a,0xf57,0xf57,0xd7d, +0x876,0xc81,0xc7e,0xc7e,0xc75,0xc75,0xc75,0xc75,0xc75,0xc75,0xf54,0xf54,0xf54,0xf54,0xf54,0x873, +0x14a3,0x12,0xd7a,0x879,0x12d5,0x366,0x369,0x369,0x369,0x369,0x369,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xf5d, +0xf5d,0xf5d,0xf5d,0xf5d,0x87c,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x8fd, +0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0xb10,0xb10,0xb10,0xc75,0xc7b,0xc78,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0x12d2,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x360,0x35d, +0x35a,0x357,0xb73,0xb73,0x8fa,0x366,0x366,0x372,0x366,0x36c,0x36c,0x36c,0x36c,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x9cc,0x9cc,0x366,0x366,0x366,0x366,0x366,0x9cc, +0x369,0x366,0x369,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x9cc, +0x366,0x366,0x366,0x369,0x375,0x366,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x34e,0x357,0x354, +0x354,0x351,0x351,0x351,0x351,0x36f,0x36f,0x351,0x351,0x357,0x354,0x354,0x354,0x351,0xc84,0xc84, +0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x9cc,0x9cc,0x9cc,0x9c9,0x9c9,0xc84, +0x9e1,0x9e1,0x9e1,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9d8,0x9db,0x9d8,0x15,0x9e4, +0x9de,0x9cf,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0xc8a,0xc8a,0xc8a, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x15,0x15,0xc8a,0xc8a,0xc8a, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xfe1,0xfe1, +0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0xb76,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb, +0xeeb,0xeeb,0xeeb,0xeeb,0xefa,0xefa,0xeee,0xeee,0xef1,0xf00,0xefd,0x10e,0x10e,0x10e,0x10e,0x10e, +0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x25e,0x25e,0x25e,0x25e,0x25e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x237,0x237,0x237,0x237,0x237,0x237,0x237, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xaec,0xaec,0xaef,0xaef,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0x72,0x72,0x72,0x72, +0x1563,0x1563,0x1563,0x1563,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1560, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x975,0x975,6,0x15,0x15,0x15,0x15,0x15,0x15,0x18, -0x18,0x15,0x15,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,0x15,0x15,0x15,0x15,0x15, -0x15,0x18,9,0x15,0x15,0x15,0x15,0x12,6,6,6,6,6,6,6,6, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1890,0x1893,0x1893,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1752,0x1752,0x1752,0x1752,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x183, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1f2,0x1f2,0x1f2,0x1f2,0x160e,0x160e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x16bc,0x16bc,0x16bc,0x16bc,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xdd7,0xdd7,0xdd4,0xdd4,0xdd4,0xdd7,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a,0x23a,0x23a,0x23a,0x23a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x933,0x933, +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, +3,3,0x933,0x933,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,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,0x1b,0x975,0x975,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xd77,0xd77,0xd77,0xd77, -0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x14f4,0x3cf,0x3de,0x3de, -0x39,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x39,0x3e4,0x3e4,0x39,0x39,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x3e4,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x3e4,0x39,0x39,0x39,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x39, -0x3d2,0xcd2,0x3cf,0x3de,0x3de,0x3cf,0x3cf,0x3cf,0x3cf,0x39,0x39,0x3de,0x3de,0x39,0x39,0x3e1, -0x3e1,0x3d5,0xdc5,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3cf,0x39,0x39,0x39,0x39, -0x3e7,0x3e7,0x39,0x3e7,0x3e4,0x3e4,0x3cf,0x3cf,0x39,0x39,0x960,0x960,0x960,0x960,0x960,0x960, -0x960,0x960,0x960,0x960,0x3e4,0x3e4,0x3db,0x3db,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3db,0x3d8,0x114c, -0x3f,0x3c,0x39,0x39,0x42,0xcd5,0x3ea,0xcd8,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42, -0x42,0x42,0x42,0x3f6,0x3f6,0x42,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42,0x3f6,0x3f9, -0x42,0x3f6,0x3f9,0x42,0x3f6,0x3f6,0x42,0x42,0x3ed,0x42,0x3f3,0x3f3,0x3f3,0x3ea,0x3ea,0x42, -0x42,0x42,0x42,0x3ea,0x3ea,0x42,0x42,0x3ea,0x3ea,0x3f0,0x42,0x42,0x42,0xfa8,0x42,0x42, -0x42,0x42,0x42,0x42,0x42,0x3f9,0x3f9,0x3f9,0x3f6,0x42,0x3f9,0x42,0x42,0x42,0x42,0x42, -0x42,0x42,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x3ea,0x3ea,0x3f6,0x3f6, -0x3f6,0xfa8,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x45,0x3fc,0x3fc,0x405, -0x45,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0xce1,0x408,0x45,0x408,0x408,0x408,0x45,0x408, -0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x45,0x408,0x408, -0x408,0x408,0x408,0x408,0x408,0x45,0x408,0x408,0x45,0x408,0x408,0x408,0x408,0x408,0x45,0x45, -0x3ff,0x408,0x405,0x405,0x405,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x45,0x3fc,0x3fc,0x405,0x45,0x405, -0x405,0x402,0x45,0x45,0x408,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, -0x45,0x45,0x45,0x45,0x408,0xce1,0xcdb,0xcdb,0x45,0x45,0x966,0x966,0x966,0x966,0x966,0x966, -0x966,0x966,0x966,0x966,0x140a,0xcde,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x170d,0x48,0x48, -0x48,0x48,0x48,0x48,0x4b,0x40b,0x41a,0x41a,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420, -0x420,0x4b,0x4b,0x420,0x420,0x4b,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, -0x420,0x420,0x420,0x420,0x420,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x4b,0x420,0x420, -0x4b,0xce4,0x420,0x420,0x420,0x420,0x4b,0x4b,0x40e,0x420,0x40b,0x40b,0x41a,0x40b,0x40b,0x40b, -0xfab,0x4b,0x4b,0x41a,0x41d,0x4b,0x4b,0x41d,0x41d,0x411,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, -0x4b,0x4b,0x40b,0x40b,0x4b,0x4b,0x4b,0x4b,0x423,0x423,0x4b,0x420,0x420,0x420,0xfab,0xfab, -0x4b,0x4b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x414,0xce4,0x1323,0x1323, -0x1323,0x1323,0x1323,0x1323,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4e,0x4e,0x426,0x432, -0x4e,0x432,0x432,0x432,0x432,0x432,0x432,0x4e,0x4e,0x4e,0x432,0x432,0x432,0x4e,0x432,0x432, -0x435,0x432,0x4e,0x4e,0x4e,0x432,0x432,0x4e,0x432,0x4e,0x432,0x432,0x4e,0x4e,0x4e,0x432, -0x432,0x4e,0x4e,0x4e,0x432,0x432,0x96f,0x4e,0x4e,0x4e,0x432,0x432,0x432,0x432,0x432,0x432, -0x432,0x96f,0xdc8,0x432,0x432,0x432,0x4e,0x4e,0x4e,0x4e,0x426,0x42c,0x426,0x42c,0x42c,0x4e, -0x4e,0x4e,0x42c,0x42c,0x42c,0x4e,0x42f,0x42f,0x42f,0x429,0x4e,0x4e,0xfae,0x4e,0x4e,0x4e, -0x4e,0x4e,0x4e,0x426,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xee2,0x96c, -0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x969,0x969,0x969,0xce7,0xce7,0xce7,0xce7,0xce7, -0xce7,0xcea,0xce7,0x4e,0x4e,0x4e,0x4e,0x4e,0x14f7,0x444,0x444,0x444,0x51,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x14fa,0x447,0x447,0x447,0x447,0x447,0x51,0x51,0x51,0xfb7,0x438,0x438, -0x438,0x444,0x444,0x444,0x444,0x51,0x438,0x438,0x43b,0x51,0x438,0x438,0x438,0x43e,0x51,0x51, -0x51,0x51,0x51,0x51,0x51,0x438,0x438,0x51,0xfb7,0xfb7,0x1710,0x51,0x51,0x51,0x51,0x51, -0x447,0x447,0xfb1,0xfb1,0x51,0x51,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4, -0x17cd,0x14fd,0x453,0x453,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x54,0x459,0x459, -0x459,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, -0x459,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x54,0x459,0x459,0x459, -0x459,0x459,0x54,0x54,0xced,0xcf0,0x453,0x44a,0x456,0x453,0x44a,0x453,0x453,0x54,0x44a,0x456, -0x456,0x54,0x456,0x456,0x44a,0x44d,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x44a,0x44a,0x54, -0x54,0x54,0x54,0x54,0x54,0x54,0x459,0x54,0x459,0x459,0xefa,0xefa,0x54,0x54,0x450,0x450, -0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x54,0xefd,0xefd,0x54,0x54,0x54,0x54,0x54, -0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x5a,0x1500,0x465,0x465,0x57,0x46b,0x46b,0x46b, -0x46b,0x46b,0x46b,0x46b,0x46b,0x57,0x46b,0x46b,0x46b,0x57,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, -0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x465,0x45c,0x45c,0x45c,0xfba,0x57,0x465,0x465, -0x465,0x57,0x468,0x468,0x468,0x45f,0x1329,0x17d0,0x57,0x57,0x57,0x57,0x17d3,0x17d3,0x17d3,0x45c, -0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x1713,0x46b,0x46b,0xfba,0xfba,0x57,0x57,0x462,0x462, -0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0x17d0,0x17d0, -0x17d0,0xfc0,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, -0x46b,0x1326,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, -0x46b,0x46b,0x1326,0x5a,0x5a,0xfc3,0x45c,0x465,0x5d,0x5d,0xa38,0xa38,0x5d,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d, -0x5d,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, -0x5d,0xa3e,0x5d,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d,0x5d,0x5d,0xa32,0x5d, -0x5d,0x5d,0x5d,0xa2f,0xa38,0xa38,0xa2f,0xa2f,0xa2f,0x5d,0xa2f,0x5d,0xa38,0xa38,0xa3b,0xa38, -0xa3b,0xa3b,0xa3b,0xa2f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x1503,0x1503,0x1503,0x1503,0x1503,0x1503, -0x1503,0x1503,0x1503,0x1503,0x5d,0x5d,0xa38,0xa38,0xa35,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x60,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, -0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, -0x486,0x486,0x486,0x486,0x486,0x471,0x486,0x483,0x471,0x471,0x471,0x471,0x471,0x471,0x477,0x60, -0x60,0x60,0x60,0x46e,0x48c,0x48c,0x48c,0x48c,0x48c,0x486,0x489,0x474,0x474,0x474,0x474,0x474, -0x474,0x471,0x474,0x47a,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x47d,0x47d, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, -0x63,0x49b,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x63,0x63, -0x63,0x63,0x63,0x63,0x49b,0x49b,0x49b,0x49b,0x63,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b, -0x63,0x49b,0x49b,0x49b,0x63,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x49b,0x63,0x49b,0x49b,0x49b, -0x49b,0x48f,0x49b,0x498,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x63,0x48f,0x48f,0x49b,0x63,0x63, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x63,0x4a1,0x63,0x492,0x492,0x492,0x492,0x492,0x48f,0x63,0x63, -0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x63,0x63,0x49e,0x49e,0x140d,0x140d, -0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x66,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1, -0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1, -0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0xa4d,0xfcf,0xfcf,0x66,0x66,0x66, -0x66,0x97e,0x97e,0x981,0x97e,0x981,0x981,0x98a,0x981,0x98a,0x97e,0x97e,0x97e,0x97e,0x97e,0x9ab, -0x97e,0x981,0x984,0x984,0x987,0x990,0x984,0x984,0x9b1,0x9b1,0x9b1,0x9b1,0x1332,0x132c,0x132c,0x132c, -0x97e,0x97e,0x97e,0x981,0x97e,0x97e,0xa41,0x97e,0x66,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0x97e, -0x97e,0x97e,0x981,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0xa41,0xa41, -0xa41,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0xa41,0x981,0xa41,0xa41,0xa41,0x66,0xa4a,0xa4a, -0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa44,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0x66,0xfc6,0xa47, -0xdcb,0xdcb,0xfc9,0xfcc,0xfc6,0x114f,0x114f,0x114f,0x114f,0x132f,0x132f,0x66,0x66,0x66,0x66,0x66, +6,6,6,6,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0x14b2,0x38d,0x39c,0x39c,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x1b,0x1b,0x3a2,0x3a2,0x1b,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x3a2,0x1b, +0x1b,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x1b,0x390,0xc90,0x38d,0x39c,0x39c,0x38d,0x38d,0x38d, +0x38d,0x1b,0x1b,0x39c,0x39c,0x1b,0x1b,0x39f,0x39f,0x393,0xd83,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x38d,0x1b,0x1b,0x1b,0x1b,0x3a5,0x3a5,0x1b,0x3a5,0x3a2,0x3a2,0x38d,0x38d, +0x1b,0x1b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x3a2,0x3a2,0x399,0x399, +0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x110a,0x184b,0x1848,0x1b,0x1b,0x1e,0xc93,0x3a8,0xc96, +0x1e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x1e,0x1e,0x1e,0x3b4,0x3b4,0x1e,0x1e,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b4,0x1e,0x1e, +0x3ab,0x1e,0x3b1,0x3b1,0x3b1,0x3a8,0x3a8,0x1e,0x1e,0x1e,0x1e,0x3a8,0x3a8,0x1e,0x1e,0x3a8, +0x3a8,0x3ae,0x1e,0x1e,0x1e,0xf66,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3b7,0x3b7,0x3b7, +0x3b4,0x1e,0x3b7,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x3a8,0x3a8,0x3b4,0x3b4,0x3b4,0xf66,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0xc9f,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6, +0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x21,0x3bd,0x3c6,0x3c3,0x3c3,0x3c3,0x3ba,0x3ba,0x3ba, +0x3ba,0x3ba,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c3,0x3c3,0x3c0,0x21,0x21,0x3c6,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3c6,0xc9f,0xc99,0xc99, +0x21,0x21,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x13c8,0xc9c,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x16ce,0x184e,0x184e,0x184e,0x1851,0x1851,0x1851,0x24,0x3c9,0x3d8,0x3d8, +0x24,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x24,0x3de,0x3de,0x24,0x24,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de,0x24,0xca2,0x3de,0x3de,0x3de,0x3de,0x24,0x24, +0x3cc,0x3de,0x3c9,0x3c9,0x3d8,0x3c9,0x3c9,0x3c9,0xf69,0x24,0x24,0x3d8,0x3db,0x24,0x24,0x3db, +0x3db,0x3cf,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3c9,0x3c9,0x24,0x24,0x24,0x24, +0x3e1,0x3e1,0x24,0x3de,0x3de,0x3de,0xf69,0xf69,0x24,0x24,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d2,0xca2,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x27,0x27,0x3e4,0x3f0,0x27,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x27, +0x27,0x27,0x3f0,0x3f0,0x3f0,0x27,0x3f0,0x3f0,0x3f3,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x27, +0x3f0,0x27,0x3f0,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x92d,0x27, +0x27,0x27,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x92d,0xd86,0x3f0,0x3f0,0x3f0,0x27,0x27, +0x27,0x27,0x3e4,0x3ea,0x3e4,0x3ea,0x3ea,0x27,0x27,0x27,0x3ea,0x3ea,0x3ea,0x27,0x3ed,0x3ed, +0x3ed,0x3e7,0x27,0x27,0xf6c,0x27,0x27,0x27,0x27,0x27,0x27,0x3e4,0x27,0x27,0x27,0x27, +0x27,0x27,0x27,0x27,0x27,0x27,0xea0,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, +0x927,0x927,0x927,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca8,0xca5,0x27,0x27,0x27,0x27,0x27, +0x14b5,0x402,0x402,0x402,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x2a,0x405,0x405, +0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, +0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x14b8,0x405,0x405,0x405, +0x405,0x405,0x2a,0x2a,0x2a,0xf75,0x3f6,0x3f6,0x3f6,0x402,0x402,0x402,0x402,0x2a,0x3f6,0x3f6, +0x3f9,0x2a,0x3f6,0x3f6,0x3f6,0x3fc,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0x2a, +0xf75,0xf75,0x16d1,0x2a,0x2a,0x2a,0x2a,0x2a,0x405,0x405,0xf6f,0xf6f,0x2a,0x2a,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, +0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x178e,0x14bb,0x411,0x411,0x2d,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x2d,0x2d,0xcab,0xcae,0x411,0x408, +0x414,0x411,0x408,0x411,0x411,0x2d,0x408,0x414,0x414,0x2d,0x414,0x414,0x408,0x40b,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x408,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x417,0x2d, +0x417,0x417,0xeb8,0xeb8,0x2d,0x2d,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e, +0x2d,0xebb,0xebb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x1854,0x14be,0x423,0x423,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x30,0x429,0x429, +0x429,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429, +0x423,0x41a,0x41a,0x41a,0xf78,0x30,0x423,0x423,0x423,0x30,0x426,0x426,0x426,0x41d,0x12e7,0x1791, +0x30,0x30,0x30,0x30,0x1794,0x1794,0x1794,0x41a,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x16d4, +0x429,0x429,0xf78,0xf78,0x30,0x30,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x1791,0x1791,0x1791,0xf7e,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81, +0x33,0x33,0x9f6,0x9f6,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9f0,0x33,0x33,0x33,0x33,0x9ed,0x9f6,0x9f6,0x9ed,0x9ed, +0x9ed,0x33,0x9ed,0x33,0x9f6,0x9f6,0x9f9,0x9f6,0x9f9,0x9f9,0x9f9,0x9ed,0x33,0x33,0x33,0x33, +0x33,0x33,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x33,0x33,0x9f6,0x9f6, +0x9f3,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x42f,0x444,0x441, +0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x435,0x36,0x36,0x36,0x36,0x42c,0x44a,0x44a,0x44a,0x44a, +0x44a,0x444,0x447,0x432,0x432,0x432,0x432,0x432,0x432,0x42f,0x432,0x438,0x43e,0x43e,0x43e,0x43e, +0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43b,0x43b,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x459,0x459,0x39,0x459,0x39,0x39,0x459, +0x459,0x39,0x459,0x39,0x39,0x459,0x39,0x39,0x39,0x39,0x39,0x39,0x459,0x459,0x459,0x459, +0x39,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x39,0x459,0x459,0x459,0x39,0x459,0x39,0x459, +0x39,0x39,0x459,0x459,0x39,0x459,0x459,0x459,0x459,0x44d,0x459,0x456,0x44d,0x44d,0x44d,0x44d, +0x44d,0x44d,0x39,0x44d,0x44d,0x459,0x39,0x39,0x462,0x462,0x462,0x462,0x462,0x39,0x45f,0x39, +0x450,0x450,0x450,0x450,0x450,0x44d,0x39,0x39,0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x453, +0x453,0x453,0x39,0x39,0x45c,0x45c,0x13cb,0x13cb,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,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f, +0x3c,0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x972, +0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, +0x96f,0x972,0xa0b,0xf8d,0xf8d,0x3c,0x3c,0x3c,0x3c,0x93c,0x93c,0x93f,0x93c,0x93f,0x93f,0x948, +0x93f,0x948,0x93c,0x93c,0x93c,0x93c,0x93c,0x969,0x93c,0x93f,0x942,0x942,0x945,0x94e,0x942,0x942, +0x96f,0x96f,0x96f,0x96f,0x12f0,0x12ea,0x12ea,0x12ea,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x9ff,0x93c, +0x3c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f, +0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x9ff,0x9ff,0x9ff,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x9ff,0x93f,0x9ff,0x9ff,0x9ff,0x3c,0xa08,0xa08,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa02,0xa05, +0xa05,0xa05,0xa05,0xa05,0xa05,0x3c,0xf84,0xa05,0xd89,0xd89,0xf87,0xf8a,0xf84,0x110d,0x110d,0x110d, +0x110d,0x12ed,0x12ed,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,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x468,0x468,0x468,0x468,0x468,0x468,0x3f,0x13d1,0x3f,0x3f,0x3f,0x3f, +0x3f,0x13d1,0x3f,0x3f,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465, +0x465,0x465,0x465,0x465,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42,0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98, +0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0x42,0x42,0x12f3,0x12f3,0xd92,0xd95,0xa2f,0xa38,0xa2c,0xa2c,0xa2c,0xa2c,0xa38, +0xa38,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0x42,0x42,0x42,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x16da,0x45,0x45, +0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x45,0x45,0xa4d,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50, +0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50, +0xa50,0xa50,0xa50,0xa4a,0xa47,0x48,0x48,0x48,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa53,0xa53,0xa53,0xa56,0xa56,0xa56,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4, +0x14c4,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa59,0xa77, +0xa77,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5f,0xa5c,0xa6e,0xa6e,0xa71,0xa7a, +0xa68,0xa65,0xa6e,0xa6b,0xa7a,0xcb1,0x4e,0x4e,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa89,0xa89,0xb07,0xb0a,0xa8f,0xb04,0xa8c,0xa89, +0xa92,0xaa1,0xa95,0xaa4,0xaa4,0xaa4,0xa80,0x51,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0x51,0x51,0x51,0x51,0x51,0x51,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa83,0xfae,0x51,0x51,0x51,0x51,0x51,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x54,0x54, +0x489,0x489,0x489,0x489,0x489,0x489,0x54,0x54,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x54,0x489,0x54,0x489,0x54,0x489,0x54,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x486,0x486,0x486,0x486,0x486,0x486,0x54,0x54,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x480,0x486,0x480,0x480,0x47d,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x47d,0x47d,0x47d,0x486,0x486,0x486,0x486,0x54,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x54,0x47d,0x47d,0x47d,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x47d,0x47d,0x47d,0x54,0x54,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x483,0x480,0x54,0xb7c,0xb7f,0xb7f,0xb7f,0xfb7,0x57,0x14a0,0x14a0, +0x14a0,0x14a0,0x492,0x492,0x492,0x492,0x492,0x492,0x4dd,0xb91,0x5a,0x5a,0x699,0x4dd,0x4dd,0x4dd, +0x4dd,0x4dd,0x4e3,0x4f5,0x4e3,0x4ef,0x4e9,0x69c,0x4da,0x696,0x696,0x696,0x696,0x4da,0x4da,0x4da, +0x4da,0x4da,0x4e0,0x4f2,0x4e0,0x4ec,0x4e6,0x5a,0xda1,0xda1,0xda1,0xda1,0xda1,0x12f6,0x12f6,0x12f6, +0x12f6,0x12f6,0x12f6,0x12f6,0x12f6,0x5a,0x5a,0x5a,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504, +0x504,0x504,0x504,0x504,0x504,0x501,0x501,0x501,0x501,0x504,0xab6,0xab6,0xb97,0xb9d,0xb9d,0xb9a, +0xb9a,0xb9a,0xb9a,0xda7,0xebe,0xebe,0xebe,0xebe,0x10f8,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x534,0x534,0x534,0xabf,0xec7,0xfbd,0xfbd,0xfbd, +0xfbd,0x1254,0x16e0,0x16e0,0x63,0x63,0x63,0x63,0x6c3,0x6c3,0x6c3,0x6c3,0x6c6,0x6c6,0x6c6,0x6c6, +0x6c6,0x6c6,0x540,0x540,0x53d,0x53d,0x53d,0x53d,0x567,0x567,0x567,0x567,0x567,0xac8,0xac8,0x66, 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, -0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x4aa,0x4aa,0x4aa,0x4aa, -0x4aa,0x4aa,0x69,0x1413,0x69,0x69,0x69,0x69,0x69,0x1413,0x69,0x69,0x4a7,0x4a7,0x4a7,0x4a7, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0x6c,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, -0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c, -0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0x1335,0x1335,0xdd4, -0xdd7,0xa71,0xa7a,0xa6e,0xa6e,0xa6e,0xa6e,0xa7a,0xa7a,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, -0xa74,0xa74,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0x6c,0x6c,0x6c, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0x1719,0x6f,0x6f,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x6f,0x6f, -0xa8f,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92, -0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa8c,0xa89,0x72,0x72,0x72, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa95,0xa95,0xa95,0xa98,0xa98, -0xa98,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x75,0x75,0x75,0x75,0x75,0x75,0x75, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xa9b,0xab9,0xab9,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xaa1,0xa9e,0xab0,0xab0,0xab3,0xabc,0xaaa,0xaa7,0xab0,0xaad,0xabc,0xcf3,0x78,0x78, -0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0x78,0x78,0x78,0x78,0x78,0x78, -0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0x78,0x78,0x78,0x78,0x78,0x78, -0xacb,0xacb,0xb49,0xb4c,0xad1,0xb46,0xace,0xacb,0xad4,0xae3,0xad7,0xae6,0xae6,0xae6,0xac2,0x7b, -0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xac5,0xff0,0x7b,0x7b,0x7b,0x7b,0x7b, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x7e,0x7e, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x4cb,0x7e,0x4cb,0x7e,0x4cb,0x7e,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c2,0x4c8,0x4c2, -0x4c2,0x4bf,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4bf,0x4bf,0x4bf, -0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x7e,0x4bf,0x4bf,0x4bf, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4bf,0x4bf,0x4bf, -0x7e,0x7e,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c5,0x4c2,0x7e, -0xbbe,0xbc1,0xbc1,0xbc1,0xff9,0x81,0x14e5,0x14e5,0x14e5,0x14e5,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4, -0x51f,0xbd3,0x84,0x84,0x6db,0x51f,0x51f,0x51f,0x51f,0x51f,0x525,0x537,0x525,0x531,0x52b,0x6de, -0x51c,0x6d8,0x6d8,0x6d8,0x6d8,0x51c,0x51c,0x51c,0x51c,0x51c,0x522,0x534,0x522,0x52e,0x528,0x84, -0xde3,0xde3,0xde3,0xde3,0xde3,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x84,0x84,0x84, -0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x540,0x756,0x53d,0x9ba,0x9db,0xaf5,0xaf5,0xaf5, -0xbd6,0xbd6,0xde6,0xde6,0xde6,0xde6,0x1167,0x116a,0x116a,0x133b,0x14df,0x1509,0x150c,0x150c,0x171c,0x87, -0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, -0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x543,0x543,0x543, -0x543,0x546,0xaf8,0xaf8,0xbd9,0xbdf,0xbdf,0xbdc,0xbdc,0xbdc,0xbdc,0xde9,0xf00,0xf00,0xf00,0xf00, -0x113a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, -0x576,0x576,0x576,0xb01,0xf09,0xfff,0xfff,0xfff,0xfff,0x1296,0x171f,0x171f,0x8d,0x8d,0x8d,0x8d, -0x705,0x705,0x705,0x705,0x708,0x708,0x708,0x708,0x708,0x708,0x582,0x582,0x57f,0x57f,0x57f,0x57f, -0xf0f,0xf0f,0xf0f,0xf0c,0xf0c,0xf0c,0xf0c,0xf0c,0x1170,0x13bc,0x13bc,0x13bc,0x13bc,0x133e,0x133e,0x133e, -0x13bf,0x1341,0x1341,0x13bf,0x150f,0x150f,0x150f,0x150f,0x1512,0x1512,0x1512,0x17d6,0x17d6,0x17d6,0x17d6,0x90, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0xb0a,0xb0a,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x96,0x96,0x96,0x96,0x96, -0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0x99,0xb25,0xb25,0xb25,0xb25,0xb28, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a, +0x56a,0x56a,0x56a,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,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,0x6c,0xae3,0xae3,0xae3,0xae3,0xae6,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae6,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0x6f,0x6f, +0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x7ef,0x7e9,0x7ef,0x7e9,0x7ef,0x7e9,0x7ef, +0x7e9,0x7ef,0x7e9,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9, +0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7e9,0x7e9,0x7e9,0x7ef,0x7e9,0x7ef,0x7e9,0x7ef, +0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7ef,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7ec,0xc3f,0xc3f,0x75, +0x75,0x90f,0x90f,0x8d9,0x8d9,0x7f2,0x7f5,0xc3c,0x78,0x78,0x78,0x78,0x78,0x807,0x807,0x807, +0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, +0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x10e6,0x18c3,0x78,0x7b,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x7b, +0x8e2,0x8e2,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0x1389,0x1389,0x1389,0x7e,0x7e,0x7e,0x7e,0x7e, +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,0x813,0x813,0x813,0xd41,0xd41,0x81, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x81, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0x84,0x84,0x84, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xb01,0xc48,0xb01,0xb01,0xb01,0xc48,0xb01,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x993,0x993,0x993,0x993,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x8d,0x8d,0x8d,0x8d,0x8d,0xad4,0x5b5,0x5bb, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5b8,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb, +0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x8d,0x5bb,0x8d, +0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5be, +0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x1308,0x1308,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d6,0x5d0, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3, +0x90,0x90,0x5d3,0x5d3,0x5d3,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d0,0x5d0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, +0x5d6,0x5d6,0x930,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5cd,0x5cd,0xbd3,0xd59,0x90,0x90, +0x82b,0x83d,0x83a,0x83d,0x83a,0xc5d,0xc5d,0xd4d,0xd4a,0x82e,0x82e,0x82e,0x82e,0x840,0x840,0x840, +0x858,0x85b,0x86a,0x93,0x85e,0x861,0x86d,0x86d,0x855,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x849, +0x849,0x864,0x864,0x867,0x864,0x864,0x864,0x93,0x864,0x852,0x84f,0x849,0x93,0x93,0x93,0x93, +0x5e2,0x5ee,0x5e2,0xbd6,0x5e2,0x96,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x96,0x96,0x5df, +0x732,0x735,0x74a,0x74d,0x72c,0x735,0x735,0x9c,0x717,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x9c, +0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xad7,0xad7,0xad7,0x996,0x711,0x5f1,0x5f1, +0x9c,0x75c,0x73b,0x72c,0x735,0x732,0x72c,0x73e,0x72f,0x729,0x72c,0x74a,0x741,0x738,0x759,0x72c, +0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x747,0x744,0x74a,0x74a,0x74a,0x75c, +0x720,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c, +0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x9c,0x9c,0x9c, +0xb1f,0xb1f,0xb1f,0xb1f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x1860,0x1860,0x1860, 0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb28,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, -0xa2,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x837,0x83a,0x837,0x83a,0x837, -0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837, -0x837,0x837,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x837,0x837,0x837,0x837,0x837,0x83d,0x837, -0x837,0x837,0x837,0x837,0x83a,0xc81,0xc81,0xa2,0xa2,0x951,0x951,0x91b,0x91b,0x840,0x843,0xc7e, -0xa5,0xa5,0xa5,0xa5,0xa5,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, -0x855,0x1128,0xa8,0xa5,0xab,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0xab,0x924,0x924,0x927,0x927,0x927,0x927,0x927,0x927, -0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, -0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, -0x13cb,0x13cb,0x13cb,0xae,0xae,0xae,0xae,0xae,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,0xd83,0xd83,0xb1,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, -0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, -0x867,0x867,0x867,0x867,0x867,0x867,0x867,0xb1,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb4,0xb4,0xb4,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x9d5,0x9d5,0x9d5,0x9d5,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0xbd, -0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4, -0xbd,0xbd,0xbd,0xbd,0xbd,0xb16,0x5f7,0x5fd,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603, -0x603,0x5fa,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0xbd, -0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0xbd,0x5fd,0xbd,0x5fd,0x5fd,0xbd,0x5fd,0x5fd,0xbd,0x5fd,0x5fd, -0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x600,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x134a,0x134a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, -0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x618,0x612,0x615,0x61b,0x618, -0x612,0x618,0x612,0x618,0x612,0x618,0x618,0x612,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, -0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x615,0x612,0x615,0x615,0x615,0x615,0x615,0x615, -0x612,0x615,0x612,0x612,0x615,0x615,0x612,0x612,0x612,0x612,0x612,0x615,0x612,0x612,0x615,0x612, -0x615,0x615,0x615,0x612,0x615,0x615,0x615,0x615,0xc0,0xc0,0x615,0x615,0x615,0x615,0x612,0x612, -0x615,0x612,0x612,0x612,0x612,0x615,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x612,0x612, -0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, -0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0x618,0x618,0x972,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x60f,0x60f,0xc15,0xd9b,0xc0,0xc0,0x879,0x88b,0x888,0x88b,0x888,0xc9f,0xc9f,0xd8f, -0xd8c,0x87c,0x87c,0x87c,0x87c,0x88e,0x88e,0x88e,0x8a6,0x8a9,0x8b8,0xc3,0x8ac,0x8af,0x8bb,0x8bb, -0x8a3,0x89a,0x894,0x89a,0x894,0x89a,0x894,0x897,0x897,0x8b2,0x8b2,0x8b5,0x8b2,0x8b2,0x8b2,0xc3, -0x8b2,0x8a0,0x89d,0x897,0xc3,0xc3,0xc3,0xc3,0x624,0x630,0x624,0xc18,0x624,0xc6,0x624,0x630, -0x624,0x630,0x624,0x630,0x624,0x630,0x624,0x630,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d, -0x627,0x62d,0x627,0x62d,0x627,0xc6,0xc6,0x621,0x777,0x77a,0x78f,0x792,0x771,0x77a,0x77a,0xcc, -0x759,0x75c,0x75c,0x75c,0x75c,0x759,0x759,0xcc,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0xc9,0xb19,0xb19,0xb19,0x9d8,0x753,0x633,0x633,0xcc,0x7a1,0x780,0x771,0x77a,0x777,0x771,0x783, -0x774,0x76e,0x771,0x78f,0x786,0x77d,0x79e,0x771,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, -0x79b,0x79b,0x78c,0x789,0x78f,0x78f,0x78f,0x7a1,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,0xcc,0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, -0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, -0xcc,0xcc,0x75f,0x75f,0x75f,0xcc,0xcc,0xcc,0xb61,0xb61,0xb61,0xb61,0xcf,0xcf,0xcf,0xcf, -0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xd5,0xd5,0xd5,0xd5,0xd5, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xdb,0xdb,0x100b,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,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,0xb94,0xde,0xb94,0xb94, -0xde,0xde,0xb94,0xde,0xde,0xb94,0xb94,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xde,0xb91,0xde,0xb91,0xb91,0xb91, -0xb91,0xd14,0xb91,0xb91,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xde,0xde,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xde,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,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xde, -0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xde,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xe01,0xe01,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb8b, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xf18,0xf15,0xde,0xde,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xe1,0xb9a,0xe1,0xe1, -0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1, -0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xc27,0xc27,0xc27,0xc27, -0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xe4,0xc27,0xc27,0xc27,0xc27,0xc21,0xc21, -0xc24,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xc30,0xc30,0xc30,0xc30, -0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc2a,0xc2a, -0xc2d,0xc93,0xc93,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc33,0xc33, -0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xed,0xc3c,0xc3c,0xc3c,0xed,0xc39,0xc39, -0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xd26,0xd26,0xd26,0xd26, +0xb25,0xb25,0xb25,0xa2,0xa2,0xa2,0xa2,0xa2,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa8, +0xa8,0xfc9,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6, +0x16e6,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xab,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xab,0xb52,0xb52,0xab,0xab,0xb52,0xab,0xab,0xb52,0xb52,0xab, +0xab,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f, +0xb4f,0xb4f,0xab,0xb4f,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xcd2,0xb4f,0xb4f,0xab,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xab,0xb52, +0xb52,0xb52,0xb52,0xab,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xab, +0xab,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xdbf,0xdbf,0xab,0xab,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xed6,0xed3, +0xab,0xab,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xae,0xb58,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,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xb1,0xbe5,0xbe5,0xbe5,0xbe5,0xbdf,0xbdf,0xbe2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee, +0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbe8,0xbe8,0xbeb,0xc51,0xc51,0xb4,0xb4,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf1,0xbf1,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, +0xb7,0xb7,0xb7,0xb7,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xba,0xbfa,0xbfa,0xbfa,0xba,0xbf7,0xbf7,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba, +0xba,0xba,0xba,0xba,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0x14e2,0x14e2,0xbd,0xcd5,0xcd5,0xcd5,0xce1,0xce1,0xce1,0xce1,0xcd5,0xcd5,0xce1,0xce1,0xce1, +0xbd,0xbd,0xbd,0xbd,0xce1,0xce1,0xcd5,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xcd8,0xcd8,0xcd8, +0xbd,0xbd,0xbd,0xbd,0xcdb,0xbd,0xbd,0xbd,0xce7,0xce7,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde, +0xcde,0xcde,0xcde,0xcde,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, +0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xc0,0xc0,0xcea,0xcea,0xcea,0xcea,0xcea,0xc0,0xc0,0xc0, +0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0xc3,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x1863,0xc3,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x16e9,0x16e9,0x16e9,0x16e9,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xc9,0xc9,0xc9,0xc9,0xc9,0xd56,0xd56,0xd56,0xcc,0xcc,0xcc,0xcc,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xcc,0xcc,0xcc,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd53,0xd53,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, +0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, +0xd1a,0xd1a,0xcf,0xd17,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd2,0xd2,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2,0xd2, +0xd2,0xd2,0xd2,0xd2,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x1821,0x1821,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd5,0xd26,0xd5,0xd26,0xd26, 0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0x1524,0x1524,0xf0,0xd17,0xd17,0xd17,0xd23, -0xd23,0xd23,0xd23,0xd17,0xd17,0xd23,0xd23,0xd23,0xf0,0xf0,0xf0,0xf0,0xd23,0xd23,0xd17,0xd23, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd1a,0xd1a,0xd1a,0xf0,0xf0,0xf0,0xf0,0xd1d,0xf0,0xf0,0xf0, -0xd29,0xd29,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2c,0xd2c,0xd2c,0xd2c, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xf3,0xf3, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0xf6,0xf6,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0xf6, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0xf6,0xf6,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0xf9,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0x1728,0x1728,0x1728,0x1728,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0xf6,0xf6,0xf6,0xf6,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xfc,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xd53,0xd53,0xfc,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xfc, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xff,0xff,0xff,0xff,0xff, -0xd98,0xd98,0xd98,0x102,0x102,0x102,0x102,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, -0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, -0x102,0x102,0x102,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd5c,0xd5c,0xd5c,0xd5c, -0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c, -0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0x105,0xd59,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0x108,0x108,0xd62,0xd62,0xd62,0xd62, -0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0x108,0x108,0x108,0x108,0x108,0x108,0x1860,0x1860,0x1860,0x1860, -0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0xd68,0xd68,0xd68,0xd68, -0xd68,0xd68,0x10b,0x10b,0xd68,0x10b,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68, -0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0x10b,0xd68, -0xd68,0x10b,0x10b,0x10b,0xd68,0x10b,0x10b,0xd68,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0x10e, -0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0x152a,0x152a,0x17d9,0x17d9,0x114,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, -0x1107,0x1107,0x1107,0x1107,0x171,0x171,0x171,0x171,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe25, -0xe25,0xe2b,0xe2b,0xe25,0x117,0x117,0xe28,0xe28,0x1137,0x1137,0x1137,0x1137,0x11a,0x11a,0x11a,0x11a, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90, -0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x152d, -0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x1530,0x120,0x120, -0x120,0x120,0x11d,0x17dc,0x1356,0x1179,0xf27,0xf27,0xe40,0xe3d,0xe40,0xe3d,0xe3d,0xe34,0xe34,0xe34, -0xe34,0xe34,0xe34,0x1182,0x117f,0x1182,0x117f,0x117c,0x117c,0x117c,0x141c,0x1419,0x123,0x123,0x123,0x123, -0x123,0xe3a,0xe37,0xe37,0xe37,0xe34,0xe3a,0xe37,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43, -0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, -0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, -0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, -0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49, -0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46, -0xe46,0xe46,0x129,0x129,0x129,0x129,0x129,0x129,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x12c,0x141f, -0x12c,0x12c,0x12c,0x12c,0x12c,0x141f,0x12c,0x12c,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0x12f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x12f,0xe64,0xe58,0xe58,0xe58,0x132,0xe58,0xe58,0x132, -0x132,0x132,0x132,0x132,0xe58,0xe58,0xe58,0xe58,0xe64,0xe64,0xe64,0xe64,0x132,0xe64,0xe64,0xe64, -0x132,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, -0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0x132,0x132,0x132,0x132,0xe55,0xe55,0xe55,0x132, -0x132,0x132,0x132,0xe5b,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe67,0xe67,0xe5e,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0x1188,0x1188, -0x135,0x135,0x135,0x135,0xe73,0xe73,0xe73,0xe73,0xe73,0xe76,0xe76,0xe76,0xe73,0xe73,0xe76,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0x135,0x135,0x135,0x135,0x135,0x135, -0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0x1185,0x135,0x135,0x135,0xe6d,0xe6d, -0xe7c,0xe7c,0xe7c,0xe7c,0x138,0x138,0x138,0x138,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, -0xe79,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x1539,0x153f,0x153c,0x1884,0x17df,0x13e,0x13e,0x13e,0x13e,0x13e,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, -0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, -0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0xea3,0xea3,0xea3,0xea0, -0xea0,0xe97,0xe97,0xea0,0xe9d,0xe9d,0xe9d,0xe9d,0x141,0x141,0x141,0x141,0x12f3,0x12f3,0x12f3,0x12f3, -0x12f3,0x12f3,0x12f6,0x12f6,0x12f9,0x12f6,0x198,0x198,0x198,0x198,0x198,0x198,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0x142b,0x142b,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0xea9,0x135c,0x144,0x144,0x144, -0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x1359,0xc63,0xc63,0xc63,0xc63, -0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xed6,0xec7,0xec1,0xed3, -0xed0,0xeca,0xeca,0xed9,0xec4,0xecd,0x147,0x147,0x147,0x147,0x147,0x147,0xf5a,0xf5a,0xf45,0xf5a, -0xf5d,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0x14d,0x14d,0x14d,0x14d,0xf54,0xf54,0xf54,0xf54, -0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf66,0xf66,0xf4b,0xf51,0xf66,0xf66,0xf4e,0xf4b,0xf4b,0xf4b, -0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, -0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0x14d,0x14d,0x14d,0x1362,0x135f,0x1362,0x135f, -0x1362,0x135f,0x1362,0x135f,0x1362,0x135f,0x1431,0x154b,0x154b,0x154b,0x17e2,0x150,0x154b,0x154b,0x1731,0x1731, -0x1731,0x172b,0x1731,0x172b,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,0x150,0x150,0x150,0x1548,0x1434,0x1434,0x135f,0x1062,0x1062,0x1062,0x1062,0x1062, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf72,0xf72,0xf78,0xf78,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, -0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81, -0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf7b,0xf7b,0xf7b,0xf7b,0x1191,0x1191,0x156,0x156,0x156,0xf7e, -0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e, -0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1734,0x159,0x159,0x159,0x159,0x159,0x159, -0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159, -0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0xf8a,0xf8a,0xf8a,0x1554, -0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x15c,0xf87,0xf87,0xf87,0xf87, -0x1551,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0xf8d,0xf8d,0xf8d,0xf8d, -0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x15f,0x15f, -0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x1089,0x1089,0x1089,0x1089, -0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, -0x1086,0x1086,0x107d,0x107a,0x162,0x162,0x162,0x108c,0x108c,0x1080,0x1080,0x1080,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x162,0x162,0x162,0x1089,0x1089,0x1089,0x108f,0x108f,0x108f,0x108f, -0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x10a4,0x10a4,0x10a4,0x10a4, -0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a7,0x10a7,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, -0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x10ce,0x10ce,0x10ce,0x10ce, -0x10c8,0x17e5,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x10d4,0x10d4,0x10cb,0x10cb,0x10cb,0x10cb, -0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x168,0x168,0x168,0x168,0x168,0x168,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10ec,0x10ef, -0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x10e9,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1101,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10fe,0x10fe,0x10f5,0x10f5,0x10fe, -0x10fe,0x10f5,0x10f5,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x1101,0x1101,0x1101,0x10f5, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x10f5,0x10fe,0x16e,0x16e,0x10fb,0x10fb,0x10fb,0x10fb, -0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x16e,0x16e,0x10f8,0x1104,0x1104,0x1104,0x1560,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110d,0x174,0x174,0x1110,0x1110,0x1110,0x1110, -0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, -0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x177,0x177,0x177,0x1113,0x1113,0x1113,0x1113, -0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x17a,0x17a,0x17a, -0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x1119,0x1119,0x1119,0x1119, -0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119, -0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x17d,0x17d,0x17d,0x17d,0x17d,0x1116,0x111c,0x111c,0x111c,0x111c, -0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x180,0x180,0x180,0x180,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1197,0x1197,0x1197,0x1197, -0x11a0,0x1197,0x1197,0x1197,0x11a0,0x1197,0x1197,0x1197,0x1197,0x1194,0x186,0x186,0x119d,0x119d,0x119d,0x119d, -0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x186,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11bb,0x11a6,0x11bb,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x18c,0x11af,0x11b8,0x11a6,0x11b8, -0x11b8,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11a6, -0x11a6,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x18c,0x18c,0x11a9,0x11b5,0x11b5,0x11b5,0x11b5, -0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x11b5,0x11b5,0x11b5,0x11b5, -0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x11b2,0x11b2,0x11b2,0x11b2, -0x11b2,0x11b2,0x11b2,0x11c1,0x11c4,0x11c4,0x11c4,0x11c4,0x11b2,0x11b2,0x18c,0x18c,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15a8,0x210,0x1308,0x12e7,0x1302,0x1302, -0x1302,0x1302,0x1302,0x1302,0x1302,0x12ea,0x12ea,0x12ea,0x12ea,0x1302,0x12ea,0x12ea,0x12ea,0x12ea,0x12f0,0x14d6, -0x14dc,0x14d9,0x14d3,0x192,0x1701,0x1701,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x11d9,0x11d9,0x11d9,0x11d9, -0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d0,0x11d0,0x11d3,0x11dc, -0x11d6,0x11d6,0x11d6,0x11dc,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x130e,0x11e5,0x1311, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e2,0x11e2,0x11e2,0x11e5,0x173a,0x173d,0x19b,0x19b,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x19e,0x19e,0x19e,0x11fa,0x11ee,0x11ee,0x11ee, -0x11ee,0x11ee,0x11ee,0x11f1,0x1200,0x1200,0x11ee,0x11ee,0x11ee,0x11ee,0x1a1,0x12fc,0x11f4,0x11f4,0x11f4,0x11f4, -0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x1a1,0x1a1,0x1a1,0x1a1,0x11ee,0x11ee,0x121e,0x1212,0x121e,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x121b,0x121b,0x1221,0x1215,0x1218,0x1236,0x1236,0x1236,0x1230, -0x1230,0x1227,0x1230,0x1230,0x1227,0x1230,0x1230,0x1239,0x1233,0x122a,0x1a7,0x1a7,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x1aa,0x1aa,0x1aa,0x1aa,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, -0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, -0x123c,0x123c,0x123c,0x123c,0x1aa,0x1aa,0x1aa,0x1aa,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1ad,0x1245, -0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1b0,0x1b0, -0x1b0,0x1251,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1b3,0x1b3, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263, -0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, -0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1bc,0x1287,0x1287,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, -0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, -0x12b1,0x12b1,0x12b1,0x156c,0x156c,0x1c5,0x1c5,0x1c5,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, -0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b4,0x1293,0x1c5, -0x13b6,0x12bd,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x12bd,0x13b6,0x12bd, -0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1443,0x1443,0x1c5,0x1c5,0x1c5,0x1c5, -0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba,0x13b3,0x12ba,0x12ba,0x13b3,0x13b9,0x12c0, -0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b, -0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x12e1,0x13d4,0x13d1,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12de,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12de,0x12db,0x12db,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d1, -0x13d4,0x13d4,0x13d4,0x1866,0x1c8,0x1c8,0x1c8,0x1c8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8, -0x12d8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1401,0x1401,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1374,0x1374,0x1374,0x1374, -0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, -0x1374,0x1374,0x1374,0x1374,0x1374,0x136e,0x136e,0x136e,0x1cb,0x1cb,0x1371,0x1cb,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1377,0x1380,0x137a,0x137a,0x1380,0x1380,0x1380,0x137a,0x1380,0x137a,0x137a,0x137a,0x1383,0x1383, -0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x137d,0x137d,0x137d,0x137d,0x1d1,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1d1,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1d1,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138f,0x13a1,0x13a1,0x1395,0x1395,0x1395,0x1395,0x1395,0x1d4,0x1d4,0x1d4,0x1d4,0x1392,0x1392, -0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1398,0x1398, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x156f,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x13da,0x13d7,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,0x1da,0x1da,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1dd,0x1dd,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1572,0x1dd,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13dd,0x1dd,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x13fb,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x1587,0x1587,0x1587,0x1587,0x1587,0x158a,0x16f8,0x158a,0x158a,0x158a,0x17c1,0x186f,0x186f,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x158a,0x158a,0x158a,0x158a, -0x158a,0x158a,0x1587,0x1587,0x1587,0x158a,0x1587,0x16f5,0x16f5,0x1e0,0x1e0,0x1e0,0x158a,0x1587,0x1587,0x158a, -0x186f,0x186f,0x186f,0x1e3,0x1e3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x13aa,0x13aa,0x13aa,0x13aa, -0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, -0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x144f,0x1590,0x144f,0x144f, -0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1746, -0x1746,0x1e9,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x1455,0x1455,0x1455,0x1455, -0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1ec, -0x1455,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec, -0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1455,0x1ec, -0x1ec,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1ec, -0x1455,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1ec, -0x1455,0x1ec,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec, -0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1455,0x1455,0x1455, -0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1452,0x1452,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1458, -0x1458,0x1458,0x1458,0x1458,0x1467,0x1458,0x145b,0x145b,0x1458,0x1458,0x1458,0x145e,0x145e,0x1ef,0x1464,0x1464, -0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1461,0x146d,0x146d,0x146d,0x1ef,0x1ef,0x1ef,0x1ef, -0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479, -0x1479,0x1479,0x1479,0x1476,0x1470,0x1470,0x1476,0x1476,0x147f,0x147f,0x1479,0x147c,0x147c,0x1476,0x1473,0x1f2, -0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482, -0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482, -0x1f5,0x1f5,0x1f5,0x1f5,0x1749,0x1749,0x1482,0x1482,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1f5,0x1f5,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x148e,0x148e,0x148e,0x148e,0x148e,0x1f8,0x1f8,0x1f8, -0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x148e,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, -0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1488,0x1488,0x1488,0x1488,0x1491, -0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x14a3,0x14a6,0x14a9,0x14a9, -0x14a6,0x14ac,0x14ac,0x1497,0x149a,0x174f,0x174c,0x174c,0x174c,0x1596,0x1fb,0x1fb,0x149d,0x149d,0x149d,0x149d, -0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x1593,0x1755,0x1758,0x1752,0x175b,0x175b,0x14b2,0x14b2,0x14b2,0x14b2, -0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x14af,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x14b5,0x14b5,0x14b5,0x14b5, -0x14b5,0x14b5,0x14b5,0x14b5,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1305,0x1302,0x1305,0x12ed, -0x1302,0x1302,0x1302,0x1308,0x1302,0x1308,0x130b,0x1302,0x1308,0x1308,0x1302,0x1302,0x14c7,0x14c7,0x14c7,0x14c7, -0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14b8,0x14c1,0x14b8,0x14c1,0x14c1,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14c4,0x14bb,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x159c,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x207,0x207,0x1599,0x1599,0x1599,0x1599, -0x1599,0x159f,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x1704,0x16fb,0x16fb,0x16fb, -0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb, -0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x20d,0x20d,0x20d,0x20d,0x210,0x210,0x210,0x210, +0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd26,0xd26,0xd5,0xd5,0xd5,0xd26,0xd5,0xd5,0xd26, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0x14e8,0x14e8,0x179a,0x179a,0xde, +0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x135,0x135,0x135,0x135, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xde3,0xde3,0xde9,0xde9,0xde3,0xe1,0xe1,0xde6,0xde6, +0x10f5,0x10f5,0x10f5,0x10f5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, +0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, +0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb, +0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14ee,0x1866,0x1866,0x1866,0x1866,0xe7,0x179d,0x1314,0x1137,0xee5,0xee5, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfb,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x1140,0x113d,0x1140,0x113d,0x113a, +0x113a,0x113a,0x13da,0x13d7,0xea,0xea,0xea,0xea,0xea,0xdf8,0xdf5,0xdf5,0xdf5,0xdf2,0xdf8,0xdf5, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, +0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xf3,0x13dd,0xf3,0xf3,0xf3,0xf3,0xf3,0x13dd,0xf3,0xf3, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xf6, +0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, +0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xf6, +0xe22,0xe16,0xe16,0xe16,0xf9,0xe16,0xe16,0xf9,0xf9,0xf9,0xf9,0xf9,0xe16,0xe16,0xe16,0xe16, +0xe22,0xe22,0xe22,0xe22,0xf9,0xe22,0xe22,0xe22,0xf9,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xf9,0xf9,0xf9,0xf9,0xe13,0xe13,0xe13,0xf9,0xf9,0xf9,0xf9,0xe19,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe25,0xe25,0xe1c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0x1146,0x1146,0xfc,0xfc,0xfc,0xfc,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe34,0xe34,0xe34,0xe31,0xe31,0xe34,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0x1143,0xfc,0xfc,0xfc,0xe2b,0xe2b,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff,0xff,0xff, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe37,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14f7,0x14fd,0x14fa,0x1845,0x17a0,0x1869,0x1869,0x1869, +0x1869,0x1869,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, +0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, +0x102,0x102,0x102,0x102,0xe61,0xe61,0xe61,0xe5e,0xe5e,0xe55,0xe55,0xe5e,0xe5b,0xe5b,0xe5b,0xe5b, +0x105,0x105,0x105,0x105,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b7,0x12b4,0x159,0x159, +0x159,0x159,0x159,0x159,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0x13e9,0x13e9,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0xe67,0x131a,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0x1317,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21, +0xc21,0xc21,0xc21,0xc21,0xe94,0xe85,0xe7f,0xe91,0xe8e,0xe88,0xe88,0xe97,0xe82,0xe8b,0x10b,0x10b, +0x10b,0x10b,0x10b,0x10b,0xf18,0xf18,0xf03,0xf18,0xf1b,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0x111,0x111,0x111,0x111,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf24,0xf24, +0xf09,0xf0f,0xf24,0xf24,0xf0c,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf06, +0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf09,0x111,0x111,0x111,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x13ef,0x1509, +0x1509,0x1509,0x17a3,0x114,0x1509,0x1509,0x16f2,0x16f2,0x16f2,0x16ec,0x16f2,0x16ec,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1506, +0x13f2,0x13f2,0x131d,0x1020,0x1020,0x1020,0x1020,0x1020,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf30,0xf30,0xf36,0xf36, +0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f, +0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf39,0xf39, +0xf39,0xf39,0x114f,0x114f,0x11a,0x11a,0x11a,0xf3c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x16f5,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0xf48,0xf48,0xf48,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512, +0x1512,0x1512,0x1512,0x120,0xf45,0xf45,0xf45,0xf45,0x150f,0x120,0x120,0x120,0x120,0x120,0x120,0x120, +0x120,0x120,0x120,0x120,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b, +0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123, +0x123,0x123,0x123,0x123,0x1047,0x1047,0x1047,0x1047,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, +0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1044,0x1044,0x103b,0x1038,0x126,0x126,0x126,0x104a, +0x104a,0x103e,0x103e,0x103e,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x126,0x126, +0x126,0x1047,0x1047,0x1047,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050, +0x1050,0x1050,0x1050,0x1050,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1065,0x1065, +0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0x129,0x129,0x129,0x129,0x108c,0x108c,0x108c,0x108c,0x1086,0x17a6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x1092,0x1092,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10aa,0x10ad,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x10a7,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b3,0x10b3,0x10bc,0x10bc,0x10b3,0x10b3,0x10bc,0x10bc,0x10b3,0x10b3,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x10bf,0x10bf,0x10bf,0x10b3,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10b3,0x10bc,0x132,0x132,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x132,0x132, +0x10b6,0x10c2,0x10c2,0x10c2,0x151e,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,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10cb,0x138,0x138,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x13b,0x13b,0x13b,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, +0x13e,0x13e,0x13e,0x13e,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, +0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x141,0x141, +0x141,0x141,0x141,0x10d4,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da, +0x144,0x144,0x144,0x144,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, +0x147,0x147,0x147,0x147,0x1155,0x1155,0x1155,0x1155,0x115e,0x1155,0x1155,0x1155,0x115e,0x1155,0x1155,0x1155, +0x1155,0x1152,0x14a,0x14a,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b, +0x115b,0x115b,0x115b,0x14a,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d, +0x14d,0x14d,0x14d,0x14d,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x1179,0x1164,0x1179,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1164,0x1164,0x150,0x116d,0x1176,0x1164,0x1176,0x1176,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179,0x1164,0x1164,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a, +0x116a,0x150,0x150,0x1167,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x150,0x150, +0x150,0x150,0x150,0x150,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x150,0x150, +0x150,0x150,0x150,0x150,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x117f,0x1182,0x1182,0x1182,0x1182, +0x1170,0x1170,0x150,0x150,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1566,0x1cb,0x12c6,0x12a5,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12a8,0x12a8,0x12a8, +0x12a8,0x12c0,0x12a8,0x12a8,0x12a8,0x12a8,0x12ae,0x1494,0x149a,0x1497,0x1491,0x18e4,0x16bf,0x16bf,0x153,0x153, +0x153,0x153,0x153,0x153,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x118e,0x118e,0x1191,0x119a,0x1194,0x1194,0x1194,0x119a,0x156,0x156,0x156,0x156, +0x156,0x156,0x156,0x156,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d, +0x119d,0x119d,0x119d,0x119d,0x119d,0x12cc,0x11a3,0x12cf,0x11a3,0x11a3,0x11a3,0x11a3,0x11a0,0x11a0,0x11a0,0x11a3, +0x16fb,0x16fe,0x15c,0x15c,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x15f,0x15f,0x15f,0x11b8,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11af,0x11be,0x11be,0x11ac,0x11ac, +0x11ac,0x11ac,0x162,0x12ba,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x162,0x162, +0x162,0x162,0x11ac,0x11ac,0x11dc,0x11d0,0x11dc,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, +0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x11d9, +0x11d9,0x11df,0x11d3,0x11d6,0x11f4,0x11f4,0x11f4,0x11ee,0x11ee,0x11e5,0x11ee,0x11ee,0x11e5,0x11ee,0x11ee,0x11f7, +0x11f1,0x11e8,0x168,0x168,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x168,0x168, +0x168,0x168,0x168,0x168,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x16b,0x16b,0x16b,0x16b,0x11fa, +0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa, +0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x16b,0x16b,0x16b,0x16b, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x16e,0x1203,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x171,0x171,0x171,0x120f,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x174,0x174,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218, +0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, +0x1221,0x1221,0x1221,0x177,0x177,0x177,0x177,0x177,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x17d, +0x1242,0x1242,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x152a,0x152a,0x186,0x186,0x186, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x126f,0x126f,0x126f,0x1272,0x1272,0x1272,0x1251,0x186,0x1374,0x127b,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x127b,0x1374,0x127b,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1401,0x1401,0x186,0x186,0x186,0x186,0x1377,0x1377,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1278,0x1371,0x1278,0x1278,0x1371,0x1377,0x127e,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824, +0x1824,0x1824,0x1824,0x1824,0x1824,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x1329,0x1329,0x1329,0x1329,0x129f,0x1392,0x138f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c,0x1299, +0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c, +0x1299,0x1299,0x1392,0x1392,0x1392,0x1392,0x1392,0x138f,0x1392,0x1392,0x1392,0x1827,0x189,0x189,0x189,0x189, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x13bf,0x13bf,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x132c,0x132c,0x132c,0x18c,0x18c,0x132f,0x18c,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1335,0x133e, +0x1338,0x1338,0x133e,0x133e,0x133e,0x1338,0x133e,0x1338,0x1338,0x1338,0x1341,0x1341,0x18f,0x18f,0x18f,0x18f, +0x18f,0x18f,0x18f,0x18f,0x133b,0x133b,0x133b,0x133b,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134d,0x135f, +0x135f,0x1353,0x1353,0x1353,0x1353,0x1353,0x195,0x195,0x195,0x195,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, +0x1356,0x1356,0x1356,0x1356,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195, +0x195,0x195,0x195,0x152d,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x198,0x198,0x198, +0x198,0x198,0x198,0x198,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x19b,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x1530,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x139b,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x1365,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, +0x19b,0x19b,0x19b,0x19b,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1545,0x1545,0x1545,0x1545,0x1545,0x1548, +0x16b6,0x1548,0x1548,0x1548,0x1782,0x1830,0x1830,0x186c,0x186c,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1545,0x1545,0x1545,0x1548,0x1545,0x16b3, +0x16b3,0x19e,0x19e,0x19e,0x1548,0x1545,0x1545,0x1548,0x1830,0x1830,0x1830,0x18cf,0x18cf,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, +0x1a1,0x1a1,0x1a1,0x1a1,0x140d,0x154e,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d, +0x140d,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1707,0x1707,0x1a4,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413, +0x1413,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1410,0x1410,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1416,0x1416,0x1416,0x1416,0x1416,0x1425,0x1416,0x1419,0x1419, +0x1416,0x1416,0x1416,0x141c,0x141c,0x1aa,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422, +0x141f,0x142b,0x142b,0x142b,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1434,0x142e,0x142e,0x1434,0x1434, +0x143d,0x143d,0x1437,0x143a,0x143a,0x1434,0x1431,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440, +0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1b0,0x1b0,0x1b0,0x1b0,0x170a,0x170a,0x1440,0x1440, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x1b0,0x1b0,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x144c,0x144c,0x144c,0x144c,0x144c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449, +0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449, +0x1449,0x1449,0x1449,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x1b3,0x1b3,0x1b3,0x1446,0x1446,0x1446,0x1446,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f, +0x144f,0x144f,0x144f,0x144f,0x1461,0x1464,0x1467,0x1467,0x1464,0x146a,0x146a,0x1455,0x1458,0x1710,0x170d,0x170d, +0x170d,0x1554,0x1b6,0x1b6,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1551,0x1716, +0x1719,0x1713,0x171c,0x171c,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1b9,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1bc,0x1bc,0x1bc,0x1bc, +0x1bc,0x1bc,0x1bc,0x1bc,0x12c3,0x12c0,0x12c3,0x12ab,0x12c0,0x12c0,0x12c0,0x12c6,0x12c0,0x12c6,0x12c9,0x12c0, +0x12c6,0x12c6,0x12c0,0x12c0,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1476, +0x147f,0x1476,0x147f,0x147f,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1482,0x1479,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x155a,0x155a,0x1c2,0x1c2,0x1557,0x1557,0x1557,0x1557,0x1557,0x155d,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x16c2,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x1c8,0x1c8,0x1c8,0x1c8,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1ce,0x1ce,0x1572,0x156c,0x156f,0x1578,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x171f,0x16c5,0x1587,0x16cb,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1d7,0x1590, +0x1590,0x1d7,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590, +0x1590,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1590, +0x1590,0x1590,0x1d7,0x1d7,0x16c8,0x1590,0x1581,0x1587,0x1581,0x1587,0x1587,0x1587,0x1587,0x1d7,0x1d7,0x1587, +0x1587,0x1d7,0x1d7,0x158a,0x158a,0x158d,0x1d7,0x1d7,0x1722,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1581, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1593,0x1590,0x1590,0x1590,0x1590,0x1587,0x1587,0x1d7,0x1d7,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7,0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x1da,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a2,0x15a2,0x15a2,0x1596,0x1596,0x1596,0x15a2,0x15a2, +0x1596,0x15a5,0x1599,0x1596,0x15ab,0x15ab,0x159f,0x15ab,0x15ab,0x159c,0x17b5,0x1da,0x15ba,0x15ba,0x15ba,0x15ae, +0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15b1,0x15b4,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1725,0x1725,0x1725,0x1725, +0x15c6,0x15c3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, +0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15d8,0x15d8,0x15d8,0x15d8, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15cf, +0x15d2,0x15d5,0x15d8,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15db,0x15db,0x1e9,0x1e9,0x1e9,0x1e9,0x15de,0x15de,0x15de,0x15de,0x15de,0x15e4,0x15e4,0x15e4,0x15e4, +0x15e4,0x15e4,0x15e1,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x1ec,0x1ec,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ea,0x15ea,0x15ea,0x15ea, +0x15ea,0x15ea,0x15ea,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x15f3,0x1605,0x1605,0x15f9, +0x1602,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15fc,0x15fc,0x15fc,0x15fc, +0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x160b,0x160b,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x1f2,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1611,0x161a,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1617,0x1617,0x1617,0x1617,0x1617,0x1f5,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1f8,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x1629,0x1629,0x1629,0x1629,0x1629,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1644,0x1644,0x1647,0x1647, +0x164a,0x163b,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1fe,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x1fe,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1644,0x1644,0x1644,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x165c,0x165c,0x165c,0x165c, +0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x204,0x204, +0x204,0x204,0x204,0x204,0x204,0x1659,0x1659,0x1659,0x1659,0x204,0x204,0x204,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x165f,0x1671,0x1671,0x165f,0x165f, +0x165f,0x165f,0x20a,0x20a,0x1671,0x1671,0x1674,0x1674,0x165f,0x165f,0x1671,0x1665,0x1662,0x1668,0x167a,0x167a, +0x166b,0x166b,0x166e,0x166e,0x166e,0x167a,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e, +0x172e,0x172e,0x172e,0x172e,0x172b,0x172b,0x172b,0x172b,0x1728,0x1728,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20d,0x167d,0x167d,0x167d, +0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d, +0x167d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, 0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x213,0x213,0x213,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x213,0x213,0x213,0x213,0x213, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x15b4,0x15ae,0x15b1,0x15ba, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x175e,0x15c3,0x15c9,0x170a,0x21c,0x15d2,0x15d2,0x15d2, -0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x21c,0x15d2,0x15d2,0x21c,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, -0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, -0x15d2,0x21c,0x15d2,0x15d2,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x21c,0x1707,0x15d2,0x15c3,0x15c9, -0x15c3,0x15c9,0x15c9,0x15c9,0x15c9,0x21c,0x21c,0x15c9,0x15c9,0x21c,0x21c,0x15cc,0x15cc,0x15cf,0x21c,0x21c, -0x1761,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x15c3,0x21c,0x21c,0x21c,0x21c,0x21c,0x15d5,0x15d2,0x15d2, -0x15d2,0x15d2,0x15c9,0x15c9,0x21c,0x21c,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x21c,0x21c,0x21c, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, -0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea, -0x15ea,0x15ea,0x21f,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea, -0x15e4,0x15e4,0x15e4,0x15d8,0x15d8,0x15d8,0x15e4,0x15e4,0x15d8,0x15e7,0x15db,0x15d8,0x15ed,0x15ed,0x15e1,0x15ed, -0x15ed,0x15de,0x17f4,0x21f,0x15fc,0x15fc,0x15fc,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f3,0x15f6,0x222, -0x222,0x222,0x222,0x222,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x222,0x222, -0x222,0x222,0x222,0x222,0x1764,0x1764,0x1764,0x1764,0x1608,0x1605,0x225,0x225,0x225,0x225,0x225,0x225, -0x225,0x225,0x225,0x225,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, -0x178e,0x178e,0x178e,0x178e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1611,0x1614,0x1617,0x161a,0x22b,0x22b,0x22b,0x22b,0x22b, -0x22b,0x22b,0x22b,0x22b,0x1629,0x1629,0x1629,0x1629,0x1629,0x161d,0x161d,0x22e,0x22e,0x22e,0x22e,0x1620, -0x1620,0x1620,0x1620,0x1620,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1623,0x22e,0x22e,0x22e,0x22e,0x22e, -0x22e,0x22e,0x22e,0x22e,0x1632,0x1632,0x1632,0x1632,0x1632,0x231,0x231,0x162f,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162f,0x162f,0x162f,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x1635,0x1647,0x1647,0x163b,0x1644,0x234,0x234,0x234,0x234,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x234,0x234, -0x234,0x234,0x234,0x234,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x237,0x1659,0x1659,0x1659,0x1659,0x1659,0x1653,0x165c,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1659,0x1659, -0x1659,0x1659,0x1659,0x23a,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, -0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, -0x1662,0x1662,0x1662,0x23d,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166b,0x166b,0x166b,0x166b,0x166b,0x240, -0x240,0x240,0x240,0x240,0x1686,0x1686,0x1689,0x1689,0x168c,0x167d,0x243,0x243,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x243,0x167d, -0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x243,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x243,0x243,0x243,0x243, -0x243,0x1686,0x1686,0x1686,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x246,0x246,0x246, -0x246,0x246,0x246,0x246,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, -0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x169b,0x169b,0x169b, -0x169b,0x249,0x249,0x249,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16a1,0x16b3,0x16b3,0x16a1,0x16a1,0x16a1,0x16a1,0x24f,0x24f,0x16b3,0x16b3,0x16b6,0x16b6, -0x16a1,0x16a1,0x16b3,0x16a7,0x16a4,0x16aa,0x16bc,0x16bc,0x16ad,0x16ad,0x16b0,0x16b0,0x16b0,0x16bc,0x176d,0x176d, -0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a, -0x1767,0x1767,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0x252,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, -0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x252,0x252,0x252,0x252,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255, -0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x16c5,0x16d4,0x16cb,0x16c8,0x16da,0x16da,0x16ce,0x16da,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x258,0x258,0x258,0x258,0x258,0x258, -0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, -0x16dd,0x16dd,0x16dd,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x16e6, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x25e,0x25e,0x25e,0x1770,0x1770,0x1770, -0x177c,0x177c,0x1770,0x1770,0x1770,0x1770,0x177c,0x1770,0x1770,0x1770,0x1770,0x1773,0x25e,0x25e,0x25e,0x25e, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1776,0x1776,0x1782,0x1782,0x1782,0x1776, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,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,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x267,0x1797,0x1797,0x267,0x267, -0x267,0x267,0x267,0x1794,0x1794,0x1794,0x1794,0x1794,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x26a, -0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179d,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, -0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x26d,0x26d,0x26d,0x26d,0x26d, -0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, -0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x26d,0x26d,0x26d,0x26d,0x26d, -0x26d,0x26d,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x270,0x270,0x273,0x273,0x273,0x273,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, -0x17ca,0x1878,0x1878,0x1878,0x1878,0x1875,0x1878,0x279,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1878,0x1875, -0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1878,0x279,0x279,0x1878,0x1878,0x1878,0x1878,0x1878, -0x1878,0x1878,0x1875,0x1872,0x1875,0x1878,0x1878,0x273,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1872,0x1875, -0x1875,0x1875,0x1875,0x1875,0x276,0x273,0x273,0x273,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875, -0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x276,0x276,0x276,0x276,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x1875,0x1875,0x1875, -0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x276,0x276,0x276,0x276,0x276,0x276, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x17c7,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x276,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x276,0x276, -0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x17ac,0x17ac,0x17ac,0x17ac,0x17a9,0x17ac,0x17ac,0x17af,0x17b2,0x17af,0x17af,0x17ac,0x27c,0x27c,0x27c,0x27c, -0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x1806,0x1806,0x1806,0x1806,0x17fd,0x17fd,0x17fd,0x17f7,0x17fa,0x17fa,0x17fa,0x27f,0x27f,0x27f,0x27f,0x27f, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x27f,0x27f,0x27f,0x27f,0x1800,0x1800, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x282,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x1683,0x1692,0x1689,0x1686,0x1698,0x1698,0x168c,0x1698, +0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x213,0x213,0x213,0x213,0x213,0x213,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x216,0x216,0x216,0x216,0x216, +0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x16a4,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1740,0x1740,0x219,0x219,0x219,0x1731,0x1731,0x1731,0x173d,0x173d,0x1731,0x1731,0x1731,0x1731,0x173d,0x1731, +0x1731,0x1731,0x1731,0x1734,0x219,0x219,0x219,0x219,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x1737,0x1737,0x1743,0x1743,0x1743,0x1737,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, +0x1758,0x1758,0x1758,0x222,0x1758,0x1758,0x222,0x222,0x222,0x222,0x222,0x1755,0x1755,0x1755,0x1755,0x1755, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b,0x225,0x175b,0x175b,0x175b,0x175b,0x225,0x175b, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175e,0x225,0x225,0x225,0x225,0x225,0x225, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, +0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x22b,0x22b,0x22b,0x22b, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x178b,0x1839,0x1839,0x1839,0x1839,0x1836,0x1839,0x18d5, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1839,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2, +0x1839,0x18d5,0x18d5,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1836,0x1833,0x1836,0x1839,0x1839,0x22b, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1833,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2,0x22b,0x22b,0x22b, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836, +0x1836,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x1788,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x18d2,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d,0x1770, +0x1773,0x1770,0x1770,0x176d,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e, +0x22e,0x22e,0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be,0x17be,0x17b8, +0x17bb,0x17bb,0x17bb,0x231,0x231,0x231,0x231,0x231,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4, +0x17c4,0x17c4,0x231,0x231,0x231,0x231,0x17c1,0x17c1,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2, +0x17e2,0x234,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2, +0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17df,0x17cd,0x17cd,0x17cd,0x17cd, +0x17cd,0x17cd,0x17cd,0x234,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17df,0x17d0,0x17e2,0x17e5,0x17e5,0x17d9, +0x17d6,0x17d6,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x17dc,0x17dc,0x17dc,0x17dc, +0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x234,0x234,0x234,0x17f1,0x17f4,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a, +0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb, +0x17eb,0x23a,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x183c,0x18d8,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x240,0x240,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee, +0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x240,0x17f7,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee, +0x17ee,0x17f7,0x17ee,0x17ee,0x17f7,0x17ee,0x17ee,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, +0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x243,0x243,0x243, +0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, +0x1815,0x1815,0x1806,0x1800,0x1800,0x1815,0x1803,0x1818,0x1818,0x1818,0x1818,0x181b,0x181b,0x180f,0x180c,0x1809, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x246,0x180f,0x246,0x1809,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, 0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, -0x1821,0x1821,0x1821,0x181e,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x282,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x181e,0x180f,0x1821,0x1824,0x1824,0x1818,0x1815,0x1815,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x282,0x282,0x282, -0x1830,0x1833,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x288,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x288,0x288,0x182a,0x182a,0x182a,0x182a,0x182a, -0x187b,0x28e,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, -0x291,0x291,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x291,0x1836,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x1836,0x182d,0x182d,0x1836,0x182d,0x182d,0x291, -0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c, -0x183c,0x183c,0x183c,0x183c,0x183c,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, -0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x1854,0x1854,0x1845,0x183f,0x183f,0x1854,0x1842,0x1857, -0x1857,0x1857,0x1857,0x185a,0x185a,0x184e,0x184b,0x1848,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x297,0x184e,0x297,0x1848,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860, -0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x29a,0x29a,0x29a,0x29a, -0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d, -0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x29a,0x29a,0x29a,0x29a, -0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x29d,0x29d,0x29d, -0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a6,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x975,0x975,0x17c4,0x17c4,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1, -0x2c1,0x2c1,0x2c1,0x2c1,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x2a6,0x2a6,0x2a6,0x2a6,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, -0x2a9,0x2a9,0x2a9,0x2a9,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x112b,0x112b,0x112b,0x112b,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0x14ca,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, -0x2af,0x2af,0x2af,0x2af,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0x12cf, -0x12cf,0x12cf,0x2b2,0x2b2,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, -0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, -0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x2b8,0x2b8, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x2be,0x2be, -0x1143,0x3ba,0x3ba,0x3c6,0xccf,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c6,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3c6,0x3c6,0x3c6,0x3c6,0x3c0,0x1146,0x131d, -0x3c9,0x942,0x945,0x3bd,0x3bd,0x1143,0x131a,0x131a,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc, -0x3c9,0x3c9,0x3ba,0x3ba,0x8cd,0x8d0,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, -0x3c3,0xfa5,0xfa2,0x1320,0x1320,0x1320,0x1320,0x1320,0x14f1,0x1149,0x1149,0xef7,0xef7,0xdc2,0xef7,0xef7, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3cc,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x131a,0x131d,0x3bd,0x3c9,0x3c6,0x3c6, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0xbbb,0xbbb,0xdce,0xdce,0x8d3,0xdd1,0x1410,0x1410,0x1410, -0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, -0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, -0x4b0,0x4b0,0x4b0,0x115e,0x115e,0x115e,0x115e,0x115e,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, -0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, -0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b, -0x4b3,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, -0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, -0x4b0,0x4b0,0x4b0,0x4b0,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4b6,0x4b6,0x4b6,0x4b6,0x4b9,0x9b7,0xff3,0xff3,0xff6,0xff3, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0xff6,0xff3,0xff6,0xff3,0xff6,0xff3, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x6a8,0x6a8,0x6ab,0x4e6,0x6b7,0x6b4,0x6b4,0x6b1,0x510,0x510,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0xae9, -0x6ba,0x4f2,0x6d2,0x6d5,0x507,0x6ba,0x4f5,0x4f5,0x4e6,0x501,0x501,0x6a8,0x50d,0x50a,0x6ae,0x4e0, -0x4d7,0x4d7,0x4da,0x4da,0x4da,0x4da,0x4da,0x4dd,0x4da,0x4da,0x4da,0x4d1,0x519,0x516,0x513,0x513, -0x6c6,0x4fb,0x4f8,0x6c3,0x6c0,0x6bd,0x6cf,0x4e9,0x6cc,0x6cc,0x4fe,0x501,0x6c9,0x6c9,0x4fe,0x501, -0x4e3,0x4e6,0x4e6,0x4e6,0x504,0x4ef,0x4ec,0xbd0,0xaef,0xaf2,0xaec,0xaec,0xaec,0xaec,0xbc7,0xbc7, -0xbc7,0xbc7,0xbcd,0xcfc,0xcf9,0xddd,0xde0,0xbca,0xde0,0xde0,0xde0,0xde0,0xddd,0xde0,0xde0,0xbc4, -0x54c,0x54c,0x564,0x6e4,0x549,0x6e1,0x54c,0x561,0x549,0x6e4,0x55b,0x564,0x564,0x564,0x55b,0x55b, -0x564,0x564,0x564,0x6ed,0x549,0x564,0x6e7,0x549,0x558,0x564,0x564,0x564,0x564,0x564,0x549,0x549, -0x54f,0x6e1,0x6ea,0x549,0x564,0x549,0x6f0,0x549,0x564,0x552,0x56a,0x6f3,0x564,0x564,0x555,0x55b, -0x564,0x564,0x567,0x564,0x55b,0x55e,0x55e,0x55e,0x55e,0xafe,0xafb,0xcff,0xdef,0xbeb,0xbee,0xbee, -0xbe8,0xbe5,0xbe5,0xbe5,0xbe5,0xbee,0xbeb,0xbeb,0xbeb,0xbeb,0xbe2,0xbe5,0xdec,0xf03,0xf06,0xffc, -0x116d,0x116d,0x116d,0x6f9,0x6f6,0x56d,0x570,0x570,0x570,0x570,0x570,0x6f6,0x6f9,0x6f9,0x6f6,0x570, -0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x579,0x579,0x579,0x579, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x573,0x573,0x573,0x573,0x573,0x573, -0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57c,0x585,0x585,0x57f,0x57f,0x57f,0x582,0x57c, -0x57f,0x57f,0x57c,0x57c,0x57c,0x57c,0x57f,0x57f,0x702,0x702,0x57c,0x57c,0x57f,0x57f,0x57f,0x57f, -0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x582,0x57f,0x57f,0x705,0x57f, -0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57c,0x57f,0x57c,0x57c,0x57c,0x57c,0x57c,0x57c, -0x57f,0x57f,0x57c,0x702,0x57c,0x57c,0x57c,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0x70b,0x588,0x70b,0x70b, -0x58b,0x588,0x588,0x70b,0x70b,0x58b,0x588,0x70b,0x58b,0x588,0x588,0x70b,0x588,0x70b,0x597,0x594, -0x588,0x70b,0x588,0x588,0x588,0x588,0x70b,0x588,0x588,0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x70b, -0x58b,0x70b,0x58b,0x70b,0x70b,0x70b,0x70b,0x70b,0x711,0x58e,0x70b,0x58e,0x58e,0x588,0x588,0x588, -0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x588,0x588,0x70b,0x70b,0x588,0x588,0x588,0x58b,0x588,0x588, -0x58b,0x588,0x588,0x58b,0x70b,0x58b,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x70b,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70e,0x70b,0x58b,0x588, -0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x70b,0x70b,0x588,0x58b,0x70e,0x70e,0x58b,0x58b,0x588,0x588, -0x58b,0x58b,0x588,0x588,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x58b,0x58b,0x70b,0x70b, -0x58b,0x58b,0x70b,0x70b,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x70b,0x588,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70b,0x588,0x588, -0x588,0x588,0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x588,0x588,0x588, -0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x591,0x588,0x588,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, -0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x59a,0xb07,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x5a6,0x5a3,0x5a6,0x5a3,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x714,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59a,0x59a,0x819,0x819,0x59a,0x59a,0x59a,0x59a,0x5a0,0x5a0,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59d,0x81f,0x81c,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0xb07,0xbfa,0xb07,0xb07,0xb07,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x5af,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60, -0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xd74,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x5b2,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x5b5,0x5b5,0x5b5,0x5b5,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x729,0x729,0x729,0x729, -0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x5b8,0x5b8,0x729,0x729, -0x729,0x729,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0x72f,0x72f,0x5bb,0x72c, -0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x5be,0x5be,0x5bb,0x5bb,0x5c1,0x5c1,0x5c1,0x5c1,0x72f,0x72f, -0x5c1,0x5c1,0x732,0x72f,0x5bb,0x5bb,0x5bb,0x5bb,0x72f,0x72f,0x5c1,0x5c1,0x732,0x72f,0x5bb,0x5bb, -0x5bb,0x5bb,0x72f,0x72f,0x72c,0x5bb,0x5c1,0x72f,0x5bb,0x5bb,0x72c,0x72f,0x72f,0x72f,0x5c1,0x5c1, -0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x72f,0x72c, -0x72f,0x72c,0x5bb,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5bb,0x5bb,0x72c,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xc00,0xc00,0xc00,0xc03,0xc03,0xc78,0xc78,0xc00,0x5cd,0x5cd,0x5cd,0x5cd, -0x5ca,0x741,0x741,0x5c4,0x5c4,0x735,0x5c4,0x5c4,0x5c4,0x5c4,0x73b,0x735,0x5c4,0x5ca,0x5c4,0x5c4, -0xd7d,0xd7d,0xc06,0xc06,0xdfe,0xb10,0x5c7,0x5c7,0x738,0x5d0,0x738,0x5c7,0x5ca,0x5c4,0x5ca,0x5ca, -0x5c4,0x5c4,0x5ca,0x5c4,0x5c4,0x5c4,0x5ca,0x5c4,0x5c4,0x5c4,0x5ca,0x5ca,0x5c4,0x5c4,0x5c4,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5ca,0x5cd,0x5cd,0x5c7,0x5c4,0x5c4,0x5c4,0x5c4,0x747,0x5c4,0x747,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x744,0x741,0x5d3,0x744, -0x735,0x73b,0x5ca,0x735,0x73e,0x735,0x735,0x5c4,0x735,0x741,0x5d3,0x741,0xb10,0xb10,0xc09,0xc09, -0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc0c,0xc09,0xc09,0xdf5,0xeb5,0x5d6,0x5d6,0x5d6,0x5d6, +0x1821,0x1821,0x1821,0x1821,0x249,0x249,0x249,0x249,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x181e,0x181e,0x181e,0x249,0x249,0x249,0x249,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x252,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x255, +0x187e,0x187e,0x255,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, +0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x255, +0x255,0x255,0x1872,0x255,0x1872,0x1872,0x255,0x1872,0x1872,0x1872,0x1875,0x1872,0x1878,0x1878,0x1881,0x1872, +0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b, +0x187b,0x187b,0x255,0x255,0x255,0x255,0x255,0x255,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x258,0x258,0x258,0x258,0x1899,0x1899,0x1899,0x1899,0x25b,0x25b,0x189c,0x189c, +0x189c,0x189c,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896, +0x1887,0x188a,0x188d,0x189f,0x189f,0x25b,0x1890,0x1890,0x18ae,0x18b1,0x18c0,0x18c0,0x18b1,0x18b4,0x18ae,0x18ab, +0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1899,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896, +0x1896,0x1884,0x1884,0x1884,0x1899,0x1899,0x1899,0x1899,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x18db,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, +0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x933,0x933,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0x267,0x267, +0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6, +0x18c6,0x18c6,0x18c6,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, +0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0x128d,0x128d,0x128d,0x26d,0x26d,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0x273,0x273,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x276,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x279,0x279,0x1785,0x1785,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c, +0x27c,0x27c,0x27c,0x27c,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x1101,0x378,0x378,0x384,0xc8d,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0x387,0x387,0x387,0x387,0x384,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x384,0x384,0x384, +0x384,0x37e,0x1104,0x12db,0x387,0x900,0x903,0x37b,0x37b,0x1101,0x12d8,0x12d8,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x387,0x387,0x378,0x378,0x87f,0x882,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x381,0xf63,0xf60,0x12de,0x12de,0x12de,0x12de,0x12de,0x14af,0x1107,0x1107,0xeb5, +0xeb5,0xd80,0xeb5,0xeb5,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387, +0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x12d8,0x12db, +0x37b,0x387,0x384,0x384,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x429,0x429, +0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x1857, +0x1857,0xf81,0x41a,0x423,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465, +0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0xb79,0xb79,0xd8c,0xd8c,0x885, +0xd8f,0x13ce,0x13ce,0x13ce,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468, +0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468, +0x468,0x468,0x468,0x468,0x46e,0x46e,0x46e,0x111c,0x111c,0x111c,0x111c,0x111c,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x471,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x474,0x474,0x474,0x474,0x477,0x975, +0xfb1,0xfb1,0xfb4,0xfb1,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0xfb4,0xfb1, +0xfb4,0xfb1,0xfb4,0xfb1,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x666,0x666,0x669,0x4a4,0x675,0x672,0x672,0x66f,0x4ce,0x4ce,0x48c,0x48c, +0x48c,0x48c,0x48c,0xaa7,0x678,0x4b0,0x690,0x693,0x4c5,0x678,0x4b3,0x4b3,0x4a4,0x4bf,0x4bf,0x666, +0x4cb,0x4c8,0x66c,0x49e,0x495,0x495,0x498,0x498,0x498,0x498,0x498,0x49b,0x498,0x498,0x498,0x48f, +0x4d7,0x4d4,0x4d1,0x4d1,0x684,0x4b9,0x4b6,0x681,0x67e,0x67b,0x68d,0x4a7,0x68a,0x68a,0x4bc,0x4bf, +0x687,0x687,0x4bc,0x4bf,0x4a1,0x4a4,0x4a4,0x4a4,0x4c2,0x4ad,0x4aa,0xb8e,0xaad,0xab0,0xaaa,0xaaa, +0xaaa,0xaaa,0xb85,0xb85,0xb85,0xb85,0xb8b,0xcba,0xcb7,0xd9b,0xd9e,0xb88,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9b,0xd9e,0xd9e,0xb82,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4f8,0x4fe,0x714,0x4fb,0x978, +0x999,0xab3,0xab3,0xab3,0xb94,0xb94,0xda4,0xda4,0xda4,0xda4,0x1125,0x1128,0x1128,0x12f9,0x149d,0x14c7, +0x14ca,0x14ca,0x16dd,0x185a,0x50a,0x50a,0x522,0x6a2,0x507,0x69f,0x50a,0x51f,0x507,0x6a2,0x519,0x522, +0x522,0x522,0x519,0x519,0x522,0x522,0x522,0x6ab,0x507,0x522,0x6a5,0x507,0x516,0x522,0x522,0x522, +0x522,0x522,0x507,0x507,0x50d,0x69f,0x6a8,0x507,0x522,0x507,0x6ae,0x507,0x522,0x510,0x528,0x6b1, +0x522,0x522,0x513,0x519,0x522,0x522,0x525,0x522,0x519,0x51c,0x51c,0x51c,0x51c,0xabc,0xab9,0xcbd, +0xdad,0xba9,0xbac,0xbac,0xba6,0xba3,0xba3,0xba3,0xba3,0xbac,0xba9,0xba9,0xba9,0xba9,0xba0,0xba3, +0xdaa,0xec1,0xec4,0xfba,0x112b,0x112b,0x112b,0x6b7,0x6b4,0x52b,0x52e,0x52e,0x52e,0x52e,0x52e,0x6b4, +0x6b7,0x6b7,0x6b4,0x52e,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd, +0x537,0x537,0x537,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x531,0x531, +0x531,0x531,0x531,0x531,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x543,0x543,0x53d, +0x53d,0x53d,0x540,0x53a,0x53d,0x53d,0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x6c0,0x6c0,0x53a,0x53a, +0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x540,0x540,0x540, +0x53d,0x53d,0x6c3,0x53d,0x6c3,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x53d,0x53a,0x53a, +0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x53a,0x6c0,0x53a,0x53a,0x53a,0xac2,0xac2,0xac2,0xac2,0xac2, +0xac2,0xac2,0xac2,0xac2,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0x6c9,0x546,0x6c9,0x6c9,0x549,0x546,0x546,0x6c9,0x6c9,0x549,0x546,0x6c9,0x549,0x546,0x546,0x6c9, +0x546,0x6c9,0x555,0x552,0x546,0x6c9,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x6c9,0x6c9,0x6c9, +0x6c9,0x546,0x546,0x6c9,0x549,0x6c9,0x549,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6cf,0x54c,0x6c9,0x54c, +0x54c,0x546,0x546,0x546,0x6c9,0x6c9,0x6c9,0x6c9,0x546,0x546,0x546,0x546,0x6c9,0x6c9,0x546,0x546, +0x546,0x549,0x546,0x546,0x549,0x546,0x546,0x549,0x6c9,0x549,0x546,0x546,0x6c9,0x546,0x546,0x546, +0x546,0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x6cc,0x6c9,0x549,0x546,0x6c9,0x6c9,0x6c9,0x6c9,0x546,0x546,0x6c9,0x6c9,0x546,0x549,0x6cc,0x6cc, +0x549,0x549,0x546,0x546,0x549,0x549,0x546,0x546,0x549,0x549,0x546,0x546,0x546,0x546,0x546,0x546, +0x549,0x549,0x6c9,0x6c9,0x549,0x549,0x6c9,0x6c9,0x549,0x549,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549, +0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549,0x546,0x54f,0x546,0x546,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x558,0xac5,0x558,0x558, +0x558,0x558,0x558,0x558,0x564,0x561,0x564,0x561,0x558,0x558,0x558,0x558,0x558,0x558,0x6d2,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x7d4,0x7d4,0x558,0x558,0x558,0x558,0x55e,0x55e,0x558,0x558, +0x558,0x558,0x558,0x558,0x55b,0x7da,0x7d7,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0xac5,0xbb8,0xac5,0xac5,0xac5, +0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567, +0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567, +0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x56d,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, +0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xd32, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x570,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x573,0x573,0x573,0x573, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7, +0x576,0x576,0x6e7,0x6e7,0x6e7,0x6e7,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, +0x6ed,0x6ed,0x579,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x57c,0x57c,0x579,0x579,0x57f,0x57f, +0x57f,0x57f,0x6ed,0x6ed,0x57f,0x57f,0x6f0,0x6ed,0x579,0x579,0x579,0x579,0x6ed,0x6ed,0x57f,0x57f, +0x6f0,0x6ed,0x579,0x579,0x579,0x579,0x6ed,0x6ed,0x6ea,0x579,0x57f,0x6ed,0x579,0x579,0x6ea,0x6ed, +0x6ed,0x6ed,0x57f,0x57f,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579, +0x579,0x579,0x6ed,0x6ea,0x6ed,0x6ea,0x579,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x579,0x579,0x6ea, +0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xbbe,0xbbe,0xbbe,0xbc1,0xbc1,0xc36,0xc36,0xbbe, +0x58b,0x58b,0x58b,0x58b,0x588,0x6ff,0x6ff,0x582,0x582,0x6f3,0x582,0x582,0x582,0x582,0x6f9,0x6f3, +0x582,0x588,0x582,0x582,0xd3b,0xd3b,0xbc4,0xbc4,0xdbc,0xace,0x585,0x585,0x6f6,0x58e,0x6f6,0x585, +0x588,0x582,0x588,0x588,0x582,0x582,0x588,0x582,0x582,0x582,0x588,0x582,0x582,0x582,0x588,0x588, +0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x588,0x58b,0x58b,0x585,0x582,0x582,0x582,0x582, +0x705,0x582,0x705,0x582,0x582,0x582,0x582,0x582,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd, +0x7dd,0x7dd,0x7dd,0x7dd,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582, +0x702,0x6ff,0x591,0x702,0x6f3,0x6f9,0x588,0x6f3,0x6fc,0x6f3,0x6f3,0x582,0x6f3,0x6ff,0x591,0x6ff, +0xace,0xace,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbca,0xbc7,0xbc7,0xdb3,0xe73, +0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, +0x594,0x594,0x594,0x594,0x597,0x1383,0x1383,0x1383,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x14d3,0x59d,0x5a9,0x59d,0x59d,0x1383,0x597,0x597,0x5ac,0x5a9,0x1386,0x1386,0x5af,0x5af,0x597,0x5a3, +0x597,0x597,0x5a3,0x597,0x5a3,0x597,0x5a3,0x597,0x597,0x597,0x597,0x597,0x597,0x5a3,0x597,0x597, +0x597,0x597,0x597,0x597,0x1383,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x5a3, +0x5a3,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x70b,0x597,0x597,0x597,0x597,0x597,0x597, +0x5a3,0x597,0x597,0x5a3,0x597,0x597,0x597,0x597,0x1383,0x597,0x1383,0x597,0x597,0x597,0x597,0x1383, +0x1383,0x1383,0x597,0x1287,0x597,0x597,0x597,0x5a0,0x5a0,0x5a0,0x5a0,0x1305,0x1305,0x597,0x59a,0x5a6, +0x5ac,0x597,0x597,0x597,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd, +0xbd0,0xbcd,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x597,0x5a3,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x1383,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x1383,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d0,0x5d6,0x5c7,0x5ca,0x5d6,0x5d6,0x5d6,0x5d6, 0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, -0x5d9,0x13c5,0x13c5,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x1515,0x5df,0x5eb,0x5df, -0x5df,0x13c5,0x5d9,0x5d9,0x5ee,0x5eb,0x13c8,0x13c8,0x5f1,0x5f1,0x5d9,0x5e5,0x5d9,0x5d9,0x5e5,0x5d9, -0x5e5,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5e5,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x74d,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5d9,0x5d9,0x5e5, -0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x5d9,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x13c5,0x13c5,0x5d9,0x12c9, -0x5d9,0x5d9,0x5d9,0x5e2,0x5e2,0x5e2,0x5e2,0x1347,0x1347,0x5d9,0x5dc,0x5e8,0x5ee,0x5d9,0x5d9,0x5d9, -0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0x74a,0x74a, -0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x61b,0x61b,0x61b, -0x61b,0x61b,0x61b,0x61b,0x612,0x618,0x609,0x60c,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612, -0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x618,0x612,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, -0x134a,0x134a,0x134a,0x134a,0x618,0x612,0x618,0x612,0x618,0x612,0x615,0x61b,0x615,0x61b,0x618,0x612, -0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x615,0x618,0x612,0x615, -0x618,0x612,0x615,0x61b,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x615,0x615,0x612,0x615,0x612,0x615,0x612,0x612,0x615,0x612,0x612,0x615, -0x612,0x615,0x612,0x612,0x615,0x612,0x615,0x615,0x612,0x612,0x612,0x615,0x612,0x612,0x612,0x612, -0x612,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x612,0x612,0x615,0x612,0x615,0x612, -0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b, -0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x61e,0x61e,0x61e,0x61e,0x1008,0x1008,0x1008,0x1518, -0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1722,0x1722,0x87f,0x885,0x885,0x891,0x891,0x882,0x879,0x882, -0x879,0x882,0x879,0x882,0x879,0x882,0x879,0x882,0x62d,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62d, -0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62d, -0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, -0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x720,0x720,0x720,0x720,0x720,0x720, -0x720,0x720,0x720,0x720,0x720,0x720,0x723,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, -0x720,0x720,0x720,0x720,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,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,0xc66,0x8e5,0x8df,0x8dc,0x8e2,0x8d9,0x765,0x768,0x768,0x768,0x768,0x768, -0x768,0x768,0x768,0x768,0x8eb,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, -0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, -0x765,0x765,0x765,0x765,0x765,0x765,0x8e8,0x8e8,0x76b,0x8fa,0x8fd,0x903,0x825,0x831,0x918,0x82e, -0x8f1,0x8ee,0x8f1,0x8ee,0x8f7,0x8f4,0x8f7,0x8f4,0x8f1,0x8ee,0x82b,0x903,0x8f1,0x8ee,0x8f1,0x8ee, -0x8f1,0x8ee,0x8f1,0x8ee,0x906,0x90f,0x90c,0x90c,0x771,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7a7, -0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7, -0x7a7,0x7a7,0x7a7,0x774,0x78f,0x76e,0x795,0x798,0x792,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x774,0x78f,0x76e,0x78f,0xc69,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,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x816, -0x82b,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x94e,0x94e,0x94e,0x94e,0x834,0x834, -0x909,0x915,0x915,0x915,0x915,0x912,0x828,0x900,0xb34,0xb34,0xb34,0xc7b,0xc99,0xc96,0xb4f,0x8d6, -0x83a,0x837,0x83a,0x83d,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x837,0x837,0x837,0x837,0x837, -0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x837, -0xc9c,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x846,0x849,0x846,0x849,0x846, -0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846, -0x849,0x846,0x849,0x84c,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x846,0x846,0x846,0x846,0x846, -0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x846, -0x846,0x846,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x846,0x846,0x846,0x846,0x846,0x84c,0x846, -0x846,0x846,0x846,0x846,0x849,0x84c,0x84c,0x849,0x849,0x849,0x849,0x91e,0x921,0x84f,0x852,0xc84, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x85b,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x864,0x864,0x864,0x864, -0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864, -0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0xd86,0xd86,0xeb8,0x85e,0x92a,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0xd80,0xd80,0xd80,0xd80,0x867,0x867,0x867,0x867, -0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x933,0x933,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x86a,0x86a,0x86a, -0x86a,0x86a,0x86a,0xd89,0xd89,0xd89,0xd89,0x936,0x936,0x936,0x936,0x936,0x86a,0x86a,0x86a,0x86a, -0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a, -0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0xd89,0xd89, -0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, -0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870, -0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870, -0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb, -0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb, -0x112b,0x112b,0x112b,0x112b,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873, -0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873, -0x873,0x873,0x873,0x873,0x873,0x873,0x876,0x876,0x873,0x876,0x873,0x876,0x876,0x873,0x873,0x873, -0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x876,0x873,0x876,0x873,0x876,0x876,0x873,0x873,0x876, -0x876,0x876,0x873,0x873,0x873,0x873,0x14cd,0x14cd,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,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,0x12ff,0x12ff,0x12ff,0x12ff,0x12a8,0x12a8,0x12a8,0x12a8, -0x12a8,0x12a8,0x12a8,0x12a8,0xd80,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, -0xc87,0xc87,0xc87,0xc87,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x930,0x92d,0x930,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, -0x92d,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0xd89, -0x9b1,0x993,0x993,0x993,0x993,0x98d,0x993,0x993,0x9a5,0x993,0x993,0x990,0x99c,0x9a2,0x9a2,0x9a2, -0x9a2,0x9a2,0x9a5,0x98d,0x999,0x98d,0x98d,0x98d,0x984,0x984,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, -0x98d,0x98d,0x98d,0x98d,0x990,0x984,0x98d,0x984,0x98d,0x984,0x99f,0x996,0x99f,0x996,0x9ae,0x9ae, -0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, -0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, -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, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c6,0x9c6, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9c9,0x9c9, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9d2,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,0x9d2,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,0xa62,0xa62,0xfed,0xa62,0xa62,0xa62,0xa65,0xa62, -0xfed,0xa62,0xa62,0xfe4,0xa5c,0xa50,0xa50,0xa50,0xa50,0xa5f,0xa50,0xfd2,0xfd2,0xfd2,0xa50,0xa53, -0xa5c,0xa56,0xfd8,0xfe7,0xfe7,0xfd2,0xfd2,0xfed,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xa68,0xa68,0xa59,0xa59,0xa59,0xa59,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa5f,0xa5f, -0xa50,0xa50,0xfed,0xfed,0xfed,0xfed,0xfd2,0xfd2,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xdda,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa80,0xa86,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0x1164,0x1164,0x1164,0x1164,0x1164, -0x1164,0x1164,0x1164,0x1164,0x1161,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xabc,0xabc,0xabc,0xabf,0xabf,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xaa4,0xaa4,0xab9,0xa9b, -0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xab9,0xab9,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xadd,0xadd,0xadd,0xadd,0xadd,0xac8,0xac8,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,0xadd, -0xadd,0xadd,0xadd,0xae0,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, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, +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,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308, +0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d3,0x5d6,0x5d0,0x5d3,0x5d6,0x5d0,0x5d3,0x5d9,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0, +0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0,0x5d0,0x5d3, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0, +0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,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,0x5d9,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,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5dc,0x5dc,0x5dc,0x5dc, +0xfc6,0xfc6,0xfc6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x16e3,0x16e3,0x831,0x837,0x837,0x843, +0x843,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x5eb,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb, +0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8, +0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6e1,0x6de,0x6de,0x6de,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db, +0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e, +0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e, +0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0xc24,0x897,0x891,0x88e,0x894,0x88b,0x723,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x89d,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x89a,0x89a,0x72c,0x768,0x768,0x768, +0x768,0x768,0x768,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762, +0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x72f,0x74a,0x729,0x750,0x753,0x74d,0x765,0x765,0x765, +0x765,0x765,0x765,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x72f,0x74a,0x729,0x74a,0xc27,0x7ce,0x7ce,0x7ce,0x7ce, +0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce, +0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x1281,0x1281, +0x1281,0x1281,0x1281,0x7d1,0x8a0,0x8b8,0x8bb,0x8c1,0x8a3,0x7e3,0x8d6,0x7e0,0x8af,0x8a9,0x8af,0x8a9, +0x8b5,0x8b2,0x8b5,0x8b2,0x8af,0x8a9,0x8ac,0x8c1,0x8af,0x8a9,0x8af,0x8a9,0x8af,0x8a9,0x8af,0x8a9, +0x8c4,0x8cd,0x8ca,0x8ca,0x8ac,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x90c,0x90c, +0x90c,0x90c,0x7e6,0x7e6,0x8c7,0x8d3,0x8d3,0x8d3,0x8d3,0x8d0,0x8a6,0x8be,0xaf2,0xaf2,0xaf2,0xc39, +0xc57,0xc54,0xb0d,0x888,0x7ec,0x7e9,0x7ec,0x7ef,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7e9, +0x7e9,0x7e9,0x7e9,0x7e9,0x7ec,0x7ec,0x7e9,0x7ec,0x7ec,0x7e9,0x7ec,0x7ec,0x7e9,0x7ec,0x7ec,0x7e9, +0x7ec,0x7ec,0x7e9,0x7e9,0xc5a,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7f8, +0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8, +0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7fe,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x7fb,0x7fb,0x7f8,0x7fb,0x7fb,0x7f8,0x7fb,0x7fb,0x7f8,0x7fb,0x7fb,0x7f8, +0x7fb,0x7fb,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7fb,0x7fe,0x7fe,0x7fb,0x7fb,0x7fb,0x7fb,0x8dc, +0x8df,0x801,0x804,0xc42,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80d,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +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,0xd44,0xd44,0xe76,0x810, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0xd3e,0xd3e,0xd3e,0xd3e, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0xd47,0xd47,0xd47,0xd47,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0xd47,0xd47,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,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x822,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0xe79,0xe79, +0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79, +0xe79,0xe79,0xe79,0xe79,0x10e9,0x10e9,0x10e9,0x10e9,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,0x828,0x828,0x825,0x828,0x825,0x828, +0x828,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x825,0x828,0x825,0x828, +0x828,0x825,0x825,0x828,0x828,0x828,0x825,0x825,0x825,0x825,0x148b,0x148b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,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,0x12bd,0x12bd,0x12bd,0x12bd, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0xd3e,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8ee, +0x8eb,0x8ee,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0xd47,0x96f,0x951,0x951,0x951,0x951,0x94b,0x951,0x951,0x963,0x951,0x951,0x94e, +0x95a,0x960,0x960,0x960,0x960,0x960,0x963,0x94b,0x957,0x94b,0x94b,0x94b,0x942,0x942,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94e,0x942,0x94b,0x942,0x94b,0x942,0x95d,0x954, +0x95d,0x954,0x96c,0x96c,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,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e, +0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e, +0x97e,0x97e,0x97e,0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x984,0x984,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x987,0x987,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0xa20,0xa20,0xfab,0xa20, +0xa20,0xa20,0xa23,0xa20,0xfab,0xa20,0xa20,0xfa2,0xa1a,0xa0e,0xa0e,0xa0e,0xa0e,0xa1d,0xa0e,0xf90, +0xf90,0xf90,0xa0e,0xa11,0xa1a,0xa14,0xf96,0xfa5,0xfa5,0xf90,0xf90,0xfab,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xa26,0xa26,0xa17,0xa17,0xa17,0xa17,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa1d,0xa1d,0xa0e,0xa0e,0xfab,0xfab,0xfab,0xfab,0xf90,0xf90,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa3e,0xa44,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x111f,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa7a,0xa7a,0xa7a,0xa7d, +0xa7d,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa62,0xa62,0xa77,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa77,0xa77,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa86,0xa86,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9e,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5, +0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,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,0xae3,0xae3,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,0xae9,0xae9,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,0xaf8,0xaf8,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafe,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,0xafb,0xafb,0xb01,0xb01,0xc48,0xc48, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xc48,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,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,0x14d9,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xccf,0xccf,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xccc,0xccc, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, 0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, 0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb34,0xb40,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb43,0xb37,0xb37, +0xb37,0xb37,0xb37,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb46,0xb46,0xb46,0xb46,0xb46, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb43,0xb43,0xc8a,0xc8a,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0x151b,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xd11,0xd11, -0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, -0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xd0e,0xd0e,0xd5f,0xd5f,0xd5f,0xd5f, -0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xb6d,0xb6d,0xb6d,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb70,0xb70,0xb70,0xb70, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb76,0xb82,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb85,0xb79,0xb79,0xb79,0xb79,0xb79,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb88,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f, -0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0x1725,0x1725,0xb94,0xb8b,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,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,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, -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,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0xb9d,0xb9d,0xb9d,0xb9d,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, -0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbf7,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xd02,0xd05,0xdf2,0xdf2,0xdf2, -0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xf0f,0xf0f,0xf0f,0xf0f,0xc09,0xc09,0xc09,0xc09, -0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xdf8,0xeb2, -0xdf8,0xdfb,0xdfb,0xdf8,0xdf5,0xdf8,0xdf5,0xdf8,0xdf8,0x1002,0x1299,0x1299,0xe04,0xe04,0xe04,0xe04, -0xe04,0xe0a,0xe07,0xf21,0xf21,0xf21,0xf21,0x1416,0x1014,0x1416,0x1353,0x1353,0xc3f,0xc3f,0xc3f,0xc3f, -0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc6f,0xc6c, -0xc6f,0xc6c,0xc6f,0xc6c,0x1125,0x1122,0x101a,0x1017,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42, -0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc48,0xc48,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xc4b,0xc4b,0xc4b,0xc51,0xc4e,0xc75,0xc72,0xc51,0xc4e,0xc51,0xc4e,0xc51, -0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc51,0xc4e,0xc51,0xc4e,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xb3a,0xb3a,0xb3d,0xb3d,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0xb52,0xb49,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb5,0xbb8, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xcc0, +0xcc3,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xecd,0xecd,0xecd,0xecd, +0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xcc6,0xcc6,0xcc6,0xcc6,0xcc6,0xcc6, +0xcc6,0xcc6,0xdb6,0xe70,0xdb6,0xdb9,0xdb9,0xdb6,0xdb3,0xdb6,0xdb3,0xdb6,0xdb6,0xfc0,0x1257,0x1257, +0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc8,0xdc5,0xedf,0xedf,0xedf,0xedf,0x13d4,0xfd2,0x13d4,0x1311,0x1311, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xc2d,0xc2a,0xc2d,0xc2a,0xc2d,0xc2a,0x10e3,0x10e0,0xfd8,0xfd5,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc06,0xc06,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc33,0xc30,0xc0f, +0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f, +0xc0c,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc0f,0xc0c,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc09,0xc09,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc18,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc18,0xc18,0xc18,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc15,0xc12,0xc12,0xc12,0xc4b,0xc4b,0xc4b,0xc4b, 0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc51,0xc4e,0xc4b,0xc4b,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc5a,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc5a,0xc5a,0xc5a,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc57,0xc54,0xc54,0xc54,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xd0b,0xd7a,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xeb2,0xeb2,0xdf5,0xdf5,0xdf5,0xdf5,0xdf8,0xdf8,0xf12,0x1002,0x1002,0x1002,0x1002,0x1002, -0x1002,0x1002,0x1002,0x1002,0x1002,0x12c6,0x12c6,0x129c,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd35,0xd35, -0xd35,0xd35,0xd35,0xd32,0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd3b,0xd3b,0xd44,0xd44,0xd44,0xd44,0xd38,0xd38, -0xd38,0xd38,0xd38,0xd3e,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, -0xe0d,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd3b,0xd3b,0xd3b,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4d,0xd4d,0xd4d, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xf24,0xf24,0xf24,0xf24, -0xf24,0xf24,0xf24,0x112e,0x112e,0x101d,0x101d,0x101d,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, -0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, -0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, -0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, -0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,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,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, -0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, -0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19, -0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19, -0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xedf,0xedf,0xe31,0xe31,0xf27,0xf27,0xf27,0xf27, -0xf27,0xf27,0xf27,0x1029,0x1029,0x1029,0x1029,0x1029,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026, -0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d, -0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d, -0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xf2a, -0xf2a,0xf2a,0xf2a,0x102c,0x102c,0x102c,0x102c,0x102c,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xcc9,0xd38,0xdb3,0xdb3, +0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xe70,0xe70,0xdb3,0xdb3,0xdb3,0xdb3,0xdb6,0xdb6,0xed0,0xfc0, +0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0x1284,0x1284,0x125a,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf0,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05,0xcf9,0xcf9,0xd02,0xd02, +0xd02,0xd02,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcfc,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce, +0xdce,0xdce,0xdce,0xdce,0xdcb,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcf9,0xcf9,0xcf9,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xd08,0xd08,0xd08,0xd08, +0xd08,0xd0b,0xd0b,0xd0b,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1, +0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0x10ec,0x10ec,0xfdb,0xfdb,0xfdb,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xe9d,0xe9d,0xdef,0xdef, +0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0xfe4,0xfe4,0xfe4,0xfe4, +0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xdfe,0xdfb,0xdfe,0xdfb, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xe0a,0xe0a,0xe0a,0xe0a, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xee8,0xee8,0xee8,0xee8,0xfea,0xfea,0xfea,0xfea,0xfea,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe3d,0xe40,0xe40,0xe40,0xe40, +0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, +0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe43,0xe43,0xe43,0xe43,0xe43,0xe4c,0xe4c,0xe4c,0xe4c, +0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49, +0xe49,0xe49,0xe46,0xe4f,0xff6,0xff0,0xfff,0xfed,0xe4c,0xe4c,0xfed,0xfed,0xe61,0xe61,0xe52,0xe61, +0xe61,0xe61,0xe58,0xe61,0xe61,0xe61,0xe61,0xe52,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, +0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe7c,0xe7c,0xe7c,0xe7c, 0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, -0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, -0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, -0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe7f,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, -0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, -0xe82,0xe82,0xe82,0xe85,0xe85,0xe85,0xe85,0xe85,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e, -0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe88,0xe91, -0x1038,0x1032,0x1041,0x102f,0xe8e,0xe8e,0x102f,0x102f,0xea3,0xea3,0xe94,0xea3,0xea3,0xea3,0xe9a,0xea3, -0xea3,0xea3,0xea3,0xe94,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3, -0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, -0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, -0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc, -0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, -0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0xf24,0xf24,0xf24,0xf24,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020, -0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0xf45,0xf45,0xf45,0xf45,0xf57,0xf60,0xf63,0xf60, -0xf63,0xf60,0xf63,0xf60,0xf63,0xf60,0xf63,0xf60,0xf60,0xf60,0xf63,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf48,0xf57,0xf45,0xf45,0xf45,0xf45,0xf45,0xf5a,0xf45,0xf5a,0xf57,0xf57,0xf6c,0xf69,0xf6c,0xf6c, -0xf6c,0xf69,0xf69,0xf6c,0xf69,0xf6c,0xf69,0xf6c,0xf69,0x1053,0x1053,0x1053,0x118e,0x104a,0x1053,0x104a, -0xf69,0xf6c,0xf69,0xf69,0x104a,0x104a,0x104a,0x104a,0x104d,0x1050,0x118e,0x118e,0xf6f,0xf6f,0x1065,0x105c, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x105c,0x105c,0x1065,0x105c, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf84,0xf84,0xf84,0xf84, -0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84, -0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0x154e, -0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e, -0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, -0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, -0xfd2,0xfed,0xfe4,0xfe1,0xfe1,0xfed,0xfed,0xfe4,0xfe4,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfed,0xfed, -0xfed,0xfd2,0xfd2,0xfd2,0xfd2,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed, -0xfed,0xfed,0xfd2,0xfe4,0xfe7,0xfd2,0xfd2,0xfea,0xfea,0xfea,0xfea,0xfea,0xfea,0xfd5,0xfed,0xfea, -0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0x1158,0x1158,0x1155,0x1152,0xfdb,0xfdb, -0x1005,0x1005,0x1005,0x1005,0x12c6,0x12c6,0x129c,0x129c,0x12a2,0x1299,0x1299,0x1299,0x1299,0x129c,0x13c2,0x12a2, -0x129c,0x12a2,0x1299,0x12a2,0x12c6,0x1299,0x1299,0x1299,0x129c,0x129c,0x1299,0x1299,0x129c,0x1299,0x1299,0x129c, -0x1020,0x1020,0x1020,0x1020,0x1020,0x101d,0x101d,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1527,0x1527,0x1527, -0x112e,0x101d,0x101d,0x101d,0x101d,0x12d2,0x12ab,0x12ab,0x12ab,0x12ab,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x103e,0x103e,0x103b,0x1035,0x103b,0x1035,0x103b,0x1035,0x103b,0x1035,0x1032,0x1032,0x1032,0x1032,0x1047,0x1044, -0x1032,0x118b,0x1422,0x1425,0x1425,0x1422,0x1422,0x1422,0x1422,0x1422,0x1428,0x1428,0x1542,0x1536,0x1536,0x1533, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1059,0x1056,0x1056,0x1065,0x105c,0x1362,0x135f,0x172e, -0x1362,0x135f,0x1431,0x142e,0x1545,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c, -0x105f,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x1065,0x105c, -0x1068,0x1068,0x106e,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074, -0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074, -0x1074,0x106e,0x1068,0x1068,0x1068,0x1068,0x106e,0x106e,0x1068,0x1068,0x1071,0x143a,0x1437,0x1437,0x1074,0x1074, -0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1095,0x1095,0x1095,0x1098,0x1095,0x1095,0x109b,0x109b, -0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, -0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10aa,0x10a1,0x10b0,0x10ad, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7, -0x1368,0x1365,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10bf,0x1140, -0x10b3,0x10b3,0x10b3,0x10b9,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x10b6,0x10b6,0x10b9,0x10c5, -0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc, -0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc, -0x155a,0x1557,0x155a,0x1557,0x155d,0x155d,0x1737,0x1440,0x10ce,0x10ce,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe9a,0xe9a,0xe9a,0xe9a, +0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0x10f5,0x10f5,0x10f5,0x10f5, +0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0xecd,0xecd,0xecd,0xeca, +0xeca,0xeca,0xeca,0xeca,0x112e,0x137a,0x137a,0x137a,0x137a,0x12fc,0x12fc,0x12fc,0x137d,0x12ff,0x12ff,0x137d, +0x14cd,0x14cd,0x14cd,0x14cd,0x14d0,0x14d0,0x14d0,0x1797,0x1797,0x1797,0x1797,0x185d,0xee2,0xee2,0xee2,0xee2, +0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde, +0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xf03,0xf03,0xf03,0xf03, +0xf15,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf1e,0xf1e,0xf21,0xf1e, +0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0xf1e,0xf1e,0xf1e,0xf1e,0xf06,0xf15,0xf03,0xf03,0xf03,0xf03,0xf03,0xf18,0xf03,0xf18,0xf15,0xf15, +0xf2a,0xf27,0xf2a,0xf2a,0xf2a,0xf27,0xf27,0xf2a,0xf27,0xf2a,0xf27,0xf2a,0xf27,0x1011,0x1011,0x1011, +0x114c,0x1008,0x1011,0x1008,0xf27,0xf2a,0xf27,0xf27,0x1008,0x1008,0x1008,0x1008,0x100b,0x100e,0x114c,0x114c, +0xf2d,0xf2d,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x101a,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf90,0xfab,0xfa2,0xf9f,0xf9f,0xfab,0xfab,0xfa2,0xfa2,0xf9f,0xf9f,0xf9f, +0xf9f,0xf9f,0xfab,0xfab,0xfab,0xf90,0xf90,0xf90,0xf90,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab, +0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xf90,0xfa2,0xfa5,0xf90,0xf90,0xfa8,0xfa8,0xfa8,0xfa8,0xfa8, +0xfa8,0xf93,0xfab,0xfa8,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0x1116,0x1116, +0x1113,0x1110,0xf99,0xf99,0xfc3,0xfc3,0xfc3,0xfc3,0x1284,0x1284,0x125a,0x125a,0x1260,0x1257,0x1257,0x1257, +0x1257,0x125a,0x1380,0x1260,0x125a,0x1260,0x1257,0x1260,0x1284,0x1257,0x1257,0x1257,0x125a,0x125a,0x1257,0x1257, +0x125a,0x1257,0x1257,0x125a,0xfde,0xfde,0xfde,0xfde,0xfde,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde,0xfde, +0xfde,0x14e5,0x14e5,0x14e5,0x10ec,0xfdb,0xfdb,0xfdb,0xfdb,0x1290,0x1269,0x1269,0x1269,0x1269,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0xffc,0xffc,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff0,0xff0, +0xff0,0xff0,0x1005,0x1002,0xff0,0x1149,0x13e0,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e6,0x13e6, +0x1500,0x14f4,0x14f4,0x14f1,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1017,0x1014,0x1014,0x1023, +0x101a,0x1320,0x131d,0x16ef,0x1320,0x131d,0x13ef,0x13ec,0x1503,0x1503,0x1509,0x1503,0x1509,0x1503,0x1509,0x1503, +0x1509,0x1503,0x1509,0x1503,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x1023,0x101a,0x1023,0x101a,0x101d,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x1023,0x101a,0x1023, +0x101a,0x1023,0x1023,0x101a,0x1026,0x1026,0x102c,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x102c,0x1026,0x1026,0x1026,0x1026,0x102c,0x102c,0x1026,0x1026,0x102f,0x13f8, +0x13f5,0x13f5,0x1032,0x1032,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x13fb,0x13fb, +0x13fb,0x13fb,0x13fb,0x13fb,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, +0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1053,0x1053,0x1053,0x1056, +0x1053,0x1053,0x1059,0x1059,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c, +0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c, +0x105c,0x105c,0x105c,0x105c,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1068,0x105f,0x106e,0x106b,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1065,0x1065,0x1065,0x1065,0x1326,0x1323,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x107d,0x10fe,0x1071,0x1071,0x1071,0x1077,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x1074,0x1074,0x1077,0x1083,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x1080,0x107a,0x1518,0x1515,0x1518,0x1515,0x151b,0x151b,0x16f8,0x13fe,0x108c,0x108c,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108c,0x108c,0x108c,0x108c, +0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x1095,0x1095, +0x1095,0x1095,0x1095,0x1098,0x1098,0x1098,0x10f2,0x10a1,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0, +0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, +0x109b,0x109b,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, +0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, 0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, -0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10ce,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10da, -0x10da,0x10da,0x1134,0x10e3,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, -0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, -0x1113,0x1113,0x1113,0x1113,0x111c,0x111c,0x111c,0x111c,0x1131,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, -0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, -0x111c,0x111c,0x111c,0x111c,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x1197,0x1197,0x119a,0x119a,0x11a0,0x1197, -0x1197,0x1197,0x1197,0x1197,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x11a3,0x11a3,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11c7,0x11cd,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10da,0x10da,0x10da,0x10da,0x10ef,0x10da,0x10da,0x10da, +0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da, +0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e9,0x10e9,0x10e9,0x10e9,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x1488,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x18c6,0x18c6, +0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e, +0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x1155,0x1155, +0x1158,0x1158,0x115e,0x1155,0x1155,0x1155,0x1155,0x1155,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1185,0x118b,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11a6,0x11a6,0x11a6,0x11b5,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11a9,0x11b5,0x11b5,0x11a6,0x11a6, +0x11a6,0x11a6,0x11b5,0x11b5,0x11a6,0x11b5,0x11b5,0x11b5,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11ca,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c1, +0x11c1,0x11c1,0x11c7,0x11c4,0x1521,0x1524,0x1527,0x1527,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11cd,0x11d9,0x11cd,0x11cd,0x11cd,0x11e2,0x11e2,0x11cd, +0x11cd,0x11e2,0x11d9,0x11e2,0x11e2,0x11d9,0x11cd,0x11d0,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, 0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, -0x11d9,0x11d9,0x11d9,0x11d9,0x11e8,0x11e8,0x11e8,0x11f7,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11eb,0x11f7,0x11f7,0x11e8,0x11e8,0x11e8,0x11e8,0x11f7,0x11f7, -0x11e8,0x11f7,0x11f7,0x11f7,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1209,0x1209,0x1209,0x1209,0x120c,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1203,0x1203,0x1203,0x1209,0x1206, -0x1563,0x1566,0x1569,0x1569,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, -0x121b,0x121b,0x121b,0x121b,0x120f,0x121b,0x120f,0x120f,0x120f,0x1224,0x1224,0x120f,0x120f,0x1224,0x121b,0x1224, -0x1224,0x121b,0x120f,0x1212,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, -0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, -0x121b,0x121b,0x121b,0x121b,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236, -0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236, -0x1236,0x1236,0x1236,0x1236,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124b,0x124b,0x124b,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1284, -0x1281,0x1281,0x1281,0x1281,0x127e,0x127e,0x127e,0x1272,0x1272,0x1272,0x1272,0x127e,0x127e,0x1278,0x1275,0x127b, -0x127b,0x126c,0x1287,0x1287,0x126f,0x126f,0x127e,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, -0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1284,0x1281, -0x1284,0x1281,0x1281,0x1281,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x1290,0x1290,0x1290,0x128d,0x128d,0x128d,0x128a,0x128a,0x128a,0x128a,0x128d,0x128a, -0x128a,0x128a,0x1290,0x128d,0x1290,0x128d,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x1290,0x128d,0x128d,0x128a,0x128a,0x128a,0x128a,0x129c,0x129c,0x1344,0x1299,0x1344,0x1344,0x1344,0x1344, -0x1299,0x129f,0x12c6,0x1299,0x1299,0x1299,0x1299,0x1299,0x129f,0x12a2,0x12c6,0x12c6,0x12a2,0x12c6,0x1299,0x12a2, -0x12a2,0x12a5,0x12c6,0x1299,0x1299,0x12c6,0x129c,0x129c,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, -0x13b3,0x13b3,0x12ae,0x12ae,0x12ae,0x12ae,0x13ce,0x13ad,0x12b7,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce, -0x13ce,0x13ce,0x13ce,0x1863,0x1863,0x1863,0x1863,0x1863,0x13b6,0x13b6,0x12bd,0x13b6,0x13b6,0x13b6,0x12bd,0x13b6, -0x13b6,0x13b6,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x13b0,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba, -0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x139b,0x138c,0x139b,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, -0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e3,0x13e3,0x13e3, -0x13e0,0x13e3,0x13e0,0x13e3,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0, -0x13e3,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e6,0x13e3,0x13e3,0x13e3, -0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0, -0x13e0,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0, -0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x1575,0x1575,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x1578,0x1578, -0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x17b8,0x17b8,0x17b8,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x157e,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x17b8,0x17b8,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6, -0x1578,0x1578,0x157e,0x157e,0x1578,0x157e,0x157e,0x157e,0x1575,0x1575,0x157e,0x157e,0x13e3,0x13e3,0x13e9,0x13e9, -0x13e9,0x16ec,0x13e3,0x13e9,0x13e3,0x13e3,0x13e9,0x1584,0x1584,0x157e,0x157e,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, -0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x1578,0x1578,0x157e, -0x16ec,0x157e,0x1578,0x157e,0x17b8,0x17b8,0x17b8,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x13e3,0x157e,0x13e9,0x13e9, -0x13e3,0x13e3,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13ec,0x13ec, -0x13ec,0x13ec,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e9,0x13e9,0x13e3,0x13e9,0x13e9,0x13e9, -0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x16ec,0x13e3,0x13e3,0x13e3, -0x13e3,0x157e,0x1578,0x17b8,0x1446,0x1446,0x1446,0x1446,0x1575,0x1575,0x1575,0x1575,0x1575,0x157b,0x157e,0x17b8, -0x17b8,0x17b8,0x17b8,0x1740,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x1578,0x1578,0x157e, -0x1584,0x1584,0x157e,0x157e,0x157e,0x157e,0x186c,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x157e, -0x1578,0x1578,0x1578,0x1578,0x1581,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x1578,0x157e, -0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157e,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14d0,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x13ef, -0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x14d0,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x14d0,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef, -0x14d0,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x16f2,0x16f2,0x17be, -0x17be,0x13f2,0x13f2,0x13f2,0x13ef,0x13ef,0x13ef,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x1671,0x1671,0x1671,0x1671, -0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x13f8,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f8,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13fb, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, -0x13fb,0x13fb,0x13fb,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x17eb,0x17eb,0x17e8,0x1743, -0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x144c,0x144c,0x144c,0x144c, -0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x158d,0x1458,0x1458,0x1458,0x146a, -0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a, -0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1485,0x1485,0x1485,0x1485, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x120c,0x120c,0x1209,0x1209,0x1209,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x122a,0x122a,0x1239,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123f,0x123c,0x123f,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123f,0x123c,0x123c,0x123c,0x123c,0x1239,0x1239,0x1239,0x122d,0x122d,0x122d,0x122d,0x1239, +0x1239,0x1233,0x1230,0x1236,0x1236,0x1245,0x1242,0x1242,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124e,0x124e,0x124b,0x124b,0x124b,0x1248,0x1248, +0x1248,0x1248,0x124b,0x1248,0x1248,0x1248,0x124e,0x124b,0x124e,0x124b,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124b,0x124b,0x1248,0x1248,0x1248,0x1248,0x125a,0x125a,0x1302,0x1257, +0x1302,0x1302,0x1302,0x1302,0x1257,0x125d,0x1284,0x1257,0x1257,0x1257,0x1257,0x1257,0x125d,0x1260,0x1284,0x1284, +0x1260,0x1284,0x1257,0x1260,0x1260,0x1263,0x1284,0x1257,0x1257,0x1284,0x125a,0x125a,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x126c,0x126c,0x126c,0x126c,0x138c,0x136b,0x1275,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1824,0x1824,0x1824,0x1824,0x1824,0x1374,0x1374,0x127b,0x1374, +0x1374,0x1374,0x127b,0x1374,0x1374,0x1374,0x1275,0x1275,0x1275,0x1275,0x1275,0x136e,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1278,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1278,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1359,0x134a,0x1359,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x134a,0x134a,0x134a,0x134a, +0x134a,0x134a,0x134a,0x134a,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1398,0x1395,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x139e,0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1, +0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4, +0x13a4,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x1533,0x1533, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1779,0x1779,0x1779, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1779,0x1779, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a4,0x1536,0x1536,0x153c,0x153c,0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x153c,0x153c, +0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x16aa,0x13a1,0x13a7,0x13a1,0x13a1,0x13a7,0x1542,0x1542,0x153c,0x153c,0x1779, +0x1779,0x1779,0x1779,0x1779,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a4,0x13a1,0x13a1, +0x13a1,0x1536,0x1536,0x153c,0x16aa,0x153c,0x1536,0x153c,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c,0x177c,0x177c, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c, +0x13a1,0x153c,0x13a7,0x13a7,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13aa,0x13aa,0x13aa,0x13aa,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7, +0x13a1,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x16aa,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1536,0x1779,0x1404,0x1404,0x1404,0x1404,0x1533,0x1533,0x1533,0x1533, +0x1533,0x1539,0x153c,0x1779,0x1779,0x1779,0x1779,0x1701,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c, +0x153c,0x1536,0x1536,0x153c,0x1542,0x1542,0x153c,0x153c,0x153c,0x153c,0x182d,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x153c,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x153f,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c, +0x1536,0x1536,0x1536,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e, +0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x148e, +0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x16b0,0x16b0,0x177f,0x177f,0x13b0,0x13b0,0x13b0,0x13ad,0x13ad,0x13ad,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b9,0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x17ac,0x17ac,0x17a9,0x1704,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x1407,0x1407,0x1407,0x1407,0x1407,0x1407, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x154b, +0x1416,0x1416,0x1416,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, +0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x1452,0x1452,0x145e,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, +0x1464,0x1464,0x1464,0x145e,0x145e,0x145e,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x145e, 0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, -0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1494,0x1494,0x14a0,0x14a6, -0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, -0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a0, -0x14a0,0x14a0,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14a0,0x14c7,0x14c7,0x14c7,0x14c7, -0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7, -0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x1578,0x1578,0x157e,0x157e, -0x157e,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x157e, -0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157e,0x157e,0x157e,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x157e,0x157e,0x157e,0x157e,0x1578,0x1578,0x1584,0x1578,0x1578,0x1578, -0x1578,0x16ef,0x16ef,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1869,0x157e,0x1578,0x1578, -0x157e,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x1578,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, +0x1536,0x1536,0x153c,0x153c,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x153c,0x153c,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x1536,0x1536, +0x1542,0x1536,0x1536,0x1536,0x1536,0x16ad,0x16ad,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x182a,0x153c,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x153c,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x15bd,0x15bd,0x15bd,0x15bd, 0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, -0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, -0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15f0,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1602,0x160b,0x160b,0x160b,0x160b,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, -0x1620,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, -0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, -0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1641,0x1641,0x1641,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1641,0x1641,0x1635,0x1641,0x1638,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15ae,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c0,0x15c9,0x15c9,0x15c9,0x15c9,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15e7,0x15e7,0x15e7,0x15de,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x15ff,0x15ff,0x15ff,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15ff,0x15ff,0x15f3,0x15ff,0x15f6,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1626,0x1626,0x1626,0x1626, +0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626, +0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1623,0x1623,0x1623,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x1635,0x1635,0x1635,0x1632,0x1632,0x1632,0x162f,0x162f,0x162f,0x162f,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x164a,0x164a,0x163e,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x1644,0x1644,0x1644,0x1644, 0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, -0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668, -0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668, -0x1668,0x1668,0x1668,0x1668,0x1668,0x1665,0x1665,0x1665,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, -0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1677,0x1677, -0x1677,0x1674,0x1674,0x1674,0x1671,0x1671,0x1671,0x1671,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x168c, -0x168c,0x1680,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692, -0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x168f, -0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16c5,0x16d4,0x16d4,0x16c5,0x16c5,0x16c5,0x16c5,0x16c5, -0x16c5,0x16d4,0x16c5,0x16d7,0x16d7,0x16c5,0x16d7,0x16c5,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, -0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, -0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, -0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, -0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1650,0x1650,0x1650,0x1650, +0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, +0x1650,0x1650,0x1650,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1683,0x1692,0x1692,0x1683, +0x1683,0x1683,0x1683,0x1683,0x1683,0x1692,0x1683,0x1695,0x1695,0x1683,0x1695,0x1683,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x1746,0x1746,0x1746,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x174c,0x1749, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, 0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x178b,0x1788,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x178e,0x178e,0x178e,0x178e, -0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, -0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x1791,0x1791,0x1791,0x1791, -0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, -0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x17a3,0x17a3,0x17a3,0x17a3, -0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, -0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17ac, -0x17ac,0x17ac,0x17ac,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac, -0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac, -0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17c4,0x17c4,0x17c4,0x17c4, -0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4, -0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x1809,0x1809,0x1806,0x1806, -0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806, -0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1809,0x1809,0x1809,0x1809, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1854,0x1854,0x1854,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x187e,0x187e,0x187e,0x187e, -0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, -0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0,0,0 +0x17ca,0x17ca,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca, +0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1815,0x1815,0x1815,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18a5,0x18ab,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18bd,0x18a8,0x18a8,0x18a8,0x18a8,0x18b4, +0x18ba,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18b7,0x18a8,0x18a8,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4924, + propsVectorsTrie_index+4880, NULL, - 4924, - 24212, + 4880, + 24356, 0xa40, - 0x13bc, + 0x1390, 0x0, 0x0, 0x110000, - 0x71cc, + 0x7230, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[6279]={ -0x67,0,0,0x67,0,0x200000,0x67,0,0x230400,0x67,0,0x230560,0x67,0,0x400000,0x67, -0,0x448000,0x67,0,0x500000,0x67,0,0x962460,0x67,0,0x962540,0x67,0,0xe00000,0x67,0, -0xe30000,0x67,0,0x1329800,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67,0,0, -0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1067,0,0x200000,0x1067, -0,0x230400,0x1167,0,0,0x1267,0,0,0x1267,0,0x962460,0x1367,0,0,0x1467,0, -0,0x1567,0,0,0x1667,0,0,0x1767,0,0,0x1767,0,0x962460,0x1867,0,0, -0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67,0,0,0x1f67,0,0,0x2067, -0,0,0x2267,0,0,0x2367,0,0,0x2467,0,0,0x2567,0,0,0x2767,0, -0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000,0x2b67,0,0,0x2d67,0,0, -0x3067,0x20000000,0x200000,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67,0,0,0x3c67, -0,0,0x3e67,0,0,0x4067,0,0,0x4067,0,0xe30400,0x4167,0,0,0x4367,0, +static const uint32_t propsVectors[6375]={ +0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, +0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0, +0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0, +0x1767,0,0,0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67, +0,0,0x1f67,0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0, +0,0x2567,0,0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000, +0x2b67,0,0,0x2d67,0,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67, +0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0,0,0x4367,0, 0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0,0x5067,0,0, 0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767,0,0,0x5867, -0,0,0x5867,0,0x230400,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0, -0,0x6067,0x80000,0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0, -0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7367,0x20000000,0x200000,0x7567,0,0,0x7667, -0,0,0x7767,0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0, -0,0x7e67,0,0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8367,0,0, -0x8367,0,0x962460,0x8467,0,0,0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8867, -0,0,0x8967,0,0,0x8b67,0,0,0x8c67,0,0,0x8e67,0x20000000,0,0x8e67,0x20000000, -0x400000,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0,0,0x9367,0,0, -0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0,0x9967,0,0,0x9a67, -0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367,0,0,0xa467,0, -0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0,0,0xa967,0,0, -0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0,0,0xae67,0,0,0xaf67, -0,0,0xaf67,0,0x962540,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467,0, -0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0,0, -0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0,0xc167, -0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767,0, -0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0,0xe30000,0xcc67,0,0xe00000, -0xcf67,0,0xe00000,0xcf67,0,0x30e00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0,0xd467, -0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67,0, -0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0, -0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567, -0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0, -0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0, -0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867, -0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0, -0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0, -0x10567,0,0x200000,0x10567,0,0xe00000,0x10567,0,0x30e00000,0x10567,0,0xb28045a0,0x10667,0,0,0x10767, -0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67,0,0,0x10b67,0, -0x1230400,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0,0, -0x11167,0,0,0xa0067,0,0xe00000,0xa0067,0,0xe30000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4767, -0,0xe30000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0, -0xe00000,0xb0067,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040, -0x11000100,0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200, -0x24000008,0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100, -0x220402,0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402, -0x11000419,0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519, -0x7c00100,0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500, -0x230400,0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001, -0x11000800,0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e, -0x4000400,0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100, -0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400, -0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03, -0x7c00100,0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000, -0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800, -0x11000c00,0,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02, -0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100, -0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460, -0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004, -0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100, -0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460, -0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f, -0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400, -0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541, -0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423, -0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400, -0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460, -0x11001615,0x6800000,0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a, -0x2806400,0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000, -0x1600000,0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000, -0x11001926,0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18, -0x2802100,0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100, -0x1830002,0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500, -0x11001e12,0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e, -0x4000400,0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000, -0x918820,0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b, -0x11002800,0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800, -0x24000000,0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008, -0x1410000,0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002, -0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900, -0x4000000,0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020, -0x141000e,0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000, -0x11002a00,0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00, -0x4000000,0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120, -0x230402,0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006, -0x11002d00,0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00, -0x24000020,0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020, -0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000, -0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300, -0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000, -0x10200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000, -0x11003700,0x24000000,0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800, -0x24000000,0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000, -0x10e05200,0x11003800,0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801, -0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102, -0x7000100,0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400, -0x962460,0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408, -0x11005502,0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200, -0x4000400,0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000, -0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f, -0x11020219,0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319, -0x7c00100,0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100, -0x220400,0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460, -0x11020701,0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908, -0x7c00100,0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000, -0x200002,0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000, -0x11022800,0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800, -0x24000020,0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100, -0x12040f,0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405, -0x11022c0e,0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19, -0x7c00100,0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020, -0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403, -0x11023300,0x4000100,0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600, -0x24000020,0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000, -0x10e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023700,0x24000020,0x10105200,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000, -0x11024e67,0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712, -0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,0x11065700,0x4000000, -0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011, -0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700, -0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010, -0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411, -0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100, -0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,0x11080100,0x24000006, -0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400, -0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100, -0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0, -0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000, -0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000, -0x24100000,0x1410001,0x110a3700,0x24000000,0x30200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300, -0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000, -0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16, -0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000, -0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d, -0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300, -0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000, -0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c, -0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400, -0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010, -0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c11,0x7c00900,0x230400,0x11400f34,0xc000010,0x448000, -0x11400f44,0xc000010,0x448000,0x11401d70,0x4000000,0x200000,0x11403d92,0x4000000,0xe00000,0x11445787,0x4000004,0x120000a,0x11445787,0x4000008,0x81000a,0x11445787, -0x4000008,0x141000a,0x11445787,0x4000010,0x87000a,0x11445787,0xc000010,0x84800a,0x11445790,0x3802500,0x126246a,0x11445790,0x7c00d00,0x2530c0a,0x114a3d87,0x24000000, -0x810000,0x114a3d87,0x24000000,0x1410000,0x114a3d87,0x24000008,0x810000,0x114a3d87,0x24000008,0x1410000,0x114a3d87,0x24000010,0x870000,0x114a3d87,0x2c000010,0x848000, -0x114a3d8d,0x4000000,0xe00000,0x114a3d8d,0x24000000,0xe00000,0x114a3d8d,0x24000002,0x1200000,0x114a3d8d,0x24000002,0x10e00000,0x114a3d8d,0x24000008,0x810000,0x114a3d8d, -0x24000008,0x1410000,0x114a3d90,0x7c00900,0x930c00,0x114a3d90,0x7c00900,0xe30c00,0x114a3d92,0x7c00300,0xe30000,0x114a3e90,0x7000400,0x1200c02,0x114a3f87,0x4000004, -0x1200000,0x114a3f90,0x7c00d00,0x2530c00,0x114a4292,0x4000000,0xe00000,0x114a4292,0x4000000,0xe0000f,0x114a4492,0x4000000,0xe00002,0x114a4492,0x4000000,0xe00003, -0x114a4492,0x4000000,0x10e00003,0x114a4592,0x4000000,0xe00002,0x114a4592,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c17,0x2802100,0x962460,0x11800c17, -0x2802500,0x962460,0x11800f1d,0x2802400,0x962460,0x11800f29,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d93,0x2802400, -0x962460,0x118a3e90,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1b,0x6800000,0x1329800,0x11c00f58,0x6800000,0x1329800, -0x11c0105d,0x6800000,0x1329800,0x11c01161,0x6800000,0x1329800,0x11c01265,0x6800000,0x1329800,0x11c01469,0x4000000,0x200000,0x11c01469,0x6800000,0x1329800,0x11c01469, -0x7c00100,0x230400,0x11c0511b,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100, -0x962460,0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000, -0x20001b27,0x4000000,0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27, -0x4000000,0x1410000,0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400, -0x962540,0x20001b27,0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020, -0x20004c67,0,0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67, -0,0,0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100, -0x220400,0x30000419,0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400, -0x30000600,0x7c00500,0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908, -0x7c00100,0x220401,0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100, -0x230400,0x30000d22,0,0x218960,0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000, -0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821, -0x2802100,0x962460,0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100, -0x230400,0x30001b27,0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400, -0x30001c1c,0x2802100,0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c, -0x6800100,0x1862540,0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010, -0x200000,0x30001f0b,0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400, -0x30002128,0x4000010,0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d, -0x4000001,0x440000,0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400, -0x1862460,0x30002417,0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000, -0x30002417,0x4000010,0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417, -0x7d00100,0x1830000,0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006, -0x500000,0x3000251b,0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400, -0x3000251b,0x7c00900,0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800, -0x2c000010,0x1248002,0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100, -0x10220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000, -0x30003700,0x24000000,0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701, -0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000, -0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400, -0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402576,0x4000010,0x400000,0x30402576,0x4000010,0xb70000,0x30402576,0xc000010,0xb48000,0x304a3d92, -0x4000000,0xe00000,0x30800c17,0x2802100,0x962460,0x30c01c6e,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000, -0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400, -0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00, -0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020, -0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000, -0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908, -0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000, -0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000, -0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01, -0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120, -0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000, -0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800, -0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100, -0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460, -0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600, -0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020, -0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460, -0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600, -0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100, -0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001, -0x320a6b16,0x7c00100,0x2530c00,0x32406372,0xc000010,0x448000,0x324a3d95,0x4000000,0x10e00000,0x324a3d95,0x7c00100,0x1230400,0x324a3f90,0x4000002,0x1200c00,0x324a538d, -0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100, -0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218960,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460, -0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000d22,0x7c00100,0x230400,0x40000f0a, -0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000, -0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460, -0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00, -0x4000000,0x200002,0x40003000,0x24000000,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100, -0x220400,0x40005a09,0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000, -0x40006f30,0x6800000,0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117, -0x4000000,0x200000,0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100, -0x220400,0x40007219,0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000, -0x40007400,0x4000000,0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933, -0x7c00100,0x230400,0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400, -0x962460,0x40020701,0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000, -0x400a4400,0x4000000,0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300, -0x4000000,0x1410010,0x404077b8,0x4000000,0x200000,0x404077bb,0x4000000,0x200000,0x404077bb,0x4000000,0x400000,0x40c0511b,0x4000000,0x200000,0x41000419,0x7c00100, -0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400, -0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02, -0x4000000,0x1500000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100, -0x230400,0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000, -0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00, -0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10205200,0x41003700,0x24000000, -0x10e00000,0x41005d00,0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f, -0x41007219,0x7c00100,0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e, -0x7c00100,0x230400,0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100, -0x230400,0x41008301,0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400, -0x41008407,0x7c00100,0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838, -0x7c00100,0x220400,0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000, -0x200000,0x41008939,0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000, -0x41008b3b,0x6800000,0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e, -0x7c00100,0x22040f,0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000, -0x1710000,0x41008e00,0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000, -0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701, -0x2802000,0xc62460,0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000,0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300, -0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010, -0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8292,0x4000000,0xe00000,0x41808300, -0x2802000,0x962460,0x41c01469,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100, -0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400, -0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000, -0x24000020,0x200000,0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100, -0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460, -0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257, -0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000, -0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540, -0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500, -0x4000400,0x200400,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010, -0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a92,0x4000000,0x200000, -0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02, -0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100, -0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000, -0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27, -0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000, -0x1329800,0x51001c1c,0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000, -0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19, -0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000,0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100, -0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000, -0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00, -0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000, -0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e, -0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519, -0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100, -0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460, -0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d, -0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100, -0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000, -0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008, -0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100, -0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800, -0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e, -0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100, -0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460, -0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00, -0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000, -0x30200000,0x510aaa00,0x4000000,0x30e00000,0x5140a2b3,0x4000400,0x400000,0x514a8292,0x4000000,0xe00000,0x51802b84,0x2802000,0x962460,0x51c00908,0x2802400,0x962460, -0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00, -0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100, -0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006, -0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407, -0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100, -0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000, -0x5200ac7e,0x7c00100,0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a, -0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100, -0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000, -0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a, -0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000, -0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400, -0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f, -0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500, -0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800, -0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912, -0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100, -0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400, -0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0,0x218960,0x5200c178, -0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100, -0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400, -0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700, -0x24000000,0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000, -0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d, -0x5202c300,0x4000100,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11, -0x7c00300,0xe30001,0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000, -0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af78,0x6800400,0x962540,0x5240af78,0x7c00100,0x230400,0x5240af79,0x4000400,0x200000, -0x5240af79,0x6800100,0x962540,0x5240b298,0x4000000,0x200000,0x5240b2a2,0x4000000,0x200000,0x5240b2a2,0x4000000,0x1500000,0x5240b5b6,0x7c00900,0x230400,0x524a4492, -0x4000000,0xe00003,0x5280af78,0x2802400,0x962460,0x5280af79,0x2802400,0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x52c0b3ad,0x2802400, -0x962460,0x52c0b3b1,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540, -0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27, -0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000, -0x10200000,0x60003000,0x24000000,0x10e00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400, -0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519, -0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x32703580,0x6000c654,0x2802000, -0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000, -0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941, -0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100, -0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000, -0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000, -0x24000000,0x30e00000,0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000,0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000, -0x30100000,0x600ac400,0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000, -0x600acd00,0x4000000,0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30e05200,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00, -0x4000000,0x30e00000,0x600ace00,0x4000000,0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0x30e05200,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300, -0xe30000,0x604ac492,0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000, -0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c, -0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100, -0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400, -0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202, -0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400, -0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000, -0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573, -0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100, -0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800, -0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98, -0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000, -0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001, -0x610ace00,0x4000000,0x30e00000,0x6140af78,0x7c00100,0x230400,0x6140af79,0x6800100,0x962540,0x6140af82,0x7c00100,0x230400,0x6180af79,0x2802400,0x962460,0x62002a00, -0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0, -0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460, -0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000, -0x24000000,0x200000,0x70003000,0x24000000,0x10200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100, -0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460, -0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00, -0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100, -0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f, -0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941, -0x2806000,0x962460,0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000, -0x10e00000,0x7000cd00,0x4000000,0x10e05200,0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460, -0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86, -0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000, -0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400, -0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489, -0x6804400,0x962540,0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000, -0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000, -0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691, -0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100, -0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460, -0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c, -0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000, -0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400, -0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f, -0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100, -0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000, -0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490, -0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100, -0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000, -0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921, -0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000, -0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000, -0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00, -0x4000000,0xb28045a0,0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfbd,0x4000000,0x200000,0x7040f7c1,0x80000, -0x918820,0x7080af79,0x2802400,0x962460,0x7080dfbd,0x2802400,0x962460,0x70c0e4bf,0x2802400,0x962460,0x70c0e4bf,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400, -0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00, -0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100, -0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400, -0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997, -0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100, -0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000, -0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1, -0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100, -0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000, -0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670, -0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x72904de0,0x800ace00,0x4000000, -0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,0x230400, -0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00, -0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100, -0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460, -0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8, -0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100, -0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460, -0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa, -0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010, -0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400, -0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00, -0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300, -0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000}; +0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0,0,0x6067,0x80000, +0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0,0x6f67,0,0, +0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767,0,0,0x7867, +0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0,0,0x7f67,0, +0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0,0x8567,0,0, +0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67,0,0,0x8c67, +0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0, +0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0, +0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367, +0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0, +0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0,0, +0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467, +0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0, +0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0, +0xc167,0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767, +0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcc67,0,0xe00000,0xcf67,0, +0xe00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0,0xd467,0,0,0xd567,0,0, +0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67,0,0,0xdb67,0,0,0xdc67, +0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0,0xe067,0,0,0xe167,0, +0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567,0,0,0xe667,0,0, +0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0,0,0xeb67,0,0,0xec67, +0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0,0xf167,0,0,0xf367,0, +0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867,0,0,0xf967,0,0, +0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0,0,0xfe67,0,0,0x10167, +0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0,0x10567,0,0xe00000,0x10667,0, +0,0x10767,0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67,0,0, +0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0,0,0x11167, +0,0,0x11367,0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0, +0,0x11867,0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000, +0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267, +0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001, +0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200,0x24000008,0x1710000, +0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319, +0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100, +0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400, +0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600, +0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010, +0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002, +0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e, +0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100, +0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400, +0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000,0x11000b13, +0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00,0x80000000, +0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000,0x1329800, +0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402,0x11000c02, +0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400, +0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460, +0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004, +0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400, +0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460, +0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f, +0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100, +0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541, +0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524, +0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800000, +0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460, +0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926, +0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000, +0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460, +0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18, +0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100, +0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001, +0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800, +0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000, +0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000, +0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800, +0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002,0x11002800,0x40000001, +0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f, +0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900, +0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000, +0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f, +0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00, +0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000, +0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000, +0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00, +0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000,0x11003000,0x24000020, +0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003, +0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x10200000,0x11003600, +0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700,0x24000000, +0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0xe00000, +0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x10e05200,0x11003800, +0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100, +0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100,0x230408, +0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500, +0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100, +0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002, +0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000,0x11020200, +0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100, +0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402, +0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600, +0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400, +0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401, +0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800, +0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002, +0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000, +0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00, +0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100, +0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402, +0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00, +0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100, +0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000, +0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000,0x11023700, +0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023700,0x24000020,0x10105200,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0, +0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a, +0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011,0x11065700, +0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700,0x4000008, +0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400,0xe00011, +0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719, +0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0, +0x19329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000, +0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100, +0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100,0x24000020, +0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00, +0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400,0x11080200, +0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100, +0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x30200000, +0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14, +0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100, +0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402, +0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516, +0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000, +0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010, +0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400, +0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010, +0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c, +0x11400a0c,0xc000010,0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c13,0x7c00900,0x230400,0x11400f36, +0xc000010,0x448000,0x11400f46,0xc000010,0x448000,0x11401d72,0x4000000,0x200000,0x11403d95,0x4000000,0xe00000,0x1144578a,0x4000004,0x120000a,0x1144578a,0x4000008, +0x81000a,0x1144578a,0x4000008,0x141000a,0x1144578a,0x4000010,0x87000a,0x1144578a,0xc000010,0x84800a,0x11445793,0x3802500,0x126246a,0x11445793,0x7c00d00,0x2530c0a, +0x11463d8a,0x4000001,0x440011,0x114a3d8a,0x4000000,0xe00000,0x114a3d8a,0x4000000,0xe00002,0x114a3d8a,0x24000000,0x810000,0x114a3d8a,0x24000000,0xe00000,0x114a3d8a, +0x24000000,0x1410000,0x114a3d8a,0x24000008,0x810000,0x114a3d8a,0x24000008,0x1410000,0x114a3d8a,0x24000010,0x870000,0x114a3d8a,0x2c000010,0x848000,0x114a3d90,0x4000000, +0xe00000,0x114a3d90,0x24000000,0xe00000,0x114a3d90,0x24000002,0x1200000,0x114a3d90,0x24000002,0x10e00000,0x114a3d90,0x24000008,0x810000,0x114a3d90,0x24000008,0x1410000, +0x114a3d93,0x7c00900,0x930c00,0x114a3d93,0x7c00900,0xe30c00,0x114a3d95,0x7c00300,0xe30000,0x114a3e93,0x7000400,0x1200c02,0x114a3f8a,0x4000004,0x1200000,0x114a3f93, +0x7c00d00,0x2530c00,0x114a4295,0x4000000,0xe00000,0x114a4295,0x4000000,0xe0000f,0x114a4495,0x4000000,0xe00002,0x114a4495,0x4000000,0xe00003,0x114a4495,0x4000000, +0x10e00003,0x114a4595,0x4000000,0xe00002,0x114a4595,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c19,0x2802100,0x962460,0x11800c19,0x2802500,0x962460, +0x11800f1f,0x2802400,0x962460,0x11800f2b,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d96,0x2802400,0x962460,0x118a3e93, +0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1d,0x6800000,0x1329800,0x11c00f5a,0x6800000,0x1329800,0x11c0105f,0x6800000, +0x1329800,0x11c01163,0x6800000,0x1329800,0x11c01267,0x6800000,0x1329800,0x11c0146b,0x4000000,0x200000,0x11c0146b,0x6800000,0x1329800,0x11c0146b,0x7c00100,0x230400, +0x11c0511d,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27, +0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000, +0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000, +0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27, +0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67,0, +0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0, +0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419, +0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500, +0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401, +0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22, +0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100, +0x230400,0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460, +0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27, +0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100, +0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540, +0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b, +0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000010, +0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x440000, +0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417, +0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010, +0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000, +0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b, +0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900, +0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002, +0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x10220405,0x30002d19, +0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000, +0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460, +0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00, +0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900, +0x1230400,0x300a4929,0x4000000,0xe00000,0x30402578,0x4000010,0x400000,0x30402578,0x4000010,0xb70000,0x30402578,0xc000010,0xb48000,0x304a3d95,0x4000000,0xe00000, +0x30800c19,0x2802100,0x962460,0x30c01c70,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e, +0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000, +0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001, +0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00, +0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300, +0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400, +0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800, +0x80020,0x218820,0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010, +0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460, +0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00, +0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020, +0x200000,0x32003600,0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800,0x24000000,0x810000, +0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a, +0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100, +0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000, +0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900, +0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000, +0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000, +0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14, +0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100, +0x2530c00,0x32406374,0xc000010,0x448000,0x324a3d98,0x4000000,0x10e00000,0x324a3d98,0x7c00100,0x1230400,0x324a3f93,0x4000002,0x1200c00,0x324a5390,0x24000000,0xe00000, +0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e, +0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000, +0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400, +0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f, +0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100, +0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002, +0x40003000,0x24000000,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100,0x220400,0x40005a09, +0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000, +0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000, +0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219, +0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000,0x40007400,0x4000000, +0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400, +0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701, +0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000,0x400a4400,0x4000000, +0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010, +0x404077bb,0x4000000,0x200000,0x404077be,0x4000000,0x200000,0x404077be,0x4000000,0x400000,0x40c0511d,0x4000000,0x200000,0x41000419,0x7c00100,0x220400,0x41000419, +0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13,0x2802000, +0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02,0x4000000,0x1500000, +0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,0x41001d0c, +0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800,0x24000000, +0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120,0x220405, +0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10205200,0x41003700,0x24000000,0x10e00000,0x41005d00, +0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100, +0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400, +0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301, +0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100, +0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400, +0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939, +0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000, +0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f, +0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00, +0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100, +0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460, +0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000,0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100, +0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000, +0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8295,0x4000000,0xe00000,0x41808300,0x2802000,0x962460, +0x41c0146b,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908, +0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020, +0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000, +0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600, +0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000, +0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400, +0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e, +0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100, +0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400, +0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b, +0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a95,0x4000000,0x200000,0x5100080e,0x7c00100, +0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400, +0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524, +0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000, +0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400, +0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c, +0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100, +0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400, +0x51003700,0x24000000,0x200000,0x51003700,0x24000000,0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108, +0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020, +0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000, +0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00, +0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100, +0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f, +0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71, +0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010, +0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800, +0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63, +0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010, +0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400, +0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f, +0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100, +0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540, +0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442, +0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100, +0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000,0xe00000, +0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x30200000,0x510aaa00, +0x4000000,0x30e00000,0x5140a2b6,0x4000400,0x400000,0x514a8295,0x4000000,0xe00000,0x51802b87,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400, +0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000, +0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128, +0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000, +0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400, +0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b, +0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100, +0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460, +0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a, +0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400, +0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460, +0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e, +0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010, +0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460, +0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f, +0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100, +0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520, +0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75, +0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000, +0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460, +0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178, +0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100, +0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000,0x10100000, +0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300, +0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100, +0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001, +0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x30e0000d,0x520ac414, +0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af7a,0x6800400,0x962540,0x5240af7a,0x7c00100,0x230400,0x5240af7b,0x4000400,0x200000,0x5240af7b,0x6800100, +0x962540,0x5240b29b,0x4000000,0x200000,0x5240b2a5,0x4000000,0x200000,0x5240b2a5,0x4000000,0x1500000,0x5240b5b9,0x7c00900,0x230400,0x524a4495,0x4000000,0xe00003, +0x5280af7a,0x2802400,0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x5280af7f,0x2802400,0x962460,0x52c0b3b0,0x2802400,0x962460,0x52c0b3b4, +0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100, +0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000, +0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x10200000,0x60003000, +0x24000000,0x10e00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100, +0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400, +0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654, +0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100, +0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460, +0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941, +0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000, +0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000,0x24000000,0x30e00000, +0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000,0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x30100000,0x600ac400, +0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000,0x600acd00,0x4000000, +0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30e05200,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00,0x4000000,0x30e00000, +0x600ace00,0x4000000,0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0x30e05200,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300,0xe30000,0x604ac495, +0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100, +0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400, +0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519, +0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100, +0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400, +0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476, +0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100, +0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000, +0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c, +0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100, +0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800, +0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99, +0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000, +0x30e00000,0x6140af7a,0x7c00100,0x230400,0x6140af7b,0x6800100,0x962540,0x6140af84,0x7c00100,0x230400,0x6180af7b,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000, +0x63002800,0x80000,0x918820,0x63c00c11,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a, +0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100, +0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000, +0x70003000,0x24000000,0x10200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108, +0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400, +0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000, +0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965, +0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000, +0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460, +0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00, +0x4000000,0x10e05200,0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100, +0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000, +0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187, +0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000, +0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540, +0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d, +0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100, +0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400, +0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0, +0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000, +0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000, +0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3, +0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010, +0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000, +0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200, +0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010, +0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000, +0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6, +0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800, +0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000, +0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e, +0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000, +0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00,0x4000000,0xb28045a0, +0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfc0,0x4000000,0x200000,0x7040f7c4,0x80000,0x918820,0x7080af7b, +0x2802400,0x962460,0x7080dfc0,0x2802400,0x962460,0x70c0e4c2,0x2802100,0x962460,0x70c0e4c2,0x2802400,0x962460,0x70c0e4c2,0x6800100,0x962540,0x8000120f,0x7c00100, +0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000, +0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519, +0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100, +0x230400,0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460, +0x8000d997,0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489, +0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010, +0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540, +0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06, +0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010, +0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000, +0x80010670,0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x7a904de0,0x800ace00, +0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100, +0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460, +0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202, +0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00, +0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460, +0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8, +0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100, +0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000, +0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa, +0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100, +0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0, +0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a, +0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100, +0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000, +0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500, +0x4000000,0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100, +0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000, +0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0, +0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000, +0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560, +0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00, +0x4000000,0x30e00000,0xa00b0500,0x4000000,0x30e00000,0xa00b0500,0x4000000,0xb28045a0,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100, +0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af86,0x6800400,0x962540}; -static const int32_t countPropsVectors=6279; -static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[194]={ +static const int32_t countPropsVectors=6375; +static const int32_t propsVectorsColumns=3; /* The code assumes that this value is > 0*/ +static const uint16_t scriptExtensions[198]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, -0x8025,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x19,4,0xa,0xf, -0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15,0x19,0x1a, -0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89, -0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a, -0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x55,4,0x3a,0x8076,4,0x5a,0x10, -0x80a4,0x10,0x5f,0xf,0x809d,0xf,0x63,0x23,0x8089,0x23,0x67,0x1c,0x34,0x8076,0x1c,0x6b, -0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa,0x15,0x1a, -0x23,0x8024,0xa,0x8015,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12, -0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78,0x91,0x99,0x9e, -0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a,0xa,0xab,0xa, -0x8023,0xa,0xaf,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89, -0x67,0x8087}; +0x8025,2,0xe,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x1b,4, +0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15, +0x19,0x1a,0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x3a,0x89,0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x30,0x3a,0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x57,4,0x3a,0x8076,4, +0x5c,0x10,0x80a4,0x10,0x61,0xf,0x809d,0xf,0x65,0x23,0x8089,0x23,0x69,0x1c,0x34,0x8076, +0x1c,0x6d,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa, +0x15,0x1a,0x23,0x8024,0xa,0x8015,0x8004,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029, +5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78, +0x91,0x99,0x9e,0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a, +0xa,0xae,0xa,0x8023,0xa,0xb2,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031, +2,0x8007,0x89,0x69,0x8087,0}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x28aa,0x28aa,0x28aa,0x28aa,0x6196,3,0x7a1d,0x7a7e,0x7a7e,0x7a7e,0xb11ae,0x2a75631,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2962,0x2962,0x2962,0x2962,0x6280,3,0x7b67,0x7bca,0x7bca,0x7bca,0xb18b1,0x2a75631,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucharstriebuilder.cpp b/deps/icu-small/source/common/ucharstriebuilder.cpp index 694648d0c811f7..049997a27545ed 100644 --- a/deps/icu-small/source/common/ucharstriebuilder.cpp +++ b/deps/icu-small/source/common/ucharstriebuilder.cpp @@ -287,7 +287,7 @@ UCharsTrieBuilder::indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UCha UCharsTrieBuilder::UCTLinearMatchNode::UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode) : LinearMatchNode(len, nextNode), s(units) { - hash=hash*37+ustr_hashUCharsN(units, len); + hash=hash*37u+ustr_hashUCharsN(units, len); } UBool diff --git a/deps/icu-small/source/common/ucln_cmn.h b/deps/icu-small/source/common/ucln_cmn.h index a6ecfd54bb55e4..5db94945172c3d 100644 --- a/deps/icu-small/source/common/ucln_cmn.h +++ b/deps/icu-small/source/common/ucln_cmn.h @@ -35,7 +35,7 @@ typedef enum ECleanupCommonType { UCLN_COMMON_START = -1, UCLN_COMMON_USPREP, UCLN_COMMON_BREAKITERATOR, - UCLN_COMMON_BREAKITERATOR_DICT, + UCLN_COMMON_RBBI, UCLN_COMMON_SERVICE, UCLN_COMMON_LOCALE_KEY_TYPE, UCLN_COMMON_LOCALE, diff --git a/deps/icu-small/source/common/ucnv_ct.cpp b/deps/icu-small/source/common/ucnv_ct.cpp index c9a0ce36930ec9..51e31aa4116bd3 100644 --- a/deps/icu-small/source/common/ucnv_ct.cpp +++ b/deps/icu-small/source/common/ucnv_ct.cpp @@ -315,6 +315,7 @@ _CompoundTextClose(UConverter *converter) { } uprv_free(converter->extraInfo); + converter->extraInfo = NULL; } } @@ -519,7 +520,7 @@ UConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, currentState = tmpState; } - sourceOffset = uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength; + sourceOffset = static_cast(uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength); mySource += sourceOffset; diff --git a/deps/icu-small/source/common/ucnv_lmb.cpp b/deps/icu-small/source/common/ucnv_lmb.cpp index 4a5befde6145a2..6dd8e83428a0af 100644 --- a/deps/icu-small/source/common/ucnv_lmb.cpp +++ b/deps/icu-small/source/common/ucnv_lmb.cpp @@ -966,26 +966,26 @@ _LMBCSFromUnicode(UConverterFromUnicodeArgs* args, if(extraInfo->localeConverterIndex < ULMBCS_DOUBLEOPTGROUP_START) { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, ULMBCS_GRP_L1, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); if(!bytes_written) { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, ULMBCS_GRP_EXCEPT, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); } if(!bytes_written) { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, extraInfo->localeConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); } } else { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, extraInfo->localeConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); } diff --git a/deps/icu-small/source/common/ucnv_u16.cpp b/deps/icu-small/source/common/ucnv_u16.cpp index 674d0323efddef..a289fd4acfac1a 100644 --- a/deps/icu-small/source/common/ucnv_u16.cpp +++ b/deps/icu-small/source/common/ucnv_u16.cpp @@ -1323,9 +1323,17 @@ _UTF16GetName(const UConverter *cnv) { U_CDECL_END extern const UConverterSharedData _UTF16Data; -#define IS_UTF16BE(cnv) ((cnv)->sharedData==&_UTF16BEData) -#define IS_UTF16LE(cnv) ((cnv)->sharedData==&_UTF16LEData) -#define IS_UTF16(cnv) ((cnv)->sharedData==&_UTF16Data || (cnv)->sharedData==&_UTF16v2Data) +static inline bool IS_UTF16BE(const UConverter *cnv) { + return ((cnv)->sharedData == &_UTF16BEData); +} + +static inline bool IS_UTF16LE(const UConverter *cnv) { + return ((cnv)->sharedData == &_UTF16LEData); +} + +static inline bool IS_UTF16(const UConverter *cnv) { + return ((cnv)->sharedData==&_UTF16Data) || ((cnv)->sharedData == &_UTF16v2Data); +} U_CDECL_BEGIN static void U_CALLCONV diff --git a/deps/icu-small/source/common/ucnv_u8.cpp b/deps/icu-small/source/common/ucnv_u8.cpp index b2d26f9c3b7f8e..866cf81659486b 100644 --- a/deps/icu-small/source/common/ucnv_u8.cpp +++ b/deps/icu-small/source/common/ucnv_u8.cpp @@ -31,6 +31,7 @@ #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" +#include "ustr_imp.h" /* Prototypes --------------------------------------------------------------- */ @@ -44,51 +45,13 @@ U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args /* UTF-8 -------------------------------------------------------------------- */ -/* UTF-8 Conversion DATA - * for more information see Unicode Standard 2.0, Transformation Formats Appendix A-9 - */ -/*static const uint32_t REPLACEMENT_CHARACTER = 0x0000FFFD;*/ #define MAXIMUM_UCS2 0x0000FFFF -#define MAXIMUM_UTF 0x0010FFFF -#define MAXIMUM_UCS4 0x7FFFFFFF -#define HALF_SHIFT 10 -#define HALF_BASE 0x0010000 -#define HALF_MASK 0x3FF -#define SURROGATE_HIGH_START 0xD800 -#define SURROGATE_HIGH_END 0xDBFF -#define SURROGATE_LOW_START 0xDC00 -#define SURROGATE_LOW_END 0xDFFF - -/* -SURROGATE_LOW_START + HALF_BASE */ -#define SURROGATE_LOW_BASE 9216 - -static const uint32_t offsetsFromUTF8[7] = {0, - (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, - (uint32_t) 0x03C82080, (uint32_t) 0xFA082080, (uint32_t) 0x82082080 -}; -/* END OF UTF-8 Conversion DATA */ - -static const int8_t bytesFromUTF8[256] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0 +static const uint32_t offsetsFromUTF8[5] = {0, + (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, + (uint32_t) 0x03C82080 }; -/* - * Starting with Unicode 3.0.1: - * UTF-8 byte sequences of length N _must_ encode code points of or above utf8_minChar32[N]; - * byte sequences with more than 4 bytes are illegal in UTF-8, - * which is tested with impossible values for them - */ -static const uint32_t -utf8_minChar32[7]={ 0, 0, 0x80, 0x800, 0x10000, 0xffffffff, 0xffffffff }; - static UBool hasCESU8Data(const UConverter *cnv) { #if UCONFIG_ONLY_HTML_CONVERSION @@ -127,7 +90,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, while (mySource < sourceLimit && myTarget < targetLimit) { ch = *(mySource++); - if (ch < 0x80) /* Simple case */ + if (U8_IS_SINGLE(ch)) /* Simple case */ { *(myTarget++) = (UChar) ch; } @@ -135,7 +98,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, { /* store the first char */ toUBytes[0] = (char)ch; - inBytes = bytesFromUTF8[ch]; /* lookup current sequence length */ + inBytes = U8_COUNT_BYTES_NON_ASCII(ch); /* lookup current sequence length */ i = 1; morebytes: @@ -144,7 +107,8 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, if (mySource < sourceLimit) { toUBytes[i] = (char) (ch2 = *mySource); - if (!U8_IS_TRAIL(ch2)) + if (!icu::UTF8::isValidTrail(ch, ch2, i, inBytes) && + !(isCESU8 && i == 1 && ch == 0xed && U8_IS_TRAIL(ch2))) { break; /* i < inBytes */ } @@ -162,24 +126,12 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, } } - /* Remove the accumulated high bits */ - ch -= offsetsFromUTF8[inBytes]; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[i] && - (isCESU8 ? i <= 3 : !U_IS_SURROGATE(ch))) + // In CESU-8, only surrogates, not supplementary code points, are encoded directly. + if (i == inBytes && (!isCESU8 || i <= 3)) { + /* Remove the accumulated high bits */ + ch -= offsetsFromUTF8[inBytes]; + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ if (ch <= MAXIMUM_UCS2) { @@ -189,9 +141,8 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; @@ -256,7 +207,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr while (mySource < sourceLimit && myTarget < targetLimit) { ch = *(mySource++); - if (ch < 0x80) /* Simple case */ + if (U8_IS_SINGLE(ch)) /* Simple case */ { *(myTarget++) = (UChar) ch; *(myOffsets++) = offsetNum++; @@ -264,7 +215,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr else { toUBytes[0] = (char)ch; - inBytes = bytesFromUTF8[ch]; + inBytes = U8_COUNT_BYTES_NON_ASCII(ch); i = 1; morebytes: @@ -273,7 +224,8 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr if (mySource < sourceLimit) { toUBytes[i] = (char) (ch2 = *mySource); - if (!U8_IS_TRAIL(ch2)) + if (!icu::UTF8::isValidTrail(ch, ch2, i, inBytes) && + !(isCESU8 && i == 1 && ch == 0xed && U8_IS_TRAIL(ch2))) { break; /* i < inBytes */ } @@ -290,24 +242,12 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr } } - /* Remove the accumulated high bits */ - ch -= offsetsFromUTF8[inBytes]; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[i] && - (isCESU8 ? i <= 3 : !U_IS_SURROGATE(ch))) + // In CESU-8, only surrogates, not supplementary code points, are encoded directly. + if (i == inBytes && (!isCESU8 || i <= 3)) { + /* Remove the accumulated high bits */ + ch -= offsetsFromUTF8[inBytes]; + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ if (ch <= MAXIMUM_UCS2) { @@ -318,10 +258,9 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); + *(myTarget++) = U16_LEAD(ch); *(myOffsets++) = offsetNum; - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; + ch = U16_TRAIL(ch); if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; @@ -616,10 +555,9 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, UConverter *cnv; const uint8_t *sourceInitial; const uint8_t *source; - uint16_t extraBytesToWrite; uint8_t myByte; UChar32 ch; - int8_t i, isLegalSequence; + int8_t i; /* UTF-8 only here, the framework handles CESU-8 to combine surrogate pairs */ @@ -633,14 +571,14 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, } myByte = (uint8_t)*(source++); - if (myByte < 0x80) + if (U8_IS_SINGLE(myByte)) { args->source = (const char *)source; return (UChar32)myByte; } - extraBytesToWrite = (uint16_t)bytesFromUTF8[myByte]; - if (extraBytesToWrite == 0) { + uint16_t countTrailBytes = U8_COUNT_TRAIL_BYTES(myByte); + if (countTrailBytes == 0) { cnv->toUBytes[0] = myByte; cnv->toULength = 1; *err = U_ILLEGAL_CHAR_FOUND; @@ -649,15 +587,17 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, } /*The byte sequence is longer than the buffer area passed*/ - if (((const char *)source + extraBytesToWrite - 1) > args->sourceLimit) + if (((const char *)source + countTrailBytes) > args->sourceLimit) { /* check if all of the remaining bytes are trail bytes */ + uint16_t extraBytesToWrite = countTrailBytes + 1; cnv->toUBytes[0] = myByte; i = 1; *err = U_TRUNCATED_CHAR_FOUND; while(source < (const uint8_t *)args->sourceLimit) { - if(U8_IS_TRAIL(myByte = *source)) { - cnv->toUBytes[i++] = myByte; + uint8_t b = *source; + if(icu::UTF8::isValidTrail(myByte, b, i, extraBytesToWrite)) { + cnv->toUBytes[i++] = b; ++source; } else { /* error even before we run out of input */ @@ -670,81 +610,28 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, return 0xffff; } - isLegalSequence = 1; ch = myByte << 6; - switch(extraBytesToWrite) - { - /* note: code falls through cases! (sic)*/ - case 6: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; + if(countTrailBytes == 2) { + uint8_t t1 = *source, t2; + if(U8_IS_VALID_LEAD3_AND_T1(myByte, t1) && U8_IS_TRAIL(t2 = *++source)) { + args->source = (const char *)(source + 1); + return (((ch + t1) << 6) + t2) - offsetsFromUTF8[3]; } - ++source; - U_FALLTHROUGH; - case 5: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; + } else if(countTrailBytes == 1) { + uint8_t t1 = *source; + if(U8_IS_TRAIL(t1)) { + args->source = (const char *)(source + 1); + return (ch + t1) - offsetsFromUTF8[2]; } - ++source; - U_FALLTHROUGH; - case 4: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 3: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 2: - ch += (myByte = *source); - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; + } else { // countTrailBytes == 3 + uint8_t t1 = *source, t2, t3; + if(U8_IS_VALID_LEAD4_AND_T1(myByte, t1) && U8_IS_TRAIL(t2 = *++source) && + U8_IS_TRAIL(t3 = *++source)) { + args->source = (const char *)(source + 1); + return (((((ch + t1) << 6) + t2) << 6) + t3) - offsetsFromUTF8[4]; } - ++source; - }; - ch -= offsetsFromUTF8[extraBytesToWrite]; - args->source = (const char *)source; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[extraBytesToWrite] && - !U_IS_SURROGATE(ch) - ) { - return ch; /* return the code point */ } + args->source = (const char *)source; for(i = 0; sourceInitial < source; ++i) { cnv->toUBytes[i] = *sourceInitial++; @@ -757,14 +644,6 @@ U_CDECL_END /* UTF-8-from-UTF-8 conversion functions ------------------------------------ */ -/* minimum code point values for n-byte UTF-8 sequences, n=0..4 */ -static const UChar32 -utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; - -/* offsets for n-byte UTF-8 sequences that were calculated with ((lead<<6)+trail)<<6+trail... */ -static const UChar32 -utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; - U_CDECL_BEGIN /* "Convert" UTF-8 to UTF-8: Validate and copy. Modified from ucnv_DBCSFromUTF8(). */ static void U_CALLCONV @@ -812,39 +691,35 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, *pErrorCode=U_USING_DEFAULT_WARNING; return; } else { - /* - * Use a single counter for source and target, counting the minimum of - * the source length and the target capacity. - * As a result, the source length is checked only once per multi-byte - * character instead of twice. - * - * Make sure that the last byte sequence is complete, or else - * stop just before it. - * (The longest legal byte sequence has 3 trail bytes.) - * Count oldToULength (number of source bytes from a previous buffer) - * into the source length but reduce the source index by toULimit - * while going back over trail bytes in order to not go back into - * the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * Let the standard converter handle edge cases. - */ - int32_t i; - + // Use a single counter for source and target, counting the minimum of + // the source length and the target capacity. + // Let the standard converter handle edge cases. if(count>targetCapacity) { count=targetCapacity; } - i=0; - while(i<3 && i<(count-toULimit)) { - b=source[count-oldToULength-i-1]; - if(U8_IS_TRAIL(b)) { - ++i; - } else { - if(i0 only once per 1/2/3-byte character. + // If the buffer ends with a truncated 2- or 3-byte sequence, + // then we reduce the count to stop before that, + // and collect the remaining bytes after the conversion loop. + { + // Do not go back into the bytes that will be read for finishing a partial + // sequence from the previous buffer. + int32_t length=count-toULimit; + if(length>0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + count-=2; + } + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --count; } - break; } } } @@ -859,17 +734,17 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* conversion loop */ while(count>0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ *target++=b; --count; continue; } else { - if(b>0xe0) { - if( /* handle U+1000..U+D7FF inline */ - (t1=source[0]) >= 0x80 && ((b<0xed && (t1 <= 0xbf)) || - (b==0xed && (t1 <= 0x9f))) && - (t2=source[1]) >= 0x80 && t2 <= 0xbf + if(b>=0xe0) { + if( /* handle U+0800..U+FFFF inline */ + b<0xf0 && + U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && + U8_IS_TRAIL(t2=source[1]) ) { source+=2; *target++=b; @@ -878,10 +753,10 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, count-=3; continue; } - } else if(b<0xe0) { + } else { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && - (t1=*source) >= 0x80 && t1 <= 0xbf + U8_IS_TRAIL(t1=*source) ) { ++source; *target++=b; @@ -889,30 +764,18 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, count-=2; continue; } - } else if(b==0xe0) { - if( /* handle U+0800..U+0FFF inline */ - (t1=source[0]) >= 0xa0 && t1 <= 0xbf && - (t2=source[1]) >= 0x80 && t2 <= 0xbf - ) { - source+=2; - *target++=b; - *target++=t1; - *target++=t2; - count-=3; - continue; - } } /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULength=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - /* legal byte sequence for BMP code point */ - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* legal byte sequence for supplementary code point */ - } else { + if(toULength!=toULimit) { /* error handling: illegal UTF-8 byte sequence */ source-=(toULength-oldToULength); while(oldToULength(sourceLimit-source)) { /* collect a truncated byte sequence */ toULength=0; diff --git a/deps/icu-small/source/common/ucnvlat1.cpp b/deps/icu-small/source/common/ucnvlat1.cpp index 7a0dccd4469771..9855ebe6e774d7 100644 --- a/deps/icu-small/source/common/ucnvlat1.cpp +++ b/deps/icu-small/source/common/ucnvlat1.cpp @@ -23,6 +23,7 @@ #include "unicode/utf8.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" +#include "ustr_imp.h" /* control optimizations according to the platform */ #define LATIN1_UNROLL_FROM_UNICODE 1 @@ -374,7 +375,7 @@ ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ *target++=(uint8_t)b; --targetCapacity; @@ -409,7 +410,7 @@ ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, if(U_SUCCESS(*pErrorCode) && source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { utf8->toUnicodeStatus=utf8->toUBytes[0]=b=*source++; utf8->toULength=1; - utf8->mode=U8_COUNT_TRAIL_BYTES(b)+1; + utf8->mode=U8_COUNT_BYTES(b); } /* write back the updated pointers */ diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index 4412be6739e934..e5efa7fc1b2ad3 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -59,6 +59,7 @@ #include "cmemory.h" #include "cstring.h" #include "umutex.h" +#include "ustr_imp.h" /* control optimizations according to the platform */ #define MBCS_UNROLL_SINGLE_TO_BMP 1 @@ -5011,13 +5012,9 @@ ucnv_MBCSSingleFromUChar32(UConverterSharedData *sharedData, /* MBCS-from-UTF-8 conversion functions ------------------------------------- */ -/* minimum code point values for n-byte UTF-8 sequences, n=0..4 */ -static const UChar32 -utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; - /* offsets for n-byte UTF-8 sequences that were calculated with ((lead<<6)+trail)<<6+trail... */ static const UChar32 -utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; +utf8_offsets[5]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; static void U_CALLCONV ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, @@ -5037,7 +5034,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, uint8_t b, t1, t2; uint32_t asciiRoundtrips; - uint16_t value, minValue; + uint16_t value, minValue = 0; UBool hasSupplementary; /* set up the local pointers */ @@ -5075,28 +5072,27 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, toULength=oldToULength=toULimit=0; } - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * Do not go back into the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - */ + // The conversion loop checks source0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + sourceLimit-=2; } - break; + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --sourceLimit; } } } @@ -5130,7 +5126,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { *target++=(uint8_t)b; @@ -5185,7 +5181,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULengthsourceLimit) { b=*source; - if(U8_IS_TRAIL(b)) { + if(icu::UTF8::isValidTrail(c, b, toULength, toULimit)) { ++source; ++toULength; c=(c<<6)+b; @@ -5220,22 +5216,18 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* supplementary code point */ - if(!hasSupplementary) { - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - value=0; - } else { + if(toULength==toULimit) { + c-=utf8_offsets[toULength]; + if(toULength<=3) { /* BMP */ value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); + } else { + /* supplementary code point */ + if(!hasSupplementary) { + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + value=0; + } else { + value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); + } } } else { /* error handling: illegal UTF-8 byte sequence */ @@ -5310,7 +5302,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { c=utf8->toUBytes[0]=b=*source++; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES(b); while(sourcetoUBytes[toULength++]=b=*source++; c=(c<<6)+b; @@ -5344,7 +5336,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, uint32_t stage2Entry; uint32_t asciiRoundtrips; - uint16_t value; + uint16_t value = 0; UBool hasSupplementary; /* set up the local pointers */ @@ -5375,28 +5367,27 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, toULength=oldToULength=toULimit=0; } - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * Do not go back into the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - */ + // The conversion loop checks source0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + sourceLimit-=2; } - break; + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --sourceLimit; } } } @@ -5412,7 +5403,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { *target++=b; @@ -5426,13 +5417,13 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } } else { - if(b>0xe0) { - if( /* handle U+1000..U+D7FF inline */ - (((t1=(uint8_t)(source[0]-0x80), b<0xed) && (t1 <= 0x3f)) || - (b==0xed && (t1 <= 0x1f))) && + if(b>=0xe0) { + if( /* handle U+0800..U+D7FF inline */ + b<=0xed && // do not assume maxFastUChar>0xd7ff + U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && (t2=(uint8_t)(source[1]-0x80)) <= 0x3f ) { - c=((b&0xf)<<6)|t1; + c=((b&0xf)<<6)|(t1&0x3f); source+=2; value=DBCS_RESULT_FROM_UTF8(mbcsIndex, results, c, t2); if(value==0) { @@ -5442,7 +5433,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { c=-1; } - } else if(b<0xe0) { + } else { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && (t1=(uint8_t)(*source-0x80)) <= 0x3f @@ -5457,15 +5448,13 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { c=-1; } - } else { - c=-1; } if(c<0) { /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULengthsourceLimit) { b=*source; - if(U8_IS_TRAIL(b)) { + if(icu::UTF8::isValidTrail(c, b, toULength, toULimit)) { ++source; ++toULength; c=(c<<6)+b; @@ -5500,22 +5489,18 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - stage2Entry=MBCS_STAGE_2_FROM_U(table, c); - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* supplementary code point */ - if(!hasSupplementary) { - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - stage2Entry=0; - } else { + if(toULength==toULimit) { + c-=utf8_offsets[toULength]; + if(toULength<=3) { /* BMP */ stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + } else { + /* supplementary code point */ + if(!hasSupplementary) { + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + stage2Entry=0; + } else { + stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + } } } else { /* error handling: illegal UTF-8 byte sequence */ @@ -5620,7 +5605,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { c=utf8->toUBytes[0]=b=*source++; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES(b); while(sourcetoUBytes[toULength++]=b=*source++; c=(c<<6)+b; diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 085f994858136d..aa9d855f5022e7 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -25,6 +25,7 @@ #include "uenumimp.h" #include "uhash.h" #include "hash.h" +#include "uinvchar.h" #include "uresimp.h" #include "ulist.h" #include "ureslocs.h" @@ -545,93 +546,97 @@ U_CAPI int32_t U_EXPORT2 ucurr_forLocale(const char* locale, UChar* buff, int32_t buffCapacity, - UErrorCode* ec) -{ - int32_t resLen = 0; - const UChar* s = NULL; - if (ec != NULL && U_SUCCESS(*ec)) { - if ((buff && buffCapacity) || !buffCapacity) { - UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; - if ((resLen = uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus))) { - // there is a currency keyword. Try to see if it's valid - if(buffCapacity > resLen) { - /* Normalize the currency keyword value to upper case. */ - T_CString_toUpperCase(id); - u_charsToUChars(id, buff, resLen); - } - } else { - // get country or country_variant in `id' - uint32_t variantType = idForLocale(locale, id, sizeof(id), ec); + UErrorCode* ec) { + if (U_FAILURE(*ec)) { return 0; } + if (buffCapacity < 0 || (buff == nullptr && buffCapacity > 0)) { + *ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - if (U_FAILURE(*ec)) { - return 0; - } + char currency[4]; // ISO currency codes are alpha3 codes. + UErrorCode localStatus = U_ZERO_ERROR; + int32_t resLen = uloc_getKeywordValue(locale, "currency", + currency, UPRV_LENGTHOF(currency), &localStatus); + if (U_SUCCESS(localStatus) && resLen == 3 && uprv_isInvariantString(currency, resLen)) { + if (resLen < buffCapacity) { + T_CString_toUpperCase(currency); + u_charsToUChars(currency, buff, resLen); + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } + + // get country or country_variant in `id' + char id[ULOC_FULLNAME_CAPACITY]; + uint32_t variantType = idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + if (U_FAILURE(*ec)) { + return 0; + } #if !UCONFIG_NO_SERVICE - const UChar* result = CReg::get(id); - if (result) { - if(buffCapacity > u_strlen(result)) { - u_strcpy(buff, result); - } - return u_strlen(result); - } + const UChar* result = CReg::get(id); + if (result) { + if(buffCapacity > u_strlen(result)) { + u_strcpy(buff, result); + } + resLen = u_strlen(result); + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } #endif - // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); - if (idDelim) { - idDelim[0] = 0; - } + // Remove variants, which is only needed for registration. + char *idDelim = uprv_strchr(id, VAR_DELIM); + if (idDelim) { + idDelim[0] = 0; + } - // Look up the CurrencyMap element in the root bundle. - UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); - UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); - UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); + const UChar* s = NULL; // Currency code from data file. + if (id[0] == 0) { + // No point looking in the data for an empty string. + // This is what we would get. + localStatus = U_MISSING_RESOURCE_ERROR; + } else { + // Look up the CurrencyMap element in the root bundle. + localStatus = U_ZERO_ERROR; + UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); + UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); + UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); + s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); + + // Get the second item when PREEURO is requested, and this is a known Euro country. + // If the requested variant is PREEURO, and this isn't a Euro country, + // assume that the country changed over to the Euro in the future. + // This is probably an old version of ICU that hasn't been updated yet. + // The latest currency is probably correct. + if (U_SUCCESS(localStatus)) { + if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { + currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - - /* - Get the second item when PREEURO is requested, and this is a known Euro country. - If the requested variant is PREEURO, and this isn't a Euro country, assume - that the country changed over to the Euro in the future. This is probably - an old version of ICU that hasn't been updated yet. The latest currency is - probably correct. - */ - if (U_SUCCESS(localStatus)) { - if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { - currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); - s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - } - else if ((variantType & VARIANT_IS_EURO)) { - s = EUR_STR; - } - } - ures_close(countryArray); - ures_close(currencyReq); - - if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) - { - // We don't know about it. Check to see if we support the variant. - uloc_getParent(locale, id, sizeof(id), ec); - *ec = U_USING_FALLBACK_WARNING; - return ucurr_forLocale(id, buff, buffCapacity, ec); - } - else if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { - // There is nothing to fallback to. Report the failure/warning if possible. - *ec = localStatus; - } - if (U_SUCCESS(*ec)) { - if(buffCapacity > resLen) { - u_strcpy(buff, s); - } - } + } else if ((variantType & VARIANT_IS_EURO)) { + s = EUR_STR; } - return u_terminateUChars(buff, buffCapacity, resLen, ec); - } else { - *ec = U_ILLEGAL_ARGUMENT_ERROR; } + ures_close(currencyReq); + ures_close(countryArray); } - return resLen; + + if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) { + // We don't know about it. Check to see if we support the variant. + uloc_getParent(locale, id, UPRV_LENGTHOF(id), ec); + *ec = U_USING_FALLBACK_WARNING; + // TODO: Loop over the shortened id rather than recursing and + // looking again for a currency keyword. + return ucurr_forLocale(id, buff, buffCapacity, ec); + } + if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { + // There is nothing to fallback to. Report the failure/warning if possible. + *ec = localStatus; + } + if (U_SUCCESS(*ec)) { + if(buffCapacity > resLen) { + u_strcpy(buff, s); + } + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); } // end registration @@ -648,7 +653,16 @@ static UBool fallback(char *loc) { return FALSE; } UErrorCode status = U_ZERO_ERROR; - uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); + if (uprv_strcmp(loc, "en_GB") == 0) { + // HACK: See #13368. We need "en_GB" to fall back to "en_001" instead of "en" + // in order to consume the correct data strings. This hack will be removed + // when proper data sink loading is implemented here. + // NOTE: "001" adds 1 char over "GB". However, both call sites allocate + // arrays with length ULOC_FULLNAME_CAPACITY (plenty of room for en_001). + uprv_strcpy(loc + 3, "001"); + } else { + uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); + } /* char *i = uprv_strrchr(loc, '_'); if (i == NULL) { @@ -2216,6 +2230,7 @@ ucurr_countCurrencies(const char* locale, UErrorCode localStatus = U_ZERO_ERROR; char id[ULOC_FULLNAME_CAPACITY]; uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus); + // get country or country_variant in `id' /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec); diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index aa23ab719ab6c0..c15cb78a74ad7a 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -206,6 +206,8 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca return didUpdate; } +#if U_PLATFORM_HAS_WINUWP_API == 0 + static UBool setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCode) { UDataMemory tData; @@ -215,6 +217,8 @@ setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCod return setCommonICUData(&tData, FALSE, pErrorCode); } +#endif + static const char * findBasename(const char *path) { const char *basename=uprv_strrchr(path, U_FILE_SEP_CHAR); @@ -982,7 +986,7 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, /* init path iterator for individual files */ UDataPathIterator iter(dataPath, pkgName, path, tocEntryPathSuffix, FALSE, pErrorCode); - while((pathBuffer = iter.next(pErrorCode))) + while((pathBuffer = iter.next(pErrorCode)) != NULL) { #ifdef UDATA_DEBUG fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); @@ -1165,7 +1169,7 @@ doOpenChoice(const char *path, const char *type, const char *name, if(uprv_strchr(path,U_FILE_ALT_SEP_CHAR) != NULL) { altSepPath.append(path, *pErrorCode); char *p; - while((p=uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR))) { + while ((p = uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } #if defined (UDATA_DEBUG) diff --git a/deps/icu-small/source/common/uhash.cpp b/deps/icu-small/source/common/uhash.cpp index 0e2a3c03c62f50..a80e7b8ff27b42 100644 --- a/deps/icu-small/source/common/uhash.cpp +++ b/deps/icu-small/source/common/uhash.cpp @@ -79,14 +79,14 @@ * prime number while being less than a power of two. */ static const int32_t PRIMES[] = { - 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, + 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647 /*, 4294967291 */ }; #define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES) -#define DEFAULT_PRIME_INDEX 3 +#define DEFAULT_PRIME_INDEX 4 /* These ratios are tuned to the PRIMES array such that a resize * places the table back into the zone of non-resizing. That is, @@ -570,6 +570,22 @@ uhash_init(UHashtable *fillinResult, return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status); } +U_CAPI UHashtable* U_EXPORT2 +uhash_initSize(UHashtable *fillinResult, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t size, + UErrorCode *status) { + + // Find the smallest index i for which PRIMES[i] >= size. + int32_t i = 0; + while (i<(PRIMES_LENGTH-1) && PRIMES[i](ustr_hashCharsN(s, uprv_strlen(s))); } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/common/uhash.h b/deps/icu-small/source/common/uhash.h index 2e7cf6a394c912..b59d2711bb29d0 100644 --- a/deps/icu-small/source/common/uhash.h +++ b/deps/icu-small/source/common/uhash.h @@ -231,6 +231,25 @@ uhash_init(UHashtable *hash, UValueComparator *valueComp, 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 size The initial capacity of this hash table. + * @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_initSize(UHashtable *hash, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t size, + UErrorCode *status); + /** * Close a UHashtable, releasing the memory used. * @param hash The UHashtable to close. If hash is NULL no operation is performed. diff --git a/deps/icu-small/source/common/uinvchar.cpp b/deps/icu-small/source/common/uinvchar.cpp index ed1ab8e761eef6..eafb951e38a67c 100644 --- a/deps/icu-small/source/common/uinvchar.cpp +++ b/deps/icu-small/source/common/uinvchar.cpp @@ -573,7 +573,7 @@ uprv_aestrncpy(uint8_t *dst, const uint8_t *src, int32_t n) uint8_t *orig_dst = dst; if(n==-1) { - n = uprv_strlen((const char*)src)+1; /* copy NUL */ + n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ } /* copy non-null */ while(*src && n>0) { @@ -594,7 +594,7 @@ uprv_eastrncpy(uint8_t *dst, const uint8_t *src, int32_t n) uint8_t *orig_dst = dst; if(n==-1) { - n = uprv_strlen((const char*)src)+1; /* copy NUL */ + n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ } /* copy non-null */ while(*src && n>0) { diff --git a/deps/icu-small/source/common/ulist.cpp b/deps/icu-small/source/common/ulist.cpp index d4549328ea55fb..07cbcc8303ac91 100644 --- a/deps/icu-small/source/common/ulist.cpp +++ b/deps/icu-small/source/common/ulist.cpp @@ -252,7 +252,7 @@ U_CAPI const char * U_EXPORT2 ulist_next_keyword_value(UEnumeration *en, int32_t s = (const char *)ulist_getNext((UList *)(en->context)); if (s != NULL && resultLength != NULL) { - *resultLength = uprv_strlen(s); + *resultLength = static_cast(uprv_strlen(s)); } return s; } diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 4d854bbcca320e..7a1dc723cff619 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -98,6 +98,7 @@ locale_getKeywords(const char *localeID, */ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ +/* Subsequent hand addition of selected languages */ static const char * const LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", @@ -109,7 +110,7 @@ static const char * const LANGUAGES[] = { "bgn", "bho", "bi", "bik", "bin", "bjn", "bkm", "bla", "bm", "bn", "bo", "bpy", "bqi", "br", "bra", "brh", "brx", "bs", "bss", "bua", "bug", "bum", "byn", "byv", - "ca", "cad", "car", "cay", "cch", "ce", "ceb", "cgg", + "ca", "cad", "car", "cay", "cch", "ccp", "ce", "ceb", "cgg", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "co", "cop", "cps", "cr", "crh", "cs", "csb", "cu", "cv", "cy", @@ -213,6 +214,7 @@ static const char* const REPLACEMENT_LANGUAGES[]={ */ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ +/* Subsequent hand addition of selected languages */ static const char * const LANGUAGES_3[] = { "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", @@ -224,7 +226,7 @@ static const char * const LANGUAGES_3[] = { "bgn", "bho", "bis", "bik", "bin", "bjn", "bkm", "bla", "bam", "ben", "bod", "bpy", "bqi", "bre", "bra", "brh", "brx", "bos", "bss", "bua", "bug", "bum", "byn", "byv", - "cat", "cad", "car", "cay", "cch", "che", "ceb", "cgg", + "cat", "cad", "car", "cay", "cch", "ccp", "che", "ceb", "cgg", "cha", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "cos", "cop", "cps", "cre", "crh", "ces", "csb", "chu", "chv", "cym", @@ -529,14 +531,16 @@ static const VariantMap VARIANT_MAP[] = { #define _hasBCP47Extension(id) (id && uprv_strstr(id, "@") == NULL && getShortestSubtagLength(localeID) == 1) /* Converts the BCP47 id to Unicode id. Does nothing to id if conversion fails */ #define _ConvertBCP47(finalID, id, buffer, length,err) \ - if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || U_FAILURE(*err)) { \ + if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || \ + U_FAILURE(*err) || *err == U_STRING_NOT_TERMINATED_WARNING) { \ finalID=id; \ + if (*err == U_STRING_NOT_TERMINATED_WARNING) { *err = U_BUFFER_OVERFLOW_ERROR; } \ } else { \ finalID=buffer; \ } /* Gets the size of the shortest subtag in the given localeID. */ static int32_t getShortestSubtagLength(const char *localeID) { - int32_t localeIDLength = uprv_strlen(localeID); + int32_t localeIDLength = static_cast(uprv_strlen(localeID)); int32_t length = localeIDLength; int32_t tmpLength = 0; int32_t i; @@ -2486,7 +2490,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, #if defined(ULOC_DEBUG) fprintf(stderr,"%02d: %s\n", i, acceptList[i]); #endif - while((l=uenum_next(availableLocales, NULL, status))) { + while((l=uenum_next(availableLocales, NULL, status)) != NULL) { #if defined(ULOC_DEBUG) fprintf(stderr," %s\n", l); #endif @@ -2526,7 +2530,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, #if defined(ULOC_DEBUG) fprintf(stderr,"Try: [%s]", fallbackList[i]); #endif - while((l=uenum_next(availableLocales, NULL, status))) { + while((l=uenum_next(availableLocales, NULL, status)) != NULL) { #if defined(ULOC_DEBUG) fprintf(stderr," %s\n", l); #endif diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index 856407defe1ea1..f8337ec02476c4 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -1022,7 +1022,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac no known mapping. This implementation normalizes the the value to lower case */ - int32_t bcpValueLen = uprv_strlen(bcpValue); + int32_t bcpValueLen = static_cast(uprv_strlen(bcpValue)); if (bcpValueLen < extBufCapacity) { uprv_strcpy(pExtBuf, bcpValue); T_CString_toLowerCase(pExtBuf); @@ -1288,7 +1288,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT bufIdx++; } - len = uprv_strlen(attr->attribute); + len = static_cast(uprv_strlen(attr->attribute)); uprv_memcpy(buf + bufIdx, attr->attribute, len); bufIdx += len; @@ -1841,7 +1841,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta int32_t newTagLength; grandfatheredLen = tagLen; /* back up for output parsedLen */ - newTagLength = uprv_strlen(GRANDFATHERED[i+1]); + newTagLength = static_cast(uprv_strlen(GRANDFATHERED[i+1])); if (tagLen < newTagLength) { uprv_free(tagBuf); tagBuf = (char*)uprv_malloc(newTagLength + 1); diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index 749a84321886d0..5084913cbf742a 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -102,9 +102,6 @@ { HANDLE map; HANDLE file; - SECURITY_ATTRIBUTES mappingAttributes; - SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; - SECURITY_DESCRIPTOR securityDesc; UDataMemory_init(pData); /* Clear the output struct. */ @@ -143,6 +140,11 @@ This is required for multiuser systems on Windows 2000 SP4 and beyond */ // TODO: UWP does not have this function and I do not think it is required? #if U_PLATFORM_HAS_WINUWP_API == 0 + + SECURITY_ATTRIBUTES mappingAttributes; + SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; + SECURITY_DESCRIPTOR securityDesc; + 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)) { diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index 12bd7575d66b44..cbbd66cb5a8a65 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -132,7 +132,7 @@ umtx_condBroadcast(UConditionVar *condition) { } U_CAPI void U_EXPORT2 -umtx_condSignal(UConditionVar *condition) { +umtx_condSignal(UConditionVar * /* condition */) { // Function not implemented. There is no immediate requirement from ICU to have it. // Once ICU drops support for Windows XP and Server 2003, ICU Condition Variables will be // changed to be thin wrappers on native Windows CONDITION_VARIABLEs, and this function diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index b1e4cc68c6dbef..9c1ac7531bc60d 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -250,7 +250,7 @@ class U_COMMON_API BreakIterator : public UObject { virtual int32_t next(void) = 0; /** - * Return character index of the current interator position within the text. + * Return character index of the current iterator position within the text. * @return The boundary most recently returned. * @stable ICU 2.0 */ @@ -277,7 +277,7 @@ class U_COMMON_API BreakIterator : public UObject { virtual int32_t preceding(int32_t offset) = 0; /** - * Return true if the specfied position is a boundary position. + * Return true if the specified position is a boundary position. * As a side effect, the current position of the iterator is set * to the first boundary position at or following the specified offset. * @param offset the offset to check. @@ -331,7 +331,7 @@ class U_COMMON_API BreakIterator : public UObject { * @param fillInVec an array to be filled in with the status values. * @param capacity the length of the supplied vector. A length of zero causes * the function to return the number of status values, in the - * normal way, without attemtping to store any values. + * normal way, without attempting to store any values. * @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. @@ -469,7 +469,7 @@ class U_COMMON_API BreakIterator : public UObject { static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** - * Get name of the object for the desired Locale, in the desired langauge. + * Get name of the object for the desired Locale, in the desired language. * @param objectLocale must be from getAvailableLocales. * @param displayLocale specifies the desired locale for output. * @param name the fill-in parameter of the return value @@ -482,7 +482,7 @@ class U_COMMON_API BreakIterator : public UObject { UnicodeString& name); /** - * Get name of the object for the desired Locale, in the langauge of the + * Get name of the object for the desired Locale, in the language of the * default locale. * @param objectLocale must be from getMatchingLocales * @param name the fill-in parameter of the return value @@ -629,10 +629,12 @@ class U_COMMON_API BreakIterator : public UObject { /** @internal */ BreakIterator(); /** @internal */ - BreakIterator (const BreakIterator &other) : UObject(other) {} + BreakIterator (const BreakIterator &other); #ifndef U_HIDE_INTERNAL_API /** @internal */ - BreakIterator (const Locale& valid, const Locale& actual); + BreakIterator (const Locale& valid, const Locale &actual); + /** @internal. Assignment Operator, used by RuleBasedBreakIterator. */ + BreakIterator &operator = (const BreakIterator &other); #endif /* U_HIDE_INTERNAL_API */ private: @@ -640,12 +642,6 @@ class U_COMMON_API BreakIterator : public UObject { /** @internal */ char actualLocale[ULOC_FULLNAME_CAPACITY]; char validLocale[ULOC_FULLNAME_CAPACITY]; - - /** - * The assignment operator has no real implementation. - * It's provided to make the compiler happy. Do not call. - */ - BreakIterator& operator=(const BreakIterator&); }; #ifndef U_HIDE_DEPRECATED_API @@ -661,5 +657,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ -#endif // _BRKITER +#endif // BRKITER_H //eof diff --git a/deps/icu-small/source/common/unicode/bytestream.h b/deps/icu-small/source/common/unicode/bytestream.h index 477892b2759768..9df23f79c54c0c 100644 --- a/deps/icu-small/source/common/unicode/bytestream.h +++ b/deps/icu-small/source/common/unicode/bytestream.h @@ -126,8 +126,8 @@ class U_COMMON_API ByteSink : public UMemory { virtual void Flush(); private: - ByteSink(const ByteSink &); // copy constructor not implemented - ByteSink &operator=(const ByteSink &); // assignment operator not implemented + ByteSink(const ByteSink &) = delete; + ByteSink &operator=(const ByteSink &) = delete; }; // ------------------------------------------------------------- @@ -217,9 +217,10 @@ class U_COMMON_API CheckedArrayByteSink : public ByteSink { int32_t size_; int32_t appended_; UBool overflowed_; - CheckedArrayByteSink(); ///< default constructor not implemented - CheckedArrayByteSink(const CheckedArrayByteSink &); ///< copy constructor not implemented - CheckedArrayByteSink &operator=(const CheckedArrayByteSink &); ///< assignment operator not implemented + + CheckedArrayByteSink() = delete; + CheckedArrayByteSink(const CheckedArrayByteSink &) = delete; + CheckedArrayByteSink &operator=(const CheckedArrayByteSink &) = delete; }; /** @@ -236,6 +237,21 @@ class StringByteSink : public ByteSink { * @stable ICU 4.2 */ StringByteSink(StringClass* dest) : dest_(dest) { } +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a ByteSink that reserves append capacity and will append bytes to the dest string. + * + * @param dest pointer to string object to append to + * @param initialAppendCapacity capacity beyond dest->length() to be reserve()d + * @draft ICU 60 + */ + StringByteSink(StringClass* dest, int32_t initialAppendCapacity) : dest_(dest) { + if (initialAppendCapacity > 0 && + (uint32_t)initialAppendCapacity > (dest->capacity() - dest->length())) { + dest->reserve(dest->length() + initialAppendCapacity); + } + } +#endif // U_HIDE_DRAFT_API /** * Append "bytes[0,n-1]" to this. * @param data the pointer to the bytes @@ -245,9 +261,10 @@ class StringByteSink : public ByteSink { virtual void Append(const char* data, int32_t n) { dest_->append(data, n); } private: StringClass* dest_; - StringByteSink(); ///< default constructor not implemented - StringByteSink(const StringByteSink &); ///< copy constructor not implemented - StringByteSink &operator=(const StringByteSink &); ///< assignment operator not implemented + + StringByteSink() = delete; + StringByteSink(const StringByteSink &) = delete; + StringByteSink &operator=(const StringByteSink &) = delete; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/casemap.h b/deps/icu-small/source/common/unicode/casemap.h index 98184820d53457..4a4917bdcaf1b7 100644 --- a/deps/icu-small/source/common/unicode/casemap.h +++ b/deps/icu-small/source/common/unicode/casemap.h @@ -8,6 +8,7 @@ #define __CASEMAP_H__ #include "unicode/utypes.h" +#include "unicode/stringpiece.h" #include "unicode/uobject.h" /** @@ -20,6 +21,7 @@ U_NAMESPACE_BEGIN #ifndef U_HIDE_DRAFT_API class BreakIterator; +class ByteSink; class Edits; /** @@ -36,7 +38,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -48,7 +50,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -71,7 +74,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -83,7 +86,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -112,8 +116,10 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * all others. (This can be modified with options bits.) * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, - * U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param iter A break iterator to find the first characters of words that are to be titlecased. * It is set to the source string (setText()) * and used one or more times for iteration (first() and next()). @@ -130,7 +136,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -159,7 +166,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The result may be longer or shorter than the original. * The source string and the destination buffer must not overlap. * - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. @@ -172,7 +179,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -188,6 +196,129 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { char16_t *dest, int32_t destCapacity, Edits *edits, UErrorCode &errorCode); + /** + * Lowercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToLower + * @draft ICU 60 + */ + static void utf8ToLower( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToUpper + * @draft ICU 60 + */ + static void utf8ToUpper( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setUText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToTitle + * @draft ICU 60 + */ + static void utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-8 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8FoldCase + * @draft ICU 60 + */ + static void utf8Fold( + uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + /** * Lowercases a UTF-8 string and optionally records edits. * Casing is locale-dependent and context-sensitive. @@ -195,7 +326,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -207,7 +338,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -217,7 +349,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @see ucasemap_utf8ToLower * @draft ICU 59 */ - static int32_t utf8ToLower( + static int32_t utf8ToLower( const char *locale, uint32_t options, const char *src, int32_t srcLength, char *dest, int32_t destCapacity, Edits *edits, @@ -230,7 +362,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -242,7 +374,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -271,10 +404,12 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * all others. (This can be modified with options bits.) * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, - * U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param iter A break iterator to find the first characters of words that are to be titlecased. - * It is set to the source string (setText()) + * It is set to the source string (setUText()) * and used one or more times for iteration (first() and next()). * If NULL, then a word break iterator for the locale is used * (or something equivalent). @@ -289,7 +424,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -317,7 +453,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The result may be longer or shorter than the original. * The source string and the destination buffer must not overlap. * - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. @@ -330,7 +466,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. diff --git a/deps/icu-small/source/common/unicode/char16ptr.h b/deps/icu-small/source/common/unicode/char16ptr.h index fa17c62446cfb0..fbce1775911518 100644 --- a/deps/icu-small/source/common/unicode/char16ptr.h +++ b/deps/icu-small/source/common/unicode/char16ptr.h @@ -95,45 +95,45 @@ class U_COMMON_API Char16Ptr U_FINAL { return reinterpret_cast(t); } - char16_t *p; + char16_t *p_; #else union { char16_t *cp; uint16_t *up; wchar_t *wp; - } u; + } u_; #endif }; #ifdef U_ALIASING_BARRIER -Char16Ptr::Char16Ptr(char16_t *p) : p(p) {} +Char16Ptr::Char16Ptr(char16_t *p) : p_(p) {} #if !U_CHAR16_IS_TYPEDEF -Char16Ptr::Char16Ptr(uint16_t *p) : p(cast(p)) {} +Char16Ptr::Char16Ptr(uint16_t *p) : p_(cast(p)) {} #endif #if U_SIZEOF_WCHAR_T==2 -Char16Ptr::Char16Ptr(wchar_t *p) : p(cast(p)) {} +Char16Ptr::Char16Ptr(wchar_t *p) : p_(cast(p)) {} #endif -Char16Ptr::Char16Ptr(std::nullptr_t p) : p(p) {} +Char16Ptr::Char16Ptr(std::nullptr_t p) : p_(p) {} Char16Ptr::~Char16Ptr() { - U_ALIASING_BARRIER(p); + U_ALIASING_BARRIER(p_); } -char16_t *Char16Ptr::get() const { return p; } +char16_t *Char16Ptr::get() const { return p_; } #else -Char16Ptr::Char16Ptr(char16_t *p) { u.cp = p; } +Char16Ptr::Char16Ptr(char16_t *p) { u_.cp = p; } #if !U_CHAR16_IS_TYPEDEF -Char16Ptr::Char16Ptr(uint16_t *p) { u.up = p; } +Char16Ptr::Char16Ptr(uint16_t *p) { u_.up = p; } #endif #if U_SIZEOF_WCHAR_T==2 -Char16Ptr::Char16Ptr(wchar_t *p) { u.wp = p; } +Char16Ptr::Char16Ptr(wchar_t *p) { u_.wp = p; } #endif -Char16Ptr::Char16Ptr(std::nullptr_t p) { u.cp = p; } +Char16Ptr::Char16Ptr(std::nullptr_t p) { u_.cp = p; } Char16Ptr::~Char16Ptr() {} -char16_t *Char16Ptr::get() const { return u.cp; } +char16_t *Char16Ptr::get() const { return u_.cp; } #endif @@ -203,45 +203,45 @@ class U_COMMON_API ConstChar16Ptr U_FINAL { return reinterpret_cast(t); } - const char16_t *p; + const char16_t *p_; #else union { const char16_t *cp; const uint16_t *up; const wchar_t *wp; - } u; + } u_; #endif }; #ifdef U_ALIASING_BARRIER -ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p(p) {} +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {} #if !U_CHAR16_IS_TYPEDEF -ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p(cast(p)) {} +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p_(cast(p)) {} #endif #if U_SIZEOF_WCHAR_T==2 -ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p(cast(p)) {} +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p_(cast(p)) {} #endif -ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p(p) {} +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p_(p) {} ConstChar16Ptr::~ConstChar16Ptr() { - U_ALIASING_BARRIER(p); + U_ALIASING_BARRIER(p_); } -const char16_t *ConstChar16Ptr::get() const { return p; } +const char16_t *ConstChar16Ptr::get() const { return p_; } #else -ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u.cp = p; } +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u_.cp = p; } #if !U_CHAR16_IS_TYPEDEF -ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u.up = p; } +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u_.up = p; } #endif #if U_SIZEOF_WCHAR_T==2 -ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u.wp = p; } +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u_.wp = p; } #endif -ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u.cp = p; } +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u_.cp = p; } ConstChar16Ptr::~ConstChar16Ptr() {} -const char16_t *ConstChar16Ptr::get() const { return u.cp; } +const char16_t *ConstChar16Ptr::get() const { return u_.cp; } #endif diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 6e59f3e3887e6d..3e645aee4a87fb 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -140,7 +140,7 @@ * * Number Formatting * unum.h - * icu::NumberFormat + * icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions) * * * Number Spellout
(Rule Based Number Formatting) diff --git a/deps/icu-small/source/common/unicode/edits.h b/deps/icu-small/source/common/unicode/edits.h index 8d3becb7a2a580..082c3733a88bda 100644 --- a/deps/icu-small/source/common/unicode/edits.h +++ b/deps/icu-small/source/common/unicode/edits.h @@ -36,19 +36,61 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * @draft ICU 59 */ Edits() : - array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), - errorCode(U_ZERO_ERROR) {} + array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), numChanges(0), + errorCode_(U_ZERO_ERROR) {} + /** + * Copy constructor. + * @param other source edits + * @draft ICU 60 + */ + Edits(const Edits &other) : + array(stackArray), capacity(STACK_CAPACITY), length(other.length), + delta(other.delta), numChanges(other.numChanges), + errorCode_(other.errorCode_) { + copyArray(other); + } + /** + * Move constructor, might leave src empty. + * This object will have the same contents that the source object had. + * @param src source edits + * @draft ICU 60 + */ + Edits(Edits &&src) U_NOEXCEPT : + array(stackArray), capacity(STACK_CAPACITY), length(src.length), + delta(src.delta), numChanges(src.numChanges), + errorCode_(src.errorCode_) { + moveArray(src); + } + /** * Destructor. * @draft ICU 59 */ ~Edits(); + /** + * Assignment operator. + * @param other source edits + * @return *this + * @draft ICU 60 + */ + Edits &operator=(const Edits &other); + + /** + * Move assignment operator, might leave src empty. + * This object will have the same contents that the source object had. + * The behavior is undefined if *this and src are the same object. + * @param src source edits + * @return *this + * @draft ICU 60 + */ + Edits &operator=(Edits &&src) U_NOEXCEPT; + /** * Resets the data but may not release memory. * @draft ICU 59 */ - void reset(); + void reset() U_NOEXCEPT; /** * Adds a record for an unchanged segment of text. @@ -66,6 +108,9 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * Sets the UErrorCode if an error occurred while recording edits. * Preserves older error codes in the outErrorCode. * Normally called from inside ICU string transformation functions, not user code. + * @param outErrorCode Set to an error code if it does not contain one already + * and an error occurred while recording edits. + * Otherwise unchanged. * @return TRUE if U_FAILURE(outErrorCode) * @draft ICU 59 */ @@ -81,7 +126,13 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * @return TRUE if there are any change edits * @draft ICU 59 */ - UBool hasChanges() const; + UBool hasChanges() const { return numChanges != 0; } + + /** + * @return the number of change edits + * @draft ICU 60 + */ + int32_t numberOfChanges() const { return numChanges; } /** * Access to the list of edits. @@ -90,6 +141,15 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * @draft ICU 59 */ struct U_COMMON_API Iterator U_FINAL : public UMemory { + /** + * Default constructor, empty iterator. + * @draft ICU 60 + */ + Iterator() : + array(nullptr), index(0), length(0), + remaining(0), onlyChanges_(FALSE), coarse(FALSE), + dir(0), changed(FALSE), oldLength_(0), newLength_(0), + srcIndex(0), replIndex(0), destIndex(0) {} /** * Copy constructor. * @draft ICU 59 @@ -103,6 +163,9 @@ class U_COMMON_API Edits U_FINAL : public UMemory { /** * Advances to the next edit. + * @param errorCode 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 TRUE if there is another edit * @draft ICU 59 */ @@ -121,10 +184,86 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * if the source index is out of bounds for the source string. * * @param i source index + * @param errorCode 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 TRUE if the edit for the source index was found * @draft ICU 59 */ - UBool findSourceIndex(int32_t i, UErrorCode &errorCode); + UBool findSourceIndex(int32_t i, UErrorCode &errorCode) { + return findIndex(i, TRUE, errorCode) == 0; + } + + /** + * Finds the edit that contains the destination index. + * The destination index may be found in a non-change + * even if normal iteration would skip non-changes. + * Normal iteration can continue from a found edit. + * + * The iterator state before this search logically does not matter. + * (It may affect the performance of the search.) + * + * The iterator state after this search is undefined + * if the source index is out of bounds for the source string. + * + * @param i destination index + * @param errorCode 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 TRUE if the edit for the destination index was found + * @draft ICU 60 + */ + UBool findDestinationIndex(int32_t i, UErrorCode &errorCode) { + return findIndex(i, FALSE, errorCode) == 0; + } + + /** + * Returns the destination index corresponding to the given source index. + * If the source index is inside a change edit (not at its start), + * then the destination index at the end of that edit is returned, + * since there is no information about index mapping inside a change edit. + * + * (This means that indexes to the start and middle of an edit, + * for example around a grapheme cluster, are mapped to indexes + * encompassing the entire edit. + * The alternative, mapping an interior index to the start, + * would map such an interval to an empty one.) + * + * This operation will usually but not always modify this object. + * The iterator state after this search is undefined. + * + * @param i source index + * @param errorCode 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 destination index; undefined if i is not 0..string length + * @draft ICU 60 + */ + int32_t destinationIndexFromSourceIndex(int32_t i, UErrorCode &errorCode); + + /** + * Returns the source index corresponding to the given destination index. + * If the destination index is inside a change edit (not at its start), + * then the source index at the end of that edit is returned, + * since there is no information about index mapping inside a change edit. + * + * (This means that indexes to the start and middle of an edit, + * for example around a grapheme cluster, are mapped to indexes + * encompassing the entire edit. + * The alternative, mapping an interior index to the start, + * would map such an interval to an empty one.) + * + * This operation will usually but not always modify this object. + * The iterator state after this search is undefined. + * + * @param i destination index + * @param errorCode 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 source index; undefined if i is not 0..string length + * @draft ICU 60 + */ + int32_t sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode); /** * @return TRUE if this edit replaces oldLength() units with newLength() different ones. @@ -167,15 +306,22 @@ class U_COMMON_API Edits U_FINAL : public UMemory { Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs); int32_t readLength(int32_t head); - void updateIndexes(); + void updateNextIndexes(); + void updatePreviousIndexes(); UBool noNext(); UBool next(UBool onlyChanges, UErrorCode &errorCode); + UBool previous(UErrorCode &errorCode); + /** @return -1: error or i<0; 0: found; 1: i>=string length */ + int32_t findIndex(int32_t i, UBool findSource, UErrorCode &errorCode); const uint16_t *array; int32_t index, length; + // 0 if we are not within compressed equal-length changes. + // Otherwise the number of remaining changes, including the current one. int32_t remaining; UBool onlyChanges_, coarse; + int8_t dir; // iteration direction: back(<0), initial(0), forward(>0) UBool changed; int32_t oldLength_, newLength_; int32_t srcIndex, replIndex, destIndex; @@ -219,9 +365,39 @@ class U_COMMON_API Edits U_FINAL : public UMemory { return Iterator(array, length, FALSE, FALSE); } + /** + * Merges the two input Edits and appends the result to this object. + * + * Consider two string transformations (for example, normalization and case mapping) + * where each records Edits in addition to writing an output string.
+ * Edits ab reflect how substrings of input string a + * map to substrings of intermediate string b.
+ * Edits bc reflect how substrings of intermediate string b + * map to substrings of output string c.
+ * This function merges ab and bc such that the additional edits + * recorded in this object reflect how substrings of input string a + * map to substrings of output string c. + * + * If unrelated Edits are passed in where the output string of the first + * has a different length than the input string of the second, + * then a U_ILLEGAL_ARGUMENT_ERROR is reported. + * + * @param ab reflects how substrings of input string a + * map to substrings of intermediate string b. + * @param bc reflects how substrings of intermediate string b + * map to substrings of output string c. + * @param errorCode 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 *this, with the merged edits appended + * @draft ICU 60 + */ + Edits &mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode); + private: - Edits(const Edits &) = delete; - Edits &operator=(const Edits &) = delete; + void releaseArray() U_NOEXCEPT; + Edits ©Array(const Edits &other); + Edits &moveArray(Edits &src) U_NOEXCEPT; void setLastUnit(int32_t last) { array[length - 1] = (uint16_t)last; } int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; } @@ -234,7 +410,8 @@ class U_COMMON_API Edits U_FINAL : public UMemory { int32_t capacity; int32_t length; int32_t delta; - UErrorCode errorCode; + int32_t numChanges; + UErrorCode errorCode_; uint16_t stackArray[STACK_CAPACITY]; }; diff --git a/deps/icu-small/source/common/unicode/filteredbrk.h b/deps/icu-small/source/common/unicode/filteredbrk.h index 51bb651fbac366..a0319bf0a76af5 100644 --- a/deps/icu-small/source/common/unicode/filteredbrk.h +++ b/deps/icu-small/source/common/unicode/filteredbrk.h @@ -55,14 +55,30 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { */ static FilteredBreakIteratorBuilder *createInstance(const Locale& where, UErrorCode& status); +#ifndef U_HIDE_DEPRECATED_API + /** + * This function has been deprecated in favor of createEmptyInstance, which has + * identical behavior. + * @param status The error code. + * @return the new builder + * @deprecated ICU 60 use createEmptyInstance instead + * @see createEmptyInstance() + */ + static inline FilteredBreakIteratorBuilder *createInstance(UErrorCode &status) { + return createEmptyInstance(status); + } +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API /** * Construct an empty FilteredBreakIteratorBuilder. * In this state, it will not suppress any segment boundaries. * @param status The error code. * @return the new builder - * @stable ICU 56 + * @draft ICU 60 */ - static FilteredBreakIteratorBuilder *createInstance(UErrorCode &status); + static FilteredBreakIteratorBuilder *createEmptyInstance(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ /** * Suppress a certain string from being the end of a segment. @@ -89,6 +105,20 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { */ virtual UBool unsuppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0; +#ifndef U_HIDE_DEPRECATED_API + /** + * This function has been deprecated in favor of wrapIteratorWithFilter() + * The behavior is identical. + * @param adoptBreakIterator the break iterator to adopt + * @param status error code + * @return the new BreakIterator, owned by the caller. + * @deprecated ICU 60 use wrapIteratorWithFilter() instead + * @see wrapBreakIteratorWithFilter() + */ + virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API /** * Wrap (adopt) an existing break iterator in a new filtered instance. * The resulting BreakIterator is owned by the caller. @@ -96,12 +126,16 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * Note that the adoptBreakIterator is adopted by the new BreakIterator * and should no longer be used by the caller. * The FilteredBreakIteratorBuilder may be reused. + * This function is an alias for build() * @param adoptBreakIterator the break iterator to adopt * @param status error code * @return the new BreakIterator, owned by the caller. - * @stable ICU 56 + * @draft ICU 60 */ - virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; + inline BreakIterator *wrapIteratorWithFilter(BreakIterator* adoptBreakIterator, UErrorCode& status) { + return build(adoptBreakIterator, status); + } +#endif /* U_HIDE_DRAFT_API */ protected: /** diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index 3ab820188f7f23..e17ee3d886ef34 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -213,7 +213,6 @@ class LocalPointer : public LocalPointerBase { errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -222,7 +221,6 @@ class LocalPointer : public LocalPointerBase { LocalPointer(LocalPointer &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the object it owns. * @stable ICU 4.4 @@ -230,7 +228,6 @@ class LocalPointer : public LocalPointerBase { ~LocalPointer() { delete LocalPointerBase::ptr; } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -241,7 +238,6 @@ class LocalPointer : public LocalPointerBase { LocalPointer &operator=(LocalPointer &&src) U_NOEXCEPT { return moveFrom(src); } -#endif // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). @@ -362,7 +358,6 @@ class LocalArray : public LocalPointerBase { errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -371,7 +366,6 @@ class LocalArray : public LocalPointerBase { LocalArray(LocalArray &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the array it owns. * @stable ICU 4.4 @@ -379,7 +373,6 @@ class LocalArray : public LocalPointerBase { ~LocalArray() { delete[] LocalPointerBase::ptr; } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -390,7 +383,6 @@ class LocalArray : public LocalPointerBase { LocalArray &operator=(LocalArray &&src) U_NOEXCEPT { return moveFrom(src); } -#endif // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). @@ -492,7 +484,6 @@ class LocalArray : public LocalPointerBase { * @see LocalPointer * @stable ICU 4.4 */ -#if U_HAVE_RVALUE_REFERENCES #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ class LocalPointerClassName : public LocalPointerBase { \ public: \ @@ -526,34 +517,6 @@ class LocalArray : public LocalPointerBase { ptr=p; \ } \ } -#else -#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - class LocalPointerClassName : public LocalPointerBase { \ - public: \ - using LocalPointerBase::operator*; \ - using LocalPointerBase::operator->; \ - explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase(p) {} \ - ~LocalPointerClassName() { closeFunction(ptr); } \ - LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ - if (ptr != NULL) { closeFunction(ptr); } \ - LocalPointerBase::ptr=src.ptr; \ - src.ptr=NULL; \ - return *this; \ - } \ - void swap(LocalPointerClassName &other) U_NOEXCEPT { \ - Type *temp=LocalPointerBase::ptr; \ - LocalPointerBase::ptr=other.ptr; \ - other.ptr=temp; \ - } \ - friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) U_NOEXCEPT { \ - p1.swap(p2); \ - } \ - void adoptInstead(Type *p) { \ - if (ptr != NULL) { closeFunction(ptr); } \ - ptr=p; \ - } \ - } -#endif U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index 37a34f71403f24..c752344f339db1 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -88,7 +88,7 @@ class UnicodeString; *

* The third constructor requires a third argument--the Variant. * The Variant codes are vendor and browser-specific. - * For example, use REVISED for a langauge's revised script orthography, and POSIX for POSIX. + * For example, use REVISED for a language's revised script orthography, and POSIX for POSIX. * Where there are two variants, separate them with an underscore, and * put the most important one first. For * example, a Traditional Spanish collation might be referenced, with diff --git a/deps/icu-small/source/common/unicode/normalizer2.h b/deps/icu-small/source/common/unicode/normalizer2.h index d326da948a3573..8a6d7138021b56 100644 --- a/deps/icu-small/source/common/unicode/normalizer2.h +++ b/deps/icu-small/source/common/unicode/normalizer2.h @@ -28,12 +28,15 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/stringpiece.h" #include "unicode/uniset.h" #include "unicode/unistr.h" #include "unicode/unorm2.h" U_NAMESPACE_BEGIN +class ByteSink; + /** * Unicode normalization functionality for standard Unicode normalization or * for using custom mapping tables. @@ -215,6 +218,35 @@ class U_COMMON_API Normalizer2 : public UObject { normalize(const UnicodeString &src, UnicodeString &dest, UErrorCode &errorCode) const = 0; + + /** + * Normalizes a UTF-8 string and optionally records how source substrings + * relate to changed and unchanged result substrings. + * + * Currently implemented completely only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * Otherwise currently converts to & from UTF-16 and does not support edits. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src Source UTF-8 string. + * @param sink A ByteSink to which the normalized UTF-8 result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be nullptr. + * @param errorCode 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.) + * @draft ICU 60 + */ + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const; + /** * Appends the normalized form of the second string to the first string * (merging them at the boundary) and returns the first string. @@ -340,6 +372,30 @@ class U_COMMON_API Normalizer2 : public UObject { */ virtual UBool isNormalized(const UnicodeString &s, UErrorCode &errorCode) const = 0; + /** + * Tests if the UTF-8 string is normalized. + * Internally, in cases where the quickCheck() method would return "maybe" + * (which is only possible for the two COMPOSE modes) this method + * resolves to "yes" or "no" to provide a definitive result, + * at the cost of doing more work in those cases. + * + * This works for all normalization modes, + * but it is currently optimized for UTF-8 only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * For other modes it currently converts to UTF-16 and calls isNormalized(). + * + * @param s UTF-8 input string + * @param errorCode 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 TRUE if s is normalized + * @draft ICU 60 + */ + virtual UBool + isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const; + /** * Tests if the string is normalized. @@ -479,7 +535,36 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; + + /** + * Normalizes a UTF-8 string and optionally records how source substrings + * relate to changed and unchanged result substrings. + * + * Currently implemented completely only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * Otherwise currently converts to & from UTF-16 and does not support edits. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src Source UTF-8 string. + * @param sink A ByteSink to which the normalized UTF-8 result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be nullptr. + * @param errorCode 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.) + * @draft ICU 60 + */ + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE; + /** * Appends the normalized form of the second string to the first string * (merging them at the boundary) and returns the first string. @@ -497,7 +582,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; /** * Appends the second string to the first string * (merging them at the boundary) and returns the first string. @@ -515,7 +600,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; /** * Gets the decomposition mapping of c. @@ -529,7 +614,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.6 */ virtual UBool - getDecomposition(UChar32 c, UnicodeString &decomposition) const; + getDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE; /** * Gets the raw decomposition mapping of c. @@ -543,7 +628,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 49 */ virtual UBool - getRawDecomposition(UChar32 c, UnicodeString &decomposition) const; + getRawDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE; /** * Performs pairwise composition of a & b and returns the composite if there is one. @@ -556,7 +641,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 49 */ virtual UChar32 - composePair(UChar32 a, UChar32 b) const; + composePair(UChar32 a, UChar32 b) const U_OVERRIDE; /** * Gets the combining class of c. @@ -567,7 +652,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 49 */ virtual uint8_t - getCombiningClass(UChar32 c) const; + getCombiningClass(UChar32 c) const U_OVERRIDE; /** * Tests if the string is normalized. @@ -581,7 +666,30 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.4 */ virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const; + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; + /** + * Tests if the UTF-8 string is normalized. + * Internally, in cases where the quickCheck() method would return "maybe" + * (which is only possible for the two COMPOSE modes) this method + * resolves to "yes" or "no" to provide a definitive result, + * at the cost of doing more work in those cases. + * + * This works for all normalization modes, + * but it is currently optimized for UTF-8 only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * For other modes it currently converts to UTF-16 and calls isNormalized(). + * + * @param s UTF-8 input string + * @param errorCode 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 TRUE if s is normalized + * @draft ICU 60 + */ + virtual UBool + isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const U_OVERRIDE; /** * Tests if the string is normalized. * For details see the Normalizer2 base class documentation. @@ -594,7 +702,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.4 */ virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const; + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; /** * Returns the end of the normalized substring of the input string. * For details see the Normalizer2 base class documentation. @@ -607,7 +715,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.4 */ virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const; + spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; /** * Tests if the character always has a normalization boundary before it, @@ -617,7 +725,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return TRUE if c has a normalization boundary before it * @stable ICU 4.4 */ - virtual UBool hasBoundaryBefore(UChar32 c) const; + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE; /** * Tests if the character always has a normalization boundary after it, @@ -627,7 +735,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return TRUE if c has a normalization boundary after it * @stable ICU 4.4 */ - virtual UBool hasBoundaryAfter(UChar32 c) const; + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE; /** * Tests if the character is normalization-inert. @@ -636,7 +744,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return TRUE if c is normalization-inert * @stable ICU 4.4 */ - virtual UBool isInert(UChar32 c) const; + virtual UBool isInert(UChar32 c) const U_OVERRIDE; private: UnicodeString & normalize(const UnicodeString &src, @@ -644,6 +752,12 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { USetSpanCondition spanCondition, UErrorCode &errorCode) const; + void + normalizeUTF8(uint32_t options, const char *src, int32_t length, + ByteSink &sink, Edits *edits, + USetSpanCondition spanCondition, + UErrorCode &errorCode) const; + UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index 23b9464c6507d2..12e2929d240d45 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -132,6 +132,8 @@ #define U_PF_BROWSER_NATIVE_CLIENT 4020 /** Android is based on Linux. @internal */ #define U_PF_ANDROID 4050 +/** Fuchsia is a POSIX-ish platform. @internal */ +#define U_PF_FUCHSIA 4100 /* Maximum value for Linux-based platform is 4499 */ /** z/OS is the successor to OS/390 which was the successor to MVS. @internal */ #define U_PF_OS390 9000 @@ -152,6 +154,8 @@ # include #elif defined(__pnacl__) || defined(__native_client__) # define U_PLATFORM U_PF_BROWSER_NATIVE_CLIENT +#elif defined(__Fuchsia__) +# define U_PLATFORM U_PF_FUCHSIA #elif defined(linux) || defined(__linux__) || defined(__linux) # define U_PLATFORM U_PF_LINUX #elif defined(__APPLE__) && defined(__MACH__) @@ -192,6 +196,20 @@ # define U_PLATFORM U_PF_UNKNOWN #endif +/** + * \def UPRV_INCOMPLETE_CPP11_SUPPORT + * This switch turns off ICU 60 NumberFormatter code. + * By default, this switch is enabled on AIX and z/OS, + * which have poor C++11 support. + * + * NOTE: This switch is intended to be temporary; see #13393. + * + * @internal + */ +#ifndef UPRV_INCOMPLETE_CPP11_SUPPORT +# define UPRV_INCOMPLETE_CPP11_SUPPORT (U_PLATFORM == U_PF_AIX || U_PLATFORM == U_PF_OS390 || U_PLATFORM == U_PF_SOLARIS ) +#endif + /** * \def CYGWINMSVC * Defined if this is Windows with Cygwin, but using MSVC rather than gcc. @@ -330,31 +348,6 @@ # define U_HAVE_INTTYPES_H U_HAVE_STDINT_H #endif -/** - * \def U_IOSTREAM_SOURCE - * Defines what support for C++ streams is available. - * - * If U_IOSTREAM_SOURCE is set to 199711, then <iostream> is available - * (the ISO/IEC C++ FDIS was published in November 1997), and then - * one should qualify streams using the std namespace in ICU header - * files. - * Starting with ICU 49, this is the only supported version. - * - * If U_IOSTREAM_SOURCE is set to 198506, then <iostream.h> is - * available instead (in June 1985 Stroustrup published - * "An Extensible I/O Facility for C++" at the summer USENIX conference). - * Starting with ICU 49, this version is not supported any more. - * - * If U_IOSTREAM_SOURCE is 0 (or any value less than 199711), - * then C++ streams are not available and - * support for them will be silently suppressed in ICU. - * - * @internal - */ -#ifndef U_IOSTREAM_SOURCE -#define U_IOSTREAM_SOURCE 199711 -#endif - /*===========================================================================*/ /** @{ Compiler and environment features */ /*===========================================================================*/ @@ -505,22 +498,6 @@ namespace std { }; #endif -/** - * \def U_HAVE_RVALUE_REFERENCES - * Set to 1 if the compiler supports rvalue references. - * C++11 feature, necessary for move constructor & move assignment. - * @internal - */ -#ifdef U_HAVE_RVALUE_REFERENCES - /* Use the predefined value. */ -#elif U_CPLUSPLUS_VERSION >= 11 || __has_feature(cxx_rvalue_references) \ - || defined(__GXX_EXPERIMENTAL_CXX0X__) \ - || (defined(_MSC_VER) && _MSC_VER >= 1600) /* Visual Studio 2010 */ -# define U_HAVE_RVALUE_REFERENCES 1 -#else -# define U_HAVE_RVALUE_REFERENCES 0 -#endif - /** * \def U_NOEXCEPT * "noexcept" if supported, otherwise empty. @@ -871,6 +848,16 @@ namespace std { # define U_CALLCONV U_EXPORT2 #endif +/** + * \def U_CALLCONV_FPTR + * Similar to U_CALLCONV, but only used on function pointers. + * @internal + */ +#if U_PLATFORM == U_PF_OS390 && defined(__cplusplus) +# define U_CALLCONV_FPTR U_CALLCONV +#else +# define U_CALLCONV_FPTR +#endif /* @} */ #endif diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index d654154008bc7f..c3c201dd35d333 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -31,23 +31,14 @@ #include "unicode/schriter.h" #include "unicode/uchriter.h" - -struct UTrie; - U_NAMESPACE_BEGIN /** @internal */ +class LanguageBreakEngine; struct RBBIDataHeader; -class RuleBasedBreakIteratorTables; -class BreakIterator; class RBBIDataWrapper; -class UStack; -class LanguageBreakEngine; class UnhandledEngine; -struct RBBIStateTable; - - - +class UStack; /** * @@ -96,47 +87,49 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ RBBIDataWrapper *fData; - /** Index of the Rule {tag} values for the most recent match. + /** + * The iteration state - current position, rule status for the current position, + * and whether the iterator ran off the end, yielding UBRK_DONE. + * Current position is pinned to be 0 < position <= text.length. + * Current position is always set to a boundary. * @internal */ - int32_t fLastRuleStatusIndex; + /** + * The current position of the iterator. Pinned, 0 < fPosition <= text.length. + * Never has the value UBRK_DONE (-1). + */ + int32_t fPosition; /** - * Rule tag value valid flag. - * Some iterator operations don't intrinsically set the correct tag value. - * This flag lets us lazily compute the value if we are ever asked for it. - * @internal - */ - UBool fLastStatusIndexValid; + * TODO: + */ + int32_t fRuleStatusIndex; /** - * Counter for the number of characters encountered with the "dictionary" - * flag set. - * @internal - */ - uint32_t fDictionaryCharCount; + * True when iteration has run off the end, and iterator functions should return UBRK_DONE. + */ + UBool fDone; /** - * 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 + * Cache of previously determined boundary positions. */ - int32_t* fCachedBreakPositions; - + public: // TODO: debug, return to private. + class BreakCache; + BreakCache *fBreakCache; + private: /** - * The number of elements in fCachedBreakPositions + * Counter for the number of characters encountered with the "dictionary" + * flag set. * @internal */ - int32_t fNumCachedBreakPositions; + uint32_t fDictionaryCharCount; /** - * if fCachedBreakPositions is not null, this indicates which item in the - * cache the current iteration position refers to - * @internal + * Cache of boundary positions within a region of text that has been + * sub-divided by dictionary based breaking. */ - int32_t fPositionInCache; + class DictionaryCache; + DictionaryCache *fDictionaryCache; /** * @@ -179,13 +172,11 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); - + /** @internal */ friend class RBBIRuleBuilder; /** @internal */ friend class BreakIterator; - - public: /** Default constructor. Creates an empty shell of an iterator, with no @@ -469,7 +460,10 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { virtual UBool isBoundary(int32_t offset); /** - * Returns the current iteration position. + * Returns the current iteration position. Note that UBRK_DONE is never + * returned from this function; if iteration has run to the end of a + * string, current() will return the length of the string while + * next() will return UBRK_DONE). * @return The current iteration position. * @stable ICU 2.0 */ @@ -501,6 +495,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * Note: this function is not thread safe. It should not have been * declared const, and the const remains only for compatibility * reasons. (The function is logically const, but not bit-wise const). + * TODO: check this. Probably thread safe now. *

* @return the status from the break rule that determined the most recently * returned break position. @@ -660,46 +655,31 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * Common initialization function, used by constructors and bufferClone. * @internal */ - void init(); - - /** - * 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.) - * @param statetable state table used of moving backwards - * @internal - */ - int32_t handlePrevious(const RBBIStateTable *statetable); + void init(UErrorCode &status); /** - * 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. - * @param statetable state table used of moving forwards + * Iterate backwards from an arbitrary position in the input text using the Safe Reverse rules. + * This locates a "Safe Position" from which the forward break rules + * will operate correctly. A Safe Position is not necessarily a boundary itself. + * + * @param fromPosition the position in the input text to begin the iteration. * @internal */ - int32_t handleNext(const RBBIStateTable *statetable); - + int32_t handlePrevious(int32_t fromPosition); /** - * 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 + * Find a rule-based boundary by running the state machine. + * Input + * fPosition, the position in the text to begin from. + * Output + * fPosition: the boundary following the starting position. + * fDictionaryCharCount the number of dictionary characters encountered. + * If > 0, the segment will be further subdivided + * fRuleStatusIndex Info from the state table indicating which rules caused the boundary. + * * @internal */ - int32_t checkDictionary(int32_t startPos, int32_t endPos, UBool reverse); + int32_t handleNext(); /** @@ -710,11 +690,14 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c); + public: +#ifndef U_HIDE_INTERNAL_API /** - * @internal + * Debugging function only. + * @internal */ - void makeRuleStatusValid(); - + void dumpCache(); +#endif /* U_HIDE_INTERNAL_API */ }; //------------------------------------------------------------------------------ diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 26eae01525292c..850949caaf5cda 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -21,6 +21,13 @@ U_NAMESPACE_BEGIN +// Forward declaration: +namespace number { +namespace impl { +class SimpleModifier; +} +} + /** * Formats simple patterns like "{1} was born in {0}". * Minimal subset of MessageFormat; fast, simple, minimal dependencies. @@ -286,6 +293,9 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { UnicodeString &result, const UnicodeString *resultCopy, UBool forbidResultAsValue, int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode); + + // Give access to internals to SimpleModifier for number formatting + friend class number::impl::SimpleModifier; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/stringoptions.h b/deps/icu-small/source/common/unicode/stringoptions.h new file mode 100644 index 00000000000000..f2de96e9634a02 --- /dev/null +++ b/deps/icu-small/source/common/unicode/stringoptions.h @@ -0,0 +1,198 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// stringoptions.h +// created: 2017jun08 Markus W. Scherer + +#ifndef __STRINGOPTIONS_H__ +#define __STRINGOPTIONS_H__ + +#include "unicode/utypes.h" + +/** + * \file + * \brief C API: Bit set option bit constants for various string and character processing functions. + */ + +/** + * Option value for case folding: Use default mappings defined in CaseFolding.txt. + * + * @stable ICU 2.0 + */ +#define U_FOLD_CASE_DEFAULT 0 + +/** + * Option value for case folding: + * + * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I + * and dotless i appropriately for Turkic languages (tr, az). + * + * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that + * are to be included for default mappings and + * excluded for the Turkic-specific mappings. + * + * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that + * are to be excluded for default mappings and + * included for the Turkic-specific mappings. + * + * @stable ICU 2.0 + */ +#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1 + +#ifndef U_HIDE_DRAFT_API + +/** + * Titlecase the string as a whole rather than each word. + * (Titlecase only the character at index 0, possibly adjusted.) + * Option bits value for titlecasing APIs that take an options bit set. + * + * It is an error to specify multiple titlecasing iterator options together, + * including both an options bit and an explicit BreakIterator. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @draft ICU 60 + */ +#define U_TITLECASE_WHOLE_STRING 0x20 + +/** + * Titlecase sentences rather than words. + * (Titlecase only the first character of each sentence, possibly adjusted.) + * Option bits value for titlecasing APIs that take an options bit set. + * + * It is an error to specify multiple titlecasing iterator options together, + * including both an options bit and an explicit BreakIterator. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @draft ICU 60 + */ +#define U_TITLECASE_SENTENCES 0x40 + +#endif // U_HIDE_DRAFT_API + +/** + * Do not lowercase non-initial parts of words when titlecasing. + * Option bit for titlecasing APIs that take an options bit set. + * + * By default, titlecasing will titlecase the character at each + * (possibly adjusted) BreakIterator index and + * lowercase all other characters up to the next iterator index. + * With this option, the other characters will not be modified. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @see UnicodeString::toTitle + * @see CaseMap::toTitle + * @see ucasemap_setOptions + * @see ucasemap_toTitle + * @see ucasemap_utf8ToTitle + * @stable ICU 3.8 + */ +#define U_TITLECASE_NO_LOWERCASE 0x100 + +/** + * Do not adjust the titlecasing BreakIterator indexes; + * titlecase exactly the characters at breaks from the iterator. + * Option bit for titlecasing APIs that take an options bit set. + * + * By default, titlecasing will take each break iterator index, + * adjust it to the next relevant character (see U_TITLECASE_ADJUST_TO_CASED), + * and titlecase that one. + * + * Other characters are lowercased. + * + * It is an error to specify multiple titlecasing adjustment options together. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @see U_TITLECASE_NO_LOWERCASE + * @see UnicodeString::toTitle + * @see CaseMap::toTitle + * @see ucasemap_setOptions + * @see ucasemap_toTitle + * @see ucasemap_utf8ToTitle + * @stable ICU 3.8 + */ +#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 + +#ifndef U_HIDE_DRAFT_API + +/** + * Adjust each titlecasing BreakIterator index to the next cased character. + * (See the Unicode Standard, chapter 3, Default Case Conversion, R3 toTitlecase(X).) + * Option bit for titlecasing APIs that take an options bit set. + * + * This used to be the default index adjustment in ICU. + * Since ICU 60, the default index adjustment is to the next character that is + * a letter, number, symbol, or private use code point. + * (Uncased modifier letters are skipped.) + * The difference in behavior is small for word titlecasing, + * but the new adjustment is much better for whole-string and sentence titlecasing: + * It yields "49ers" and "«丰(abc)»" instead of "49Ers" and "«丰(Abc)»". + * + * It is an error to specify multiple titlecasing adjustment options together. + * + * @see U_TITLECASE_NO_BREAK_ADJUSTMENT + * @draft ICU 60 + */ +#define U_TITLECASE_ADJUST_TO_CASED 0x400 + +/** + * Option for string transformation functions to not first reset the Edits object. + * Used for example in some case-mapping and normalization functions. + * + * @see CaseMap + * @see Edits + * @see Normalizer2 + * @draft ICU 60 + */ +#define U_EDITS_NO_RESET 0x2000 + +/** + * Omit unchanged text when recording how source substrings + * relate to changed and unchanged result substrings. + * Used for example in some case-mapping and normalization functions. + * + * @see CaseMap + * @see Edits + * @see Normalizer2 + * @draft ICU 60 + */ +#define U_OMIT_UNCHANGED_TEXT 0x4000 + +#endif // U_HIDE_DRAFT_API + +/** + * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: + * Compare strings in code point order instead of code unit order. + * @stable ICU 2.2 + */ +#define U_COMPARE_CODE_POINT_ORDER 0x8000 + +/** + * Option bit for unorm_compare: + * Perform case-insensitive comparison. + * @stable ICU 2.2 + */ +#define U_COMPARE_IGNORE_CASE 0x10000 + +/** + * Option bit for unorm_compare: + * Both input strings are assumed to fulfill FCD conditions. + * @stable ICU 2.2 + */ +#define UNORM_INPUT_IS_FCD 0x20000 + +// Related definitions elsewhere. +// Options that are not meaningful in the same functions +// can share the same bits. +// +// Public: +// unicode/unorm.h #define UNORM_COMPARE_NORM_OPTIONS_SHIFT 20 +// +// Internal: (may change or be removed) +// ucase.h #define _STRCASECMP_OPTIONS_MASK 0xffff +// ucase.h #define _FOLD_CASE_OPTIONS_MASK 7 +// ucasemap_imp.h #define U_TITLECASE_ITERATOR_MASK 0xe0 +// ucasemap_imp.h #define U_TITLECASE_ADJUSTMENT_MASK 0x600 +// ustr_imp.h #define _STRNCMP_STYLE 0x1000 +// unormcmp.cpp #define _COMPARE_EQUIV 0x80000 + +#endif // __STRINGOPTIONS_H__ diff --git a/deps/icu-small/source/common/unicode/stringtriebuilder.h b/deps/icu-small/source/common/unicode/stringtriebuilder.h index d1ac003c48a643..8d2b229413cd6d 100644 --- a/deps/icu-small/source/common/unicode/stringtriebuilder.h +++ b/deps/icu-small/source/common/unicode/stringtriebuilder.h @@ -256,7 +256,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { /** @internal */ class FinalValueNode : public Node { public: - FinalValueNode(int32_t v) : Node(0x111111*37+v), value(v) {} + FinalValueNode(int32_t v) : Node(0x111111u*37u+v), value(v) {} virtual UBool operator==(const Node &other) const; virtual void write(StringTrieBuilder &builder); protected: @@ -276,7 +276,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { void setValue(int32_t v) { hasValue=TRUE; value=v; - hash=hash*37+v; + hash=hash*37u+v; } protected: UBool hasValue; @@ -290,7 +290,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { class IntermediateValueNode : public ValueNode { public: IntermediateValueNode(int32_t v, Node *nextNode) - : ValueNode(0x222222*37+hashCode(nextNode)), next(nextNode) { setValue(v); } + : ValueNode(0x222222u*37u+hashCode(nextNode)), next(nextNode) { setValue(v); } virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); virtual void write(StringTrieBuilder &builder); @@ -307,7 +307,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { class LinearMatchNode : public ValueNode { public: LinearMatchNode(int32_t len, Node *nextNode) - : ValueNode((0x333333*37+len)*37+hashCode(nextNode)), + : ValueNode((0x333333u*37u+len)*37u+hashCode(nextNode)), length(len), next(nextNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); @@ -342,7 +342,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { equal[length]=NULL; values[length]=value; ++length; - hash=(hash*37+c)*37+value; + hash=(hash*37u+c)*37u+value; } // Adds a unit which leads to another match node. void add(int32_t c, Node *node) { @@ -350,7 +350,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { equal[length]=node; values[length]=0; ++length; - hash=(hash*37+c)*37+hashCode(node); + hash=(hash*37u+c)*37u+hashCode(node); } protected: Node *equal[kMaxBranchLinearSubNodeLength]; // NULL means "has final value". @@ -365,8 +365,8 @@ class U_COMMON_API StringTrieBuilder : public UObject { class SplitBranchNode : public BranchNode { public: SplitBranchNode(char16_t middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) - : BranchNode(((0x555555*37+middleUnit)*37+ - hashCode(lessThanNode))*37+hashCode(greaterOrEqualNode)), + : BranchNode(((0x555555u*37u+middleUnit)*37u+ + hashCode(lessThanNode))*37u+hashCode(greaterOrEqualNode)), unit(middleUnit), lessThan(lessThanNode), greaterOrEqual(greaterOrEqualNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); @@ -382,7 +382,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { class BranchHeadNode : public ValueNode { public: BranchHeadNode(int32_t len, Node *subNode) - : ValueNode((0x666666*37+len)*37+hashCode(subNode)), + : ValueNode((0x666666u*37u+len)*37u+hashCode(subNode)), length(len), next(subNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); diff --git a/deps/icu-small/source/common/unicode/ubiditransform.h b/deps/icu-small/source/common/unicode/ubiditransform.h index 724587dddc8c49..627b005ed45f8d 100644 --- a/deps/icu-small/source/common/unicode/ubiditransform.h +++ b/deps/icu-small/source/common/unicode/ubiditransform.h @@ -23,8 +23,6 @@ #include "unicode/uchar.h" #include "unicode/localpointer.h" -#ifndef U_HIDE_DRAFT_API - /** * \file * \brief Bidi Transformations @@ -60,17 +58,17 @@ * @see UBIDI_REORDER_DEFAULT * @see UBIDI_REORDER_INVERSE_LIKE_DIRECT * @see UBIDI_REORDER_RUNS_ONLY - * @draft ICU 58 + * @stable ICU 58 */ typedef enum { /** 0: Constant indicating a logical order. * This is the default for input text. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_LOGICAL = 0, /** 1: Constant indicating a visual order. * This is a default for output text. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_VISUAL } UBiDiOrder; @@ -83,20 +81,20 @@ typedef enum { * @see ubidi_setReorderingOptions * @see ubidi_writeReordered * @see ubidi_writeReverse - * @draft ICU 58 + * @stable ICU 58 */ typedef enum { /** 0: Constant indicating that character mirroring should not be * performed. * This is the default. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_MIRRORING_OFF = 0, /** 1: Constant indicating that character mirroring should be performed. * This corresponds to calling ubidi_writeReordered or * ubidi_writeReverse with the * UBIDI_DO_MIRRORING option bit set. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_MIRRORING_ON } UBiDiMirroring; @@ -104,7 +102,7 @@ typedef enum { /** * Forward declaration of the UBiDiTransform structure that stores * information used by the layout transformation engine. - * @draft ICU 58 + * @stable ICU 58 */ typedef struct UBiDiTransform UBiDiTransform; @@ -240,9 +238,9 @@ typedef struct UBiDiTransform UBiDiTransform; * @see UBiDiMirroring * @see ubidi_setPara * @see u_shapeArabic - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 ubiditransform_transform(UBiDiTransform *pBiDiTransform, const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, @@ -286,16 +284,16 @@ ubiditransform_transform(UBiDiTransform *pBiDiTransform, * ubiditransform_close(). * * @return An empty UBiDiTransform object. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT UBiDiTransform* U_EXPORT2 +U_STABLE UBiDiTransform* U_EXPORT2 ubiditransform_open(UErrorCode *pErrorCode); /** * Deallocates the given UBiDiTransform object. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 ubiditransform_close(UBiDiTransform *pBidiTransform); #if U_SHOW_CPLUSPLUS_API @@ -309,7 +307,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 58 + * @stable ICU 58 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiTransformPointer, UBiDiTransform, ubiditransform_close); @@ -317,5 +315,4 @@ U_NAMESPACE_END #endif -#endif /* U_HIDE_DRAFT_API */ #endif diff --git a/deps/icu-small/source/common/unicode/ubrk.h b/deps/icu-small/source/common/unicode/ubrk.h index 22a4b99cd6dd2b..600328c49c66bc 100644 --- a/deps/icu-small/source/common/unicode/ubrk.h +++ b/deps/icu-small/source/common/unicode/ubrk.h @@ -230,7 +230,8 @@ typedef enum USentenceBreakTag { * @param locale The locale specifying the text-breaking conventions. Note that * locale keys such as "lb" and "ss" may be used to modify text break behavior, * see general discussion of BreakIterator C API. - * @param text The text to be iterated over. + * @param text The text to be iterated over. May be null, in which case ubrk_setText() is + * used to specify the text to be iterated. * @param textLength The number of characters in text, or -1 if null-terminated. * @param status A UErrorCode to receive any errors. * @return A UBreakIterator for the specified locale. diff --git a/deps/icu-small/source/common/unicode/ucasemap.h b/deps/icu-small/source/common/unicode/ucasemap.h index 18e6c2ba0b9e0b..6b253e3d638475 100644 --- a/deps/icu-small/source/common/unicode/ucasemap.h +++ b/deps/icu-small/source/common/unicode/ucasemap.h @@ -23,6 +23,7 @@ #include "unicode/utypes.h" #include "unicode/localpointer.h" +#include "unicode/stringoptions.h" #include "unicode/ustring.h" /** @@ -144,56 +145,6 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode); U_STABLE void U_EXPORT2 ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode); -/** - * Do not lowercase non-initial parts of words when titlecasing. - * Option bit for titlecasing APIs that take an options bit set. - * - * By default, titlecasing will titlecase the first cased character - * of a word and lowercase all other characters. - * With this option, the other characters will not be modified. - * - * @see ucasemap_setOptions - * @see ucasemap_toTitle - * @see ucasemap_utf8ToTitle - * @see UnicodeString::toTitle - * @stable ICU 3.8 - */ -#define U_TITLECASE_NO_LOWERCASE 0x100 - -/** - * Do not adjust the titlecasing indexes from BreakIterator::next() indexes; - * titlecase exactly the characters at breaks from the iterator. - * Option bit for titlecasing APIs that take an options bit set. - * - * By default, titlecasing will take each break iterator index, - * adjust it by looking for the next cased character, and titlecase that one. - * Other characters are lowercased. - * - * This follows 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). - * - * @see ucasemap_setOptions - * @see ucasemap_toTitle - * @see ucasemap_utf8ToTitle - * @see UnicodeString::toTitle - * @see U_TITLECASE_NO_LOWERCASE - * @stable ICU 3.8 - */ -#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 - -/** - * Omit unchanged text when case-mapping with Edits. - * - * @see CaseMap - * @see Edits - * @draft ICU 59 - */ -#define UCASEMAP_OMIT_UNCHANGED_TEXT 0x4000 - #if !UCONFIG_NO_BREAK_ITERATION /** @@ -251,7 +202,7 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * The standard titlecase iterator for the root locale implements the * algorithm of Unicode TR 21. * - * This function uses only the setUText(), first(), next() and close() methods of the + * This function uses only the setText(), first() and next() methods of the * provided break iterator. * * The result may be longer or shorter than the original. diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 8174ca23e6f6ff..3613374d9a43a5 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -26,6 +26,7 @@ #define UCHAR_H #include "unicode/utypes.h" +#include "unicode/stringoptions.h" U_CDECL_BEGIN @@ -41,7 +42,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "9.0" +#define U_UNICODE_VERSION "10.0" /** * \file @@ -148,8 +149,9 @@ U_CDECL_BEGIN * * The properties APIs are intended to reflect Unicode properties as defined * in the Unicode Character Database (UCD) and Unicode Technical Reports (UTR). - * For details about the properties see http://www.unicode.org/ucd/ . - * For names of Unicode properties see the UCD file PropertyAliases.txt. + * + * For details about the properties see + * UAX #44: Unicode Character Database (http://www.unicode.org/reports/tr44/). * * Important: If ICU is built with UCD files from Unicode versions below, e.g., 3.2, * then properties marked with "new in Unicode 3.2" are not or not fully available. @@ -427,12 +429,29 @@ typedef enum UProperty { * @stable ICU 57 */ UCHAR_EMOJI_MODIFIER_BASE=60, + /** + * Binary property Emoji_Component. + * See http://www.unicode.org/reports/tr51/#Emoji_Properties + * + * @stable ICU 60 + */ + UCHAR_EMOJI_COMPONENT=61, + /** + * Binary property Regional_Indicator. + * @stable ICU 60 + */ + UCHAR_REGIONAL_INDICATOR=62, + /** + * Binary property Prepended_Concatenation_Mark. + * @stable ICU 60 + */ + UCHAR_PREPENDED_CONCATENATION_MARK=63, #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for binary Unicode properties. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_BINARY_LIMIT=61, + UCHAR_BINARY_LIMIT, #endif // U_HIDE_DEPRECATED_API /** Enumerated property Bidi_Class. @@ -1647,6 +1666,23 @@ enum UBlockCode { /** @stable ICU 58 */ UBLOCK_TANGUT_COMPONENTS = 273, /*[18800]*/ + // New blocks in Unicode 10.0 + + /** @stable ICU 60 */ + UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F = 274, /*[2CEB0]*/ + /** @stable ICU 60 */ + UBLOCK_KANA_EXTENDED_A = 275, /*[1B100]*/ + /** @stable ICU 60 */ + UBLOCK_MASARAM_GONDI = 276, /*[11D00]*/ + /** @stable ICU 60 */ + UBLOCK_NUSHU = 277, /*[1B170]*/ + /** @stable ICU 60 */ + UBLOCK_SOYOMBO = 278, /*[11A50]*/ + /** @stable ICU 60 */ + UBLOCK_SYRIAC_SUPPLEMENT = 279, /*[0860]*/ + /** @stable ICU 60 */ + UBLOCK_ZANABAZAR_SQUARE = 280, /*[11A00]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -1654,7 +1690,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 274, + UBLOCK_COUNT = 281, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ @@ -1930,6 +1966,19 @@ typedef enum UJoiningGroup { U_JG_AFRICAN_FEH, /**< @stable ICU 58 */ U_JG_AFRICAN_NOON, /**< @stable ICU 58 */ U_JG_AFRICAN_QAF, /**< @stable ICU 58 */ + + U_JG_MALAYALAM_BHA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_JA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_LLA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_LLLA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NGA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NNA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NNNA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NYA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_RA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_SSA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_TTA, /**< @stable ICU 60 */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UJoiningGroup value. @@ -3521,27 +3570,6 @@ u_toupper(UChar32 c); U_STABLE UChar32 U_EXPORT2 u_totitle(UChar32 c); -/** Option value for case folding: use default mappings defined in CaseFolding.txt. @stable ICU 2.0 */ -#define U_FOLD_CASE_DEFAULT 0 - -/** - * Option value for case folding: - * - * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I - * and dotless i appropriately for Turkic languages (tr, az). - * - * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that - * are to be included for default mappings and - * excluded for the Turkic-specific mappings. - * - * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that - * are to be excluded for default mappings and - * included for the Turkic-specific mappings. - * - * @stable ICU 2.0 - */ -#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1 - /** * The given character is mapped to its case folding equivalent according to * UnicodeData.txt and CaseFolding.txt; diff --git a/deps/icu-small/source/common/unicode/uclean.h b/deps/icu-small/source/common/unicode/uclean.h index d0bfcb13a644e2..3f73af37b83e81 100644 --- a/deps/icu-small/source/common/unicode/uclean.h +++ b/deps/icu-small/source/common/unicode/uclean.h @@ -149,7 +149,7 @@ typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem); * @system */ U_STABLE void U_EXPORT2 -u_setMemoryFunctions(const void *context, UMemAllocFn * U_CALLCONV a, UMemReallocFn * U_CALLCONV r, UMemFreeFn * U_CALLCONV f, +u_setMemoryFunctions(const void *context, UMemAllocFn * U_CALLCONV_FPTR a, UMemReallocFn * U_CALLCONV_FPTR r, UMemFreeFn * U_CALLCONV_FPTR f, UErrorCode *status); U_CDECL_END diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 25f19a1a61d475..5e28a146de3fff 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -76,7 +76,7 @@ #endif /** - * Determines wheter to enable auto cleanup of libraries. + * Determines whether to enable auto cleanup of libraries. * @internal */ #ifndef UCLN_NO_AUTO_CLEANUP @@ -262,7 +262,8 @@ /** * \def UCONFIG_NO_CONVERSION - * ICU will not completely build with this switch turned on. + * ICU will not completely build (compiling the tools fails) with this + * switch turned on. * This switch turns off all converters. * * You may want to use this together with U_CHARSET_IS_UTF8 defined to 1 @@ -320,7 +321,9 @@ */ #ifndef UCONFIG_NO_NORMALIZATION # define UCONFIG_NO_NORMALIZATION 0 -#elif UCONFIG_NO_NORMALIZATION +#endif + +#if UCONFIG_NO_NORMALIZATION /* common library */ /* ICU 50 CJK dictionary BreakIterator uses normalization */ # define UCONFIG_NO_BREAK_ITERATION 1 diff --git a/deps/icu-small/source/common/unicode/udisplaycontext.h b/deps/icu-small/source/common/unicode/udisplaycontext.h index c4f6c957e90bd3..398481c6812247 100644 --- a/deps/icu-small/source/common/unicode/udisplaycontext.h +++ b/deps/icu-small/source/common/unicode/udisplaycontext.h @@ -44,14 +44,12 @@ enum UDisplayContextType { * @stable ICU 54 */ UDISPCTX_TYPE_DISPLAY_LENGTH = 2, -#ifndef U_HIDE_DRAFT_API /** * Type to retrieve the substitute handling setting, e.g. * UDISPCTX_SUBSTITUTE, UDISPCTX_NO_SUBSTITUTE. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_TYPE_SUBSTITUTE_HANDLING = 3 -#endif /* U_HIDE_DRAFT_API */ }; /** * @stable ICU 51 @@ -143,7 +141,6 @@ enum UDisplayContext { * @stable ICU 54 */ UDISPCTX_LENGTH_SHORT = (UDISPCTX_TYPE_DISPLAY_LENGTH<<8) + 1, -#ifndef U_HIDE_DRAFT_API /** * ================================ * SUBSTITUTE_HANDLING can be set to one of UDISPCTX_SUBSTITUTE or @@ -154,16 +151,15 @@ enum UDisplayContext { * A possible setting for SUBSTITUTE_HANDLING: * Returns a fallback value (e.g., the input code) when no data is available. * This is the default value. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 0, /** * A possible setting for SUBSTITUTE_HANDLING: * Returns a null value when no data is available. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_NO_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 1 -#endif /* U_HIDE_DRAFT_API */ }; /** diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index e0ab0b9eb7c633..b99a686126c4e1 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -38,16 +38,6 @@ struct UConverter; // unicode/ucnv.h -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also ustring.h and unorm.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - #ifndef USTRING_H /** * \ingroup ustring_ustrlen @@ -1730,7 +1720,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ template StringClass &toUTF8String(StringClass &result) const { - StringByteSink sbs(&result); + StringByteSink sbs(&result, length()); toUTF8(sbs); return result; } @@ -1901,7 +1891,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString &fastCopyFrom(const UnicodeString &src); -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -1913,7 +1902,7 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT { return moveFrom(src); } -#endif + // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, might leave src in bogus state. @@ -2786,11 +2775,11 @@ class U_COMMON_API UnicodeString : public Replaceable * break iterator is opened. * Otherwise the provided iterator is set to the string's text. * @param locale The locale to consider. + * @param options Options bit set, usually 0. See U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param options Options bit set, see ucasemap_open(). * @return A reference to this. - * @see U_TITLECASE_NO_LOWERCASE - * @see U_TITLECASE_NO_BREAK_ADJUSTMENT - * @see ucasemap_open * @stable ICU 3.8 */ UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options); @@ -3360,7 +3349,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString(const UnicodeString& that); -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -3368,7 +3356,6 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 56 */ UnicodeString(UnicodeString &&src) U_NOEXCEPT; -#endif /** * 'Substring' constructor from tail of source string. diff --git a/deps/icu-small/source/common/unicode/unorm.h b/deps/icu-small/source/common/unicode/unorm.h index 1b5af16700fb9f..3839de129573c1 100644 --- a/deps/icu-small/source/common/unicode/unorm.h +++ b/deps/icu-small/source/common/unicode/unorm.h @@ -210,7 +210,7 @@ enum { * the output was truncated, and the error code is set to U_BUFFER_OVERFLOW_ERROR. * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_normalize(const UChar *source, int32_t sourceLength, UNormalizationMode mode, int32_t options, UChar *result, int32_t resultLength, @@ -236,7 +236,7 @@ unorm_normalize(const UChar *source, int32_t sourceLength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UNormalizationCheckResult U_EXPORT2 +U_DEPRECATED UNormalizationCheckResult U_EXPORT2 unorm_quickCheck(const UChar *source, int32_t sourcelength, UNormalizationMode mode, UErrorCode *status); @@ -257,7 +257,7 @@ unorm_quickCheck(const UChar *source, int32_t sourcelength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UNormalizationCheckResult U_EXPORT2 +U_DEPRECATED UNormalizationCheckResult U_EXPORT2 unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -283,7 +283,7 @@ unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, * @see unorm_quickCheck * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UBool U_EXPORT2 +U_DEPRECATED UBool U_EXPORT2 unorm_isNormalized(const UChar *src, int32_t srcLength, UNormalizationMode mode, UErrorCode *pErrorCode); @@ -305,7 +305,7 @@ unorm_isNormalized(const UChar *src, int32_t srcLength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UBool U_EXPORT2 +U_DEPRECATED UBool U_EXPORT2 unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -383,7 +383,7 @@ unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_next(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -416,7 +416,7 @@ unorm_next(UCharIterator *src, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_previous(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -460,7 +460,7 @@ unorm_previous(UCharIterator *src, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_concatenate(const UChar *left, int32_t leftLength, const UChar *right, int32_t rightLength, UChar *dest, int32_t destCapacity, diff --git a/deps/icu-small/source/common/unicode/unorm2.h b/deps/icu-small/source/common/unicode/unorm2.h index c6d3494d7057f5..a9bd02f256361f 100644 --- a/deps/icu-small/source/common/unicode/unorm2.h +++ b/deps/icu-small/source/common/unicode/unorm2.h @@ -32,6 +32,7 @@ #include "unicode/utypes.h" #include "unicode/localpointer.h" +#include "unicode/stringoptions.h" #include "unicode/uset.h" /** @@ -526,30 +527,6 @@ unorm2_hasBoundaryAfter(const UNormalizer2 *norm2, UChar32 c); U_STABLE UBool U_EXPORT2 unorm2_isInert(const UNormalizer2 *norm2, UChar32 c); -/** - * Option bit for unorm_compare: - * Both input strings are assumed to fulfill FCD conditions. - * @stable ICU 2.2 - */ -#define UNORM_INPUT_IS_FCD 0x20000 - -/** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. - * @stable ICU 2.2 - */ -#define U_COMPARE_IGNORE_CASE 0x10000 - -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also unistr.h and ustring.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - /** * Compares two strings for canonical equivalence. * Further options include case-insensitive comparison and diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 21c839abbf908d..982655c4425e0b 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -107,6 +107,7 @@ #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data) #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data) #define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup) +#define checkImpl U_ICU_ENTRY_POINT_RENAME(checkImpl) #define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup) #define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup) #define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats) @@ -944,6 +945,7 @@ #define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget) #define uhash_igeti U_ICU_ENTRY_POINT_RENAME(uhash_igeti) #define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init) +#define uhash_initSize U_ICU_ENTRY_POINT_RENAME(uhash_initSize) #define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput) #define uhash_iputi U_ICU_ENTRY_POINT_RENAME(uhash_iputi) #define uhash_iremove U_ICU_ENTRY_POINT_RENAME(uhash_iremove) @@ -1654,6 +1656,7 @@ #define ustr_hashICharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashICharsN) #define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN) #define ustrcase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_getCaseLocale) +#define ustrcase_getTitleBreakIterator U_ICU_ENTRY_POINT_RENAME(ustrcase_getTitleBreakIterator) #define ustrcase_internalFold U_ICU_ENTRY_POINT_RENAME(ustrcase_internalFold) #define ustrcase_internalToLower U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToLower) #define ustrcase_internalToTitle U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToTitle) diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index 1420578f02b7ae..3ec235d50ce2c2 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -444,6 +444,13 @@ typedef enum UScriptCode { /** @stable ICU 58 */ USCRIPT_SYMBOLS_EMOJI = 174,/* Zsye */ + /** @stable ICU 60 */ + USCRIPT_MASARAM_GONDI = 175,/* Gonm */ + /** @stable ICU 60 */ + USCRIPT_SOYOMBO = 176,/* Soyo */ + /** @stable ICU 60 */ + USCRIPT_ZANABAZAR_SQUARE = 177,/* Zanb */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -451,7 +458,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 175 + USCRIPT_CODE_LIMIT = 178 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/ustring.h b/deps/icu-small/source/common/unicode/ustring.h index 2099ab591300e3..1ea27126cc4de9 100644 --- a/deps/icu-small/source/common/unicode/ustring.h +++ b/deps/icu-small/source/common/unicode/ustring.h @@ -497,16 +497,6 @@ u_strCompare(const UChar *s1, int32_t length1, U_STABLE int32_t U_EXPORT2 u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrder); -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also unistr.h and unorm.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - /** * Compare two strings case-insensitively using full case folding. * This is equivalent to diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index edcb267597b92f..55709d403a6d02 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -768,7 +768,7 @@ utext_extract(UText *ut, */ #define UTEXT_SETNATIVEINDEX(ut, ix) \ { int64_t __offset = (ix) - (ut)->chunkNativeStart; \ - if (__offset>=0 && __offset<=(int64_t)(ut)->nativeIndexingLimit) { \ + if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \ (ut)->chunkOffset=(int32_t)__offset; \ } else { \ utext_setNativeIndex((ut), (ix)); } } diff --git a/deps/icu-small/source/common/unicode/utf.h b/deps/icu-small/source/common/unicode/utf.h index ab7e9ac96aa77f..aa5698069154cc 100644 --- a/deps/icu-small/source/common/unicode/utf.h +++ b/deps/icu-small/source/common/unicode/utf.h @@ -23,9 +23,6 @@ * This file defines macros for checking whether a code point is * a surrogate or a non-character etc. * - * The UChar and UChar32 data types for Unicode code units and code points - * are defined in umachine.h because they can be machine-dependent. - * * If U_NO_DEFAULT_INCLUDE_UTF_HEADERS is 0 then utf.h is included by utypes.h * and itself includes utf8.h and utf16.h after some * common definitions. @@ -50,11 +47,11 @@ * but are optimized for the much more frequently occurring BMP code points. * * umachine.h defines UChar to be an unsigned 16-bit integer. - * Where available, UChar is defined to be a char16_t - * or a wchar_t (if that is an unsigned 16-bit type), otherwise uint16_t. + * Since ICU 59, ICU uses char16_t in C++, UChar only in C, + * and defines UChar=char16_t by default. See the UChar API docs for details. * * UChar32 is defined to be a signed 32-bit integer (int32_t), large enough for a 21-bit - * Unicode code point (Unicode scalar value, 0..0x10ffff). + * Unicode code point (Unicode scalar value, 0..0x10ffff) and U_SENTINEL (-1). * Before ICU 2.4, the definition of UChar32 was similarly platform-dependent as * the definition of UChar. For details see the documentation for UChar32 itself. * @@ -63,11 +60,20 @@ * For actual Unicode character properties see uchar.h. * * By default, string operations must be done with error checking in case - * a string is not well-formed UTF-16. - * The macros will detect if a surrogate code unit is unpaired + * a string is not well-formed UTF-16 or UTF-8. + * + * The U16_ macros detect if a surrogate code unit is unpaired * (lead unit without trail unit or vice versa) and just return the unit itself * as the code point. * + * The U8_ macros detect illegal byte sequences and return a negative value. + * Starting with ICU 60, the observable length of a single illegal byte sequence + * skipped by one of these macros follows the Unicode 6+ recommendation + * which is consistent with the W3C Encoding Standard. + * + * There are ..._OR_FFFD versions of both U16_ and U8_ macros + * that return U+FFFD for illegal code unit sequences. + * * 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: @@ -91,10 +97,7 @@ * The performance differences are much larger here because UTF-8 provides so * many opportunities for malformed sequences. * 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.) + * and are fast, while the safe UTF-8 macros call functions for some complicated cases. * * Unlike with UTF-16, malformed sequences cannot be expressed with distinct * code point values (0..U+10ffff). They are indicated with negative values instead. @@ -126,8 +129,7 @@ */ #define U_IS_UNICODE_NONCHAR(c) \ ((c)>=0xfdd0 && \ - ((uint32_t)(c)<=0xfdef || ((c)&0xfffe)==0xfffe) && \ - (uint32_t)(c)<=0x10ffff) + ((c)<=0xfdef || ((c)&0xfffe)==0xfffe) && (c)<=0x10ffff) /** * Is c a Unicode code point value (0..U+10ffff) @@ -148,9 +150,7 @@ */ #define U_IS_UNICODE_CHAR(c) \ ((uint32_t)(c)<0xd800 || \ - ((uint32_t)(c)>0xdfff && \ - (uint32_t)(c)<=0x10ffff && \ - !U_IS_UNICODE_NONCHAR(c))) + (0xdfff<(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c))) /** * Is this code point a BMP code point (U+0000..U+ffff)? diff --git a/deps/icu-small/source/common/unicode/utf16.h b/deps/icu-small/source/common/unicode/utf16.h index 06653816123089..b9b9c59d3cb21f 100644 --- a/deps/icu-small/source/common/unicode/utf16.h +++ b/deps/icu-small/source/common/unicode/utf16.h @@ -185,8 +185,8 @@ * * The length can be negative for a NUL-terminated string. * - * If the offset points to a single, unpaired surrogate, then that itself - * will be returned as the code point. + * If the offset points to a single, unpaired surrogate, then + * c is set to that unpaired surrogate. * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT. * * @param s const UChar * string @@ -213,6 +213,53 @@ } \ } +#ifndef U_HIDE_DRAFT_API + +/** + * Get a code point from a string at a random-access offset, + * without changing the offset. + * "Safe" macro, handles unpaired surrogates and checks for string boundaries. + * + * The offset may point to either the lead or trail surrogate unit + * for a supplementary code point, in which case the macro will read + * the adjacent matching surrogate as well. + * + * The length can be negative for a NUL-terminated string. + * + * If the offset points to a single, unpaired surrogate, then + * c is set to U+FFFD. + * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT_OR_FFFD. + * + * @param s const UChar * string + * @param start starting string offset (usually 0) + * @param i string offset, must be start<=i(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \ + (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } else { \ + (c)=0xfffd; \ + } \ + } \ + } \ +} + +#endif // U_HIDE_DRAFT_API + /* definitions with forward iteration --------------------------------------- */ /** @@ -253,8 +300,7 @@ * for a supplementary code point, in which case the macro will read * the following trail surrogate as well. * If the offset points to a trail surrogate or - * to a single, unpaired lead surrogate, then that itself - * will be returned as the code point. + * to a single, unpaired lead surrogate, then c is set to that unpaired surrogate. * * @param s const UChar * string * @param i string offset, must be i(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \ + --(i); \ + (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } else { \ + (c)=0xfffd; \ + } \ + } \ +} + +#endif // U_HIDE_DRAFT_API + /** * Move the string offset from one code point boundary to the previous one. * (Pre-decrementing backward iteration.) diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 9e56b50474f404..59b4b2557021f0 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -41,34 +41,24 @@ /* internal definitions ----------------------------------------------------- */ - - /** * Counts the trail bytes for a UTF-8 lead byte. - * Returns 0 for 0..0xbf as well as for 0xfe and 0xff. + * Returns 0 for 0..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. * * This is internal since it is not meant to be called directly by external clients; * however it is called by public macros in this file and thus must remain stable. * - * Note: Beginning with ICU 50, the implementation uses a multi-condition expression - * which was shown in 2012 (on x86-64) to compile to fast, branch-free code. - * leadByte is evaluated multiple times. - * - * The pre-ICU 50 implementation used the exported array utf8_countTrailBytes: - * #define U8_COUNT_TRAIL_BYTES(leadByte) (utf8_countTrailBytes[leadByte]) - * leadByte was evaluated exactly once. - * * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. * @internal */ #define U8_COUNT_TRAIL_BYTES(leadByte) \ - ((uint8_t)(leadByte)<0xf0 ? \ - ((uint8_t)(leadByte)>=0xc0)+((uint8_t)(leadByte)>=0xe0) : \ - (uint8_t)(leadByte)<0xfe ? 3+((uint8_t)(leadByte)>=0xf8)+((uint8_t)(leadByte)>=0xfc) : 0) + (U8_IS_LEAD(leadByte) ? \ + ((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)+1 : 0) /** * Counts the trail bytes for a UTF-8 lead byte of a valid UTF-8 sequence. - * The maximum supported lead byte is 0xf4 corresponding to U+10FFFF. + * Returns 0 for 0..0xc1. Undefined for 0xf5..0xff. * leadByte might be evaluated multiple times. * * This is internal since it is not meant to be called directly by external clients; @@ -78,7 +68,7 @@ * @internal */ #define U8_COUNT_TRAIL_BYTES_UNSAFE(leadByte) \ - (((leadByte)>=0xc0)+((leadByte)>=0xe0)+((leadByte)>=0xf0)) + (((uint8_t)(leadByte)>=0xc2)+((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)) /** * Mask a UTF-8 lead byte, leave only the lower bits that form part of the code point value. @@ -89,6 +79,40 @@ */ #define U8_MASK_LEAD_BYTE(leadByte, countTrailBytes) ((leadByte)&=(1<<(6-(countTrailBytes)))-1) +/** + * Internal bit vector for 3-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD3_AND_T1. + * Each bit indicates whether one lead byte + first trail byte pair starts a valid sequence. + * Lead byte E0..EF bits 3..0 are used as byte index, + * first trail byte bits 7..5 are used as bit index into that byte. + * @see U8_IS_VALID_LEAD3_AND_T1 + * @internal + */ +#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30" + +/** + * Internal 3-byte UTF-8 validity check. + * Non-zero if lead byte E0..EF and first trail byte 00..FF start a valid sequence. + * @internal + */ +#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5))) + +/** + * Internal bit vector for 4-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD4_AND_T1. + * Each bit indicates whether one lead byte + first trail byte pair starts a valid sequence. + * First trail byte bits 7..4 are used as byte index, + * lead byte F0..F4 bits 2..0 are used as bit index into that byte. + * @see U8_IS_VALID_LEAD4_AND_T1 + * @internal + */ +#define U8_LEAD4_T1_BITS "\x00\x00\x00\x00\x00\x00\x00\x00\x1E\x0F\x0F\x0F\x00\x00\x00\x00" + +/** + * Internal 4-byte UTF-8 validity check. + * Non-zero if lead byte F0..F4 and first trail byte 00..FF start a valid sequence. + * @internal + */ +#define U8_IS_VALID_LEAD4_AND_T1(lead, t1) (U8_LEAD4_T1_BITS[(uint8_t)(t1)>>4]&(1<<((lead)&7))) + /** * Function for handling "next code point" with error-checking. * @@ -148,20 +172,21 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); #define U8_IS_SINGLE(c) (((c)&0x80)==0) /** - * Is this code unit (byte) a UTF-8 lead byte? + * Is this code unit (byte) a UTF-8 lead byte? (0xC2..0xF4) * @param c 8-bit code unit (byte) * @return TRUE or FALSE * @stable ICU 2.4 */ -#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc0)<0x3e) +#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc2)<=0x32) +// 0x32=0xf4-0xc2 /** - * Is this code unit (byte) a UTF-8 trail byte? + * Is this code unit (byte) a UTF-8 trail byte? (0x80..0xBF) * @param c 8-bit code unit (byte) * @return TRUE or FALSE * @stable ICU 2.4 */ -#define U8_IS_TRAIL(c) (((c)&0xc0)==0x80) +#define U8_IS_TRAIL(c) ((int8_t)(c)<-0x40) /** * How many code units (bytes) are used for the UTF-8 encoding @@ -289,7 +314,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT_UNSAFE(s, i, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ if((c)<0xe0) { \ (c)=(((c)&0x1f)<<6)|((s)[(i)++]&0x3f); \ } else if((c)<0xf0) { \ @@ -325,22 +350,19 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT(s, i, length, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __t1, __t2; \ - if( /* handle U+1000..U+CFFF inline */ \ - (0xe0<(c) && (c)<=0xec) && \ - (((i)+1)<(length) || (length)<0) && \ - (__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); \ + if( /* handle U+0800..U+FFFF inline */ \ + (0xe0<=(c) && (c)<0xf0) && \ + (((i)+1)<(length) || (length)<0) && \ + U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ + (__t2=(s)[(i)+1]-0x80)<=0x3f) { \ + (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<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)<0xe0 && (c)>=0xc2) && \ + ((i)!=(length)) && \ + (__t1=(s)[i]-0x80)<=0x3f) { \ (c)=(((c)&0x1f)<<6)|__t1; \ ++(i); \ } else { \ @@ -376,22 +398,19 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT_OR_FFFD(s, i, length, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __t1, __t2; \ - if( /* handle U+1000..U+CFFF inline */ \ - (0xe0<(c) && (c)<=0xec) && \ - (((i)+1)<(length) || (length)<0) && \ - (__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); \ + if( /* handle U+0800..U+FFFF inline */ \ + (0xe0<=(c) && (c)<0xf0) && \ + (((i)+1)<(length) || (length)<0) && \ + U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ + (__t2=(s)[(i)+1]-0x80)<=0x3f) { \ + (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<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)<0xe0 && (c)>=0xc2) && \ + ((i)!=(length)) && \ + (__t1=(s)[i]-0x80)<=0x3f) { \ (c)=(((c)&0x1f)<<6)|__t1; \ ++(i); \ } else { \ @@ -476,7 +495,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_FWD_1_UNSAFE(s, i) { \ - (i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((uint8_t)(s)[i]); \ + (i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((s)[i]); \ } /** @@ -493,15 +512,24 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_FWD_1(s, i, length) { \ - uint8_t __b=(uint8_t)(s)[(i)++]; \ - if(U8_IS_LEAD(__b)) { \ - uint8_t __count=U8_COUNT_TRAIL_BYTES(__b); \ - if((i)+__count>(length) && (length)>=0) { \ - __count=(uint8_t)((length)-(i)); \ - } \ - while(__count>0 && U8_IS_TRAIL((s)[i])) { \ - ++(i); \ - --__count; \ + uint8_t __b=(s)[(i)++]; \ + if(U8_IS_LEAD(__b) && (i)!=(length)) { \ + uint8_t __t1=(s)[i]; \ + if((0xe0<=__b && __b<0xf0)) { \ + if(U8_IS_VALID_LEAD3_AND_T1(__b, __t1) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ + ++(i); \ + } \ + } else if(__b<0xe0) { \ + if(U8_IS_TRAIL(__t1)) { \ + ++(i); \ + } \ + } else /* c>=0xf0 */ { \ + if(U8_IS_VALID_LEAD4_AND_T1(__b, __t1) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i]) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ + ++(i); \ + } \ } \ } \ } @@ -615,7 +643,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); /* c is a trail byte */ \ (c)&=0x3f; \ for(;;) { \ - __b=(uint8_t)(s)[--(i)]; \ + __b=(s)[--(i)]; \ if(__b>=0xc0) { \ U8_MASK_LEAD_BYTE(__b, __count); \ (c)|=(UChar32)__b<<__shift; \ @@ -651,7 +679,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV(s, start, i, c) { \ (c)=(uint8_t)(s)[--(i)]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -1); \ } \ } @@ -682,7 +710,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV_OR_FFFD(s, start, i, c) { \ (c)=(uint8_t)(s)[--(i)]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -3); \ } \ } diff --git a/deps/icu-small/source/common/unicode/utf_old.h b/deps/icu-small/source/common/unicode/utf_old.h index cb229cb301583e..55c17c01df6db3 100644 --- a/deps/icu-small/source/common/unicode/utf_old.h +++ b/deps/icu-small/source/common/unicode/utf_old.h @@ -145,7 +145,22 @@ #ifndef __UTF_OLD_H__ #define __UTF_OLD_H__ -#ifndef U_HIDE_DEPRECATED_API +/** + * \def U_HIDE_OBSOLETE_UTF_OLD_H + * + * Hides the obsolete definitions in unicode/utf_old.h. + * Recommended to be set to 1 at compile time to make sure + * the long-deprecated macros are no longer used. + * + * For reasons for the deprecation see the utf_old.h file comments. + * + * @internal + */ +#ifndef U_HIDE_OBSOLETE_UTF_OLD_H +# define U_HIDE_OBSOLETE_UTF_OLD_H 0 +#endif + +#if !defined(U_HIDE_DEPRECATED_API) && !U_HIDE_OBSOLETE_UTF_OLD_H #include "unicode/utf.h" #include "unicode/utf8.h" @@ -1184,6 +1199,6 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I */ #define UTF_SET_CHAR_LIMIT(s, start, i, length) U16_SET_CP_LIMIT(s, start, i, length) -#endif /* U_HIDE_DEPRECATED_API */ +#endif // !U_HIDE_DEPRECATED_API && !U_HIDE_OBSOLETE_UTF_OLD_H #endif diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index cae59ad880c411..ce7dec15535c7e 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -58,7 +58,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 59 +#define U_ICU_VERSION_MAJOR_NUM 60 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU @@ -84,7 +84,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _59 +#define U_ICU_VERSION_SUFFIX _60 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -119,24 +119,19 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "59.1" +#define U_ICU_VERSION "60.1" /** 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 */ -#if U_PLATFORM_HAS_WINUWP_API == 0 -#define U_ICU_VERSION_SHORT "59" -#else -// U_DISABLE_RENAMING does not impact dat file name -#define U_ICU_VERSION_SHORT -#endif /* U_PLATFORM_HAS_WINUWP_API == 0 */ +#define U_ICU_VERSION_SHORT "60" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "59.1" +#define U_ICU_DATA_VERSION "60.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index da1c88e84cba7d..fd0be593d786f2 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -24,8 +24,8 @@ static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER; static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER; static const int32_t MAX_EVICT_ITERATIONS = 10; -static int32_t DEFAULT_MAX_UNUSED = 1000; -static int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100; +static const int32_t DEFAULT_MAX_UNUSED = 1000; +static const int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100; U_CDECL_BEGIN diff --git a/deps/icu-small/source/common/unifiedcache.h b/deps/icu-small/source/common/unifiedcache.h index 5606e03bc99c70..947ebbdc78cf85 100644 --- a/deps/icu-small/source/common/unifiedcache.h +++ b/deps/icu-small/source/common/unifiedcache.h @@ -107,7 +107,7 @@ class CacheKey : public CacheKeyBase { */ virtual int32_t hashCode() const { const char *s = typeid(T).name(); - return ustr_hashCharsN(s, uprv_strlen(s)); + return ustr_hashCharsN(s, static_cast(uprv_strlen(s))); } /** diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index ea69d4161a2664..d0ed074a9be387 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -987,7 +987,7 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, UProperty p; int32_t v; - UBool mustNotBeEmpty = FALSE, invert = FALSE; + UBool invert = FALSE; if (value.length() > 0) { p = u_getPropertyEnum(pname.data()); @@ -1009,14 +1009,15 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, p == UCHAR_LEAD_CANONICAL_COMBINING_CLASS) { char* end; double value = uprv_strtod(vname.data(), &end); - v = (int32_t) value; - if (v != value || v < 0 || *end != 0) { - // non-integral or negative value, or trailing junk + // Anything between 0 and 255 is valid even if unused. + // Cast double->int only after range check. + // We catch NaN here because comparing it with both 0 and 255 will be false + // (as are all comparisons with NaN). + if (*end != 0 || !(0 <= value && value <= 255) || + (v = (int32_t)value) != value) { + // non-integral value or outside 0..255, or trailing junk FAIL(ec); } - // If the resultant set is empty then the numeric value - // was invalid. - mustNotBeEmpty = TRUE; } else { FAIL(ec); } @@ -1115,12 +1116,6 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, complement(); } - if (U_SUCCESS(ec) && (mustNotBeEmpty && isEmpty())) { - // mustNotBeEmpty is set to true if an empty set indicates - // invalid input. - ec = U_ILLEGAL_ARGUMENT_ERROR; - } - if (isBogus() && U_SUCCESS(ec)) { // We likely ran out of memory. AHHH! ec = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/unisetspan.cpp b/deps/icu-small/source/common/unisetspan.cpp index 09fb5b474c7e68..0a8893472f958b 100644 --- a/deps/icu-small/source/common/unisetspan.cpp +++ b/deps/icu-small/source/common/unisetspan.cpp @@ -502,7 +502,7 @@ spanOneBack(const UnicodeSet &set, const UChar *s, int32_t length) { static inline int32_t spanOneUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { UChar32 c=*s; - if((int8_t)c>=0) { + if(U8_IS_SINGLE(c)) { return set.contains(c) ? 1 : -1; } // Take advantage of non-ASCII fastpaths in U8_NEXT_OR_FFFD(). @@ -514,7 +514,7 @@ spanOneUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { static inline int32_t spanOneBackUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { UChar32 c=s[length-1]; - if((int8_t)c>=0) { + if(U8_IS_SINGLE(c)) { return set.contains(c) ? 1 : -1; } int32_t i=length-1; @@ -1006,11 +1006,9 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa // Try to match if the increment is not listed already. // Match at code point boundaries. (The UTF-8 strings were converted // from UTF-16 and are guaranteed to be well-formed.) - if( !U8_IS_TRAIL(s[pos-overlap]) && - !offsets.containsOffset(inc) && - matches8(s+pos-overlap, s8, length8) - - ) { + if(!U8_IS_TRAIL(s[pos-overlap]) && + !offsets.containsOffset(inc) && + matches8(s+pos-overlap, s8, length8)) { if(inc==rest) { return length; // Reached the end of the string. } @@ -1052,11 +1050,10 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa // Try to match if the string is longer or starts earlier. // Match at code point boundaries. (The UTF-8 strings were converted // from UTF-16 and are guaranteed to be well-formed.) - if( !U8_IS_TRAIL(s[pos-overlap]) && - (overlap>maxOverlap || /* redundant overlap==maxOverlap && */ inc>maxInc) && - matches8(s+pos-overlap, s8, length8) - - ) { + if(!U8_IS_TRAIL(s[pos-overlap]) && + (overlap>maxOverlap || + /* redundant overlap==maxOverlap && */ inc>maxInc) && + matches8(s+pos-overlap, s8, length8)) { maxInc=inc; // Longest match from earliest start. maxOverlap=overlap; break; diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index 2db2856f0bb46f..48ad929e85a729 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -308,12 +308,10 @@ UnicodeString::UnicodeString(const UnicodeString& that) { copyFrom(that); } -#if U_HAVE_RVALUE_REFERENCES UnicodeString::UnicodeString(UnicodeString &&src) U_NOEXCEPT { fUnion.fFields.fLengthAndFlags = kShortString; moveFrom(src); } -#endif UnicodeString::UnicodeString(const UnicodeString& that, int32_t srcStart) { diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 1c62ce5e974e23..2138d60c01c2d1 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -19,6 +19,7 @@ */ #include "unicode/utypes.h" +#include "unicode/brkiter.h" #include "unicode/casemap.h" #include "unicode/edits.h" #include "unicode/putil.h" @@ -104,6 +105,12 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER UBool writable = isBufferWritable(); UErrorCode errorCode = U_ZERO_ERROR; +#if !UCONFIG_NO_BREAK_ITERATION + // Read-only alias to the original string contents for the titlecasing BreakIterator. + // We cannot set the iterator simply to *this because *this is being modified. + UnicodeString oldString; +#endif + // Try to avoid heap-allocating a new character array for this string. if (writable ? oldLength <= UPRV_LENGTHOF(oldBuffer) : oldLength < US_STACKBUF_SIZE) { // Short string: Copy the contents into a temporary buffer and @@ -123,6 +130,12 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER buffer = fUnion.fStackFields.fBuffer; capacity = US_STACKBUF_SIZE; } +#if !UCONFIG_NO_BREAK_ITERATION + if (iter != nullptr) { + oldString.setTo(FALSE, oldArray, oldLength); + iter->setText(oldString); + } +#endif newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR buffer, capacity, oldArray, oldLength, NULL, errorCode); @@ -143,7 +156,13 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER oldArray = getArrayStart(); Edits edits; UChar replacementChars[200]; - stringCaseMapper(caseLocale, options | UCASEMAP_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR +#if !UCONFIG_NO_BREAK_ITERATION + if (iter != nullptr) { + oldString.setTo(FALSE, oldArray, oldLength); + iter->setText(oldString); + } +#endif + stringCaseMapper(caseLocale, options | U_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR replacementChars, UPRV_LENGTHOF(replacementChars), oldArray, oldLength, &edits, errorCode); if (U_SUCCESS(errorCode)) { @@ -179,6 +198,7 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER return *this; } errorCode = U_ZERO_ERROR; + // No need to iter->setText() again: The case mapper restarts via iter->first(). newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR getArrayStart(), getCapacity(), oldArray, oldLength, NULL, errorCode); diff --git a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp index 3156fdfc5754af..4969884b0dc9b9 100644 --- a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp @@ -30,36 +30,26 @@ U_NAMESPACE_BEGIN UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter) { - return toTitle(titleIter, Locale::getDefault(), 0); +UnicodeString::toTitle(BreakIterator *iter) { + return toTitle(iter, Locale::getDefault(), 0); } UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { - return toTitle(titleIter, locale, 0); +UnicodeString::toTitle(BreakIterator *iter, const Locale &locale) { + return toTitle(iter, locale, 0); } UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) { - BreakIterator *bi=titleIter; - if(bi==NULL) { - UErrorCode errorCode=U_ZERO_ERROR; - bi=BreakIterator::createWordInstance(locale, errorCode); - if(U_FAILURE(errorCode)) { - setToBogus(); - return *this; +UnicodeString::toTitle(BreakIterator *iter, const Locale &locale, uint32_t options) { + LocalPointer ownedIter; + UErrorCode errorCode = U_ZERO_ERROR; + iter = ustrcase_getTitleBreakIterator(&locale, "", options, iter, ownedIter, errorCode); + if (iter == nullptr) { + setToBogus(); + return *this; } - } - // Because the "this" string is both the source and the destination, - // make a copy of the original source for use by the break iterator. - // See tickets #13127 and #13128 - UnicodeString copyOfInput(*this); - bi->setText(copyOfInput); - caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, bi, ustrcase_internalToTitle); - if(titleIter==NULL) { - delete bi; - } - return *this; + caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, iter, ustrcase_internalToTitle); + return *this; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index fc91c8903d80ea..ace3c4d6d04652 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -206,6 +206,11 @@ static UBool isPOSIX_xdigit(const BinaryProperty &/*prop*/, UChar32 c, UProperty return u_isxdigit(c); } +static UBool isRegionalIndicator(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { + // Property starts are a subset of lb=RI etc. + return 0x1F1E6<=c && c<=0x1F1FF; +} + static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ /* * column and mask values for binary properties from u_getUnicodeProperties(). @@ -276,6 +281,9 @@ static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ { 2, U_MASK(UPROPS_2_EMOJI_PRESENTATION), defaultContains }, { 2, U_MASK(UPROPS_2_EMOJI_MODIFIER), defaultContains }, { 2, U_MASK(UPROPS_2_EMOJI_MODIFIER_BASE), defaultContains }, + { 2, U_MASK(UPROPS_2_EMOJI_COMPONENT), defaultContains }, + { 2, 0, isRegionalIndicator }, + { 1, U_MASK(UPROPS_PREPENDED_CONCATENATION_MARK), defaultContains }, }; U_CAPI UBool U_EXPORT2 diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index f5d69fe79cf42a..6f67756cd91033 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -189,15 +189,15 @@ enum { UPROPS_VARIATION_SELECTOR, UPROPS_PATTERN_SYNTAX, /* new in ICU 3.4 and Unicode 4.1 */ UPROPS_PATTERN_WHITE_SPACE, - UPROPS_RESERVED, /* reserved & unused */ + UPROPS_PREPENDED_CONCATENATION_MARK, // new in ICU 60 and Unicode 10 UPROPS_BINARY_1_TOP /* ==32 - full! */ }; /* * Properties in vector word 2 * Bits - * 31..28 http://www.unicode.org/reports/tr51/#Emoji_Properties - * 27..26 reserved + * 31..27 http://www.unicode.org/reports/tr51/#Emoji_Properties + * 26 reserved * 25..20 Line Break * 19..15 Sentence Break * 14..10 Word Break @@ -205,7 +205,8 @@ enum { * 4.. 0 Decomposition Type */ enum { - UPROPS_2_EMOJI=28, + UPROPS_2_EMOJI_COMPONENT=27, + UPROPS_2_EMOJI, UPROPS_2_EMOJI_PRESENTATION, UPROPS_2_EMOJI_MODIFIER, UPROPS_2_EMOJI_MODIFIER_BASE diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 0dcbcaaf90d6bd..c88d9014ec23b7 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -1083,6 +1083,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char)); if(pathBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; + ures_close(mainRes); return NULL; } } diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index f8ec5e361d222b..7998c52c7f02c5 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -33,7 +33,7 @@ namespace { const int32_t UNKNOWN = 1 << 21; const int32_t EXCLUSION = 2 << 21; const int32_t LIMITED_USE = 3 << 21; -const int32_t ASPIRATIONAL = 4 << 21; +// st int32_t ASPIRATIONAL = 4 << 21; -- not used any more since Unicode 10 const int32_t RECOMMENDED = 5 << 21; // Bits 31..24: Single-bit flags @@ -71,7 +71,7 @@ const int32_t SCRIPT_PROPS[] = { 0x0EA5 | RECOMMENDED | LB_LETTERS, // Laoo 0x004C | RECOMMENDED | CASED, // Latn 0x0D15 | RECOMMENDED, // Mlym - 0x1826 | ASPIRATIONAL, // Mong + 0x1826 | LIMITED_USE, // Mong 0x1000 | RECOMMENDED | LB_LETTERS, // Mymr 0x168F | EXCLUSION, // Ogam 0x10300 | EXCLUSION, // Ital @@ -84,8 +84,8 @@ const int32_t SCRIPT_PROPS[] = { 0x078C | RECOMMENDED | RTL, // Thaa 0x0E17 | RECOMMENDED | LB_LETTERS, // Thai 0x0F40 | RECOMMENDED, // Tibt - 0x14C0 | ASPIRATIONAL, // Cans - 0xA288 | ASPIRATIONAL | LB_LETTERS, // Yiii + 0x14C0 | LIMITED_USE, // Cans + 0xA288 | LIMITED_USE | LB_LETTERS, // Yiii 0x1703 | EXCLUSION, // Tglg 0x1723 | EXCLUSION, // Hano 0x1743 | EXCLUSION, // Buhd @@ -104,7 +104,7 @@ const int32_t SCRIPT_PROPS[] = { 0x10A00 | EXCLUSION | RTL, // Khar 0xA800 | LIMITED_USE, // Sylo 0x1980 | LIMITED_USE | LB_LETTERS, // Talu - 0x2D30 | ASPIRATIONAL, // Tfng + 0x2D30 | LIMITED_USE, // Tfng 0x103A0 | EXCLUSION, // Xpeo 0x1B05 | LIMITED_USE, // Bali 0x1BC0 | LIMITED_USE, // Batk @@ -136,7 +136,7 @@ const int32_t SCRIPT_PROPS[] = { 0x1036B | EXCLUSION, // Perm 0xA840 | EXCLUSION, // Phag 0x10900 | EXCLUSION | RTL, // Phnx - 0x16F00 | ASPIRATIONAL, // Plrd + 0x16F00 | LIMITED_USE, // Plrd 0, 0, 0, @@ -194,7 +194,7 @@ const int32_t SCRIPT_PROPS[] = { 0, 0, 0x16A4F | EXCLUSION, // Mroo - 0, + 0x1B1C4 | EXCLUSION | LB_LETTERS, // Nshu 0x11183 | EXCLUSION, // Shrd 0x110D0 | EXCLUSION, // Sora 0x11680 | EXCLUSION, // Takr @@ -219,6 +219,9 @@ const int32_t SCRIPT_PROPS[] = { 0x5B57 | RECOMMENDED | LB_LETTERS, // Hanb 0x1112 | RECOMMENDED, // Jamo 0, + 0x11D10 | EXCLUSION, // Gonm + 0x11A5C | EXCLUSION, // Soyo + 0x11A0B | EXCLUSION, // Zanb // End copy-paste from parsescriptmetadata.py }; diff --git a/deps/icu-small/source/common/ustr_imp.h b/deps/icu-small/source/common/ustr_imp.h index eb5d0722585e4c..943824fa197645 100644 --- a/deps/icu-small/source/common/ustr_imp.h +++ b/deps/icu-small/source/common/ustr_imp.h @@ -18,6 +18,7 @@ #define __USTR_IMP_H__ #include "unicode/utypes.h" +#include "unicode/utf8.h" /** * Internal option for unorm_cmpEquivFold() for strncmp style. @@ -81,4 +82,62 @@ u_terminateUChar32s(UChar32 *dest, int32_t destCapacity, int32_t length, UErrorC U_CAPI int32_t U_EXPORT2 u_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode); +/** + * Counts the bytes of any whole valid sequence for a UTF-8 lead byte. + * Returns 1 for ASCII 0..0x7f. + * Returns 0 for 0x80..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 0..4 + */ +#define U8_COUNT_BYTES(leadByte) \ + (U8_IS_SINGLE(leadByte) ? 1 : U8_COUNT_BYTES_NON_ASCII(leadByte)) + +/** + * Counts the bytes of any whole valid sequence for a UTF-8 lead byte. + * Returns 0 for 0x00..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 0 or 2..4 + */ +#define U8_COUNT_BYTES_NON_ASCII(leadByte) \ + (U8_IS_LEAD(leadByte) ? ((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)+2 : 0) + +#ifdef __cplusplus + +U_NAMESPACE_BEGIN + +class UTF8 { +public: + UTF8() = delete; // all static + + /** + * Is t a valid UTF-8 trail byte? + * + * @param prev Must be the preceding lead byte if i==1 and length>=3; + * otherwise ignored. + * @param t The i-th byte following the lead byte. + * @param i The index (1..3) of byte t in the byte sequence. 0 1) { + return U8_IS_TRAIL(t); + } else if (length == 3) { + return U8_IS_VALID_LEAD3_AND_T1(prev, t); + } else { // length == 4 + return U8_IS_VALID_LEAD4_AND_T1(prev, t); + } + } +}; + +U_NAMESPACE_END + +#endif // __cplusplus + #endif diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 0b2ba02064b324..89888cf336b0e9 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -23,46 +23,153 @@ #include "unicode/brkiter.h" #include "unicode/casemap.h" +#include "unicode/chariter.h" #include "unicode/localpointer.h" #include "unicode/ubrk.h" #include "unicode/ucasemap.h" +#include "unicode/utext.h" #include "cmemory.h" +#include "uassert.h" #include "ucase.h" #include "ucasemap_imp.h" -U_NAMESPACE_USE +U_NAMESPACE_BEGIN -/* functions available in the common library (for unistr_case.cpp) */ +/** + * Whole-string BreakIterator. + * Titlecasing only calls setText(), first(), and next(). + * We implement the rest only to satisfy the abstract interface. + */ +class WholeStringBreakIterator : public BreakIterator { +public: + WholeStringBreakIterator() : BreakIterator(), length(0) {} + ~WholeStringBreakIterator() U_OVERRIDE; + UBool operator==(const BreakIterator&) const U_OVERRIDE; + BreakIterator *clone() const U_OVERRIDE; + static UClassID U_EXPORT2 getStaticClassID(); + UClassID getDynamicClassID() const U_OVERRIDE; + CharacterIterator &getText() const U_OVERRIDE; + UText *getUText(UText *fillIn, UErrorCode &errorCode) const U_OVERRIDE; + void setText(const UnicodeString &text) U_OVERRIDE; + void setText(UText *text, UErrorCode &errorCode) U_OVERRIDE; + void adoptText(CharacterIterator* it) U_OVERRIDE; + int32_t first() U_OVERRIDE; + int32_t last() U_OVERRIDE; + int32_t previous() U_OVERRIDE; + int32_t next() U_OVERRIDE; + int32_t current() const U_OVERRIDE; + int32_t following(int32_t offset) U_OVERRIDE; + int32_t preceding(int32_t offset) U_OVERRIDE; + UBool isBoundary(int32_t offset) U_OVERRIDE; + int32_t next(int32_t n) U_OVERRIDE; + BreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize, + UErrorCode &errorCode) U_OVERRIDE; + BreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE; -/* public API functions */ +private: + int32_t length; +}; -U_CAPI int32_t U_EXPORT2 -u_strToTitle(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UBreakIterator *titleIter, - const char *locale, - UErrorCode *pErrorCode) { - LocalPointer ownedIter; - BreakIterator *iter; - if(titleIter!=NULL) { - iter=reinterpret_cast(titleIter); - } else { - iter=BreakIterator::createWordInstance(Locale(locale), *pErrorCode); - ownedIter.adoptInstead(iter); +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(WholeStringBreakIterator) + +WholeStringBreakIterator::~WholeStringBreakIterator() {} +UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return FALSE; } +BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; } + +CharacterIterator &WholeStringBreakIterator::getText() const { + U_ASSERT(FALSE); // really should not be called + // Returns a null reference. + // Otherwise we would have to define a dummy CharacterIterator, + // and either have it as a field and const_cast it to a non-const reference, + // or have it via a pointer and return a reference to that. + CharacterIterator *none = nullptr; + return *none; +} +UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; } - if(U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; +} + +void WholeStringBreakIterator::setText(const UnicodeString &text) { + length = text.length(); +} +void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + int64_t length64 = utext_nativeLength(text); + if (length64 <= INT32_MAX) { + length = (int32_t)length64; + } else { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + } } - UnicodeString s(srcLength<0, src, srcLength); - iter->setText(s); - return ustrcase_mapWithOverlap( - ustrcase_getCaseLocale(locale), 0, iter, - dest, destCapacity, - src, srcLength, - ustrcase_internalToTitle, *pErrorCode); +} +void WholeStringBreakIterator::adoptText(CharacterIterator* it) { + U_ASSERT(FALSE); // should not be called + length = it->getLength(); + delete it; } -U_NAMESPACE_BEGIN +int32_t WholeStringBreakIterator::first() { return 0; } +int32_t WholeStringBreakIterator::last() { return length; } +int32_t WholeStringBreakIterator::previous() { return 0; } +int32_t WholeStringBreakIterator::next() { return length; } +int32_t WholeStringBreakIterator::current() const { return 0; } +int32_t WholeStringBreakIterator::following(int32_t /*offset*/) { return length; } +int32_t WholeStringBreakIterator::preceding(int32_t /*offset*/) { return 0; } +UBool WholeStringBreakIterator::isBoundary(int32_t /*offset*/) { return FALSE; } +int32_t WholeStringBreakIterator::next(int32_t /*n*/) { return length; } + +BreakIterator *WholeStringBreakIterator::createBufferClone( + void * /*stackBuffer*/, int32_t & /*BufferSize*/, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; + } + return nullptr; +} +BreakIterator &WholeStringBreakIterator::refreshInputText( + UText * /*input*/, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; + } + return *this; +} + +U_CFUNC +BreakIterator *ustrcase_getTitleBreakIterator( + const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, + LocalPointer &ownedIter, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return nullptr; } + options &= U_TITLECASE_ITERATOR_MASK; + if (options != 0 && iter != nullptr) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + if (iter == nullptr) { + switch (options) { + case 0: + iter = BreakIterator::createWordInstance( + locale != nullptr ? *locale : Locale(locID), errorCode); + break; + case U_TITLECASE_WHOLE_STRING: + iter = new WholeStringBreakIterator(); + if (iter == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + break; + case U_TITLECASE_SENTENCES: + iter = BreakIterator::createSentenceInstance( + locale != nullptr ? *locale : Locale(locID), errorCode); + break; + default: + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + ownedIter.adoptInstead(iter); + } + return iter; +} int32_t CaseMap::toTitle( const char *locale, uint32_t options, BreakIterator *iter, @@ -70,11 +177,8 @@ int32_t CaseMap::toTitle( UChar *dest, int32_t destCapacity, Edits *edits, UErrorCode &errorCode) { LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); if(iter==NULL) { - iter=BreakIterator::createWordInstance(Locale(locale), errorCode); - ownedIter.adoptInstead(iter); - } - if(U_FAILURE(errorCode)) { return 0; } UnicodeString s(srcLength<0, src, srcLength); @@ -88,6 +192,30 @@ int32_t CaseMap::toTitle( U_NAMESPACE_END +U_NAMESPACE_USE + +U_CAPI int32_t U_EXPORT2 +u_strToTitle(UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UBreakIterator *titleIter, + const char *locale, + UErrorCode *pErrorCode) { + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, locale, 0, reinterpret_cast(titleIter), + ownedIter, *pErrorCode); + if (iter == nullptr) { + return 0; + } + UnicodeString s(srcLength<0, src, srcLength); + iter->setText(s); + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, iter, + dest, destCapacity, + src, srcLength, + ustrcase_internalToTitle, *pErrorCode); +} + U_CAPI int32_t U_EXPORT2 ucasemap_toTitle(UCaseMap *csm, UChar *dest, int32_t destCapacity, @@ -97,10 +225,13 @@ ucasemap_toTitle(UCaseMap *csm, return 0; } if (csm->iter == NULL) { - csm->iter = BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode); - } - if (U_FAILURE(*pErrorCode)) { - return 0; + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + if (iter == nullptr) { + return 0; + } + csm->iter = ownedIter.orphan(); } UnicodeString s(srcLength<0, src, srcLength); csm->iter->setText(s); diff --git a/deps/icu-small/source/common/ustrcase.cpp b/deps/icu-small/source/common/ustrcase.cpp index b12e7a7c0b3a10..b1beb34277896c 100644 --- a/deps/icu-small/source/common/ustrcase.cpp +++ b/deps/icu-small/source/common/ustrcase.cpp @@ -24,6 +24,7 @@ #include "unicode/brkiter.h" #include "unicode/casemap.h" #include "unicode/edits.h" +#include "unicode/stringoptions.h" #include "unicode/ustring.h" #include "unicode/ucasemap.h" #include "unicode/ubrk.h" @@ -72,9 +73,9 @@ appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, /* (not) original code point */ if(edits!=NULL) { edits->addUnchanged(cpLength); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } + } + if(options & U_OMIT_UNCHANGED_TEXT) { + return destIndex; } c=~result; if(destIndex0) { if(edits!=NULL) { edits->addUnchanged(length); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } + } + if(options & U_OMIT_UNCHANGED_TEXT) { + return destIndex; } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow @@ -237,7 +238,7 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it const UChar *src, int32_t srcLength, icu::Edits *edits, UErrorCode &errorCode) { - if(U_FAILURE(errorCode)) { + if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) { return 0; } @@ -264,45 +265,38 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it } /* - * 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[ + * Segment [prev..index[ into 3 parts: + * a) skipped characters (copy as-is) [prev..titleStart[ + * b) first letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ if(prev 0; int32_t i2 = i + 1; @@ -965,7 +961,7 @@ int32_t toUpper(uint32_t options, edits->addUnchanged(oldLength); } // Write unchanged text? - change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0; + change = (options & U_OMIT_UNCHANGED_TEXT) == 0; } } @@ -1110,7 +1106,7 @@ ustrcase_map(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM return 0; } - if(edits!=NULL) { + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR diff --git a/deps/icu-small/source/common/ustrtrns.cpp b/deps/icu-small/source/common/ustrtrns.cpp index 98d92fc4ab693b..583ec63c323aee 100644 --- a/deps/icu-small/source/common/ustrtrns.cpp +++ b/deps/icu-small/source/common/ustrtrns.cpp @@ -256,152 +256,6 @@ u_strToUTF32(UChar32 *dest, pErrorCode); } -/* 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=U8_COUNT_TRAIL_BYTES(c); - U_ASSERT(count<6); - U8_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; - } - U_FALLTHROUGH; - case 2: - trail=(uint8_t)(*s++ - 0x80); - if(trail>0x3f) { - /* not a trail byte */ - illegal=1; - break; - } - c=(c<<6)|trail; - U_FALLTHROUGH; - 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 || c0 && U8_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=U8_COUNT_TRAIL_BYTES(c); - if((limit-s)>=count) { - U8_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; - } - U_FALLTHROUGH; - case 2: - trail=*s++; - c=(c<<6)|(trail&0x3f); - illegal|=(trail&0xc0)^0x80; - U_FALLTHROUGH; - 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 */ - U_ASSERT(illegal || count0 && s 0) || subchar > 0x10ffff || U_IS_SURROGATE(subchar) @@ -434,7 +279,10 @@ u_strFromUTF8WithSub(UChar *dest, if(pNumSubstitutions!=NULL) { *pNumSubstitutions=0; } - numSubstitutions=0; + UChar *pDest = dest; + UChar *pDestLimit = dest+destCapacity; + int32_t reqLength = 0; + int32_t numSubstitutions=0; /* * Inline processing of UTF-8 byte sequences: @@ -455,95 +303,81 @@ u_strFromUTF8WithSub(UChar *dest, * 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; + int32_t i; + UChar32 c; + for(i = 0; (c = (uint8_t)src[i]) != 0 && (pDest < pDestLimit);) { + // modified copy of U8_NEXT() + ++i; + if(U8_IS_SINGLE(c)) { + *pDest++=(UChar)c; } 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; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + U8_IS_VALID_LEAD3_AND_T1((c), src[i]) && + (__t2=src[(i)+1]-0x80)<=0x3f) { + *pDest++ = (((c)&0xf)<<12)|((src[i]&0x3f)<<6)|__t2; + i+=2; + } else if( /* handle U+0080..U+07FF inline */ + ((c)<0xe0 && (c)>=0xc2) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); } else { - *(pDest++)=U16_LEAD(ch); - if(pDest 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; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + U8_IS_VALID_LEAD3_AND_T1((c), src[i]) && + (__t2=src[(i)+1]-0x80)<=0x3f) { + ++reqLength; + i+=2; + } else if( /* handle U+0080..U+07FF inline */ + ((c)<0xe0 && (c)>=0xc2) && + (__t1=src[i]-0x80)<=0x3f) { + ++reqLength; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), -1, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; } + reqLength += U16_LENGTH(c); } - - /* 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. */ + /* Faster loop without ongoing checking for srcLength and pDestLimit. */ + int32_t i = 0; + UChar32 c; for(;;) { /* * Each iteration of the inner loop progresses by at most 3 UTF-8 @@ -551,10 +385,10 @@ u_strFromUTF8WithSub(UChar *dest, * 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) */ + int32_t count = (int32_t)(pDestLimit - pDest); + int32_t count2 = (srcLength - i) / 3; + if(count > count2) { + count = count2; /* min(remaining dest, remaining src/3) */ } if(count < 3) { /* @@ -565,147 +399,123 @@ u_strFromUTF8WithSub(UChar *dest, } do { - ch = *pSrc; - if(ch <= 0x7f){ - *pDest++=(UChar)ch; - ++pSrc; + // modified copy of U8_NEXT() + c = (uint8_t)src[i++]; + if(U8_IS_SINGLE(c)) { + *pDest++=(UChar)c; } 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; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + ((i)+1)=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); + } else { + if(c >= 0xf0 || subchar > 0xffff) { + // We may read up to four bytes and write up to two UChars, + // which we didn't account for with computing count, + // so we adjust it here. + if(--count == 0) { + --i; // back out byte c + break; + } } - } - 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 */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(c<=0xFFFF) { + *(pDest++)=(UChar)c; + } else { + *(pDest++)=U16_LEAD(c); + *(pDest++)=U16_TRAIL(c); } } - - /* 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++)=U16_LEAD(ch); - *(pDest++)=U16_TRAIL(ch); - } } } while(--count > 0); } - while((pSrc 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{ - *(pDest++)=U16_LEAD(ch); - if(pDest=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(c<=0xFFFF) { + *(pDest++)=(UChar)c; + } else { + *(pDest++)=U16_LEAD(c); + if(pDest 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; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + ((i)+1)=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + ++reqLength; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; } + reqLength += U16_LENGTH(c); } - - /* 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+=U16_LENGTH(ch); } } } @@ -753,7 +563,7 @@ u_strFromUTF8Lenient(UChar *dest, uint8_t* pSrc = (uint8_t*) src; /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)){ return NULL; } @@ -994,7 +804,7 @@ u_strToUTF8WithSub(char *dest, int32_t numSubstitutions; /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)){ return NULL; } @@ -1266,18 +1076,8 @@ u_strFromJavaModifiedUTF8WithSub( int32_t srcLength, UChar32 subchar, int32_t *pNumSubstitutions, UErrorCode *pErrorCode) { - UChar *pDest = dest; - UChar *pDestLimit = dest+destCapacity; - UChar32 ch; - int32_t reqLength = 0; - const uint8_t* pSrc = (const uint8_t*) src; - const uint8_t *pSrcLimit; - int32_t count; - uint8_t t1, t2; /* trail bytes */ - int32_t numSubstitutions; - /* args check */ - if(U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)) { return NULL; } if( (src==NULL && srcLength!=0) || srcLength < -1 || @@ -1291,18 +1091,22 @@ u_strFromJavaModifiedUTF8WithSub( if(pNumSubstitutions!=NULL) { *pNumSubstitutions=0; } - numSubstitutions=0; + UChar *pDest = dest; + UChar *pDestLimit = dest+destCapacity; + int32_t reqLength = 0; + int32_t numSubstitutions=0; if(srcLength < 0) { /* * Transform a NUL-terminated ASCII string. * Handle non-ASCII strings with slower code. */ - while(((ch = *pSrc) != 0) && ch <= 0x7f && (pDest < pDestLimit)) { - *pDest++=(UChar)ch; - ++pSrc; + UChar32 c; + while(((c = (uint8_t)*src) != 0) && c <= 0x7f && (pDest < pDestLimit)) { + *pDest++=(UChar)c; + ++src; } - if(ch == 0) { + if(c == 0) { reqLength=(int32_t)(pDest - dest); if(pDestLength) { *pDestLength = reqLength; @@ -1312,33 +1116,38 @@ u_strFromJavaModifiedUTF8WithSub( u_terminateUChars(dest, destCapacity, reqLength, pErrorCode); return dest; } - srcLength = uprv_strlen((const char *)pSrc); + srcLength = static_cast(uprv_strlen(src)); } - /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ - pSrcLimit = (pSrc == NULL) ? NULL : pSrc + srcLength; + /* Faster loop without ongoing checking for srcLength and pDestLimit. */ + UChar32 ch; + uint8_t t1, t2; + int32_t i = 0; for(;;) { - count = (int32_t)(pDestLimit - pDest); - srcLength = (int32_t)(pSrcLimit - pSrc); - if(count >= srcLength && srcLength > 0 && *pSrc <= 0x7f) { + int32_t count = (int32_t)(pDestLimit - pDest); + int32_t count2 = srcLength - i; + if(count >= count2 && srcLength > 0 && U8_IS_SINGLE(*src)) { /* fast ASCII loop */ - const uint8_t *prevSrc = pSrc; - int32_t delta; - while(pSrc < pSrcLimit && (ch = *pSrc) <= 0x7f) { - *pDest++=(UChar)ch; - ++pSrc; + int32_t start = i; + uint8_t b; + while(i < srcLength && U8_IS_SINGLE(b = src[i])) { + *pDest++=b; + ++i; } - delta = (int32_t)(pSrc - prevSrc); + int32_t delta = i - start; count -= delta; - srcLength -= delta; + count2 -= delta; } /* * Each iteration of the inner loop progresses by at most 3 UTF-8 * bytes and one UChar. */ - srcLength /= 3; - if(count > srcLength) { - count = srcLength; /* min(remaining dest, remaining src/3) */ + if(subchar > 0xFFFF) { + break; + } + count2 /= 3; + if(count > count2) { + count = count2; /* min(remaining dest, remaining src/3) */ } if(count < 3) { /* @@ -1348,29 +1157,28 @@ u_strFromJavaModifiedUTF8WithSub( break; } do { - ch = *pSrc; - if(ch <= 0x7f){ + ch = (uint8_t)src[i++]; + if(U8_IS_SINGLE(ch)) { *pDest++=(UChar)ch; - ++pSrc; } else { if(ch >= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(src[i+1] - 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; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f ) { *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; + ++i; continue; } } @@ -1383,49 +1191,43 @@ u_strFromJavaModifiedUTF8WithSub( * We need to write two UChars, adjusted count for that, * and ran out of space. */ + --i; // back out byte ch break; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; - if(subchar<=0xFFFF) { - *(pDest++)=(UChar)subchar; - } else { - *(pDest++)=U16_LEAD(subchar); - *(pDest++)=U16_TRAIL(subchar); - } + *(pDest++)=(UChar)subchar; } } } while(--count > 0); } - while((pSrc= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - ((pSrcLimit - pSrc) >= 3) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + (i+1) < srcLength && + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(src[i+1] - 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; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - ((pSrcLimit - pSrc) >= 2) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + i < srcLength && + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f ) { *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; + ++i; continue; } } @@ -1435,8 +1237,7 @@ u_strFromJavaModifiedUTF8WithSub( return NULL; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; if(subchar<=0xFFFF) { *(pDest++)=(UChar)subchar; @@ -1453,32 +1254,31 @@ u_strFromJavaModifiedUTF8WithSub( } } - /* do not fill the dest buffer just count the UChars needed */ - while(pSrc < pSrcLimit){ - ch = *pSrc; - if(ch <= 0x7f) { + /* Pre-flight the rest of the string. */ + while(i < srcLength) { + ch = (uint8_t)src[i++]; + if(U8_IS_SINGLE(ch)) { reqLength++; - ++pSrc; } else { if(ch >= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - ((pSrcLimit - pSrc) >= 3) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f + (i+1) < srcLength && + (uint8_t)(src[i] - 0x80) <= 0x3f && + (uint8_t)(src[i+1] - 0x80) <= 0x3f ) { reqLength++; - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - ((pSrcLimit - pSrc) >= 2) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f + i < srcLength && + (uint8_t)(src[i] - 0x80) <= 0x3f ) { reqLength++; - pSrc += 2; + ++i; continue; } } @@ -1488,8 +1288,7 @@ u_strFromJavaModifiedUTF8WithSub( return NULL; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; reqLength+=U16_LENGTH(ch); } diff --git a/deps/icu-small/source/common/utext.cpp b/deps/icu-small/source/common/utext.cpp index eb163530fbee22..6f3806f27db3f0 100644 --- a/deps/icu-small/source/common/utext.cpp +++ b/deps/icu-small/source/common/utext.cpp @@ -847,15 +847,11 @@ U_CDECL_END //------------------------------------------------------------------------------ // Chunk size. -// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes. -// Worst case there are six UTF-8 bytes per UChar. -// obsolete 6 byte form fd + 5 trails maps to fffd -// obsolete 5 byte form fc + 4 trails maps to fffd -// non-shortest 4 byte forms maps to fffd -// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit -// mapToUChars array size must allow for the worst case, 6. -// This could be brought down to 4, by treating fd and fc as pure illegal, -// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros. +// Must be less than 85 (256/3), 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.) +// The longest illegal byte sequence treated as a single error (and converted to U+FFFD) +// is a three-byte sequence (truncated four-byte sequence). // enum { UTF8_TEXT_CHUNK_SIZE=32 }; @@ -895,7 +891,7 @@ struct UTF8Buf { // 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*6+6]; // Map native offset from bufNativeStart to + 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; }; diff --git a/deps/icu-small/source/common/utf_impl.cpp b/deps/icu-small/source/common/utf_impl.cpp index 293e6f181f3a3f..f78c566e098884 100644 --- a/deps/icu-small/source/common/utf_impl.cpp +++ b/deps/icu-small/source/common/utf_impl.cpp @@ -7,7 +7,7 @@ * Corporation and others. All Rights Reserved. * ****************************************************************************** -* file name: utf_impl.c +* file name: utf_impl.cpp * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 @@ -27,7 +27,6 @@ #include "unicode/utypes.h" #include "unicode/utf.h" #include "unicode/utf8.h" -#include "unicode/utf_old.h" #include "uassert.h" /* @@ -55,10 +54,6 @@ * - SUB AX, BX (result) * -finish: * (BSR: Bit Scan Reverse, scans for a 1-bit, starting from the MSB) - * - * In Unicode, all UTF-8 byte sequences with more than 4 bytes are illegal; - * lead bytes above 0xf4 are illegal. - * We keep them in this table for skipping long ISO 10646-UTF-8 sequences. */ extern "C" U_EXPORT const uint8_t utf8_countTrailBytes[256]={ @@ -77,24 +72,24 @@ utf8_countTrailBytes[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, + // illegal C0 & C1 + // 2-byte lead bytes C2..DF + 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, + // 3-byte lead bytes E0..EF 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, - 3, 3, 3, /* illegal in Unicode */ - 4, 4, 4, 4, /* illegal in Unicode */ - 5, 5, /* illegal in Unicode */ - 0, 0 /* illegal bytes 0xfe and 0xff */ + // 4-byte lead bytes F0..F4 + // illegal F5..FF + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const UChar32 -utf8_minLegal[4]={ 0, 0x80, 0x800, 0x10000 }; - static const UChar32 utf8_errorValue[6]={ - UTF8_ERROR_VALUE_1, UTF8_ERROR_VALUE_2, UTF_ERROR_VALUE, 0x10ffff, - 0x3ffffff, 0x7fffffff + // Same values as UTF8_ERROR_VALUE_1, UTF8_ERROR_VALUE_2, UTF_ERROR_VALUE, + // but without relying on the obsolete unicode/utf_old.h. + 0x15, 0x9f, 0xffff, + 0x10ffff }; static UChar32 @@ -134,61 +129,59 @@ errorValue(int32_t count, int8_t strict) { */ U_CAPI UChar32 U_EXPORT2 utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { + // *pi is one after byte c. int32_t i=*pi; - uint8_t count=U8_COUNT_TRAIL_BYTES(c); - U_ASSERT(count <= 5); /* U8_COUNT_TRAIL_BYTES returns value 0...5 */ - if(i+count<=length || length<0) { - uint8_t trail; - - U8_MASK_LEAD_BYTE(c, count); - /* support NUL-terminated strings: do not read beyond the first non-trail byte */ - switch(count) { - /* each branch falls through to the next one */ - case 0: - /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ - case 5: - case 4: - /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - break; - case 3: - trail=s[i++]-0x80; - c=(c<<6)|trail; - /* c>=0x110 would result in code point>0x10ffff, outside Unicode */ - if(c>=0x110 || trail>0x3f) { break; } - U_FALLTHROUGH; - case 2: - trail=s[i++]-0x80; - c=(c<<6)|trail; - /* - * test for a surrogate d800..dfff unless we are lenient: - * before the last (c<<6), a surrogate is c=360..37f - */ - if(((c&0xffe0)==0x360 && strict!=-2) || trail>0x3f) { break; } - U_FALLTHROUGH; - case 1: - trail=s[i++]-0x80; - c=(c<<6)|trail; - if(trail>0x3f) { break; } - /* correct sequence - all trail bytes have (b7..b6)==(10) */ - if(c>=utf8_minLegal[count] && - /* strict: forbid non-characters like U+fffe */ - (strict<=0 || !U_IS_UNICODE_NONCHAR(c))) { + // length can be negative for NUL-terminated strings: Read and validate one byte at a time. + if(i==length || c>0xf4) { + // end of string, or not a lead byte + } else if(c>=0xf0) { + // Test for 4-byte sequences first because + // U8_NEXT() handles shorter valid sequences inline. + uint8_t t1=s[i], t2, t3; + c&=7; + if(U8_IS_VALID_LEAD4_AND_T1(c, t1) && + ++i!=length && (t2=s[i]-0x80)<=0x3f && + ++i!=length && (t3=s[i]-0x80)<=0x3f) { + ++i; + c=(c<<18)|((t1&0x3f)<<12)|(t2<<6)|t3; + // strict: forbid non-characters like U+fffe + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { *pi=i; return c; } - /* no default branch to optimize switch() - all values are covered */ } - } else { - /* too few bytes left */ - count=length-i; - } + } else if(c>=0xe0) { + c&=0xf; + if(strict!=-2) { + uint8_t t1=s[i], t2; + if(U8_IS_VALID_LEAD3_AND_T1(c, t1) && + ++i!=length && (t2=s[i]-0x80)<=0x3f) { + ++i; + c=(c<<12)|((t1&0x3f)<<6)|t2; + // strict: forbid non-characters like U+fffe + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + *pi=i; + return c; + } + } + } else { + // strict=-2 -> lenient: allow surrogates + uint8_t t1=s[i]-0x80, t2; + if(t1<=0x3f && (c>0 || t1>=0x20) && + ++i!=length && (t2=s[i]-0x80)<=0x3f) { + *pi=i+1; + return (c<<12)|(t1<<6)|t2; + } + } + } else if(c>=0xc2) { + uint8_t t1=s[i]-0x80; + if(t1<=0x3f) { + *pi=i+1; + return ((c-0xc0)<<6)|t1; + } + } // else 0x80<=c<0xc2 is not a lead byte /* error handling */ - i=*pi; - while(count>0 && U8_IS_TRAIL(s[i])) { - ++i; - --count; - } c=errorValue(i-*pi, strict); *pi=i; return c; @@ -232,7 +225,7 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool s+=i; offset=0; c=utf8_errorValue[length-1]; - UTF8_APPEND_CHAR_UNSAFE(s, offset, c); + U8_APPEND_UNSAFE(s, offset, c); i=i+offset; } } @@ -241,99 +234,99 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool U_CAPI UChar32 U_EXPORT2 utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict) { + // *pi is the index of byte c. int32_t i=*pi; - uint8_t b, count=1, shift=6; - - if(!U8_IS_TRAIL(c)) { return errorValue(0, strict); } - - /* extract value bits from the last trail byte */ - c&=0x3f; - - for(;;) { - if(i<=start) { - /* no lead byte at all */ - return errorValue(0, strict); - } - - /* read another previous byte */ - b=s[--i]; - if((uint8_t)(b-0x80)<0x7e) { /* 0x80<=b<0xfe */ - if(b&0x40) { - /* lead byte, this will always end the loop */ - uint8_t shouldCount=U8_COUNT_TRAIL_BYTES(b); - - if(count==shouldCount) { - /* set the new position */ - *pi=i; - U8_MASK_LEAD_BYTE(b, count); - c|=(UChar32)b<=4 || c>0x10ffff || c0 && U_IS_UNICODE_NONCHAR(c))) { - /* illegal sequence or (strict and non-character) */ - if(count>=4) { - count=3; + if(U8_IS_TRAIL(c) && i>start) { + uint8_t b1=s[--i]; + if(0xc2<=b1 && b1<0xe0) { + *pi=i; + return ((b1-0xc0)<<6)|(c&0x3f); + } else if(U8_IS_TRAIL(b1) && i>start) { + // Extract the value bits from the last trail byte. + c&=0x3f; + uint8_t b2=s[--i]; + if(0xe0<=b2 && b2<0xf0) { + b2&=0xf; + if(strict!=-2) { + if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + *pi=i; + c=(b2<<12)|((b1&0x3f)<<6)|c; + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + return c; + } else { + // strict: forbid non-characters like U+fffe + return errorValue(2, strict); } - c=errorValue(count, strict); - } else { - /* exit with correct c */ } } else { - /* the lead byte does not match the number of trail bytes */ - /* only set the position to the lead byte if it would - include the trail byte that we started with */ - if(count lenient: allow surrogates + b1-=0x80; + if((b2>0 || b1>=0x20)) { + *pi=i; + return (b2<<12)|(b1<<6)|c; + } + } + } else if(U8_IS_TRAIL(b2) && i>start) { + uint8_t b3=s[--i]; + if(0xf0<=b3 && b3<=0xf4) { + b3&=7; + if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { *pi=i; - c=errorValue(count, strict); - } else { - c=errorValue(0, strict); + c=(b3<<18)|((b2&0x3f)<<12)|((b1&0x3f)<<6)|c; + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + return c; + } else { + // strict: forbid non-characters like U+fffe + return errorValue(3, strict); + } } } - break; - } else if(count<5) { - /* trail byte */ - c|=(UChar32)(b&0x3f)<start) { - Z=I-5; - } else { - Z=start; - } - - /* return I if the sequence starting there is long enough to include i */ - do { - b=s[I]; - if((uint8_t)(b-0x80)>=0x7e) { /* not 0x80<=b<0xfe */ - break; - } else if(b>=0xc0) { - if(U8_COUNT_TRAIL_BYTES(b)>=(i-I)) { - return I; - } else { - break; + // Same as utf8_prevCharSafeBody(..., strict=-1) minus assembling code points. + int32_t orig_i=i; + uint8_t c=s[i]; + if(U8_IS_TRAIL(c) && i>start) { + uint8_t b1=s[--i]; + if(0xc2<=b1 && b1<0xe0) { + return i; + } else if(U8_IS_TRAIL(b1) && i>start) { + uint8_t b2=s[--i]; + if(0xe0<=b2 && b2<0xf0) { + if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + return i; + } + } else if(U8_IS_TRAIL(b2) && i>start) { + uint8_t b3=s[--i]; + if(0xf0<=b3 && b3<=0xf4) { + if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { + return i; + } + } + } else if(0xf0<=b2 && b2<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b2, b1)) { + // Truncated 4-byte sequence. + return i; } + } else if((0xe0<=b1 && b1<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b1, c)) || + (0xf0<=b1 && b1<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b1, c))) { + // Truncated 3- or 4-byte sequence. + return i; } - } while(Z<=--I); - - /* return i itself to be consistent with the FWD_1 macro */ - return i; + } + return orig_i; } diff --git a/deps/icu-small/source/common/utrie2.cpp b/deps/icu-small/source/common/utrie2.cpp index cec7224d90f5de..8f9183bafad71f 100644 --- a/deps/icu-small/source/common/utrie2.cpp +++ b/deps/icu-small/source/common/utrie2.cpp @@ -746,7 +746,7 @@ uint16_t BackwardUTrie2StringIterator::previous16() { codePointLimit=codePointStart; if(start>=codePointStart) { codePoint=U_SENTINEL; - return 0; + return trie->errorValue; } uint16_t result; UTRIE2_U16_PREV16(trie, start, codePointStart, codePoint, result); @@ -757,7 +757,7 @@ uint16_t ForwardUTrie2StringIterator::next16() { codePointStart=codePointLimit; if(codePointLimit==limit) { codePoint=U_SENTINEL; - return 0; + return trie->errorValue; } uint16_t result; UTRIE2_U16_NEXT16(trie, codePointLimit, limit, codePoint, result); diff --git a/deps/icu-small/source/common/utrie2.h b/deps/icu-small/source/common/utrie2.h index 8e87bf8fbd3ea7..8e1caa5e90bde2 100644 --- a/deps/icu-small/source/common/utrie2.h +++ b/deps/icu-small/source/common/utrie2.h @@ -20,6 +20,7 @@ #define __UTRIE2_H__ #include "unicode/utypes.h" +#include "unicode/utf8.h" #include "putilimp.h" #include "udataswp.h" @@ -54,6 +55,8 @@ typedef struct UTrie UTrie; * is truncated, omitting both the BMP portion and the high range. * - There is a special small index for 2-byte UTF-8, and the initial data * entries are designed for fast 1/2-byte UTF-8 lookup. + * Starting with ICU 60, C0 and C1 are not recognized as UTF-8 lead bytes any more at all, + * and the associated 2-byte indexes are unused. */ /** @@ -933,29 +936,29 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, /** Internal UTF-8 next-post-increment: get the next code point's data. */ #define _UTRIE2_U8_NEXT(trie, ascii, data, src, limit, result) { \ uint8_t __lead=(uint8_t)*(src)++; \ - if(__lead<0xc0) { \ + if(U8_IS_SINGLE(__lead)) { \ (result)=(trie)->ascii[__lead]; \ } else { \ uint8_t __t1, __t2; \ - if( /* handle U+0000..U+07FF inline */ \ - __lead<0xe0 && (src)<(limit) && \ - (__t1=(uint8_t)(*(src)-0x80))<=0x3f \ - ) { \ - ++(src); \ - (result)=(trie)->data[ \ - (trie)->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET-0xc0)+__lead]+ \ - __t1]; \ - } else if( /* handle U+0000..U+CFFF inline */ \ - __lead<0xed && ((src)+1)<(limit) && \ - (__t1=(uint8_t)(*(src)-0x80))<=0x3f && (__lead>0xe0 || __t1>=0x20) && \ + if( /* handle U+0800..U+FFFF inline */ \ + 0xe0<=__lead && __lead<0xf0 && ((src)+1)<(limit) && \ + U8_IS_VALID_LEAD3_AND_T1(__lead, __t1=(uint8_t)*(src)) && \ (__t2=(uint8_t)(*((src)+1)-0x80))<= 0x3f \ ) { \ (src)+=2; \ (result)=(trie)->data[ \ ((int32_t)((trie)->index[((__lead-0xe0)<<(12-UTRIE2_SHIFT_2))+ \ - (__t1<<(6-UTRIE2_SHIFT_2))+(__t2>>UTRIE2_SHIFT_2)]) \ + ((__t1&0x3f)<<(6-UTRIE2_SHIFT_2))+(__t2>>UTRIE2_SHIFT_2)]) \ <=0xc2 && (src)<(limit) && \ + (__t1=(uint8_t)(*(src)-0x80))<=0x3f \ + ) { \ + ++(src); \ + (result)=(trie)->data[ \ + (trie)->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET-0xc0)+__lead]+ \ + __t1]; \ } else { \ int32_t __index=utrie2_internalU8NextIndex((trie), __lead, (const uint8_t *)(src), \ (const uint8_t *)(limit)); \ @@ -968,7 +971,7 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, /** Internal UTF-8 pre-decrement-previous: get the previous code point's data. */ #define _UTRIE2_U8_PREV(trie, ascii, data, start, src, result) { \ uint8_t __b=(uint8_t)*--(src); \ - if(__b<0x80) { \ + if(U8_IS_SINGLE(__b)) { \ (result)=(trie)->ascii[__b]; \ } else { \ int32_t __index=utrie2_internalU8PrevIndex((trie), __b, (const uint8_t *)(start), \ @@ -980,11 +983,4 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, U_CDECL_END -/** - * Work around MSVC 2003 optimization bugs. - */ -#if defined (U_HAVE_MSVC_2003_OR_EARLIER) -#pragma optimize("", off) -#endif - #endif diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index f2cff2d5ea33a1..9b8d3ded2fddd1 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -1015,8 +1015,8 @@ UTS46::checkLabelBiDi(const UChar *label, int32_t labelLength, IDNAInfo &info) c ) { info.isOkBiDi=FALSE; } - // Get the directionalities of the intervening characters. - uint32_t mask=0; + // Add the directionalities of the intervening characters. + uint32_t mask=firstMask|lastMask; while(i(uprv_strlen(label)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->labelToASCII_UTF8(src, sink, info, *pErrorCode); @@ -1431,7 +1431,7 @@ uidna_labelToUnicodeUTF8(const UIDNA *idna, if(!checkArgs(label, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(label, length<0 ? uprv_strlen(label) : length); + StringPiece src(label, length<0 ? static_cast(uprv_strlen(label)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->labelToUnicodeUTF8(src, sink, info, *pErrorCode); @@ -1447,7 +1447,7 @@ uidna_nameToASCII_UTF8(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(name, length<0 ? uprv_strlen(name) : length); + StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->nameToASCII_UTF8(src, sink, info, *pErrorCode); @@ -1463,7 +1463,7 @@ uidna_nameToUnicodeUTF8(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(name, length<0 ? uprv_strlen(name) : length); + StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->nameToUnicodeUTF8(src, sink, info, *pErrorCode); diff --git a/deps/icu-small/source/data/in/icudt59l.dat b/deps/icu-small/source/data/in/icudt60l.dat similarity index 50% rename from deps/icu-small/source/data/in/icudt59l.dat rename to deps/icu-small/source/data/in/icudt60l.dat index e7fb9b2598da5b1e305b826e9e7ab19ce6b1a913..2e04376ae8bc7dfe3fc03814a3d21ca3c060cc49 100644 GIT binary patch delta 688754 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�H=9>u=%3;^57!SjCG= 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

X^U(%#xeL@p)lUv;84tJ^V)?GBw%tcyg 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 V5sQ5VMPLpSzps~w>F%WS{{RxmzDocA diff --git a/deps/icu-small/source/i18n/affixpatternparser.cpp b/deps/icu-small/source/i18n/affixpatternparser.cpp index 0d65d13057ec8e..d9e122953af53e 100644 --- a/deps/icu-small/source/i18n/affixpatternparser.cpp +++ b/deps/icu-small/source/i18n/affixpatternparser.cpp @@ -22,12 +22,12 @@ #include "uassert.h" #include "unistrappender.h" - static UChar gDefaultSymbols[] = {0xa4, 0xa4, 0xa4}; +static const UChar gDefaultSymbols[] = {0xa4, 0xa4, 0xa4}; -static UChar gPercent = 0x25; -static UChar gPerMill = 0x2030; -static UChar gNegative = 0x2D; -static UChar gPositive = 0x2B; +static const UChar gPercent = 0x25; +static const UChar gPerMill = 0x2030; +static const UChar gNegative = 0x2D; +static const UChar gPositive = 0x2B; #define PACK_TOKEN_AND_LENGTH(t, l) ((UChar) (((t) << 8) | (l & 0xFF))) @@ -226,7 +226,7 @@ AffixPattern::append(const AffixPattern &other) { addLiteral(literal.getBuffer(), 0, literal.length()); break; case kCurrency: - addCurrency(iter.getTokenLength()); + addCurrency(static_cast(iter.getTokenLength())); break; default: add(iter.getTokenType()); @@ -481,7 +481,7 @@ AffixPattern::parseUserAffixString( break; case 0xA4: appender.flush(); - appendTo.add(kCurrency, tokenSize); + appendTo.add(kCurrency, static_cast(tokenSize)); break; default: appender.append(token); diff --git a/deps/icu-small/source/i18n/anytrans.cpp b/deps/icu-small/source/i18n/anytrans.cpp index e7d5375d693b14..d06469e2ae2746 100644 --- a/deps/icu-small/source/i18n/anytrans.cpp +++ b/deps/icu-small/source/i18n/anytrans.cpp @@ -31,9 +31,13 @@ static const UChar TARGET_SEP = 45; // '-' static const UChar VARIANT_SEP = 47; // '/' -static const UChar ANY[] = {65,110,121,0}; // "Any" +static const UChar ANY[] = {0x41,0x6E,0x79,0}; // "Any" static const UChar NULL_ID[] = {78,117,108,108,0}; // "Null" -static const UChar LATIN_PIVOT[] = {45,76,97,116,105,110,59,76,97,116,105,110,45,0}; // "-Latin;Latin-" +static const UChar LATIN_PIVOT[] = {0x2D,0x4C,0x61,0x74,0x6E,0x3B,0x4C,0x61,0x74,0x6E,0x2D,0}; // "-Latn;Latn-" + +// initial size for an Any-XXXX transform's cache of script-XXXX transforms +// (will grow as necessary, but we don't expect to have source text with more than 7 scripts) +#define ANY_TRANS_CACHE_INIT_SIZE 7 //------------------------------------------------------------ @@ -186,7 +190,7 @@ AnyTransliterator::AnyTransliterator(const UnicodeString& id, Transliterator(id, NULL), targetScript(theTargetScript) { - cache = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &ec); + cache = uhash_openSize(uhash_hashLong, uhash_compareLong, NULL, ANY_TRANS_CACHE_INIT_SIZE, &ec); if (U_FAILURE(ec)) { return; } @@ -212,7 +216,7 @@ AnyTransliterator::AnyTransliterator(const AnyTransliterator& o) : { // Don't copy the cache contents UErrorCode ec = U_ZERO_ERROR; - cache = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &ec); + cache = uhash_openSize(uhash_hashLong, uhash_compareLong, NULL, ANY_TRANS_CACHE_INIT_SIZE, &ec); if (U_FAILURE(ec)) { return; } @@ -286,7 +290,7 @@ Transliterator* AnyTransliterator::getTransliterator(UScriptCode source) const { } if (t == NULL) { UErrorCode ec = U_ZERO_ERROR; - UnicodeString sourceName(uscript_getName(source), -1, US_INV); + UnicodeString sourceName(uscript_getShortName(source), -1, US_INV); UnicodeString id(sourceName); id.append(TARGET_SEP).append(target); diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 5b7d64d20d0d63..426bd7904cbd84 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -66,10 +66,8 @@ #if !UCONFIG_NO_SERVICE static icu::ICULocaleService* gService = NULL; static icu::UInitOnce gServiceInitOnce = U_INITONCE_INITIALIZER; -#endif // INTERNAL - for cleanup - U_CDECL_BEGIN static UBool calendar_cleanup(void) { #if !UCONFIG_NO_SERVICE @@ -82,6 +80,7 @@ static UBool calendar_cleanup(void) { return TRUE; } U_CDECL_END +#endif // ------------------------------------------ // @@ -234,6 +233,8 @@ static ECalType getCalendarType(const char *s) { return CALTYPE_UNKNOWN; } +#if !UCONFIG_NO_SERVICE +// Only used with service registration. static UBool isStandardSupportedKeyword(const char *keyword, UErrorCode& status) { if(U_FAILURE(status)) { return FALSE; @@ -242,6 +243,7 @@ static UBool isStandardSupportedKeyword(const char *keyword, UErrorCode& status) return (calType != CALTYPE_UNKNOWN); } +// only used with service registration. static void getCalendarKeyword(const UnicodeString &id, char *targetBuffer, int32_t targetBufferSize) { UnicodeString calendarKeyword = UNICODE_STRING_SIMPLE("calendar="); int32_t calKeyLen = calendarKeyword.length(); @@ -255,6 +257,7 @@ static void getCalendarKeyword(const UnicodeString &id, char *targetBuffer, int3 } targetBuffer[keyLen] = 0; } +#endif static ECalType getCalendarTypeForLocale(const char *locid) { UErrorCode status = U_ZERO_ERROR; @@ -2966,7 +2969,7 @@ void Calendar::computeTime(UErrorCode& status) { // } #endif - int32_t millisInDay; + double millisInDay; // We only use MILLISECONDS_IN_DAY if it has been set by the user. // This makes it possible for the caller to set the calendar to a @@ -3086,10 +3089,10 @@ UBool Calendar::getImmediatePreviousZoneTransition(UDate base, UDate *transition * reflects local zone wall time. * @stable ICU 2.0 */ -int32_t Calendar::computeMillisInDay() { +double Calendar::computeMillisInDay() { // Do the time portion of the conversion. - int32_t millisInDay = 0; + double millisInDay = 0; // Find the best set of fields specifying the time of day. There // are only two possibilities here; the HOUR_OF_DAY or the @@ -3131,7 +3134,7 @@ int32_t Calendar::computeMillisInDay() { * or range. * @stable ICU 2.0 */ -int32_t Calendar::computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec) { +int32_t Calendar::computeZoneOffset(double millis, double millisInDay, UErrorCode &ec) { int32_t rawOffset, dstOffset; UDate wall = millis + millisInDay; BasicTimeZone* btz = getBasicTimeZone(); diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index 7766187b934d4a..b7348a1d16f1e1 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -63,8 +63,10 @@ static icu::Locale* availableLocaleList = NULL; static int32_t availableLocaleListCount; +#if !UCONFIG_NO_SERVICE static icu::ICULocaleService* gService = NULL; static icu::UInitOnce gServiceInitOnce = U_INITONCE_INITIALIZER; +#endif static icu::UInitOnce gAvailableLocaleListInitOnce; /** diff --git a/deps/icu-small/source/i18n/collationdatareader.cpp b/deps/icu-small/source/i18n/collationdatareader.cpp index 636eb14b7c70cb..0eb1861343cdfd 100644 --- a/deps/icu-small/source/i18n/collationdatareader.cpp +++ b/deps/icu-small/source/i18n/collationdatareader.cpp @@ -419,7 +419,8 @@ CollationDataReader::read(const CollationTailoring *base, const uint8_t *inBytes tailoring.data, ts, fastLatinPrimaries, UPRV_LENGTHOF(fastLatinPrimaries)); if(options == ts.options && ts.variableTop != 0 && reorderCodesLength == ts.reorderCodesLength && - uprv_memcmp(reorderCodes, ts.reorderCodes, reorderCodesLength * 4) == 0 && + (reorderCodesLength == 0 || + uprv_memcmp(reorderCodes, ts.reorderCodes, reorderCodesLength * 4) == 0) && fastLatinOptions == ts.fastLatinOptions && (fastLatinOptions < 0 || uprv_memcmp(fastLatinPrimaries, ts.fastLatinPrimaries, diff --git a/deps/icu-small/source/i18n/collationdatawriter.cpp b/deps/icu-small/source/i18n/collationdatawriter.cpp index a91119d8dfa4c9..823c8eb0111d31 100644 --- a/deps/icu-small/source/i18n/collationdatawriter.cpp +++ b/deps/icu-small/source/i18n/collationdatawriter.cpp @@ -224,7 +224,7 @@ CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion, int32_t totalSize = indexesLength * 4; if(hasMappings && (isBase || data.jamoCE32s != baseData->jamoCE32s)) { - indexes[CollationDataReader::IX_JAMO_CE32S_START] = data.jamoCE32s - data.ce32s; + indexes[CollationDataReader::IX_JAMO_CE32S_START] = static_cast(data.jamoCE32s - data.ce32s); } else { indexes[CollationDataReader::IX_JAMO_CE32S_START] = -1; } diff --git a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp index e889697d8a5007..e5ba2f0e21dd82 100644 --- a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp +++ b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp @@ -607,7 +607,7 @@ CollationFastLatinBuilder::encodeContractions(UErrorCode &errorCode) { } UBool firstTriple = TRUE; for(int32_t index = (int32_t)ce & 0x7fffffff;; index += 3) { - int32_t x = contractionCEs.elementAti(index); + int32_t x = static_cast(contractionCEs.elementAti(index)); if((uint32_t)x == CollationFastLatin::CONTR_CHAR_MASK && !firstTriple) { break; } int64_t cce0 = contractionCEs.elementAti(index + 1); int64_t cce1 = contractionCEs.elementAti(index + 2); diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index 86b12b917cb797..19841ee6487ad2 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -1,13 +1,13 @@ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: collationfcd.cpp - * - * machine-generated by: icu/tools/unicode/c/genuca/genuca.cpp - */ +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: collationfcd.cpp +// +// machine-generated by: icu/tools/unicode/c/genuca/genuca.cpp + #include "unicode/utypes.h" @@ -24,25 +24,25 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 8,0,9,0xa,0,0,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0x10, 0x11,0x12,0x13,0,0,0,0x14,0x15,0,0x16,0x17,0,0,0x16,0x18,0, 0,0x16,0x18,0,0,0x16,0x18,0,0,0x16,0x18,0,0,0,0x18,0, -0,0,0x19,0,0,0x16,0x18,0,0,0,0x18,0,0,0,0x1a,0, -0,0x1b,0x1c,0,0,0x1d,0x1c,0,0x1d,0x1e,0,0x1f,0x20,0,0x21,0, -0,0x22,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x23,0,0,0,0,0, +0,0,0x19,0,0,0x16,0x18,0,0,0x1a,0x18,0,0,0,0x1b,0, +0,0x1c,0x1d,0,0,0x1e,0x1d,0,0x1e,0x1f,0,0x20,0x21,0,0x22,0, +0,0x23,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x24,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x24,0x24,0,0,0,0,0x25,0, -0,0,0,0,0,0x26,0,0,0,0x13,0,0,0,0,0,0, -0x27,0,0,0x28,0,0x29,0,0,0,0x24,0x2a,0x10,0,0x2b,0,0x2c, -0,0x2d,0,0,0,0,0x2e,0x2f,0,0,0,0,0,0,1,0x30, +0,0,0,0,0,0,0,0,0x25,0x25,0,0,0,0,0x26,0, +0,0,0,0,0,0x27,0,0,0,0x13,0,0,0,0,0,0, +0x28,0,0,0x29,0,0x2a,0,0,0,0x25,0x2b,0x10,0,0x2c,0,0x2d, +0,0x2e,0,0,0,0,0x2f,0x30,0,0,0,0,0,0,1,0x31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x31,0x32,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x32,0x33,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x33,0,0,0,0x34,0,0,0,1, +0,0,0,0,0,0,0,0x34,0,0,0,0x35,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x35,0,0,0x36,0,0,0,0,0,0,0,0,0,0,0, +0,0x36,0,0,0x37,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,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,9 +101,9 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x37,0x38,0,0,0x39,0,0,0,0,0,0,0,0, -0x21,0,0,0,0,0,0x2a,0x3a,0,0x3b,0x3c,0,0,0x3c,0x3d,0, -0,0,0,0,0,0x3e,0x3f,0x40,0,0,0,0,0,0,0,0x18, +0,0,0,0x38,0x39,0,0,0x3a,0,0,0,0,0,0,0,0, +0x22,0,0,0,0,0,0x2b,0x3b,0,0x3c,0x3d,0,0,0x3d,0x3e,0, +0,0,0,0,0,0x3f,0x40,0x41,0,0,0,0,0,0,0,0x18, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -126,7 +126,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x41,0x42,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x42,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, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -143,17 +143,17 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x43,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::lcccBits[68]={ +const uint32_t CollationFCD::lcccBits[69]={ 0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff, -0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10000000,0x1e2000,0x2000,0x602000,0x400,0x7000000,0xf00,0x3000000,0x2a00000,0x3c3e0000, -0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd, -0xf83fffff,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2, -0x400000,0x40000b5,0x5108000,0x40000000 +0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10000000,0x1e2000,0x2000,0x602000,0x18000000,0x400,0x7000000,0xf00,0x3000000,0x2a00000, +0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000, +0x31021fd,0xfbffffff,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000, +2,0x400000,0x40000f5,0x5108000,0x40000000 }; const uint8_t CollationFCD::tcccIndex[2048]={ @@ -163,25 +163,25 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0x1c,0x1d,0x1e,0x1f,0,0,0x20,0x21,0x22,0x23,0x24,0,0,0,0,0x25, 0x26,0x27,0x28,0,0,0,0x29,0x2a,0,0x2b,0x2c,0,0,0x2d,0x2e,0, 0,0x2f,0x30,0,0,0x2d,0x31,0,0,0x2d,0x32,0,0,0,0x31,0, -0,0,0x33,0,0,0x2d,0x31,0,0,0,0x31,0,0,0,0x34,0, -0,0x35,0x36,0,0,0x37,0x36,0,0x37,0x38,0,0x39,0x3a,0,0x3b,0, -0,0x3c,0,0,0x31,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x3d,0,0,0,0,0, +0,0,0x33,0,0,0x2d,0x31,0,0,0x34,0x31,0,0,0,0x35,0, +0,0x36,0x37,0,0,0x38,0x37,0,0x38,0x39,0,0x3a,0x3b,0,0x3c,0, +0,0x3d,0,0,0x31,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x3e,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3e,0x3e,0,0,0,0,0x3f,0, -0,0,0,0,0,0x40,0,0,0,0x28,0,0,0,0,0,0, -0x41,0,0,0x42,0,0x43,0,0,0,0x3e,0x44,0x25,0,0x45,0,0x46, -0,0x47,0,0,0,0,0x48,0x49,0,0,0,0,0,0,1,0x4a, -1,1,1,1,0x4b,1,1,0x4c,0x4d,1,0x4e,0x4f,1,0x50,0x51,0x52, -0,0,0,0,0,0,0x53,0x54,0,0x55,0,0,0x56,0x57,0x58,0, -0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0,0x5f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3f,0x3f,0,0,0,0,0x40,0, +0,0,0,0,0,0x41,0,0,0,0x28,0,0,0,0,0,0, +0x42,0,0,0x43,0,0x44,0,0,0,0x3f,0x45,0x25,0,0x46,0,0x47, +0,0x48,0,0,0,0,0x49,0x4a,0,0,0,0,0,0,1,0x4b, +1,1,1,1,0x4c,1,1,0x4d,0x4e,1,0x4f,0x50,1,0x51,0x52,0x53, +0,0,0,0,0,0,0x54,0x55,0,0x56,0,0,0x57,0x58,0x59,0, +0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0,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,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0x2d,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x60,0,0,0,0x61,0,0,0,1, +0,0,0,0,0,0,0,0x61,0,0,0,0x62,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x62,0x63,0x64,0x65,0x63,0x64,0x66,0,0,0,0,0,0,0,0, +0,0x63,0x64,0x65,0x66,0x64,0x65,0x67,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -240,9 +240,9 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x67,0x68,0,0,0x69,0,0,0,0,0,0,0,0, -0x3b,0,0,0,0,0,0x44,0x6a,0,0x6b,0x6c,0,0,0x6c,0x6d,0, -0,0,0,0,0,0x6e,0x6f,0x70,0,0,0,0,0,0,0,0x31, +0,0,0,0x68,0x69,0,0,0x6a,0,0,0,0,0,0,0,0, +0x3c,0,0,0,0,0,0x45,0x6b,0,0x6c,0x6d,0,0,0x6d,0x6e,0, +0,0,0,0,0,0x6f,0x70,0x71,0,0,0,0,0,0,0,0x31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -265,7 +265,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x71,0x72,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x72,0x73,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -282,20 +282,20 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3d,0x73,0x74,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3e,0x74,0x75,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xe,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::tcccBits[117]={ +const uint32_t CollationFCD::tcccBits[118]={ 0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760, 0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000, 0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000,0x10480000, -0x4e002000,0x2000,0x30002000,0x602100,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000, -0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf83fffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff, -0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000,0x3c0f, -0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2, -0x400000,0x40000b5,0x5108000,0x5f7ffc00,0x7fdb +0x4e002000,0x2000,0x30002000,0x602100,0x18000000,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000, +0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xfbffffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f, +0x3fffffff,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000, +0x3c0f,0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000, +2,0x400000,0x40000f5,0x5108000,0x5f7ffc00,0x7fdb }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/collationiterator.h b/deps/icu-small/source/i18n/collationiterator.h index 2666b248fa094e..d0910ea57b40a2 100644 --- a/deps/icu-small/source/i18n/collationiterator.h +++ b/deps/icu-small/source/i18n/collationiterator.h @@ -28,6 +28,21 @@ class SkippedState; class UCharsTrie; class UVector32; +/* Large enough for CEs of most short strings. */ +#define CEBUFFER_INITIAL_CAPACITY 40 + +// Export an explicit template instantiation of the MaybeStackArray that +// is used as a data member of CEBuffer. +// +// MSVC requires this, even though it should not be necessary. +// No direct access to the MaybeStackArray leaks out of the i18n library. +// +// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. +// +#if defined (_MSC_VER) +template class U_I18N_API MaybeStackArray; +#endif + /** * Collation element iterator and abstract character iterator. * @@ -36,10 +51,10 @@ class UVector32; */ class U_I18N_API CollationIterator : public UObject { private: - class CEBuffer { + class U_I18N_API CEBuffer { private: /** Large enough for CEs of most short strings. */ - static const int32_t INITIAL_CAPACITY = 40; + static const int32_t INITIAL_CAPACITY = CEBUFFER_INITIAL_CAPACITY; public: CEBuffer() : length(0) {} ~CEBuffer(); diff --git a/deps/icu-small/source/i18n/collationweights.cpp b/deps/icu-small/source/i18n/collationweights.cpp index eb238df9423e93..aec0037861a36f 100644 --- a/deps/icu-small/source/i18n/collationweights.cpp +++ b/deps/icu-small/source/i18n/collationweights.cpp @@ -527,7 +527,7 @@ CollationWeights::allocWeights(uint32_t lowerLimit, uint32_t upperLimit, int32_t #ifdef UCOL_DEBUG printf("lengthen the short ranges from %ld bytes to %ld and iterate\n", minLength, minLength+1); #endif - for(int32_t i=0; ranges[i].length==minLength; ++i) { + for(int32_t i=0; isetParseIntegerOnly(TRUE); + newNumberFormat->setGroupingUsed(FALSE); } //---------------------------------------------------------------------- @@ -738,7 +739,7 @@ DateFormat::setBooleanAttribute(UDateFormatBooleanAttribute attr, UBool DateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/*status*/) const { - return fBoolFlags.get(attr); + return static_cast(fBoolFlags.get(attr)); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index f7ec1e6dc2dded..e364ecb708cf66 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -340,7 +340,7 @@ const DayPeriodRules *DayPeriodRules::getInstance(const Locale &locale, UErrorCo // does), return NULL. if(U_FAILURE(errorCode)) { return NULL; } - const char *localeCode = locale.getName(); + const char *localeCode = locale.getBaseName(); char name[ULOC_FULLNAME_CAPACITY]; char parentName[ULOC_FULLNAME_CAPACITY]; diff --git a/deps/icu-small/source/i18n/dcfmtsym.cpp b/deps/icu-small/source/i18n/dcfmtsym.cpp index c702c2e7d0e8cb..f840fde2abaca3 100644 --- a/deps/icu-small/source/i18n/dcfmtsym.cpp +++ b/deps/icu-small/source/i18n/dcfmtsym.cpp @@ -97,9 +97,7 @@ static const char *gNumberElementKeys[DecimalFormatSymbols::kFormatSymbolCount] // Initializes this with the decimal format symbols in the default locale. DecimalFormatSymbols::DecimalFormatSymbols(UErrorCode& status) - : UObject(), - locale() -{ + : UObject(), locale() { initialize(locale, status, TRUE); } @@ -107,16 +105,17 @@ DecimalFormatSymbols::DecimalFormatSymbols(UErrorCode& status) // Initializes this with the decimal format symbols in the desired locale. DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, UErrorCode& status) - : UObject(), - locale(loc) -{ + : UObject(), locale(loc) { initialize(locale, status); } +DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, const NumberingSystem& ns, UErrorCode& status) + : UObject(), locale(loc) { + initialize(locale, status, FALSE, &ns); +} + DecimalFormatSymbols::DecimalFormatSymbols() - : UObject(), - locale(Locale::getRoot()), - currPattern(NULL) { + : UObject(), locale(Locale::getRoot()), currPattern(NULL) { *validLocale = *actualLocale = 0; initialize(); } @@ -342,7 +341,8 @@ CurrencySpacingSink::~CurrencySpacingSink() {} } // namespace void -DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData) +DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, + UBool useLastResortData, const NumberingSystem* ns) { if (U_FAILURE(status)) { return; } *validLocale = *actualLocale = 0; @@ -355,7 +355,13 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us // Next get the numbering system for this locale and set zero digit // and the digit string based on the numbering system for the locale // - LocalPointer ns(NumberingSystem::createInstance(loc, status)); + LocalPointer nsLocal; + if (ns == nullptr) { + // Use the numbering system according to the locale. + // Save it into a LocalPointer so it gets cleaned up. + nsLocal.adoptInstead(NumberingSystem::createInstance(loc, status)); + ns = nsLocal.getAlias(); + } const char *nsName; if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { nsName = ns->getName(); @@ -433,12 +439,13 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out UChar curriso[4]; UnicodeString tempStr; - ucurr_forLocale(locStr, curriso, 4, &internalStatus); - - uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); - if (U_SUCCESS(internalStatus)) { - fSymbols[kIntlCurrencySymbol].setTo(curriso, -1); - fSymbols[kCurrencySymbol] = tempStr; + int32_t currisoLength = ucurr_forLocale(locStr, curriso, UPRV_LENGTHOF(curriso), &internalStatus); + if (U_SUCCESS(internalStatus) && currisoLength == 3) { + uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); + if (U_SUCCESS(internalStatus)) { + fSymbols[kIntlCurrencySymbol].setTo(curriso, currisoLength); + fSymbols[kCurrencySymbol] = tempStr; + } } /* else use the default values. */ diff --git a/deps/icu-small/source/i18n/decNumber.cpp b/deps/icu-small/source/i18n/decNumber.cpp index 3ae22b1b42f472..363f93ea72de40 100644 --- a/deps/icu-small/source/i18n/decNumber.cpp +++ b/deps/icu-small/source/i18n/decNumber.cpp @@ -386,7 +386,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *dn, uInt uin) { *up=(Unit)(uin%(DECDPUNMAX+1)); uin=uin/(DECDPUNMAX+1); } - dn->digits=decGetDigits(dn->lsu, up-dn->lsu); + dn->digits=decGetDigits(dn->lsu, static_cast(up - dn->lsu)); return dn; } /* decNumberFromUInt32 */ @@ -666,7 +666,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char /* Handle decimal point... */ if (dotchar!=NULL && dotchar(last-dotchar); /* adjust exponent */ /* [we can now ignore the .] */ /* OK, the digits string is good. Assemble in the decNumber, or in */ @@ -866,7 +866,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *res, const decNumber * } /* both OK */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc - res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -1253,7 +1253,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *res, const decNumbe } /* each digit */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc - res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -1880,7 +1880,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *res, const decNumber *l } /* non-zero */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc-res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -2586,7 +2586,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *res, const decNumbe } /* whole units to rotate */ /* the rotation may have left an undetermined number of zeros */ /* on the left, so true length needs to be calculated */ - res->digits=decGetDigits(res->lsu, msumax-res->lsu+1); + res->digits=decGetDigits(res->lsu, static_cast(msumax-res->lsu+1)); } /* rotate needed */ } /* rhs OK */ } /* numerics */ @@ -3310,7 +3310,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *res, const decNumber * } /* non-zero */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc-res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -5101,7 +5101,7 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, } /* p */ *up=(Unit)item; up++; /* [final needs no division] */ } /* lp */ - accunits=up-acc; /* count of units */ + accunits = static_cast(up-acc); /* count of units */ } else { /* here to use units directly, without chunking ['old code'] */ #endif @@ -6587,11 +6587,11 @@ static Int decUnitAddSub(const Unit *a, Int alength, /* OK, all A and B processed; might still have carry or borrow */ /* return number of Units in the result, negated if a borrow */ - if (carry==0) return c-clsu; /* no carry, so no more to do */ + if (carry==0) return static_cast(c-clsu); /* no carry, so no more to do */ if (carry>0) { /* positive carry */ *c=(Unit)carry; /* place as new unit */ c++; /* .. */ - return c-clsu; + return static_cast(c-clsu); } /* -ve carry: it's a borrow; complement needed */ add=1; /* temporary carry... */ @@ -6614,7 +6614,7 @@ static Int decUnitAddSub(const Unit *a, Int alength, *c=(Unit)(add-carry-1); c++; /* interesting, include it */ } - return clsu-c; /* -ve result indicates borrowed */ + return static_cast(clsu-c); /* -ve result indicates borrowed */ } /* decUnitAddSub */ /* ------------------------------------------------------------------ */ @@ -6798,7 +6798,7 @@ static Int decShiftToLeast(Unit *uar, Int units, Int shift) { if (cut==DECDPUN) { /* unit-boundary case; easy */ up=uar+D2U(shift); for (; up(target-uar); } /* messier */ @@ -6826,7 +6826,7 @@ static Int decShiftToLeast(Unit *uar, Int units, Int shift) { count-=cut; if (count<=0) break; } - return target-uar+1; + return static_cast(target-uar+1); } /* decShiftToLeast */ #if DECSUBSET @@ -7690,7 +7690,7 @@ static decNumber *decDecap(decNumber *dn, Int drop) { cut=MSUDIGITS(dn->digits-drop); /* digits to be in use in msu */ if (cut!=DECDPUN) *msu%=powers[cut]; /* clear left digits */ /* that may have left leading zero digits, so do a proper count... */ - dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1); + dn->digits=decGetDigits(dn->lsu, static_cast(msu-dn->lsu+1)); return dn; } /* decDecap */ diff --git a/deps/icu-small/source/i18n/decfmtst.cpp b/deps/icu-small/source/i18n/decfmtst.cpp index 5dff3c164509e5..5943affad4eb06 100644 --- a/deps/icu-small/source/i18n/decfmtst.cpp +++ b/deps/icu-small/source/i18n/decfmtst.cpp @@ -71,7 +71,7 @@ static const UChar gStrictDashEquivalentsPattern[] = { // [ \ - MINUS ] 0x005B, 0x005C, 0x002D, 0x2212, 0x005D, 0x0000}; -static UChar32 gMinusSigns[] = { +static const UChar32 gMinusSigns[] = { 0x002D, 0x207B, 0x208B, @@ -80,7 +80,7 @@ static UChar32 gMinusSigns[] = { 0xFE63, 0xFF0D}; -static UChar32 gPlusSigns[] = { +static const UChar32 gPlusSigns[] = { 0x002B, 0x207A, 0x208A, diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index 116c0c90bb198f..80a9446e146f6c 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -1423,8 +1423,8 @@ UBool DecimalFormat::subparse(const UnicodeString& text, UBool strictFail = FALSE; // did we exit with a strict parse failure? - int32_t lastGroup = -1; // where did we last see a grouping separator? - int32_t digitStart = position; + int32_t lastGroup = -1; // after which digit index did we last see a grouping separator? + int32_t currGroup = -1; // for temporary storage the digit index of the current grouping separator int32_t gs2 = fImpl->fEffGrouping.fGrouping2 == 0 ? fImpl->fEffGrouping.fGrouping : fImpl->fEffGrouping.fGrouping2; const UnicodeString *decimalString; @@ -1513,16 +1513,17 @@ UBool DecimalFormat::subparse(const UnicodeString& text, // before that, the group must == the secondary group // length, else it can be <= the the secondary group // length. - if ((lastGroup != -1 && backup - lastGroup - 1 != gs2) || - (lastGroup == -1 && position - digitStart - 1 > gs2)) { + if ((lastGroup != -1 && currGroup - lastGroup != gs2) || + (lastGroup == -1 && digitCount - 1 > gs2)) { strictFail = TRUE; break; } - lastGroup = backup; + lastGroup = currGroup; } // Cancel out backup setting (see grouping handler below) + currGroup = -1; backup = -1; sawDigit = TRUE; @@ -1561,6 +1562,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, // Ignore grouping characters, if we are using them, but require // that they be followed by a digit. Otherwise we backup and // reprocess them. + currGroup = digitCount; backup = position; position += groupingStringLength; sawGrouping=TRUE; @@ -1571,7 +1573,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, { if (strictParse) { if (backup != -1 || - (lastGroup != -1 && position - lastGroup != fImpl->fEffGrouping.fGrouping + 1)) { + (lastGroup != -1 && digitCount - lastGroup != fImpl->fEffGrouping.fGrouping)) { strictFail = TRUE; break; } @@ -1622,7 +1624,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, UBool sawExponentDigit = FALSE; while (pos < textLength) { - ch = text[(int32_t)pos]; + ch = text.char32At(pos); digit = ch - zero; if (digit < 0 || digit > 9) { @@ -1634,7 +1636,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, parsedNum.append(exponentSign, err); sawExponentDigit = TRUE; } - ++pos; + pos += U16_LENGTH(ch); parsedNum.append((char)(digit + '0'), err); } else { break; @@ -1673,7 +1675,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, } if (strictParse && !sawDecimal) { - if (lastGroup != -1 && position - lastGroup != fImpl->fEffGrouping.fGrouping + 1) { + if (lastGroup != -1 && digitCount - lastGroup != fImpl->fEffGrouping.fGrouping) { strictFail = TRUE; } } @@ -2543,7 +2545,7 @@ UnicodeString DecimalFormat::getPadCharacterString() const { } void DecimalFormat::setPadCharacter(const UnicodeString &padChar) { - UChar pad; + UChar32 pad; if (padChar.length() > 0) { pad = padChar.char32At(0); } @@ -2792,7 +2794,7 @@ DecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) UBool DecimalFormat::isDecimalPatternMatchRequired(void) const { - return fBoolFlags.contains(UNUM_PARSE_DECIMAL_MARK_REQUIRED); + return static_cast(fBoolFlags.contains(UNUM_PARSE_DECIMAL_MARK_REQUIRED)); } //------------------------------------------------------------------------------ diff --git a/deps/icu-small/source/i18n/decimfmtimpl.cpp b/deps/icu-small/source/i18n/decimfmtimpl.cpp index dc7c8adf67d0dc..ef44eab0101453 100644 --- a/deps/icu-small/source/i18n/decimfmtimpl.cpp +++ b/deps/icu-small/source/i18n/decimfmtimpl.cpp @@ -521,7 +521,8 @@ static FixedDecimal &initFixedDecimal( const VisibleDigits &digits, FixedDecimal &result) { result.source = 0.0; result.isNegative = digits.isNegative(); - result.isNanOrInfinity = digits.isNaNOrInfinity(); + result._isNaN = digits.isNaN(); + result._isInfinite = digits.isInfinite(); digits.getFixedDecimal( result.source, result.intValue, result.decimalDigits, result.decimalDigitsWithoutTrailingZeros, @@ -1382,8 +1383,8 @@ DecimalFormatImpl::toNumberPattern( DigitInterval maxInterval; // Only for significant digits - int32_t sigMin; - int32_t sigMax; + int32_t sigMin = 0; /* initialize to avoid compiler warning */ + int32_t sigMax = 0; /* initialize to avoid compiler warning */ // These are all the digits to be displayed. For significant digits, // this interval always starts at the 1's place an extends left. diff --git a/deps/icu-small/source/i18n/digitformatter.cpp b/deps/icu-small/source/i18n/digitformatter.cpp index abb571dc5fa9f2..0d857f8f6873c6 100644 --- a/deps/icu-small/source/i18n/digitformatter.cpp +++ b/deps/icu-small/source/i18n/digitformatter.cpp @@ -177,7 +177,7 @@ UnicodeString &DigitFormatter::format( int32_t digitsLeftOfDecimal = interval.getMostSignificantExclusive(); int32_t lastDigitPos = interval.getLeastSignificantInclusive(); int32_t intBegin = appendTo.length(); - int32_t fracBegin; + int32_t fracBegin = 0; /* initialize to avoid compiler warning */ // Emit "0" instead of empty string. if (digitsLeftOfDecimal == 0 && lastDigitPos == 0) { diff --git a/deps/icu-small/source/i18n/digitlst.cpp b/deps/icu-small/source/i18n/digitlst.cpp index fd96a07d71da23..10a3a5dca1a404 100644 --- a/deps/icu-small/source/i18n/digitlst.cpp +++ b/deps/icu-small/source/i18n/digitlst.cpp @@ -53,6 +53,7 @@ #if !defined(U_USE_STRTOD_L) # if U_PLATFORM_USES_ONLY_WIN32_API # define U_USE_STRTOD_L 1 +# define U_HAVE_XLOCALE_H 0 # elif defined(U_HAVE_STRTOD_L) # define U_USE_STRTOD_L U_HAVE_STRTOD_L # else @@ -61,10 +62,10 @@ #endif #if U_USE_STRTOD_L -# if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_CYGWIN -# include -# else +# if U_HAVE_XLOCALE_H # include +# else +# include # endif #endif diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index e465fe1762ba3e..af421d41c72e61 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -1630,20 +1630,24 @@ struct CalendarDataSink : public ResourceSink { UnicodeString *aliasArray; Hashtable *aliasMap; if ((aliasArray = (UnicodeString*)arrays.get(*alias)) != NULL) { - // Clone the array - int32_t aliasArraySize = arraySizes.geti(*alias); - LocalArray aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode); - if (U_FAILURE(errorCode)) { return; } - uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize); - // Put the array on the 'arrays' map UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; - arrays.put(*path, aliasArrayCopy.orphan(), errorCode); - arraySizes.puti(*path, aliasArraySize, errorCode); + if (arrays.get(*path) == NULL) { + // Clone the array + int32_t aliasArraySize = arraySizes.geti(*alias); + LocalArray aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode); + if (U_FAILURE(errorCode)) { return; } + uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize); + // Put the array on the 'arrays' map + arrays.put(*path, aliasArrayCopy.orphan(), errorCode); + arraySizes.puti(*path, aliasArraySize, errorCode); + } if (U_FAILURE(errorCode)) { return; } mod = true; } else if ((aliasMap = (Hashtable*)maps.get(*alias)) != NULL) { UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; - maps.put(*path, aliasMap, errorCode); + if (maps.get(*path) == NULL) { + maps.put(*path, aliasMap, errorCode); + } if (U_FAILURE(errorCode)) { return; } mod = true; } diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index 5ce3630d98f987..187342e4af2efc 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -134,15 +134,18 @@ U_NAMESPACE_BEGIN // class DateTimePatternGenerator // ***************************************************************************** static const UChar Canonical_Items[] = { - // GyQMwWEdDFHmsSv - CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E, LOW_D, CAP_D, CAP_F, + // GyQMwWEDFdaHmsSv + CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E, + CAP_D, CAP_F, LOW_D, LOW_A, // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J CAP_H, LOW_M, LOW_S, CAP_S, LOW_V, 0 }; static const dtTypeElem dtTypes[] = { // patternChar, field, type, minLen, weight {CAP_G, UDATPG_ERA_FIELD, DT_SHORT, 1, 3,}, - {CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0}, + {CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0}, + {CAP_G, UDATPG_ERA_FIELD, DT_NARROW, 5, 0}, + {LOW_Y, UDATPG_YEAR_FIELD, DT_NUMERIC, 1, 20}, {CAP_Y, UDATPG_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, {LOW_U, UDATPG_YEAR_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 20}, @@ -150,12 +153,16 @@ static const dtTypeElem dtTypes[] = { {CAP_U, UDATPG_YEAR_FIELD, DT_SHORT, 1, 3}, {CAP_U, UDATPG_YEAR_FIELD, DT_LONG, 4, 0}, {CAP_U, UDATPG_YEAR_FIELD, DT_NARROW, 5, 0}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC, 1, 2}, {CAP_Q, UDATPG_QUARTER_FIELD, DT_SHORT, 3, 0}, {CAP_Q, UDATPG_QUARTER_FIELD, DT_LONG, 4, 0}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_NARROW, 5, 0}, {LOW_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, - {LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT + DT_DELTA, 3, 0}, - {LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG + DT_DELTA, 4, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT - DT_DELTA, 3, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + {CAP_M, UDATPG_MONTH_FIELD, DT_NUMERIC, 1, 2}, {CAP_M, UDATPG_MONTH_FIELD, DT_SHORT, 3, 0}, {CAP_M, UDATPG_MONTH_FIELD, DT_LONG, 4, 0}, @@ -165,32 +172,66 @@ static const dtTypeElem dtTypes[] = { {CAP_L, UDATPG_MONTH_FIELD, DT_LONG - DT_DELTA, 4, 0}, {CAP_L, UDATPG_MONTH_FIELD, DT_NARROW - DT_DELTA, 5, 0}, {LOW_L, UDATPG_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 1}, + {LOW_W, UDATPG_WEEK_OF_YEAR_FIELD, DT_NUMERIC, 1, 2}, - {CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 0}, + + {CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC, 1, 0}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORT, 1, 3}, {CAP_E, UDATPG_WEEKDAY_FIELD, DT_LONG, 4, 0}, {CAP_E, UDATPG_WEEKDAY_FIELD, DT_NARROW, 5, 0}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER, 6, 0}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 2}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORT - 2*DT_DELTA, 3, 0}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_LONG - 2*DT_DELTA, 4, 0}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_NARROW - 2*DT_DELTA, 5, 0}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORTER - 2*DT_DELTA, 6, 0}, {LOW_E, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // LOW_E is currently not used in CLDR data, should not be canonical {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORT - DT_DELTA, 3, 0}, {LOW_E, UDATPG_WEEKDAY_FIELD, DT_LONG - DT_DELTA, 4, 0}, {LOW_E, UDATPG_WEEKDAY_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER - DT_DELTA, 6, 0}, + {LOW_D, UDATPG_DAY_FIELD, DT_NUMERIC, 1, 2}, - {CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 3}, - {CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 0}, - {LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + 3*DT_DELTA, 1, 20}, // really internal use, so we don't care - {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 0}, + {LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, // really internal use, so we don't care + + {CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC, 1, 3}, + + {CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC, 1, 0}, + + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 3}, + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_LONG, 4, 0}, + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_NARROW, 5, 0}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - DT_DELTA, 1, 3}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + // b needs to be closer to a than to B, so we make this 3*DT_DELTA + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - 3*DT_DELTA, 1, 3}, + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - 3*DT_DELTA, 4, 0}, + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - 3*DT_DELTA, 5, 0}, + {CAP_H, UDATPG_HOUR_FIELD, DT_NUMERIC + 10*DT_DELTA, 1, 2}, // 24 hour {LOW_K, UDATPG_HOUR_FIELD, DT_NUMERIC + 11*DT_DELTA, 1, 2}, // 24 hour {LOW_H, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12 hour {CAP_K, UDATPG_HOUR_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // 12 hour + // The C code has had versions of the following 3, keep & update. Should not need these, but... + // Without these, certain tests using e.g. staticGetSkeleton fail because j/J in patterns + // get skipped instead of mapped to the right hour chars, for example in + // DateFormatTest::TestPatternFromSkeleton + // IntlTestDateTimePatternGeneratorAPI:: testStaticGetSkeleton + // DateIntervalFormatTest::testTicket11985 + // Need to investigate better handling of jJC replacement e.g. in staticGetSkeleton. + {CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 5*DT_DELTA, 1, 2}, // 12/24 hour no AM/PM + {LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 6*DT_DELTA, 1, 6}, // 12/24 hour + {CAP_C, UDATPG_HOUR_FIELD, DT_NUMERIC + 7*DT_DELTA, 1, 6}, // 12/24 hour with preferred dayPeriods for 12 + {LOW_M, UDATPG_MINUTE_FIELD, DT_NUMERIC, 1, 2}, + {LOW_S, UDATPG_SECOND_FIELD, DT_NUMERIC, 1, 2}, - {CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000}, - {CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 1000}, + {CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000}, + + {CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC, 1, 1000}, + {LOW_V, UDATPG_ZONE_FIELD, DT_SHORT - 2*DT_DELTA, 1, 0}, {LOW_V, UDATPG_ZONE_FIELD, DT_LONG - 2*DT_DELTA, 4, 0}, {LOW_Z, UDATPG_ZONE_FIELD, DT_SHORT, 1, 3}, @@ -202,24 +243,27 @@ static const dtTypeElem dtTypes[] = { {CAP_O, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, {CAP_V, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 1, 0}, {CAP_V, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 2, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG-1 - DT_DELTA, 3, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG-2 - DT_DELTA, 4, 0}, {CAP_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0}, {CAP_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0}, {CAP_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, {LOW_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0}, {LOW_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0}, {LOW_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, - {LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour - {CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour no AM/PM + {0, UDATPG_FIELD_COUNT, 0, 0, 0} , // last row of dtTypes[] }; static const char* const CLDR_FIELD_APPEND[] = { - "Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week", "Day", "*", "*", "*", + "Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week", + "*", "*", "Day", "*", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J "Hour", "Minute", "Second", "*", "Timezone" }; static const char* const CLDR_FIELD_NAME[] = { - "era", "year", "quarter", "month", "week", "*", "weekday", "*", "*", "day", "dayperiod", + "era", "year", "quarter", "month", "week", "weekOfMonth", "weekday", + "dayOfYear", "weekdayOfMonth", "day", "dayperiod", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J "hour", "minute", "second", "*", "zone" }; @@ -963,47 +1007,13 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate int32_t timeMask=(1<set(patternFormCopy, fp); + dtMatcher->set(patternFormMapped, fp); const PtnSkeleton* specifiedSkeleton=NULL; bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, &specifiedSkeleton); if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) { @@ -1032,6 +1042,82 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate return resultPattern; } +/* + * Map a skeleton that may have metacharacters jJC to one without, by replacing + * the metacharacters with locale-appropriate fields of of h/H/k/K and of a/b/B + * (depends on fDefaultHourFormatChar and fAllowedHourFormats being set, which in + * turn depends on initData having been run). This method also updates the flags + * as necessary. Returns the updated skeleton. + */ +UnicodeString +DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status) { + UnicodeString patternFormMapped; + patternFormMapped.remove(); + UBool inQuoted = FALSE; + int32_t patPos, patLen = patternForm.length(); + for (patPos = 0; patPos < patLen; patPos++) { + UChar patChr = patternForm.charAt(patPos); + if (patChr == SINGLE_QUOTE) { + inQuoted = !inQuoted; + } else if (!inQuoted) { + // Handle special mappings for 'j' and 'C' in which fields lengths + // 1,3,5 => hour field length 1 + // 2,4,6 => hour field length 2 + // 1,2 => abbreviated dayPeriod (field length 1..3) + // 3,4 => long dayPeriod (field length 4) + // 5,6 => narrow dayPeriod (field length 5) + if (patChr == LOW_J || patChr == CAP_C) { + int32_t extraLen = 0; // 1 less than total field length + while (patPos+1 < patLen && patternForm.charAt(patPos+1)==patChr) { + extraLen++; + patPos++; + } + int32_t hourLen = 1 + (extraLen & 1); + int32_t dayPeriodLen = (extraLen < 2)? 1: 3 + (extraLen >> 1); + UChar hourChar = LOW_H; + UChar dayPeriodChar = LOW_A; + if (patChr == LOW_J) { + hourChar = fDefaultHourFormatChar; + } else { + AllowedHourFormat preferred; + if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) { + preferred = (AllowedHourFormat)fAllowedHourFormats[0]; + } else { + status = U_INVALID_FORMAT_ERROR; + return UnicodeString(); + } + if (preferred == ALLOWED_HOUR_FORMAT_H || preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_Hb) { + hourChar = CAP_H; + } + // in #13183 just add b/B to skeleton, no longer need to set special flags + if (preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_hB) { + dayPeriodChar = CAP_B; + } else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) { + dayPeriodChar = LOW_B; + } + } + if (hourChar==CAP_H || hourChar==LOW_K) { + dayPeriodLen = 0; + } + while (dayPeriodLen-- > 0) { + patternFormMapped.append(dayPeriodChar); + } + while (hourLen-- > 0) { + patternFormMapped.append(hourChar); + } + } else if (patChr == CAP_J) { + // Get pattern for skeleton with H, then replace H or k + // with fDefaultHourFormatChar (if different) + patternFormMapped.append(CAP_H); + *flags |= kDTPGSkeletonUsesCapJ; + } else { + patternFormMapped.append(patChr); + } + } + } + return patternFormMapped; +} + UnicodeString DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern, const UnicodeString& skeleton, @@ -1299,17 +1385,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, const dtTypeElem *row = &dtTypes[canonicalIndex]; int32_t typeValue = row->field; - // Handle special day periods. - if (typeValue == UDATPG_DAYPERIOD_FIELD && flags != 0) { - UChar c = NONE; // '0' - if (flags & kDTPGSkeletonUsesCapB) { c = CAP_B; } - if (flags & kDTPGSkeletonUsesLowB) { c = LOW_B; } - - if (c != NONE) { - for (int32_t i = 0; i < field.length(); ++i) - field.setCharAt(i, c); - } - } + // handle day periods - with #13183, no longer need special handling here, integrated with normal types if ((flags & kDTPGFixFractionalSeconds) != 0 && typeValue == UDATPG_SECOND_FIELD) { field += decimal; @@ -1841,12 +1917,14 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton for (i=0; iset(pattern); for (i=0; i < fp->itemNumber; i++) { const UnicodeString& value = fp->items[i]; - if ( value.charAt(0) == LOW_A ) { - continue; // skip 'a' - } + // don't skip 'a' anymore, dayPeriod handled specially below if ( fp->isQuoteLiteral(value) ) { UnicodeString quoteLiteral; @@ -1861,7 +1939,7 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton int32_t field = row->field; skeletonResult.original.populate(field, value); UChar repeatChar = row->patternChar; - int32_t repeatCount = row->minLen; // #7930 removes cap at 3 + int32_t repeatCount = row->minLen; skeletonResult.baseOriginal.populate(field, repeatChar, repeatCount); int16_t subField = row->type; if ( row->type > 0) { @@ -1869,6 +1947,30 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton } skeletonResult.type[field] = subField; } + // #13183, handle special behavior for day period characters (a, b, B) + if (!skeletonResult.original.isFieldEmpty(UDATPG_HOUR_FIELD)) { + if (skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==LOW_H || skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==CAP_K) { + // We have a skeleton with 12-hour-cycle format + if (skeletonResult.original.isFieldEmpty(UDATPG_DAYPERIOD_FIELD)) { + // But we do not have a day period in the skeleton; add the default DAYPERIOD (currently "a") + for (i = 0; dtTypes[i].patternChar != 0; i++) { + if ( dtTypes[i].field == UDATPG_DAYPERIOD_FIELD ) { + // first entry for UDATPG_DAYPERIOD_FIELD + skeletonResult.original.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen); + skeletonResult.baseOriginal.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen); + skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = dtTypes[i].type; + skeletonResult.addedDefaultDayPeriod = TRUE; + break; + } + } + } + } else { + // Skeleton has 24-hour-cycle hour format and has dayPeriod, delete dayPeriod (i.e. ignore it) + skeletonResult.original.clearField(UDATPG_DAYPERIOD_FIELD); + skeletonResult.baseOriginal.clearField(UDATPG_DAYPERIOD_FIELD); + skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = NONE; + } + } copyFrom(skeletonResult); } @@ -2290,13 +2392,27 @@ PtnSkeleton::equals(const PtnSkeleton& other) const { UnicodeString PtnSkeleton::getSkeleton() const { UnicodeString result; - return original.appendTo(result); + result = original.appendTo(result); + int32_t pos; + if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) { + // for backward compatibility: if DateTimeMatcher.set added a single 'a' that + // was not in the provided skeleton, remove it here before returning skeleton. + result.remove(pos, 1); + } + return result; } UnicodeString PtnSkeleton::getBaseSkeleton() const { UnicodeString result; - return baseOriginal.appendTo(result); + result = baseOriginal.appendTo(result); + int32_t pos; + if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) { + // for backward compatibility: if DateTimeMatcher.set added a single 'a' that + // was not in the provided skeleton, remove it here before returning skeleton. + result.remove(pos, 1); + } + return result; } UChar diff --git a/deps/icu-small/source/i18n/dtptngen_impl.h b/deps/icu-small/source/i18n/dtptngen_impl.h index 38afd5ff5a8d7f..2ea31a75c488fa 100644 --- a/deps/icu-small/source/i18n/dtptngen_impl.h +++ b/deps/icu-small/source/i18n/dtptngen_impl.h @@ -92,10 +92,11 @@ #define LOW_X ((UChar)0x0078) #define LOW_Y ((UChar)0x0079) #define LOW_Z ((UChar)0x007A) -#define DT_SHORT -0x102 -#define DT_LONG -0x103 -#define DT_NUMERIC 0x100 #define DT_NARROW -0x101 +#define DT_SHORTER -0x102 +#define DT_SHORT -0x103 +#define DT_LONG -0x104 +#define DT_NUMERIC 0x100 #define DT_DELTA 0x10 U_NAMESPACE_BEGIN @@ -155,6 +156,7 @@ class PtnSkeleton : public UMemory { int32_t type[UDATPG_FIELD_COUNT]; SkeletonFields original; SkeletonFields baseOriginal; + UBool addedDefaultDayPeriod; PtnSkeleton(); PtnSkeleton(const PtnSkeleton& other); diff --git a/deps/icu-small/source/i18n/gregoimp.cpp b/deps/icu-small/source/i18n/gregoimp.cpp index 01465973d63b1d..cc31e274131906 100644 --- a/deps/icu-small/source/i18n/gregoimp.cpp +++ b/deps/icu-small/source/i18n/gregoimp.cpp @@ -27,6 +27,11 @@ int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator) { numerator / denominator : ((numerator + 1) / denominator) - 1; } +int64_t ClockMath::floorDivide(int64_t numerator, int64_t denominator) { + return (numerator >= 0) ? + numerator / denominator : ((numerator + 1) / denominator) - 1; +} + int32_t ClockMath::floorDivide(double numerator, int32_t denominator, int32_t& remainder) { double quotient; diff --git a/deps/icu-small/source/i18n/gregoimp.h b/deps/icu-small/source/i18n/gregoimp.h index a7834c4ee52654..55922a6b40aa52 100644 --- a/deps/icu-small/source/i18n/gregoimp.h +++ b/deps/icu-small/source/i18n/gregoimp.h @@ -40,6 +40,17 @@ class ClockMath { */ static int32_t floorDivide(int32_t numerator, int32_t denominator); + /** + * Divide two integers, returning the floor of the quotient. + * Unlike the built-in division, this is mathematically + * well-behaved. E.g., -1/4 => 0 but + * floorDivide(-1,4) => -1. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @return the floor of the quotient + */ + static int64_t floorDivide(int64_t numerator, int64_t denominator); + /** * Divide two numbers, returning the floor of the quotient. * Unlike the built-in division, this is mathematically diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index 4e9d4a56f2b397..628c8f8992d7a2 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -42,11 +42,14 @@ #include "standardplural.h" #include "unifiedcache.h" -#define MEAS_UNIT_COUNT 135 -#define WIDTH_INDEX_COUNT (UMEASFMT_WIDTH_NARROW + 1) U_NAMESPACE_BEGIN +static constexpr int32_t PER_UNIT_INDEX = StandardPlural::COUNT; +static constexpr int32_t PATTERN_COUNT = PER_UNIT_INDEX + 1; +static constexpr int32_t MEAS_UNIT_COUNT = 138; // see assertion in MeasureFormatCacheData constructor +static constexpr int32_t WIDTH_INDEX_COUNT = UMEASFMT_WIDTH_NARROW + 1; + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureFormat) // Used to format durations like 5:47 or 21:35:42. @@ -100,8 +103,6 @@ static UMeasureFormatWidth getRegularWidth(UMeasureFormatWidth width) { */ class MeasureFormatCacheData : public SharedObject { public: - static const int32_t PER_UNIT_INDEX = StandardPlural::COUNT; - static const int32_t PATTERN_COUNT = PER_UNIT_INDEX + 1; /** * Redirection data from root-bundle, top-level sideways aliases. @@ -110,7 +111,7 @@ class MeasureFormatCacheData : public SharedObject { */ UMeasureFormatWidth widthFallback[WIDTH_INDEX_COUNT]; /** Measure unit -> format width -> array of patterns ("{0} meters") (plurals + PER_UNIT_INDEX) */ - SimpleFormatter *patterns[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT][PATTERN_COUNT]; + SimpleFormatter* patterns[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT][PATTERN_COUNT]; const UChar* dnams[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT]; SimpleFormatter perFormatters[WIDTH_INDEX_COUNT]; @@ -146,24 +147,25 @@ class MeasureFormatCacheData : public SharedObject { } private: - NumberFormat *currencyFormats[WIDTH_INDEX_COUNT]; - NumberFormat *integerFormat; - NumericDateFormatters *numericDateFormatters; + NumberFormat* currencyFormats[WIDTH_INDEX_COUNT]; + NumberFormat* integerFormat; + NumericDateFormatters* numericDateFormatters; + MeasureFormatCacheData(const MeasureFormatCacheData &other); MeasureFormatCacheData &operator=(const MeasureFormatCacheData &other); }; -MeasureFormatCacheData::MeasureFormatCacheData() { +MeasureFormatCacheData::MeasureFormatCacheData() + : integerFormat(nullptr), numericDateFormatters(nullptr) { + // Please update MEAS_UNIT_COUNT if it gets out of sync with the true count! + U_ASSERT(MEAS_UNIT_COUNT == MeasureUnit::getIndexCount()); + for (int32_t i = 0; i < WIDTH_INDEX_COUNT; ++i) { widthFallback[i] = UMEASFMT_WIDTH_COUNT; } - for (int32_t i = 0; i < UPRV_LENGTHOF(currencyFormats); ++i) { - currencyFormats[i] = NULL; - } - uprv_memset(patterns, 0, sizeof(patterns)); - uprv_memset(dnams, 0, sizeof(dnams)); - integerFormat = NULL; - numericDateFormatters = NULL; + memset(&patterns[0][0][0], 0, sizeof(patterns)); + memset(&dnams[0][0], 0, sizeof(dnams)); + memset(currencyFormats, 0, sizeof(currencyFormats)); } MeasureFormatCacheData::~MeasureFormatCacheData() { @@ -236,6 +238,9 @@ struct UnitDataSink : public ResourceSink { void setFormatterIfAbsent(int32_t index, const ResourceValue &value, int32_t minPlaceholders, UErrorCode &errorCode) { + U_ASSERT(unitIndex < MEAS_UNIT_COUNT); + U_ASSERT(width < WIDTH_INDEX_COUNT); + U_ASSERT(index < PATTERN_COUNT); SimpleFormatter **patterns = &cacheData.patterns[unitIndex][width][0]; if (U_SUCCESS(errorCode) && patterns[index] == NULL) { if (minPlaceholders >= 0) { @@ -249,6 +254,8 @@ struct UnitDataSink : public ResourceSink { } void setDnamIfAbsent(const ResourceValue &value, UErrorCode& errorCode) { + U_ASSERT(unitIndex < MEAS_UNIT_COUNT); + U_ASSERT(width < WIDTH_INDEX_COUNT); if (cacheData.dnams[unitIndex][width] == NULL) { int32_t length; cacheData.dnams[unitIndex][width] = value.getString(length, errorCode); @@ -266,7 +273,7 @@ struct UnitDataSink : public ResourceSink { setDnamIfAbsent(value, errorCode); } else if (uprv_strcmp(key, "per") == 0) { // For example, "{0}/h". - setFormatterIfAbsent(MeasureFormatCacheData::PER_UNIT_INDEX, value, 1, errorCode); + setFormatterIfAbsent(PER_UNIT_INDEX, value, 1, errorCode); } else { // The key must be one of the plural form strings. For example: // one{"{0} hr"} @@ -1093,8 +1100,7 @@ UnicodeString &MeasureFormat::formatNumeric( const SimpleFormatter *MeasureFormat::getFormatterOrNull( const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const { width = getRegularWidth(width); - SimpleFormatter *const (*unitPatterns)[MeasureFormatCacheData::PATTERN_COUNT] = - &cache->patterns[unit.getIndex()][0]; + SimpleFormatter *const (*unitPatterns)[PATTERN_COUNT] = &cache->patterns[unit.getIndex()][0]; if (unitPatterns[width][index] != NULL) { return unitPatterns[width][index]; } @@ -1162,8 +1168,7 @@ int32_t MeasureFormat::withPerUnitAndAppend( if (U_FAILURE(status)) { return offset; } - const SimpleFormatter *perUnitFormatter = - getFormatterOrNull(perUnit, width, MeasureFormatCacheData::PER_UNIT_INDEX); + const SimpleFormatter *perUnitFormatter = getFormatterOrNull(perUnit, width, PER_UNIT_INDEX); if (perUnitFormatter != NULL) { const UnicodeString *params[] = {&formatted}; perUnitFormatter->formatAndAppend( diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index 43c8fd4bab8076..580afc0df5d2bc 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -33,6 +33,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureUnit) // // Start generated code + static const int32_t gOffsets[] = { 0, 2, @@ -49,11 +50,12 @@ static const int32_t gOffsets[] = { 340, 341, 352, - 358, - 363, - 367, - 371, - 396 + 355, + 361, + 366, + 370, + 374, + 399 }; static const int32_t gIndexes[] = { @@ -72,11 +74,12 @@ static const int32_t gIndexes[] = { 79, 80, 91, - 97, - 102, - 106, - 110, - 135 + 94, + 100, + 105, + 109, + 113, + 138 }; // Must be sorted alphabetically. @@ -95,6 +98,7 @@ static const char * const gTypes[] = { "length", "light", "mass", + "none", "power", "pressure", "speed", @@ -456,6 +460,9 @@ static const char * const gSubTypes[] = { "pound", "stone", "ton", + "base", + "percent", + "permille", "gigawatt", "horsepower", "kilowatt", @@ -504,14 +511,14 @@ static const char * const gSubTypes[] = { // Must be sorted by first value and then second value. static int32_t unitPerUnitToSingleUnit[][4] = { - {327, 297, 16, 0}, - {329, 303, 16, 2}, - {331, 297, 16, 3}, - {331, 385, 4, 2}, - {331, 386, 4, 3}, - {346, 383, 3, 1}, - {349, 11, 15, 4}, - {388, 327, 4, 1} + {327, 297, 17, 0}, + {329, 303, 17, 2}, + {331, 297, 17, 3}, + {331, 388, 4, 2}, + {331, 389, 4, 3}, + {346, 386, 3, 1}, + {349, 11, 16, 4}, + {391, 327, 4, 1} }; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { @@ -610,14 +617,6 @@ MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) { return MeasureUnit::create(4, 3, status); } -// MeasureUnit *MeasureUnit::createEast(UErrorCode &status) {...} - -// MeasureUnit *MeasureUnit::createNorth(UErrorCode &status) {...} - -// MeasureUnit *MeasureUnit::createSouth(UErrorCode &status) {...} - -// MeasureUnit *MeasureUnit::createWest(UErrorCode &status) {...} - MeasureUnit *MeasureUnit::createBit(UErrorCode &status) { return MeasureUnit::create(6, 0, status); } @@ -887,179 +886,179 @@ MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(14, 0, status); + return MeasureUnit::create(15, 0, status); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(14, 1, status); + return MeasureUnit::create(15, 1, status); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(14, 2, status); + return MeasureUnit::create(15, 2, status); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(14, 3, status); + return MeasureUnit::create(15, 3, status); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(14, 4, status); + return MeasureUnit::create(15, 4, status); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(14, 5, status); + return MeasureUnit::create(15, 5, status); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(15, 0, status); + return MeasureUnit::create(16, 0, status); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(15, 1, status); + return MeasureUnit::create(16, 1, status); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(16, 2, status); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(16, 3, status); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(16, 4, status); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(16, 0, status); + return MeasureUnit::create(17, 0, status); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(16, 1, status); + return MeasureUnit::create(17, 1, status); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(16, 2, status); + return MeasureUnit::create(17, 2, status); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(16, 3, status); + return MeasureUnit::create(17, 3, status); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(18, 0, status); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(18, 1, status); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(18, 2, status); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(18, 3, status); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(19, 0, status); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(19, 1, status); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(19, 2, status); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(19, 3, status); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(18, 4, status); + return MeasureUnit::create(19, 4, status); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(18, 5, status); + return MeasureUnit::create(19, 5, status); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(18, 6, status); + return MeasureUnit::create(19, 6, status); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(18, 7, status); + return MeasureUnit::create(19, 7, status); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(18, 8, status); + return MeasureUnit::create(19, 8, status); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(18, 9, status); + return MeasureUnit::create(19, 9, status); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(18, 10, status); + return MeasureUnit::create(19, 10, status); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(18, 11, status); + return MeasureUnit::create(19, 11, status); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(18, 12, status); + return MeasureUnit::create(19, 12, status); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(18, 13, status); + return MeasureUnit::create(19, 13, status); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(18, 14, status); + return MeasureUnit::create(19, 14, status); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(18, 15, status); + return MeasureUnit::create(19, 15, status); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(18, 16, status); + return MeasureUnit::create(19, 16, status); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(18, 17, status); + return MeasureUnit::create(19, 17, status); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(18, 18, status); + return MeasureUnit::create(19, 18, status); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(18, 19, status); + return MeasureUnit::create(19, 19, status); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(18, 20, status); + return MeasureUnit::create(19, 20, status); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(18, 21, status); + return MeasureUnit::create(19, 21, status); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(18, 22, status); + return MeasureUnit::create(19, 22, status); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(18, 23, status); + return MeasureUnit::create(19, 23, status); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(18, 24, status); + return MeasureUnit::create(19, 24, status); } // End generated code @@ -1081,6 +1080,11 @@ static int32_t binarySearch( return -1; } +MeasureUnit::MeasureUnit() { + fCurrency[0] = 0; + initNoUnit("base"); +} + MeasureUnit::MeasureUnit(const MeasureUnit &other) : fTypeId(other.fTypeId), fSubTypeId(other.fSubTypeId) { uprv_strcpy(fCurrency, other.fCurrency); @@ -1269,6 +1273,15 @@ void MeasureUnit::initCurrency(const char *isoCurrency) { } } +void MeasureUnit::initNoUnit(const char *subtype) { + int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "none"); + U_ASSERT(result != -1); + fTypeId = result; + result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], subtype); + U_ASSERT(result != -1); + fSubTypeId = result - gOffsets[fTypeId]; +} + void MeasureUnit::setTo(int32_t typeId, int32_t subTypeId) { fTypeId = typeId; fSubTypeId = subTypeId; diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 94a0286196a92b..064585665ae5e6 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -1954,7 +1954,10 @@ UnicodeString MessageFormat::PluralSelectorProvider::select(void *ctx, double nu context.formatter = msgFormat.getDefaultNumberFormat(ec); context.forReplaceNumber = TRUE; } - U_ASSERT(context.number.getDouble(ec) == number); // argument number minus the offset + if (context.number.getDouble(ec) != number) { + ec = U_INTERNAL_PROGRAM_ERROR; + return UnicodeString(FALSE, OTHER_STRING, 5); + } context.formatter->format(context.number, context.numberString, ec); const DecimalFormat *decFmt = dynamic_cast(context.formatter); if(decFmt != NULL) { diff --git a/deps/icu-small/source/i18n/nfrs.cpp b/deps/icu-small/source/i18n/nfrs.cpp index 8119aefd5eccb1..b2d08889e6bce5 100644 --- a/deps/icu-small/source/i18n/nfrs.cpp +++ b/deps/icu-small/source/i18n/nfrs.cpp @@ -830,18 +830,21 @@ int64_t util64_fromDouble(double d) { return result; } -int64_t util64_pow(int32_t base, uint16_t exponent) { +uint64_t util64_pow(uint32_t base, uint16_t exponent) { if (base == 0) { return 0; } - int64_t result = 1; - int64_t pow = base; - while (exponent > 0) { + uint64_t result = 1; + uint64_t pow = base; + while (true) { if ((exponent & 1) == 1) { result *= pow; } - pow *= pow; exponent >>= 1; + if (exponent == 0) { + break; + } + pow *= pow; } return result; } diff --git a/deps/icu-small/source/i18n/nfrs.h b/deps/icu-small/source/i18n/nfrs.h index eafb1ca4413337..34846ed297b77d 100644 --- a/deps/icu-small/source/i18n/nfrs.h +++ b/deps/icu-small/source/i18n/nfrs.h @@ -88,7 +88,9 @@ class NFRuleSet : public UMemory { int64_t util64_fromDouble(double d); // raise radix to the power exponent, only non-negative exponents -int64_t util64_pow(int32_t radix, uint16_t exponent); +// Arithmetic is performed in unsigned space since overflow in +// signed space is undefined behavior. +uint64_t util64_pow(uint32_t radix, uint16_t exponent); // convert n to digit string in buffer, return length of string uint32_t util64_tou(int64_t n, UChar* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE); diff --git a/deps/icu-small/source/i18n/nfsubs.cpp b/deps/icu-small/source/i18n/nfsubs.cpp index 6e7eabe350a60e..1a0914152deaa4 100644 --- a/deps/icu-small/source/i18n/nfsubs.cpp +++ b/deps/icu-small/source/i18n/nfsubs.cpp @@ -111,7 +111,7 @@ class MultiplierSubstitution : public NFSubstitution { return newRuleValue * divisor; } - virtual double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return static_cast(divisor); } virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' @@ -148,7 +148,7 @@ class ModulusSubstitution : public NFSubstitution { virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, int32_t recursionCount, UErrorCode& status) const; virtual int64_t transformNumber(int64_t number) const { return number % divisor; } - virtual double transformNumber(double number) const { return uprv_fmod(number, divisor); } + virtual double transformNumber(double number) const { return uprv_fmod(number, static_cast(divisor)); } virtual UBool doParse(const UnicodeString& text, ParsePosition& parsePosition, @@ -158,10 +158,10 @@ class ModulusSubstitution : public NFSubstitution { Formattable& result) const; virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { - return oldRuleValue - uprv_fmod(oldRuleValue, divisor) + newRuleValue; + return oldRuleValue - uprv_fmod(oldRuleValue, static_cast(divisor)) + newRuleValue; } - virtual double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return static_cast(divisor); } virtual UBool isModulusSubstitution() const { return TRUE; } diff --git a/deps/icu-small/source/i18n/nounit.cpp b/deps/icu-small/source/i18n/nounit.cpp new file mode 100644 index 00000000000000..db07387c590af8 --- /dev/null +++ b/deps/icu-small/source/i18n/nounit.cpp @@ -0,0 +1,42 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/nounit.h" +#include "uassert.h" + +#if !UCONFIG_NO_FORMATTING + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NoUnit) + +NoUnit U_EXPORT2 NoUnit::base() { + return NoUnit("base"); +} + +NoUnit U_EXPORT2 NoUnit::percent() { + return NoUnit("percent"); +} + +NoUnit U_EXPORT2 NoUnit::permille() { + return NoUnit("permille"); +} + +NoUnit::NoUnit(const char* subtype) { + initNoUnit(subtype); +} + +NoUnit::NoUnit(const NoUnit& other) : MeasureUnit(other) { +} + +UObject* NoUnit::clone() const { + return new NoUnit(*this); +} + +NoUnit::~NoUnit() { +} + + +U_NAMESPACE_END + +#endif diff --git a/deps/icu-small/source/i18n/number_affixutils.cpp b/deps/icu-small/source/i18n/number_affixutils.cpp new file mode 100644 index 00000000000000..4dfdbc7ab708fc --- /dev/null +++ b/deps/icu-small/source/i18n/number_affixutils.cpp @@ -0,0 +1,403 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "number_affixutils.h" +#include "unicode/utf16.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +int32_t AffixUtils::estimateLength(const CharSequence &patternString, UErrorCode &status) { + AffixPatternState state = STATE_BASE; + int32_t offset = 0; + int32_t length = 0; + for (; offset < patternString.length();) { + UChar32 cp = patternString.codePointAt(offset); + + switch (state) { + case STATE_BASE: + if (cp == u'\'') { + // First quote + state = STATE_FIRST_QUOTE; + } else { + // Unquoted symbol + length++; + } + break; + case STATE_FIRST_QUOTE: + if (cp == u'\'') { + // Repeated quote + length++; + state = STATE_BASE; + } else { + // Quoted code point + length++; + state = STATE_INSIDE_QUOTE; + } + break; + case STATE_INSIDE_QUOTE: + if (cp == u'\'') { + // End of quoted sequence + state = STATE_AFTER_QUOTE; + } else { + // Quoted code point + length++; + } + break; + case STATE_AFTER_QUOTE: + if (cp == u'\'') { + // Double quote inside of quoted sequence + length++; + state = STATE_INSIDE_QUOTE; + } else { + // Unquoted symbol + length++; + } + break; + default: + U_ASSERT(false); + } + + offset += U16_LENGTH(cp); + } + + switch (state) { + case STATE_FIRST_QUOTE: + case STATE_INSIDE_QUOTE: + status = U_ILLEGAL_ARGUMENT_ERROR; + default: + break; + } + + return length; +} + +UnicodeString AffixUtils::escape(const CharSequence &input) { + AffixPatternState state = STATE_BASE; + int32_t offset = 0; + UnicodeString output; + for (; offset < input.length();) { + UChar32 cp = input.codePointAt(offset); + + switch (cp) { + case u'\'': + output.append(u"''", -1); + break; + + case u'-': + case u'+': + case u'%': + case u'‰': + case u'¤': + if (state == STATE_BASE) { + output.append(u'\''); + output.append(cp); + state = STATE_INSIDE_QUOTE; + } else { + output.append(cp); + } + break; + + default: + if (state == STATE_INSIDE_QUOTE) { + output.append(u'\''); + output.append(cp); + state = STATE_BASE; + } else { + output.append(cp); + } + break; + } + offset += U16_LENGTH(cp); + } + + if (state == STATE_INSIDE_QUOTE) { + output.append(u'\''); + } + + return output; +} + +Field AffixUtils::getFieldForType(AffixPatternType type) { + switch (type) { + case TYPE_MINUS_SIGN: + return Field::UNUM_SIGN_FIELD; + case TYPE_PLUS_SIGN: + return Field::UNUM_SIGN_FIELD; + case TYPE_PERCENT: + return Field::UNUM_PERCENT_FIELD; + case TYPE_PERMILLE: + return Field::UNUM_PERMILL_FIELD; + case TYPE_CURRENCY_SINGLE: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_DOUBLE: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_TRIPLE: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_QUAD: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_QUINT: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_OVERFLOW: + return Field::UNUM_CURRENCY_FIELD; + default: + U_ASSERT(false); + return Field::UNUM_FIELD_COUNT; // suppress "control reaches end of non-void function" + } +} + +int32_t +AffixUtils::unescape(const CharSequence &affixPattern, NumberStringBuilder &output, int32_t position, + const SymbolProvider &provider, UErrorCode &status) { + int32_t length = 0; + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return length; } + if (tag.type == TYPE_CURRENCY_OVERFLOW) { + // Don't go to the provider for this special case + length += output.insertCodePoint(position + length, 0xFFFD, UNUM_CURRENCY_FIELD, status); + } else if (tag.type < 0) { + length += output.insert( + position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status); + } else { + length += output.insertCodePoint(position + length, tag.codePoint, UNUM_FIELD_COUNT, status); + } + } + return length; +} + +int32_t AffixUtils::unescapedCodePointCount(const CharSequence &affixPattern, + const SymbolProvider &provider, UErrorCode &status) { + int32_t length = 0; + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return length; } + if (tag.type == TYPE_CURRENCY_OVERFLOW) { + length += 1; + } else if (tag.type < 0) { + length += provider.getSymbol(tag.type).length(); + } else { + length += U16_LENGTH(tag.codePoint); + } + } + return length; +} + +bool +AffixUtils::containsType(const CharSequence &affixPattern, AffixPatternType type, UErrorCode &status) { + if (affixPattern.length() == 0) { + return false; + } + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return false; } + if (tag.type == type) { + return true; + } + } + return false; +} + +bool AffixUtils::hasCurrencySymbols(const CharSequence &affixPattern, UErrorCode &status) { + if (affixPattern.length() == 0) { + return false; + } + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return false; } + if (tag.type < 0 && getFieldForType(tag.type) == UNUM_CURRENCY_FIELD) { + return true; + } + } + return false; +} + +UnicodeString AffixUtils::replaceType(const CharSequence &affixPattern, AffixPatternType type, + char16_t replacementChar, UErrorCode &status) { + UnicodeString output = affixPattern.toUnicodeString(); + if (affixPattern.length() == 0) { + return output; + }; + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return output; } + if (tag.type == type) { + output.replace(tag.offset - 1, 1, replacementChar); + } + } + return output; +} + +AffixTag AffixUtils::nextToken(AffixTag tag, const CharSequence &patternString, UErrorCode &status) { + int32_t offset = tag.offset; + int32_t state = tag.state; + for (; offset < patternString.length();) { + UChar32 cp = patternString.codePointAt(offset); + int32_t count = U16_LENGTH(cp); + + switch (state) { + case STATE_BASE: + switch (cp) { + case u'\'': + state = STATE_FIRST_QUOTE; + offset += count; + // continue to the next code point + break; + case u'-': + return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0); + case u'+': + return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0); + case u'%': + return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0); + case u'‰': + return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0); + case u'¤': + state = STATE_FIRST_CURR; + offset += count; + // continue to the next code point + break; + default: + return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp); + } + break; + case STATE_FIRST_QUOTE: + if (cp == u'\'') { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp); + } else { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp); + } + case STATE_INSIDE_QUOTE: + if (cp == u'\'') { + state = STATE_AFTER_QUOTE; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp); + } + case STATE_AFTER_QUOTE: + if (cp == u'\'') { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp); + } else { + state = STATE_BASE; + // re-evaluate this code point + break; + } + case STATE_FIRST_CURR: + if (cp == u'¤') { + state = STATE_SECOND_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0); + } + case STATE_SECOND_CURR: + if (cp == u'¤') { + state = STATE_THIRD_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0); + } + case STATE_THIRD_CURR: + if (cp == u'¤') { + state = STATE_FOURTH_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0); + } + case STATE_FOURTH_CURR: + if (cp == u'¤') { + state = STATE_FIFTH_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0); + } + case STATE_FIFTH_CURR: + if (cp == u'¤') { + state = STATE_OVERFLOW_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0); + } + case STATE_OVERFLOW_CURR: + if (cp == u'¤') { + offset += count; + // continue to the next code point and loop back to this state + break; + } else { + return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); + } + default: + U_ASSERT(false); + } + } + // End of string + switch (state) { + case STATE_BASE: + // No more tokens in string. + return {-1}; + case STATE_FIRST_QUOTE: + case STATE_INSIDE_QUOTE: + // For consistent behavior with the JDK and ICU 58, set an error here. + status = U_ILLEGAL_ARGUMENT_ERROR; + return {-1}; + case STATE_AFTER_QUOTE: + // No more tokens in string. + return {-1}; + case STATE_FIRST_CURR: + return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0); + case STATE_SECOND_CURR: + return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0); + case STATE_THIRD_CURR: + return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0); + case STATE_FOURTH_CURR: + return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0); + case STATE_FIFTH_CURR: + return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0); + case STATE_OVERFLOW_CURR: + return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); + default: + U_ASSERT(false); + return {-1}; // suppress "control reaches end of non-void function" + } +} + +bool AffixUtils::hasNext(const AffixTag &tag, const CharSequence &string) { + // First check for the {-1} and default initializer syntax. + if (tag.offset < 0) { + return false; + } else if (tag.offset == 0) { + return string.length() > 0; + } + // The rest of the fields are safe to use now. + // Special case: the last character in string is an end quote. + if (tag.state == STATE_INSIDE_QUOTE && tag.offset == string.length() - 1 && + string.charAt(tag.offset) == u'\'') { + return false; + } else if (tag.state != STATE_BASE) { + return true; + } else { + return tag.offset < string.length(); + } +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_affixutils.h b/deps/icu-small/source/i18n/number_affixutils.h new file mode 100644 index 00000000000000..fd76c99b975566 --- /dev/null +++ b/deps/icu-small/source/i18n/number_affixutils.h @@ -0,0 +1,224 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_AFFIXUTILS_H__ +#define __NUMBER_AFFIXUTILS_H__ + +#include +#include "number_types.h" +#include "unicode/stringpiece.h" +#include "unicode/unistr.h" +#include "number_stringbuilder.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +enum AffixPatternState { + STATE_BASE = 0, + STATE_FIRST_QUOTE = 1, + STATE_INSIDE_QUOTE = 2, + STATE_AFTER_QUOTE = 3, + STATE_FIRST_CURR = 4, + STATE_SECOND_CURR = 5, + STATE_THIRD_CURR = 6, + STATE_FOURTH_CURR = 7, + STATE_FIFTH_CURR = 8, + STATE_OVERFLOW_CURR = 9 +}; + +// enum AffixPatternType defined in internals.h + +struct AffixTag { + int32_t offset; + UChar32 codePoint; + AffixPatternState state; + AffixPatternType type; + + AffixTag() : offset(0), state(STATE_BASE) {} + + AffixTag(int32_t offset) : offset(offset) {} + + AffixTag(int32_t offset, UChar32 codePoint, AffixPatternState state, AffixPatternType type) + : offset(offset), codePoint(codePoint), state(state), type(type) + {} +}; + +// Exported as U_I18N_API because it is a base class for other exported types +class U_I18N_API SymbolProvider { + public: + virtual ~SymbolProvider() = default; + + // TODO: Could this be more efficient if it returned by reference? + virtual UnicodeString getSymbol(AffixPatternType type) const = 0; +}; + +/** + * Performs manipulations on affix patterns: the prefix and suffix strings associated with a decimal + * format pattern. For example: + * + * + * + * + * + * + * + *
Affix PatternExample Unescaped (Formatted) String
abcabc
ab-ab−
ab'-'ab-
ab''ab'
+ * + * To manually iterate over tokens in a literal string, use the following pattern, which is designed + * to be efficient. + * + *

+ * long tag = 0L;
+ * while (AffixPatternUtils.hasNext(tag, patternString)) {
+ *   tag = AffixPatternUtils.nextToken(tag, patternString);
+ *   int typeOrCp = AffixPatternUtils.getTypeOrCp(tag);
+ *   switch (typeOrCp) {
+ *     case AffixPatternUtils.TYPE_MINUS_SIGN:
+ *       // Current token is a minus sign.
+ *       break;
+ *     case AffixPatternUtils.TYPE_PLUS_SIGN:
+ *       // Current token is a plus sign.
+ *       break;
+ *     case AffixPatternUtils.TYPE_PERCENT:
+ *       // Current token is a percent sign.
+ *       break;
+ *     // ... other types ...
+ *     default:
+ *       // Current token is an arbitrary code point.
+ *       // The variable typeOrCp is the code point.
+ *       break;
+ *   }
+ * }
+ * 
+ */ +class U_I18N_API AffixUtils { + + public: + + /** + * Estimates the number of code points present in an unescaped version of the affix pattern string + * (one that would be returned by {@link #unescape}), assuming that all interpolated symbols + * consume one code point and that currencies consume as many code points as their symbol width. + * Used for computing padding width. + * + * @param patternString The original string whose width will be estimated. + * @return The length of the unescaped string. + */ + static int32_t estimateLength(const CharSequence &patternString, UErrorCode &status); + + /** + * Takes a string and escapes (quotes) characters that have special meaning in the affix pattern + * syntax. This function does not reverse-lookup symbols. + * + *

Example input: "-$x"; example output: "'-'$x" + * + * @param input The string to be escaped. + * @return The resulting UnicodeString. + */ + static UnicodeString escape(const CharSequence &input); + + static Field getFieldForType(AffixPatternType type); + + /** + * Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and + * "¤" with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the + * result into the NumberStringBuilder at the requested location. + * + *

Example input: "'-'¤x"; example output: "-$x" + * + * @param affixPattern The original string to be unescaped. + * @param output The NumberStringBuilder to mutate with the result. + * @param position The index into the NumberStringBuilder to insert the string. + * @param provider An object to generate locale symbols. + */ + static int32_t + unescape(const CharSequence &affixPattern, NumberStringBuilder &output, int32_t position, + const SymbolProvider &provider, UErrorCode &status); + + /** + * Sames as {@link #unescape}, but only calculates the code point count. More efficient than {@link #unescape} + * if you only need the length but not the string itself. + * + * @param affixPattern The original string to be unescaped. + * @param provider An object to generate locale symbols. + * @return The same return value as if you called {@link #unescape}. + */ + static int32_t unescapedCodePointCount(const CharSequence &affixPattern, + const SymbolProvider &provider, UErrorCode &status); + + /** + * Checks whether the given affix pattern contains at least one token of the given type, which is + * one of the constants "TYPE_" in {@link AffixPatternUtils}. + * + * @param affixPattern The affix pattern to check. + * @param type The token type. + * @return true if the affix pattern contains the given token type; false otherwise. + */ + static bool + containsType(const CharSequence &affixPattern, AffixPatternType type, UErrorCode &status); + + /** + * Checks whether the specified affix pattern has any unquoted currency symbols ("¤"). + * + * @param affixPattern The string to check for currency symbols. + * @return true if the literal has at least one unquoted currency symbol; false otherwise. + */ + static bool hasCurrencySymbols(const CharSequence &affixPattern, UErrorCode &status); + + /** + * Replaces all occurrences of tokens with the given type with the given replacement char. + * + * @param affixPattern The source affix pattern (does not get modified). + * @param type The token type. + * @param replacementChar The char to substitute in place of chars of the given token type. + * @return A string containing the new affix pattern. + */ + static UnicodeString + replaceType(const CharSequence &affixPattern, AffixPatternType type, char16_t replacementChar, + UErrorCode &status); + + /** + * Returns the next token from the affix pattern. + * + * @param tag A bitmask used for keeping track of state from token to token. The initial value + * should be 0L. + * @param patternString The affix pattern. + * @return The bitmask tag to pass to the next call of this method to retrieve the following token + * (never negative), or -1 if there were no more tokens in the affix pattern. + * @see #hasNext + */ + static AffixTag nextToken(AffixTag tag, const CharSequence &patternString, UErrorCode &status); + + /** + * Returns whether the affix pattern string has any more tokens to be retrieved from a call to + * {@link #nextToken}. + * + * @param tag The bitmask tag of the previous token, as returned by {@link #nextToken}. + * @param string The affix pattern. + * @return true if there are more tokens to consume; false otherwise. + */ + static bool hasNext(const AffixTag &tag, const CharSequence &string); + + private: + /** + * Encodes the given values into a tag struct. + * The order of the arguments is consistent with Java, but the order of the stored + * fields is not necessarily the same. + */ + static inline AffixTag + makeTag(int32_t offset, AffixPatternType type, AffixPatternState state, UChar32 cp) { + return {offset, cp, state, type}; + } +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_AFFIXUTILS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_compact.cpp b/deps/icu-small/source/i18n/number_compact.cpp new file mode 100644 index 00000000000000..8ceee1378b24cb --- /dev/null +++ b/deps/icu-small/source/i18n/number_compact.cpp @@ -0,0 +1,326 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "resource.h" +#include "number_compact.h" +#include "unicode/ustring.h" +#include "unicode/ures.h" +#include "cstring.h" +#include "charstr.h" +#include "uresimp.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// A dummy object used when a "0" compact decimal entry is encountered. This is necessary +// in order to prevent falling back to root. Object equality ("==") is intended. +const UChar *USE_FALLBACK = u""; + +/** Produces a string like "NumberElements/latn/patternsShort/decimalFormat". */ +void getResourceBundleKey(const char *nsName, CompactStyle compactStyle, CompactType compactType, + CharString &sb, UErrorCode &status) { + sb.clear(); + sb.append("NumberElements/", status); + sb.append(nsName, status); + sb.append(compactStyle == CompactStyle::UNUM_SHORT ? "/patternsShort" : "/patternsLong", status); + sb.append(compactType == CompactType::TYPE_DECIMAL ? "/decimalFormat" : "/currencyFormat", status); +} + +int32_t getIndex(int32_t magnitude, StandardPlural::Form plural) { + return magnitude * StandardPlural::COUNT + plural; +} + +int32_t countZeros(const UChar *patternString, int32_t patternLength) { + // NOTE: This strategy for computing the number of zeros is a hack for efficiency. + // It could break if there are any 0s that aren't part of the main pattern. + int32_t numZeros = 0; + for (int32_t i = 0; i < patternLength; i++) { + if (patternString[i] == u'0') { + numZeros++; + } else if (numZeros > 0) { + break; // zeros should always be contiguous + } + } + return numZeros; +} + +} // namespace + +// NOTE: patterns and multipliers both get zero-initialized. +CompactData::CompactData() : patterns(), multipliers(), largestMagnitude(0), isEmpty(TRUE) { +} + +void CompactData::populate(const Locale &locale, const char *nsName, CompactStyle compactStyle, + CompactType compactType, UErrorCode &status) { + CompactDataSink sink(*this); + LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + + bool nsIsLatn = strcmp(nsName, "latn") == 0; + bool compactIsShort = compactStyle == CompactStyle::UNUM_SHORT; + + // Fall back to latn numbering system and/or short compact style. + CharString resourceKey; + getResourceBundleKey(nsName, compactStyle, compactType, resourceKey, status); + UErrorCode localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + if (isEmpty && !nsIsLatn) { + getResourceBundleKey("latn", compactStyle, compactType, resourceKey, status); + localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + } + if (isEmpty && !compactIsShort) { + getResourceBundleKey(nsName, CompactStyle::UNUM_SHORT, compactType, resourceKey, status); + localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + } + if (isEmpty && !nsIsLatn && !compactIsShort) { + getResourceBundleKey("latn", CompactStyle::UNUM_SHORT, compactType, resourceKey, status); + localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + } + + // The last fallback should be guaranteed to return data. + if (isEmpty) { + status = U_INTERNAL_PROGRAM_ERROR; + } +} + +int32_t CompactData::getMultiplier(int32_t magnitude) const { + if (magnitude < 0) { + return 0; + } + if (magnitude > largestMagnitude) { + magnitude = largestMagnitude; + } + return multipliers[magnitude]; +} + +const UChar *CompactData::getPattern(int32_t magnitude, StandardPlural::Form plural) const { + if (magnitude < 0) { + return nullptr; + } + if (magnitude > largestMagnitude) { + magnitude = largestMagnitude; + } + const UChar *patternString = patterns[getIndex(magnitude, plural)]; + if (patternString == nullptr && plural != StandardPlural::OTHER) { + // Fall back to "other" plural variant + patternString = patterns[getIndex(magnitude, StandardPlural::OTHER)]; + } + if (patternString == USE_FALLBACK) { // == is intended + // Return null if USE_FALLBACK is present + patternString = nullptr; + } + return patternString; +} + +void CompactData::getUniquePatterns(UVector &output, UErrorCode &status) const { + U_ASSERT(output.isEmpty()); + // NOTE: In C++, this is done more manually with a UVector. + // In Java, we can take advantage of JDK HashSet. + for (auto pattern : patterns) { + if (pattern == nullptr || pattern == USE_FALLBACK) { + continue; + } + + // Insert pattern into the UVector if the UVector does not already contain the pattern. + // Search the UVector from the end since identical patterns are likely to be adjacent. + for (int32_t i = output.size() - 1; i >= 0; i--) { + if (u_strcmp(pattern, static_cast(output[i])) == 0) { + goto continue_outer; + } + } + + // The string was not found; add it to the UVector. + // ANDY: This requires a const_cast. Why? + output.addElement(const_cast(pattern), status); + + continue_outer: + continue; + } +} + +void CompactData::CompactDataSink::put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &status) { + // traverse into the table of powers of ten + ResourceTable powersOfTenTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int i3 = 0; powersOfTenTable.getKeyAndValue(i3, key, value); ++i3) { + + // Assumes that the keys are always of the form "10000" where the magnitude is the + // length of the key minus one. We expect magnitudes to be less than MAX_DIGITS. + auto magnitude = static_cast (strlen(key) - 1); + int8_t multiplier = data.multipliers[magnitude]; + U_ASSERT(magnitude < COMPACT_MAX_DIGITS); + + // Iterate over the plural variants ("one", "other", etc) + ResourceTable pluralVariantsTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int i4 = 0; pluralVariantsTable.getKeyAndValue(i4, key, value); ++i4) { + + // Skip this magnitude/plural if we already have it from a child locale. + // Note: This also skips USE_FALLBACK entries. + StandardPlural::Form plural = StandardPlural::fromString(key, status); + if (U_FAILURE(status)) { return; } + if (data.patterns[getIndex(magnitude, plural)] != nullptr) { + continue; + } + + // The value "0" means that we need to use the default pattern and not fall back + // to parent locales. Example locale where this is relevant: 'it'. + int32_t patternLength; + const UChar *patternString = value.getString(patternLength, status); + if (U_FAILURE(status)) { return; } + if (u_strcmp(patternString, u"0") == 0) { + patternString = USE_FALLBACK; + patternLength = 0; + } + + // Save the pattern string. We will parse it lazily. + data.patterns[getIndex(magnitude, plural)] = patternString; + + // If necessary, compute the multiplier: the difference between the magnitude + // and the number of zeros in the pattern. + if (multiplier == 0) { + int32_t numZeros = countZeros(patternString, patternLength); + if (numZeros > 0) { // numZeros==0 in certain cases, like Somali "Kun" + multiplier = static_cast (numZeros - magnitude - 1); + } + } + } + + // Save the multiplier. + if (data.multipliers[magnitude] == 0) { + data.multipliers[magnitude] = multiplier; + if (magnitude > data.largestMagnitude) { + data.largestMagnitude = magnitude; + } + data.isEmpty = false; + } else { + U_ASSERT(data.multipliers[magnitude] == multiplier); + } + } +} + +/////////////////////////////////////////////////////////// +/// END OF CompactData.java; BEGIN CompactNotation.java /// +/////////////////////////////////////////////////////////// + +CompactHandler::CompactHandler(CompactStyle compactStyle, const Locale &locale, const char *nsName, + CompactType compactType, const PluralRules *rules, + MutablePatternModifier *buildReference, const MicroPropsGenerator *parent, + UErrorCode &status) + : rules(rules), parent(parent) { + data.populate(locale, nsName, compactStyle, compactType, status); + if (buildReference != nullptr) { + // Safe code path + precomputeAllModifiers(*buildReference, status); + safe = TRUE; + } else { + // Unsafe code path + safe = FALSE; + } +} + +CompactHandler::~CompactHandler() { + for (int32_t i = 0; i < precomputedModsLength; i++) { + delete precomputedMods[i].mod; + } +} + +void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + + // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T + UVector allPatterns(12, status); + if (U_FAILURE(status)) { return; } + data.getUniquePatterns(allPatterns, status); + if (U_FAILURE(status)) { return; } + + // C++ only: ensure that precomputedMods has room. + precomputedModsLength = allPatterns.size(); + if (precomputedMods.getCapacity() < precomputedModsLength) { + precomputedMods.resize(allPatterns.size(), status); + if (U_FAILURE(status)) { return; } + } + + for (int32_t i = 0; i < precomputedModsLength; i++) { + auto patternString = static_cast(allPatterns[i]); + UnicodeString hello(patternString); + CompactModInfo &info = precomputedMods[i]; + ParsedPatternInfo patternInfo; + PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); + if (U_FAILURE(status)) { return; } + buildReference.setPatternInfo(&patternInfo); + info.mod = buildReference.createImmutable(status); + if (U_FAILURE(status)) { return; } + info.numDigits = patternInfo.positive.integerTotal; + info.patternString = patternString; + } +} + +void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(quantity, micros, status); + if (U_FAILURE(status)) { return; } + + // Treat zero as if it had magnitude 0 + int magnitude; + if (quantity.isZero()) { + magnitude = 0; + micros.rounding.apply(quantity, status); + } else { + // TODO: Revisit chooseMultiplierAndApply + int multiplier = micros.rounding.chooseMultiplierAndApply(quantity, data, status); + magnitude = quantity.isZero() ? 0 : quantity.getMagnitude(); + magnitude -= multiplier; + } + + StandardPlural::Form plural = quantity.getStandardPlural(rules); + const UChar *patternString = data.getPattern(magnitude, plural); + int numDigits = -1; + if (patternString == nullptr) { + // Use the default (non-compact) modifier. + // No need to take any action. + } else if (safe) { + // Safe code path. + // Java uses a hash set here for O(1) lookup. C++ uses a linear search. + // TODO: Benchmark this and maybe change to a binary search or hash table. + int32_t i = 0; + for (; i < precomputedModsLength; i++) { + const CompactModInfo &info = precomputedMods[i]; + if (u_strcmp(patternString, info.patternString) == 0) { + info.mod->applyToMicros(micros, quantity); + numDigits = info.numDigits; + break; + } + } + // It should be guaranteed that we found the entry. + U_ASSERT(i < precomputedModsLength); + } else { + // Unsafe code path. + // Overwrite the PatternInfo in the existing modMiddle. + // C++ Note: Use unsafePatternInfo for proper lifecycle. + ParsedPatternInfo &patternInfo = const_cast(this)->unsafePatternInfo; + PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); + static_cast(const_cast(micros.modMiddle)) + ->setPatternInfo(&patternInfo); + numDigits = patternInfo.positive.integerTotal; + } + + // FIXME: Deal with numDigits == 0 (Awaiting a test case) + (void)numDigits; + + // We already performed rounding. Do not perform it again. + micros.rounding = Rounder::constructPassThrough(); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_compact.h b/deps/icu-small/source/i18n/number_compact.h new file mode 100644 index 00000000000000..2344abf535a962 --- /dev/null +++ b/deps/icu-small/source/i18n/number_compact.h @@ -0,0 +1,91 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_COMPACT_H__ +#define __NUMBER_COMPACT_H__ + +#include "standardplural.h" +#include "number_types.h" +#include "unicode/unum.h" +#include "uvector.h" +#include "resource.h" +#include "number_patternmodifier.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +static const int32_t COMPACT_MAX_DIGITS = 15; + +class CompactData : public MultiplierProducer { + public: + CompactData(); + + void populate(const Locale &locale, const char *nsName, CompactStyle compactStyle, + CompactType compactType, UErrorCode &status); + + int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE; + + const UChar *getPattern(int32_t magnitude, StandardPlural::Form plural) const; + + void getUniquePatterns(UVector &output, UErrorCode &status) const; + + private: + const UChar *patterns[(COMPACT_MAX_DIGITS + 1) * StandardPlural::COUNT]; + int8_t multipliers[COMPACT_MAX_DIGITS + 1]; + int8_t largestMagnitude; + UBool isEmpty; + + class CompactDataSink : public ResourceSink { + public: + explicit CompactDataSink(CompactData &data) : data(data) {} + + void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE; + + private: + CompactData &data; + }; +}; + +struct CompactModInfo { + const ImmutablePatternModifier *mod; + const UChar* patternString; + int32_t numDigits; +}; + +class CompactHandler : public MicroPropsGenerator, public UMemory { + public: + CompactHandler(CompactStyle compactStyle, const Locale &locale, const char *nsName, + CompactType compactType, const PluralRules *rules, + MutablePatternModifier *buildReference, const MicroPropsGenerator *parent, + UErrorCode &status); + + ~CompactHandler() U_OVERRIDE; + + void + processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + private: + const PluralRules *rules; + const MicroPropsGenerator *parent; + // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T + MaybeStackArray precomputedMods; + int32_t precomputedModsLength = 0; + CompactData data; + ParsedPatternInfo unsafePatternInfo; + UBool safe; + + /** Used by the safe code path */ + void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status); +}; + + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_COMPACT_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimalquantity.cpp b/deps/icu-small/source/i18n/number_decimalquantity.cpp new file mode 100644 index 00000000000000..72463576666bb1 --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimalquantity.cpp @@ -0,0 +1,1011 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include +#include "cmemory.h" +#include "decNumber.h" +#include +#include "number_decimalquantity.h" +#include "decContext.h" +#include "decNumber.h" +#include "number_roundingutils.h" +#include "unicode/plurrule.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +int8_t NEGATIVE_FLAG = 1; +int8_t INFINITY_FLAG = 2; +int8_t NAN_FLAG = 4; + +static constexpr int32_t DEFAULT_DIGITS = 34; +typedef MaybeStackHeaderAndArray DecNumberWithStorage; + +/** Helper function to convert a decNumber-compatible string into a decNumber. */ +void stringToDecNumber(StringPiece n, DecNumberWithStorage &dn) { + decContext set; + uprv_decContextDefault(&set, DEC_INIT_BASE); + uprv_decContextSetRounding(&set, DEC_ROUND_HALF_EVEN); + set.traps = 0; // no traps, thank you + if (n.length() > DEFAULT_DIGITS) { + dn.resize(n.length(), 0); + set.digits = n.length(); + } else { + set.digits = DEFAULT_DIGITS; + } + uprv_decNumberFromString(dn.getAlias(), n.data(), &set); + U_ASSERT(DECDPUN == 1); +} + +/** Helper function for safe subtraction (no overflow). */ +inline int32_t safeSubtract(int32_t a, int32_t b) { + // Note: In C++, signed integer subtraction is undefined behavior. + int32_t diff = static_cast(static_cast(a) - static_cast(b)); + if (b < 0 && diff < a) { return INT32_MAX; } + if (b > 0 && diff > a) { return INT32_MIN; } + return diff; +} + +static double DOUBLE_MULTIPLIERS[] = { + 1e0, + 1e1, + 1e2, + 1e3, + 1e4, + 1e5, + 1e6, + 1e7, + 1e8, + 1e9, + 1e10, + 1e11, + 1e12, + 1e13, + 1e14, + 1e15, + 1e16, + 1e17, + 1e18, + 1e19, + 1e20, + 1e21}; + +} // namespace + + +DecimalQuantity::DecimalQuantity() { + setBcdToZero(); + flags = 0; +} + +DecimalQuantity::~DecimalQuantity() { + if (usingBytes) { + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = nullptr; + usingBytes = false; + } +} + +DecimalQuantity::DecimalQuantity(const DecimalQuantity &other) { + *this = other; +} + +DecimalQuantity &DecimalQuantity::operator=(const DecimalQuantity &other) { + if (this == &other) { + return *this; + } + copyBcdFrom(other); + lOptPos = other.lOptPos; + lReqPos = other.lReqPos; + rReqPos = other.rReqPos; + rOptPos = other.rOptPos; + scale = other.scale; + precision = other.precision; + flags = other.flags; + origDouble = other.origDouble; + origDelta = other.origDelta; + isApproximate = other.isApproximate; + return *this; +} + +void DecimalQuantity::clear() { + lOptPos = INT32_MAX; + lReqPos = 0; + rReqPos = 0; + rOptPos = INT32_MIN; + flags = 0; + setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data +} + +void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) { + // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class. + U_ASSERT(minInt >= 0); + U_ASSERT(maxInt >= minInt); + + // Save values into internal state + // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE + lOptPos = maxInt; + lReqPos = minInt; +} + +void DecimalQuantity::setFractionLength(int32_t minFrac, int32_t maxFrac) { + // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class. + U_ASSERT(minFrac >= 0); + U_ASSERT(maxFrac >= minFrac); + + // Save values into internal state + // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE + rReqPos = -minFrac; + rOptPos = -maxFrac; +} + +uint64_t DecimalQuantity::getPositionFingerprint() const { + uint64_t fingerprint = 0; + fingerprint ^= lOptPos; + fingerprint ^= (lReqPos << 16); + fingerprint ^= (static_cast(rReqPos) << 32); + fingerprint ^= (static_cast(rOptPos) << 48); + return fingerprint; +} + +void DecimalQuantity::roundToIncrement(double roundingIncrement, RoundingMode roundingMode, + int32_t minMaxFrac, UErrorCode& status) { + // TODO: This is innefficient. Improve? + // TODO: Should we convert to decNumber instead? + double temp = toDouble(); + temp /= roundingIncrement; + setToDouble(temp); + roundToMagnitude(0, roundingMode, status); + temp = toDouble(); + temp *= roundingIncrement; + setToDouble(temp); + // Since we reset the value to a double, we need to specify the rounding boundary + // in order to get the DecimalQuantity out of approximation mode. + roundToMagnitude(-minMaxFrac, roundingMode, status); +} + +void DecimalQuantity::multiplyBy(int32_t multiplicand) { + if (isInfinite() || isZero() || isNaN()) { + return; + } + // TODO: Should we convert to decNumber instead? + double temp = toDouble(); + temp *= multiplicand; + setToDouble(temp); +} + +int32_t DecimalQuantity::getMagnitude() const { + U_ASSERT(precision != 0); + return scale + precision - 1; +} + +void DecimalQuantity::adjustMagnitude(int32_t delta) { + if (precision != 0) { + scale += delta; + origDelta += delta; + } +} + +StandardPlural::Form DecimalQuantity::getStandardPlural(const PluralRules *rules) const { + if (rules == nullptr) { + // Fail gracefully if the user didn't provide a PluralRules + return StandardPlural::Form::OTHER; + } else { + UnicodeString ruleString = rules->select(*this); + return StandardPlural::orOtherFromString(ruleString); + } +} + +double DecimalQuantity::getPluralOperand(PluralOperand operand) const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment at the top of this file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + switch (operand) { + case PLURAL_OPERAND_I: + return static_cast(toLong()); + case PLURAL_OPERAND_F: + return static_cast(toFractionLong(true)); + case PLURAL_OPERAND_T: + return static_cast(toFractionLong(false)); + case PLURAL_OPERAND_V: + return fractionCount(); + case PLURAL_OPERAND_W: + return fractionCountWithoutTrailingZeros(); + default: + return std::abs(toDouble()); + } +} + +int32_t DecimalQuantity::getUpperDisplayMagnitude() const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment in the header file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + int32_t magnitude = scale + precision; + int32_t result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude; + return result - 1; +} + +int32_t DecimalQuantity::getLowerDisplayMagnitude() const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment in the header file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + int32_t magnitude = scale; + int32_t result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude; + return result; +} + +int8_t DecimalQuantity::getDigit(int32_t magnitude) const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment at the top of this file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + return getDigitPos(magnitude - scale); +} + +int32_t DecimalQuantity::fractionCount() const { + return -getLowerDisplayMagnitude(); +} + +int32_t DecimalQuantity::fractionCountWithoutTrailingZeros() const { + return -scale > 0 ? -scale : 0; // max(-scale, 0) +} + +bool DecimalQuantity::isNegative() const { + return (flags & NEGATIVE_FLAG) != 0; +} + +bool DecimalQuantity::isInfinite() const { + return (flags & INFINITY_FLAG) != 0; +} + +bool DecimalQuantity::isNaN() const { + return (flags & NAN_FLAG) != 0; +} + +bool DecimalQuantity::isZero() const { + return precision == 0; +} + +DecimalQuantity &DecimalQuantity::setToInt(int32_t n) { + setBcdToZero(); + flags = 0; + if (n < 0) { + flags |= NEGATIVE_FLAG; + n = -n; + } + if (n != 0) { + _setToInt(n); + compact(); + } + return *this; +} + +void DecimalQuantity::_setToInt(int32_t n) { + if (n == INT32_MIN) { + readLongToBcd(-static_cast(n)); + } else { + readIntToBcd(n); + } +} + +DecimalQuantity &DecimalQuantity::setToLong(int64_t n) { + setBcdToZero(); + flags = 0; + if (n < 0) { + flags |= NEGATIVE_FLAG; + n = -n; + } + if (n != 0) { + _setToLong(n); + compact(); + } + return *this; +} + +void DecimalQuantity::_setToLong(int64_t n) { + if (n == INT64_MIN) { + static const char *int64minStr = "9.223372036854775808E+18"; + DecNumberWithStorage dn; + stringToDecNumber(int64minStr, dn); + readDecNumberToBcd(dn.getAlias()); + } else if (n <= INT32_MAX) { + readIntToBcd(static_cast(n)); + } else { + readLongToBcd(n); + } +} + +DecimalQuantity &DecimalQuantity::setToDouble(double n) { + setBcdToZero(); + flags = 0; + // signbit() from handles +0.0 vs -0.0 + if (std::signbit(n) != 0) { + flags |= NEGATIVE_FLAG; + n = -n; + } + if (std::isnan(n) != 0) { + flags |= NAN_FLAG; + } else if (std::isfinite(n) == 0) { + flags |= INFINITY_FLAG; + } else if (n != 0) { + _setToDoubleFast(n); + compact(); + } + return *this; +} + +void DecimalQuantity::_setToDoubleFast(double n) { + isApproximate = true; + origDouble = n; + origDelta = 0; + + // Make sure the double is an IEEE 754 double. If not, fall back to the slow path right now. + // TODO: Make a fast path for other types of doubles. + if (!std::numeric_limits::is_iec559) { + convertToAccurateDouble(); + // Turn off the approximate double flag, since the value is now exact. + isApproximate = false; + origDouble = 0.0; + return; + } + + // To get the bits from the double, use memcpy, which takes care of endianness. + uint64_t ieeeBits; + uprv_memcpy(&ieeeBits, &n, sizeof(n)); + int32_t exponent = static_cast((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff; + + // Not all integers can be represented exactly for exponent > 52 + if (exponent <= 52 && static_cast(n) == n) { + _setToLong(static_cast(n)); + return; + } + + // 3.3219... is log2(10) + auto fracLength = static_cast ((52 - exponent) / 3.32192809489); + if (fracLength >= 0) { + int32_t i = fracLength; + // 1e22 is the largest exact double. + for (; i >= 22; i -= 22) n *= 1e22; + n *= DOUBLE_MULTIPLIERS[i]; + } else { + int32_t i = fracLength; + // 1e22 is the largest exact double. + for (; i <= -22; i += 22) n /= 1e22; + n /= DOUBLE_MULTIPLIERS[-i]; + } + auto result = static_cast(std::round(n)); + if (result != 0) { + _setToLong(result); + scale -= fracLength; + } +} + +void DecimalQuantity::convertToAccurateDouble() { + double n = origDouble; + U_ASSERT(n != 0); + int32_t delta = origDelta; + setBcdToZero(); + + // Call the slow oracle function (Double.toString in Java, sprintf in C++). + // The constant DBL_DIG defines a platform-specific number of digits in a double. + // However, this tends to be too low (see #11318). Instead, we always use 14 decimal places. + static constexpr size_t CAP = 1 + 14 + 8; // Extra space for '+', '.', e+NNN, and '\0' + char dstr[CAP]; + snprintf(dstr, CAP, "%+1.14e", n); + + // uprv_decNumberFromString() will parse the string expecting '.' as a + // decimal separator, however sprintf() can use ',' in certain locales. + // Overwrite a ',' with '.' here before proceeding. + char *decimalSeparator = strchr(dstr, ','); + if (decimalSeparator != nullptr) { + *decimalSeparator = '.'; + } + + StringPiece sp(dstr); + DecNumberWithStorage dn; + stringToDecNumber(dstr, dn); + _setToDecNumber(dn.getAlias()); + + scale += delta; + explicitExactDouble = true; +} + +DecimalQuantity &DecimalQuantity::setToDecNumber(StringPiece n) { + setBcdToZero(); + flags = 0; + + DecNumberWithStorage dn; + stringToDecNumber(n, dn); + + // The code path for decNumber is modeled after BigDecimal in Java. + if (decNumberIsNegative(dn.getAlias())) { + flags |= NEGATIVE_FLAG; + } + if (!decNumberIsZero(dn.getAlias())) { + _setToDecNumber(dn.getAlias()); + } + return *this; +} + +void DecimalQuantity::_setToDecNumber(decNumber *n) { + // Java fastpaths for ints here. In C++, just always read directly from the decNumber. + readDecNumberToBcd(n); + compact(); +} + +int64_t DecimalQuantity::toLong() const { + int64_t result = 0L; + for (int32_t magnitude = scale + precision - 1; magnitude >= 0; magnitude--) { + result = result * 10 + getDigitPos(magnitude - scale); + } + return result; +} + +int64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const { + int64_t result = 0L; + int32_t magnitude = -1; + for (; (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos)) && + magnitude >= rOptPos; magnitude--) { + result = result * 10 + getDigitPos(magnitude - scale); + } + return result; +} + +double DecimalQuantity::toDouble() const { + if (isApproximate) { + return toDoubleFromOriginal(); + } + + if (isNaN()) { + return NAN; + } else if (isInfinite()) { + return isNegative() ? -INFINITY : INFINITY; + } + + int64_t tempLong = 0L; + int32_t lostDigits = precision - (precision < 17 ? precision : 17); + for (int shift = precision - 1; shift >= lostDigits; shift--) { + tempLong = tempLong * 10 + getDigitPos(shift); + } + double result = static_cast(tempLong); + int32_t _scale = scale + lostDigits; + if (_scale >= 0) { + // 1e22 is the largest exact double. + int32_t i = _scale; + for (; i >= 22; i -= 22) result *= 1e22; + result *= DOUBLE_MULTIPLIERS[i]; + } else { + // 1e22 is the largest exact double. + int32_t i = _scale; + for (; i <= -22; i += 22) result /= 1e22; + result /= DOUBLE_MULTIPLIERS[-i]; + } + if (isNegative()) { result = -result; } + return result; +} + +double DecimalQuantity::toDoubleFromOriginal() const { + double result = origDouble; + int32_t delta = origDelta; + if (delta >= 0) { + // 1e22 is the largest exact double. + for (; delta >= 22; delta -= 22) result *= 1e22; + result *= DOUBLE_MULTIPLIERS[delta]; + } else { + // 1e22 is the largest exact double. + for (; delta <= -22; delta += 22) result /= 1e22; + result /= DOUBLE_MULTIPLIERS[-delta]; + } + if (isNegative()) { result *= -1; } + return result; +} + +void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) { + // The position in the BCD at which rounding will be performed; digits to the right of position + // will be rounded away. + // TODO: Andy: There was a test failure because of integer overflow here. Should I do + // "safe subtraction" everywhere in the code? What's the nicest way to do it? + int position = safeSubtract(magnitude, scale); + + if (position <= 0 && !isApproximate) { + // All digits are to the left of the rounding magnitude. + } else if (precision == 0) { + // No rounding for zero. + } else { + // Perform rounding logic. + // "leading" = most significant digit to the right of rounding + // "trailing" = least significant digit to the left of rounding + int8_t leadingDigit = getDigitPos(safeSubtract(position, 1)); + int8_t trailingDigit = getDigitPos(position); + + // Compute which section of the number we are in. + // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles) + // LOWER means we are between the bottom edge and the midpoint, like 1.391 + // MIDPOINT means we are exactly in the middle, like 1.500 + // UPPER means we are between the midpoint and the top edge, like 1.916 + roundingutils::Section section = roundingutils::SECTION_MIDPOINT; + if (!isApproximate) { + if (leadingDigit < 5) { + section = roundingutils::SECTION_LOWER; + } else if (leadingDigit > 5) { + section = roundingutils::SECTION_UPPER; + } else { + for (int p = safeSubtract(position, 2); p >= 0; p--) { + if (getDigitPos(p) != 0) { + section = roundingutils::SECTION_UPPER; + break; + } + } + } + } else { + int32_t p = safeSubtract(position, 2); + int32_t minP = uprv_max(0, precision - 14); + if (leadingDigit == 0) { + section = roundingutils::SECTION_LOWER_EDGE; + for (; p >= minP; p--) { + if (getDigitPos(p) != 0) { + section = roundingutils::SECTION_LOWER; + break; + } + } + } else if (leadingDigit == 4) { + for (; p >= minP; p--) { + if (getDigitPos(p) != 9) { + section = roundingutils::SECTION_LOWER; + break; + } + } + } else if (leadingDigit == 5) { + for (; p >= minP; p--) { + if (getDigitPos(p) != 0) { + section = roundingutils::SECTION_UPPER; + break; + } + } + } else if (leadingDigit == 9) { + section = roundingutils::SECTION_UPPER_EDGE; + for (; p >= minP; p--) { + if (getDigitPos(p) != 9) { + section = roundingutils::SECTION_UPPER; + break; + } + } + } else if (leadingDigit < 5) { + section = roundingutils::SECTION_LOWER; + } else { + section = roundingutils::SECTION_UPPER; + } + + bool roundsAtMidpoint = roundingutils::roundsAtMidpoint(roundingMode); + if (safeSubtract(position, 1) < precision - 14 || + (roundsAtMidpoint && section == roundingutils::SECTION_MIDPOINT) || + (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) { + // Oops! This means that we have to get the exact representation of the double, because + // the zone of uncertainty is along the rounding boundary. + convertToAccurateDouble(); + roundToMagnitude(magnitude, roundingMode, status); // start over + return; + } + + // Turn off the approximate double flag, since the value is now confirmed to be exact. + isApproximate = false; + origDouble = 0.0; + origDelta = 0; + + if (position <= 0) { + // All digits are to the left of the rounding magnitude. + return; + } + + // Good to continue rounding. + if (section == -1) { section = roundingutils::SECTION_LOWER; } + if (section == -2) { section = roundingutils::SECTION_UPPER; } + } + + bool roundDown = roundingutils::getRoundingDirection((trailingDigit % 2) == 0, + isNegative(), + section, + roundingMode, + status); + if (U_FAILURE(status)) { + return; + } + + // Perform truncation + if (position >= precision) { + setBcdToZero(); + scale = magnitude; + } else { + shiftRight(position); + } + + // Bubble the result to the higher digits + if (!roundDown) { + if (trailingDigit == 9) { + int bubblePos = 0; + // Note: in the long implementation, the most digits BCD can have at this point is 15, + // so bubblePos <= 15 and getDigitPos(bubblePos) is safe. + for (; getDigitPos(bubblePos) == 9; bubblePos++) {} + shiftRight(bubblePos); // shift off the trailing 9s + } + int8_t digit0 = getDigitPos(0); + U_ASSERT(digit0 != 9); + setDigitPos(0, static_cast(digit0 + 1)); + precision += 1; // in case an extra digit got added + } + + compact(); + } +} + +void DecimalQuantity::roundToInfinity() { + if (isApproximate) { + convertToAccurateDouble(); + } +} + +void DecimalQuantity::appendDigit(int8_t value, int32_t leadingZeros, bool appendAsInteger) { + U_ASSERT(leadingZeros >= 0); + + // Zero requires special handling to maintain the invariant that the least-significant digit + // in the BCD is nonzero. + if (value == 0) { + if (appendAsInteger && precision != 0) { + scale += leadingZeros + 1; + } + return; + } + + // Deal with trailing zeros + if (scale > 0) { + leadingZeros += scale; + if (appendAsInteger) { + scale = 0; + } + } + + // Append digit + shiftLeft(leadingZeros + 1); + setDigitPos(0, value); + + // Fix scale if in integer mode + if (appendAsInteger) { + scale += leadingZeros + 1; + } +} + +UnicodeString DecimalQuantity::toPlainString() const { + UnicodeString sb; + if (isNegative()) { + sb.append(u'-'); + } + for (int m = getUpperDisplayMagnitude(); m >= getLowerDisplayMagnitude(); m--) { + sb.append(getDigit(m) + u'0'); + if (m == 0) { sb.append(u'.'); } + } + return sb; +} + +//////////////////////////////////////////////////// +/// End of DecimalQuantity_AbstractBCD.java /// +/// Start of DecimalQuantity_DualStorageBCD.java /// +//////////////////////////////////////////////////// + +int8_t DecimalQuantity::getDigitPos(int32_t position) const { + if (usingBytes) { + if (position < 0 || position > precision) { return 0; } + return fBCD.bcdBytes.ptr[position]; + } else { + if (position < 0 || position >= 16) { return 0; } + return (int8_t) ((fBCD.bcdLong >> (position * 4)) & 0xf); + } +} + +void DecimalQuantity::setDigitPos(int32_t position, int8_t value) { + U_ASSERT(position >= 0); + if (usingBytes) { + ensureCapacity(position + 1); + fBCD.bcdBytes.ptr[position] = value; + } else if (position >= 16) { + switchStorage(); + ensureCapacity(position + 1); + fBCD.bcdBytes.ptr[position] = value; + } else { + int shift = position * 4; + fBCD.bcdLong = (fBCD.bcdLong & ~(0xfL << shift)) | ((long) value << shift); + } +} + +void DecimalQuantity::shiftLeft(int32_t numDigits) { + if (!usingBytes && precision + numDigits > 16) { + switchStorage(); + } + if (usingBytes) { + ensureCapacity(precision + numDigits); + int i = precision + numDigits - 1; + for (; i >= numDigits; i--) { + fBCD.bcdBytes.ptr[i] = fBCD.bcdBytes.ptr[i - numDigits]; + } + for (; i >= 0; i--) { + fBCD.bcdBytes.ptr[i] = 0; + } + } else { + fBCD.bcdLong <<= (numDigits * 4); + } + scale -= numDigits; + precision += numDigits; +} + +void DecimalQuantity::shiftRight(int32_t numDigits) { + if (usingBytes) { + int i = 0; + for (; i < precision - numDigits; i++) { + fBCD.bcdBytes.ptr[i] = fBCD.bcdBytes.ptr[i + numDigits]; + } + for (; i < precision; i++) { + fBCD.bcdBytes.ptr[i] = 0; + } + } else { + fBCD.bcdLong >>= (numDigits * 4); + } + scale += numDigits; + precision -= numDigits; +} + +void DecimalQuantity::setBcdToZero() { + if (usingBytes) { + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = nullptr; + usingBytes = false; + } + fBCD.bcdLong = 0L; + scale = 0; + precision = 0; + isApproximate = false; + origDouble = 0; + origDelta = 0; +} + +void DecimalQuantity::readIntToBcd(int32_t n) { + U_ASSERT(n != 0); + // ints always fit inside the long implementation. + uint64_t result = 0L; + int i = 16; + for (; n != 0; n /= 10, i--) { + result = (result >> 4) + ((static_cast(n) % 10) << 60); + } + U_ASSERT(!usingBytes); + fBCD.bcdLong = result >> (i * 4); + scale = 0; + precision = 16 - i; +} + +void DecimalQuantity::readLongToBcd(int64_t n) { + U_ASSERT(n != 0); + if (n >= 10000000000000000L) { + ensureCapacity(); + int i = 0; + for (; n != 0L; n /= 10L, i++) { + fBCD.bcdBytes.ptr[i] = static_cast(n % 10); + } + U_ASSERT(usingBytes); + scale = 0; + precision = i; + } else { + uint64_t result = 0L; + int i = 16; + for (; n != 0L; n /= 10L, i--) { + result = (result >> 4) + ((n % 10) << 60); + } + U_ASSERT(i >= 0); + U_ASSERT(!usingBytes); + fBCD.bcdLong = result >> (i * 4); + scale = 0; + precision = 16 - i; + } +} + +void DecimalQuantity::readDecNumberToBcd(decNumber *dn) { + if (dn->digits > 16) { + ensureCapacity(dn->digits); + for (int32_t i = 0; i < dn->digits; i++) { + fBCD.bcdBytes.ptr[i] = dn->lsu[i]; + } + } else { + uint64_t result = 0L; + for (int32_t i = 0; i < dn->digits; i++) { + result |= static_cast(dn->lsu[i]) << (4 * i); + } + fBCD.bcdLong = result; + } + scale = dn->exponent; + precision = dn->digits; +} + +void DecimalQuantity::compact() { + if (usingBytes) { + int32_t delta = 0; + for (; delta < precision && fBCD.bcdBytes.ptr[delta] == 0; delta++); + if (delta == precision) { + // Number is zero + setBcdToZero(); + return; + } else { + // Remove trailing zeros + shiftRight(delta); + } + + // Compute precision + int32_t leading = precision - 1; + for (; leading >= 0 && fBCD.bcdBytes.ptr[leading] == 0; leading--); + precision = leading + 1; + + // Switch storage mechanism if possible + if (precision <= 16) { + switchStorage(); + } + + } else { + if (fBCD.bcdLong == 0L) { + // Number is zero + setBcdToZero(); + return; + } + + // Compact the number (remove trailing zeros) + // TODO: Use a more efficient algorithm here and below. There is a logarithmic one. + int32_t delta = 0; + for (; delta < precision && getDigitPos(delta) == 0; delta++); + fBCD.bcdLong >>= delta * 4; + scale += delta; + + // Compute precision + int32_t leading = precision - 1; + for (; leading >= 0 && getDigitPos(leading) == 0; leading--); + precision = leading + 1; + } +} + +void DecimalQuantity::ensureCapacity() { + ensureCapacity(40); +} + +void DecimalQuantity::ensureCapacity(int32_t capacity) { + if (capacity == 0) { return; } + int32_t oldCapacity = usingBytes ? fBCD.bcdBytes.len : 0; + if (!usingBytes) { + // TODO: There is nothing being done to check for memory allocation failures. + // TODO: Consider indexing by nybbles instead of bytes in C++, so that we can + // make these arrays half the size. + fBCD.bcdBytes.ptr = static_cast(uprv_malloc(capacity * sizeof(int8_t))); + fBCD.bcdBytes.len = capacity; + // Initialize the byte array to zeros (this is done automatically in Java) + uprv_memset(fBCD.bcdBytes.ptr, 0, capacity * sizeof(int8_t)); + } else if (oldCapacity < capacity) { + auto bcd1 = static_cast(uprv_malloc(capacity * 2 * sizeof(int8_t))); + uprv_memcpy(bcd1, fBCD.bcdBytes.ptr, oldCapacity * sizeof(int8_t)); + // Initialize the rest of the byte array to zeros (this is done automatically in Java) + uprv_memset(fBCD.bcdBytes.ptr + oldCapacity, 0, (capacity - oldCapacity) * sizeof(int8_t)); + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = bcd1; + fBCD.bcdBytes.len = capacity * 2; + } + usingBytes = true; +} + +void DecimalQuantity::switchStorage() { + if (usingBytes) { + // Change from bytes to long + uint64_t bcdLong = 0L; + for (int i = precision - 1; i >= 0; i--) { + bcdLong <<= 4; + bcdLong |= fBCD.bcdBytes.ptr[i]; + } + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = nullptr; + fBCD.bcdLong = bcdLong; + usingBytes = false; + } else { + // Change from long to bytes + // Copy the long into a local variable since it will get munged when we allocate the bytes + uint64_t bcdLong = fBCD.bcdLong; + ensureCapacity(); + for (int i = 0; i < precision; i++) { + fBCD.bcdBytes.ptr[i] = static_cast(bcdLong & 0xf); + bcdLong >>= 4; + } + U_ASSERT(usingBytes); + } +} + +void DecimalQuantity::copyBcdFrom(const DecimalQuantity &other) { + setBcdToZero(); + if (other.usingBytes) { + ensureCapacity(other.precision); + uprv_memcpy(fBCD.bcdBytes.ptr, other.fBCD.bcdBytes.ptr, other.precision * sizeof(int8_t)); + } else { + fBCD.bcdLong = other.fBCD.bcdLong; + } +} + +const char16_t* DecimalQuantity::checkHealth() const { + if (usingBytes) { + if (precision == 0) { return u"Zero precision but we are in byte mode"; } + int32_t capacity = fBCD.bcdBytes.len; + if (precision > capacity) { return u"Precision exceeds length of byte array"; } + if (getDigitPos(precision - 1) == 0) { return u"Most significant digit is zero in byte mode"; } + if (getDigitPos(0) == 0) { return u"Least significant digit is zero in long mode"; } + for (int i = 0; i < precision; i++) { + if (getDigitPos(i) >= 10) { return u"Digit exceeding 10 in byte array"; } + if (getDigitPos(i) < 0) { return u"Digit below 0 in byte array"; } + } + for (int i = precision; i < capacity; i++) { + if (getDigitPos(i) != 0) { return u"Nonzero digits outside of range in byte array"; } + } + } else { + if (precision == 0 && fBCD.bcdLong != 0) { + return u"Value in bcdLong even though precision is zero"; + } + if (precision > 16) { return u"Precision exceeds length of long"; } + if (precision != 0 && getDigitPos(precision - 1) == 0) { + return u"Most significant digit is zero in long mode"; + } + if (precision != 0 && getDigitPos(0) == 0) { + return u"Least significant digit is zero in long mode"; + } + for (int i = 0; i < precision; i++) { + if (getDigitPos(i) >= 10) { return u"Digit exceeding 10 in long"; } + if (getDigitPos(i) < 0) { return u"Digit below 0 in long (?!)"; } + } + for (int i = precision; i < 16; i++) { + if (getDigitPos(i) != 0) { return u"Nonzero digits outside of range in long"; } + } + } + + // No error + return nullptr; +} + +UnicodeString DecimalQuantity::toString() const { + MaybeStackArray digits(precision + 1); + for (int32_t i = 0; i < precision; i++) { + digits[i] = getDigitPos(precision - i - 1) + '0'; + } + digits[precision] = 0; // terminate buffer + char buffer8[100]; + snprintf( + buffer8, + sizeof(buffer8), + "", + (lOptPos > 999 ? 999 : lOptPos), + lReqPos, + rReqPos, + (rOptPos < -999 ? -999 : rOptPos), + (usingBytes ? "bytes" : "long"), + (precision == 0 ? "0" : digits.getAlias()), + "E", + scale); + return UnicodeString(buffer8, -1, US_INV); +} + +UnicodeString DecimalQuantity::toNumberString() const { + MaybeStackArray digits(precision + 11); + for (int32_t i = 0; i < precision; i++) { + digits[i] = getDigitPos(precision - i - 1) + '0'; + } + snprintf(digits.getAlias() + precision, 11, "E%d", scale); + return UnicodeString(digits.getAlias(), -1, US_INV); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h new file mode 100644 index 00000000000000..ccb832623cb7bb --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -0,0 +1,438 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_DECIMALQUANTITY_H__ +#define __NUMBER_DECIMALQUANTITY_H__ + +#include +#include "unicode/umachine.h" +#include "decNumber.h" +#include "standardplural.h" +#include "plurrule_impl.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +/** + * An class for representing a number to be processed by the decimal formatting pipeline. Includes + * methods for rounding, plural rules, and decimal digit extraction. + * + *

By design, this is NOT IMMUTABLE and NOT THREAD SAFE. It is intended to be an intermediate + * object holding state during a pass through the decimal formatting pipeline. + * + *

Represents numbers and digit display properties using Binary Coded Decimal (BCD). + * + *

Java has multiple implementations for testing, but C++ has only one implementation. + */ +class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { + public: + /** Copy constructor. */ + DecimalQuantity(const DecimalQuantity &other); + + DecimalQuantity(); + + ~DecimalQuantity(); + + /** + * Sets this instance to be equal to another instance. + * + * @param other The instance to copy from. + */ + DecimalQuantity &operator=(const DecimalQuantity &other); + + /** + * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate. + * This method does not perform rounding. + * + * @param minInt The minimum number of integer digits. + * @param maxInt The maximum number of integer digits. + */ + void setIntegerLength(int32_t minInt, int32_t maxInt); + + /** + * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate. + * This method does not perform rounding. + * + * @param minFrac The minimum number of fraction digits. + * @param maxFrac The maximum number of fraction digits. + */ + void setFractionLength(int32_t minFrac, int32_t maxFrac); + + /** + * Rounds the number to a specified interval, such as 0.05. + * + *

If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead. + * + * @param roundingIncrement The increment to which to round. + * @param mathContext The {@link RoundingMode} to use if rounding is necessary. + */ + void roundToIncrement(double roundingIncrement, RoundingMode roundingMode, + int32_t minMaxFrac, UErrorCode& status); + + /** + * Rounds the number to a specified magnitude (power of ten). + * + * @param roundingMagnitude The power of ten to which to round. For example, a value of -2 will + * round to 2 decimal places. + * @param mathContext The {@link RoundingMode} to use if rounding is necessary. + */ + void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status); + + /** + * Rounds the number to an infinite number of decimal points. This has no effect except for + * forcing the double in {@link DecimalQuantity_AbstractBCD} to adopt its exact representation. + */ + void roundToInfinity(); + + /** + * Multiply the internal value. + * + * @param multiplicand The value by which to multiply. + */ + void multiplyBy(int32_t multiplicand); + + /** + * Scales the number by a power of ten. For example, if the value is currently "1234.56", calling + * this method with delta=-3 will change the value to "1.23456". + * + * @param delta The number of magnitudes of ten to change by. + */ + void adjustMagnitude(int32_t delta); + + /** + * @return The power of ten corresponding to the most significant nonzero digit. + * The number must not be zero. + */ + int32_t getMagnitude() const; + + /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */ + bool isZero() const; + + /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */ + bool isNegative() const; + + /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */ + bool isInfinite() const U_OVERRIDE; + + /** @return Whether the value represented by this {@link DecimalQuantity} is not a number. */ + bool isNaN() const U_OVERRIDE; + + int64_t toLong() const; + + int64_t toFractionLong(bool includeTrailingZeros) const; + + /** @return The value contained in this {@link DecimalQuantity} approximated as a double. */ + double toDouble() const; + + DecimalQuantity &setToInt(int32_t n); + + DecimalQuantity &setToLong(int64_t n); + + DecimalQuantity &setToDouble(double n); + + /** decNumber is similar to BigDecimal in Java. */ + + DecimalQuantity &setToDecNumber(StringPiece n); + + /** + * Appends a digit, optionally with one or more leading zeros, to the end of the value represented + * by this DecimalQuantity. + * + *

The primary use of this method is to construct numbers during a parsing loop. It allows + * parsing to take advantage of the digit list infrastructure primarily designed for formatting. + * + * @param value The digit to append. + * @param leadingZeros The number of zeros to append before the digit. For example, if the value + * in this instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes + * 12.304. + * @param appendAsInteger If true, increase the magnitude of existing digits to make room for the + * new digit. If false, append to the end like a fraction digit. If true, there must not be + * any fraction digits already in the number. + * @internal + * @deprecated This API is ICU internal only. + */ + void appendDigit(int8_t value, int32_t leadingZeros, bool appendAsInteger); + + /** + * Computes the plural form for this number based on the specified set of rules. + * + * @param rules A {@link PluralRules} object representing the set of rules. + * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in + * the set of standard plurals, {@link StandardPlural#OTHER} is returned instead. + */ + StandardPlural::Form getStandardPlural(const PluralRules *rules) const; + + double getPluralOperand(PluralOperand operand) const U_OVERRIDE; + + /** + * Gets the digit at the specified magnitude. For example, if the represented number is 12.3, + * getDigit(-1) returns 3, since 3 is the digit corresponding to 10^-1. + * + * @param magnitude The magnitude of the digit. + * @return The digit at the specified magnitude. + */ + int8_t getDigit(int32_t magnitude) const; + + /** + * Gets the largest power of ten that needs to be displayed. The value returned by this function + * will be bounded between minInt and maxInt. + * + * @return The highest-magnitude digit to be displayed. + */ + int32_t getUpperDisplayMagnitude() const; + + /** + * Gets the smallest power of ten that needs to be displayed. The value returned by this function + * will be bounded between -minFrac and -maxFrac. + * + * @return The lowest-magnitude digit to be displayed. + */ + int32_t getLowerDisplayMagnitude() const; + + int32_t fractionCount() const; + + int32_t fractionCountWithoutTrailingZeros() const; + + void clear(); + + /** This method is for internal testing only. */ + uint64_t getPositionFingerprint() const; + +// /** +// * If the given {@link FieldPosition} is a {@link UFieldPosition}, populates it with the fraction +// * length and fraction long value. If the argument is not a {@link UFieldPosition}, nothing +// * happens. +// * +// * @param fp The {@link UFieldPosition} to populate. +// */ +// void populateUFieldPosition(FieldPosition fp); + + /** + * Checks whether the bytes stored in this instance are all valid. For internal unit testing only. + * + * @return An error message if this instance is invalid, or null if this instance is healthy. + */ + const char16_t* checkHealth() const; + + UnicodeString toString() const; + + /* Returns the string in exponential notation. */ + UnicodeString toNumberString() const; + + /* Returns the string without exponential notation. Slightly slower than toNumberString(). */ + UnicodeString toPlainString() const; + + /** Visible for testing */ + inline bool isUsingBytes() { return usingBytes; } + + /** Visible for testing */ + inline bool isExplicitExactDouble() { return explicitExactDouble; }; + + private: + /** + * The power of ten corresponding to the least significant digit in the BCD. For example, if this + * object represents the number "3.14", the BCD will be "0x314" and the scale will be -2. + * + *

Note that in {@link java.math.BigDecimal}, the scale is defined differently: the number of + * digits after the decimal place, which is the negative of our definition of scale. + */ + int32_t scale; + + /** + * The number of digits in the BCD. For example, "1007" has BCD "0x1007" and precision 4. The + * maximum precision is 16 since a long can hold only 16 digits. + * + *

This value must be re-calculated whenever the value in bcd changes by using {@link + * #computePrecisionAndCompact()}. + */ + int32_t precision; + + /** + * A bitmask of properties relating to the number represented by this object. + * + * @see #NEGATIVE_FLAG + * @see #INFINITY_FLAG + * @see #NAN_FLAG + */ + int8_t flags; + + // The following three fields relate to the double-to-ascii fast path algorithm. + // When a double is given to DecimalQuantityBCD, it is converted to using a fast algorithm. The + // fast algorithm guarantees correctness to only the first ~12 digits of the double. The process + // of rounding the number ensures that the converted digits are correct, falling back to a slow- + // path algorithm if required. Therefore, if a DecimalQuantity is constructed from a double, it + // is *required* that roundToMagnitude(), roundToIncrement(), or roundToInfinity() is called. If + // you don't round, assertions will fail in certain other methods if you try calling them. + + /** + * Whether the value in the BCD comes from the double fast path without having been rounded to + * ensure correctness + */ + UBool isApproximate; + + /** + * The original number provided by the user and which is represented in BCD. Used when we need to + * re-compute the BCD for an exact double representation. + */ + double origDouble; + + /** + * The change in magnitude relative to the original double. Used when we need to re-compute the + * BCD for an exact double representation. + */ + int32_t origDelta; + + // Four positions: left optional '(', left required '[', right required ']', right optional ')'. + // These four positions determine which digits are displayed in the output string. They do NOT + // affect rounding. These positions are internal-only and can be specified only by the public + // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others. + // + // * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed. + // * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone" + // and are displayed unless they are trailing off the left or right edge of the number and + // have a numerical value of zero. In order to be "trailing", the digits need to be beyond + // the decimal point in their respective directions. + // * Digits outside of the "optional zone" are never displayed. + // + // See the table below for illustrative examples. + // + // +---------+---------+---------+---------+------------+------------------------+--------------+ + // | lOptPos | lReqPos | rReqPos | rOptPos | number | positions | en-US string | + // +---------+---------+---------+---------+------------+------------------------+--------------+ + // | 5 | 2 | -1 | -5 | 1234.567 | ( 12[34.5]67 ) | 1,234.567 | + // | 3 | 2 | -1 | -5 | 1234.567 | 1(2[34.5]67 ) | 234.567 | + // | 3 | 2 | -1 | -2 | 1234.567 | 1(2[34.5]6)7 | 234.56 | + // | 6 | 4 | 2 | -5 | 123456789. | 123(45[67]89. ) | 456,789. | + // | 6 | 4 | 2 | 1 | 123456789. | 123(45[67]8)9. | 456,780. | + // | -1 | -1 | -3 | -4 | 0.123456 | 0.1([23]4)56 | .0234 | + // | 6 | 4 | -2 | -2 | 12.3 | ( [ 12.3 ]) | 0012.30 | + // +---------+---------+---------+---------+------------+------------------------+--------------+ + // + int32_t lOptPos = INT32_MAX; + int32_t lReqPos = 0; + int32_t rReqPos = 0; + int32_t rOptPos = INT32_MIN; + + /** + * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map + * to one digit. For example, the number "12345" in BCD is "0x12345". + * + *

Whenever bcd changes internally, {@link #compact()} must be called, except in special cases + * like setting the digit to zero. + */ + union { + struct { + int8_t *ptr; + int32_t len; + } bcdBytes; + uint64_t bcdLong; + } fBCD; + + bool usingBytes = false; + + /** + * Whether this {@link DecimalQuantity} has been explicitly converted to an exact double. true if + * backed by a double that was explicitly converted via convertToAccurateDouble; false otherwise. + * Used for testing. + */ + bool explicitExactDouble = false; + + /** + * Returns a single digit from the BCD list. No internal state is changed by calling this method. + * + * @param position The position of the digit to pop, counted in BCD units from the least + * significant digit. If outside the range supported by the implementation, zero is returned. + * @return The digit at the specified location. + */ + int8_t getDigitPos(int32_t position) const; + + /** + * Sets the digit in the BCD list. This method only sets the digit; it is the caller's + * responsibility to call {@link #compact} after setting the digit. + * + * @param position The position of the digit to pop, counted in BCD units from the least + * significant digit. If outside the range supported by the implementation, an AssertionError + * is thrown. + * @param value The digit to set at the specified location. + */ + void setDigitPos(int32_t position, int8_t value); + + /** + * Adds zeros to the end of the BCD list. This will result in an invalid BCD representation; it is + * the caller's responsibility to do further manipulation and then call {@link #compact}. + * + * @param numDigits The number of zeros to add. + */ + void shiftLeft(int32_t numDigits); + + void shiftRight(int32_t numDigits); + + /** + * Sets the internal representation to zero. Clears any values stored in scale, precision, + * hasDouble, origDouble, origDelta, and BCD data. + */ + void setBcdToZero(); + + /** + * Sets the internal BCD state to represent the value in the given int. The int is guaranteed to + * be either positive. The internal state is guaranteed to be empty when this method is called. + * + * @param n The value to consume. + */ + void readIntToBcd(int32_t n); + + /** + * Sets the internal BCD state to represent the value in the given long. The long is guaranteed to + * be either positive. The internal state is guaranteed to be empty when this method is called. + * + * @param n The value to consume. + */ + void readLongToBcd(int64_t n); + + void readDecNumberToBcd(decNumber *dn); + + void copyBcdFrom(const DecimalQuantity &other); + + /** + * Removes trailing zeros from the BCD (adjusting the scale as required) and then computes the + * precision. The precision is the number of digits in the number up through the greatest nonzero + * digit. + * + *

This method must always be called when bcd changes in order for assumptions to be correct in + * methods like {@link #fractionCount()}. + */ + void compact(); + + void _setToInt(int32_t n); + + void _setToLong(int64_t n); + + void _setToDoubleFast(double n); + + void _setToDecNumber(decNumber *n); + + void convertToAccurateDouble(); + + double toDoubleFromOriginal() const; + + /** Ensure that a byte array of at least 40 digits is allocated. */ + void ensureCapacity(); + + void ensureCapacity(int32_t capacity); + + /** Switches the internal storage mechanism between the 64-bit long and the byte array. */ + void switchStorage(); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_DECIMALQUANTITY_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.cpp b/deps/icu-small/source/i18n/number_decimfmtprops.cpp new file mode 100644 index 00000000000000..cc57cfce6ac1fa --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimfmtprops.cpp @@ -0,0 +1,102 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "number_decimfmtprops.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +DecimalFormatProperties::DecimalFormatProperties() { + clear(); +} + +void DecimalFormatProperties::clear() { + compactStyle.nullify(); + currency.nullify(); + currencyPluralInfo.fPtr.adoptInstead(nullptr); + currencyUsage.nullify(); + decimalPatternMatchRequired = false; + decimalSeparatorAlwaysShown = false; + exponentSignAlwaysShown = false; + formatWidth = -1; + groupingSize = -1; + magnitudeMultiplier = 0; + maximumFractionDigits = -1; + maximumIntegerDigits = -1; + maximumSignificantDigits = -1; + minimumExponentDigits = -1; + minimumFractionDigits = -1; + minimumGroupingDigits = -1; + minimumIntegerDigits = -1; + minimumSignificantDigits = -1; + multiplier = 0; + negativePrefix.setToBogus(); + negativePrefixPattern.setToBogus(); + negativeSuffix.setToBogus(); + negativeSuffixPattern.setToBogus(); + padPosition.nullify(); + padString.setToBogus(); + parseCaseSensitive = false; + parseIntegerOnly = false; + parseLenient = false; + parseNoExponent = false; + parseToBigDecimal = false; + positivePrefix.setToBogus(); + positivePrefixPattern.setToBogus(); + positiveSuffix.setToBogus(); + positiveSuffixPattern.setToBogus(); + roundingIncrement = 0.0; + roundingMode.nullify(); + secondaryGroupingSize = -1; + signAlwaysShown = false; +} + +bool DecimalFormatProperties::operator==(const DecimalFormatProperties &other) const { + bool eq = true; + eq = eq && compactStyle == other.compactStyle; + eq = eq && currency == other.currency; + eq = eq && currencyPluralInfo.fPtr.getAlias() == other.currencyPluralInfo.fPtr.getAlias(); + eq = eq && currencyUsage == other.currencyUsage; + eq = eq && decimalPatternMatchRequired == other.decimalPatternMatchRequired; + eq = eq && decimalSeparatorAlwaysShown == other.decimalSeparatorAlwaysShown; + eq = eq && exponentSignAlwaysShown == other.exponentSignAlwaysShown; + eq = eq && formatWidth == other.formatWidth; + eq = eq && groupingSize == other.groupingSize; + eq = eq && magnitudeMultiplier == other.magnitudeMultiplier; + eq = eq && maximumFractionDigits == other.maximumFractionDigits; + eq = eq && maximumIntegerDigits == other.maximumIntegerDigits; + eq = eq && maximumSignificantDigits == other.maximumSignificantDigits; + eq = eq && minimumExponentDigits == other.minimumExponentDigits; + eq = eq && minimumFractionDigits == other.minimumFractionDigits; + eq = eq && minimumGroupingDigits == other.minimumGroupingDigits; + eq = eq && minimumIntegerDigits == other.minimumIntegerDigits; + eq = eq && minimumSignificantDigits == other.minimumSignificantDigits; + eq = eq && multiplier == other.multiplier; + eq = eq && negativePrefix == other.negativePrefix; + eq = eq && negativePrefixPattern == other.negativePrefixPattern; + eq = eq && negativeSuffix == other.negativeSuffix; + eq = eq && negativeSuffixPattern == other.negativeSuffixPattern; + eq = eq && padPosition == other.padPosition; + eq = eq && padString == other.padString; + eq = eq && parseCaseSensitive == other.parseCaseSensitive; + eq = eq && parseIntegerOnly == other.parseIntegerOnly; + eq = eq && parseLenient == other.parseLenient; + eq = eq && parseNoExponent == other.parseNoExponent; + eq = eq && parseToBigDecimal == other.parseToBigDecimal; + eq = eq && positivePrefix == other.positivePrefix; + eq = eq && positivePrefixPattern == other.positivePrefixPattern; + eq = eq && positiveSuffix == other.positiveSuffix; + eq = eq && positiveSuffixPattern == other.positiveSuffixPattern; + eq = eq && roundingIncrement == other.roundingIncrement; + eq = eq && roundingMode == other.roundingMode; + eq = eq && secondaryGroupingSize == other.secondaryGroupingSize; + eq = eq && signAlwaysShown == other.signAlwaysShown; + return eq; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.h b/deps/icu-small/source/i18n/number_decimfmtprops.h new file mode 100644 index 00000000000000..3e25966b6f5612 --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimfmtprops.h @@ -0,0 +1,108 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_DECIMFMTPROPS_H__ +#define __NUMBER_DECIMFMTPROPS_H__ + +#include "unicode/unistr.h" +#include +#include "unicode/plurrule.h" +#include "unicode/currpinf.h" +#include "unicode/unum.h" +#include "unicode/localpointer.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN + +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of CurrencyPluralInfoWrapper. +// (MSVC requires this, even though it should not be necessary.) +#if defined (_MSC_VER) +// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= +#pragma warning(suppress: 4661) +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalPointer; +#endif + +namespace number { +namespace impl { + +// TODO: Figure out a nicer way to deal with CurrencyPluralInfo. +// Exported as U_I18N_API because it is a public member field of exported DecimalFormatProperties +struct U_I18N_API CurrencyPluralInfoWrapper { + LocalPointer fPtr; + + CurrencyPluralInfoWrapper() {} + CurrencyPluralInfoWrapper(const CurrencyPluralInfoWrapper& other) { + if (!other.fPtr.isNull()) { + fPtr.adoptInstead(new CurrencyPluralInfo(*other.fPtr)); + } + } +}; + +// Exported as U_I18N_API because it is needed for the unit test PatternStringTest +struct U_I18N_API DecimalFormatProperties { + + public: + NullableValue compactStyle; + NullableValue currency; + CurrencyPluralInfoWrapper currencyPluralInfo; + NullableValue currencyUsage; + bool decimalPatternMatchRequired; + bool decimalSeparatorAlwaysShown; + bool exponentSignAlwaysShown; + int32_t formatWidth; + int32_t groupingSize; + int32_t magnitudeMultiplier; + int32_t maximumFractionDigits; + int32_t maximumIntegerDigits; + int32_t maximumSignificantDigits; + int32_t minimumExponentDigits; + int32_t minimumFractionDigits; + int32_t minimumGroupingDigits; + int32_t minimumIntegerDigits; + int32_t minimumSignificantDigits; + int32_t multiplier; + UnicodeString negativePrefix; + UnicodeString negativePrefixPattern; + UnicodeString negativeSuffix; + UnicodeString negativeSuffixPattern; + NullableValue padPosition; + UnicodeString padString; + bool parseCaseSensitive; + bool parseIntegerOnly; + bool parseLenient; + bool parseNoExponent; + bool parseToBigDecimal; + //PluralRules pluralRules; + UnicodeString positivePrefix; + UnicodeString positivePrefixPattern; + UnicodeString positiveSuffix; + UnicodeString positiveSuffixPattern; + double roundingIncrement; + NullableValue roundingMode; + int32_t secondaryGroupingSize; + bool signAlwaysShown; + + DecimalFormatProperties(); + + //DecimalFormatProperties(const DecimalFormatProperties &other) = default; + + DecimalFormatProperties &operator=(const DecimalFormatProperties &other) = default; + + bool operator==(const DecimalFormatProperties &other) const; + + void clear(); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_DECIMFMTPROPS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_fluent.cpp b/deps/icu-small/source/i18n/number_fluent.cpp new file mode 100644 index 00000000000000..76c3a7ce5c5d16 --- /dev/null +++ b/deps/icu-small/source/i18n/number_fluent.cpp @@ -0,0 +1,369 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include "unicode/numberformatter.h" +#include "number_decimalquantity.h" +#include "number_formatimpl.h" +#include "umutex.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +template +Derived NumberFormatterSettings::notation(const Notation ¬ation) const { + Derived copy(*this); + // NOTE: Slicing is OK. + copy.fMacros.notation = notation; + return copy; +} + +template +Derived NumberFormatterSettings::unit(const icu::MeasureUnit &unit) const { + Derived copy(*this); + // NOTE: Slicing occurs here. However, CurrencyUnit can be restored from MeasureUnit. + // TimeUnit may be affected, but TimeUnit is not as relevant to number formatting. + copy.fMacros.unit = unit; + return copy; +} + +template +Derived NumberFormatterSettings::adoptUnit(const icu::MeasureUnit *unit) const { + Derived copy(*this); + // Just copy the unit into the MacroProps by value, and delete it since we have ownership. + // NOTE: Slicing occurs here. However, CurrencyUnit can be restored from MeasureUnit. + // TimeUnit may be affected, but TimeUnit is not as relevant to number formatting. + if (unit != nullptr) { + copy.fMacros.unit = *unit; + delete unit; + } + return copy; +} + +template +Derived NumberFormatterSettings::rounding(const Rounder &rounder) const { + Derived copy(*this); + // NOTE: Slicing is OK. + copy.fMacros.rounder = rounder; + return copy; +} + +template +Derived NumberFormatterSettings::grouping(const Grouper &grouper) const { + Derived copy(*this); + copy.fMacros.grouper = grouper; + return copy; +} + +template +Derived NumberFormatterSettings::integerWidth(const IntegerWidth &style) const { + Derived copy(*this); + copy.fMacros.integerWidth = style; + return copy; +} + +template +Derived NumberFormatterSettings::symbols(const DecimalFormatSymbols &symbols) const { + Derived copy(*this); + copy.fMacros.symbols.setTo(symbols); + return copy; +} + +template +Derived NumberFormatterSettings::adoptSymbols(const NumberingSystem *ns) const { + Derived copy(*this); + copy.fMacros.symbols.setTo(ns); + return copy; +} + +template +Derived NumberFormatterSettings::unitWidth(const UNumberUnitWidth &width) const { + Derived copy(*this); + copy.fMacros.unitWidth = width; + return copy; +} + +template +Derived NumberFormatterSettings::sign(const UNumberSignDisplay &style) const { + Derived copy(*this); + copy.fMacros.sign = style; + return copy; +} + +template +Derived NumberFormatterSettings::decimal(const UNumberDecimalSeparatorDisplay &style) const { + Derived copy(*this); + copy.fMacros.decimal = style; + return copy; +} + +template +Derived NumberFormatterSettings::padding(const Padder &padder) const { + Derived copy(*this); + copy.fMacros.padder = padder; + return copy; +} + +template +Derived NumberFormatterSettings::threshold(int32_t threshold) const { + Derived copy(*this); + copy.fMacros.threshold = threshold; + return copy; +} + +// Declare all classes that implement NumberFormatterSettings +// See https://stackoverflow.com/a/495056/1407170 +template +class icu::number::NumberFormatterSettings; +template +class icu::number::NumberFormatterSettings; + + +UnlocalizedNumberFormatter NumberFormatter::with() { + UnlocalizedNumberFormatter result; + return result; +} + +LocalizedNumberFormatter NumberFormatter::withLocale(const Locale &locale) { + return with().locale(locale); +} + +// Make the child class constructor that takes the parent class call the parent class's copy constructor +UnlocalizedNumberFormatter::UnlocalizedNumberFormatter( + const NumberFormatterSettings &other) + : NumberFormatterSettings(other) { +} + +// Make the child class constructor that takes the parent class call the parent class's copy constructor +// For LocalizedNumberFormatter, also copy over the extra fields +LocalizedNumberFormatter::LocalizedNumberFormatter( + const NumberFormatterSettings &other) + : NumberFormatterSettings(other) { + // No additional copies required +} + +LocalizedNumberFormatter::LocalizedNumberFormatter(const MacroProps ¯os, const Locale &locale) { + fMacros = macros; + fMacros.locale = locale; +} + +LocalizedNumberFormatter UnlocalizedNumberFormatter::locale(const Locale &locale) const { + return LocalizedNumberFormatter(fMacros, locale); +} + +SymbolsWrapper::SymbolsWrapper(const SymbolsWrapper &other) { + doCopyFrom(other); +} + +SymbolsWrapper &SymbolsWrapper::operator=(const SymbolsWrapper &other) { + if (this == &other) { + return *this; + } + doCleanup(); + doCopyFrom(other); + return *this; +} + +SymbolsWrapper::~SymbolsWrapper() { + doCleanup(); +} + +void SymbolsWrapper::setTo(const DecimalFormatSymbols &dfs) { + doCleanup(); + fType = SYMPTR_DFS; + fPtr.dfs = new DecimalFormatSymbols(dfs); +} + +void SymbolsWrapper::setTo(const NumberingSystem *ns) { + doCleanup(); + fType = SYMPTR_NS; + fPtr.ns = ns; +} + +void SymbolsWrapper::doCopyFrom(const SymbolsWrapper &other) { + fType = other.fType; + switch (fType) { + case SYMPTR_NONE: + // No action necessary + break; + case SYMPTR_DFS: + // Memory allocation failures are exposed in copyErrorTo() + if (other.fPtr.dfs != nullptr) { + fPtr.dfs = new DecimalFormatSymbols(*other.fPtr.dfs); + } else { + fPtr.dfs = nullptr; + } + break; + case SYMPTR_NS: + // Memory allocation failures are exposed in copyErrorTo() + if (other.fPtr.ns != nullptr) { + fPtr.ns = new NumberingSystem(*other.fPtr.ns); + } else { + fPtr.ns = nullptr; + } + break; + } +} + +void SymbolsWrapper::doCleanup() { + switch (fType) { + case SYMPTR_NONE: + // No action necessary + break; + case SYMPTR_DFS: + delete fPtr.dfs; + break; + case SYMPTR_NS: + delete fPtr.ns; + break; + } +} + +bool SymbolsWrapper::isDecimalFormatSymbols() const { + return fType == SYMPTR_DFS; +} + +bool SymbolsWrapper::isNumberingSystem() const { + return fType == SYMPTR_NS; +} + +const DecimalFormatSymbols* SymbolsWrapper::getDecimalFormatSymbols() const { + U_ASSERT(fType == SYMPTR_DFS); + return fPtr.dfs; +} + +const NumberingSystem* SymbolsWrapper::getNumberingSystem() const { + U_ASSERT(fType == SYMPTR_NS); + return fPtr.ns; +} + +LocalizedNumberFormatter::~LocalizedNumberFormatter() { + delete fCompiled; +} + +FormattedNumber LocalizedNumberFormatter::formatInt(int64_t value, UErrorCode &status) const { + if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } + auto results = new NumberFormatterResults(); + if (results == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return FormattedNumber(status); + } + results->quantity.setToLong(value); + return formatImpl(results, status); +} + +FormattedNumber LocalizedNumberFormatter::formatDouble(double value, UErrorCode &status) const { + if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } + auto results = new NumberFormatterResults(); + if (results == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return FormattedNumber(status); + } + results->quantity.setToDouble(value); + return formatImpl(results, status); +} + +FormattedNumber LocalizedNumberFormatter::formatDecimal(StringPiece value, UErrorCode &status) const { + if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } + auto results = new NumberFormatterResults(); + if (results == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return FormattedNumber(status); + } + results->quantity.setToDecNumber(value); + return formatImpl(results, status); +} + +FormattedNumber +LocalizedNumberFormatter::formatImpl(impl::NumberFormatterResults *results, UErrorCode &status) const { + // fUnsafeCallCount contains memory to be interpreted as an atomic int, most commonly + // std::atomic. Since the type of atomic int is platform-dependent, we cast the + // bytes in fUnsafeCallCount to u_atomic_int32_t, a typedef for the platform-dependent + // atomic int type defined in umutex.h. + static_assert(sizeof(u_atomic_int32_t) <= sizeof(fUnsafeCallCount), + "Atomic integer size on this platform exceeds the size allocated by fUnsafeCallCount"); + u_atomic_int32_t* callCount = reinterpret_cast( + const_cast(this)->fUnsafeCallCount); + + // A positive value in the atomic int indicates that the data structure is not yet ready; + // a negative value indicates that it is ready. If, after the increment, the atomic int + // is exactly threshold, then it is the current thread's job to build the data structure. + // Note: We set the callCount to INT32_MIN so that if another thread proceeds to increment + // the atomic int, the value remains below zero. + int32_t currentCount = umtx_loadAcquire(*callCount); + if (0 <= currentCount && currentCount <= fMacros.threshold && fMacros.threshold > 0) { + currentCount = umtx_atomic_inc(callCount); + } + + if (currentCount == fMacros.threshold && fMacros.threshold > 0) { + // Build the data structure and then use it (slow to fast path). + const NumberFormatterImpl* compiled = + NumberFormatterImpl::fromMacros(fMacros, status); + U_ASSERT(fCompiled == nullptr); + const_cast(this)->fCompiled = compiled; + umtx_storeRelease(*callCount, INT32_MIN); + compiled->apply(results->quantity, results->string, status); + } else if (currentCount < 0) { + // The data structure is already built; use it (fast path). + U_ASSERT(fCompiled != nullptr); + fCompiled->apply(results->quantity, results->string, status); + } else { + // Format the number without building the data structure (slow path). + NumberFormatterImpl::applyStatic(fMacros, results->quantity, results->string, status); + } + + // Do not save the results object if we encountered a failure. + if (U_SUCCESS(status)) { + return FormattedNumber(results); + } else { + delete results; + return FormattedNumber(status); + } +} + +UnicodeString FormattedNumber::toString() const { + if (fResults == nullptr) { + // TODO: http://bugs.icu-project.org/trac/ticket/13437 + return {}; + } + return fResults->string.toUnicodeString(); +} + +Appendable &FormattedNumber::appendTo(Appendable &appendable) { + if (fResults == nullptr) { + // TODO: http://bugs.icu-project.org/trac/ticket/13437 + return appendable; + } + appendable.appendString(fResults->string.chars(), fResults->string.length()); + return appendable; +} + +void FormattedNumber::populateFieldPosition(FieldPosition &fieldPosition, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + if (fResults == nullptr) { + status = fErrorCode; + return; + } + fResults->string.populateFieldPosition(fieldPosition, 0, status); +} + +void +FormattedNumber::populateFieldPositionIterator(FieldPositionIterator &iterator, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + if (fResults == nullptr) { + status = fErrorCode; + return; + } + fResults->string.populateFieldPositionIterator(iterator, status); +} + +FormattedNumber::~FormattedNumber() { + delete fResults; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_formatimpl.cpp b/deps/icu-small/source/i18n/number_formatimpl.cpp new file mode 100644 index 00000000000000..9986ce6d8c606b --- /dev/null +++ b/deps/icu-small/source/i18n/number_formatimpl.cpp @@ -0,0 +1,464 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "cstring.h" +#include "unicode/ures.h" +#include "uresimp.h" +#include "charstr.h" +#include "number_formatimpl.h" +#include "unicode/numfmt.h" +#include "number_patternstring.h" +#include "number_utils.h" +#include "unicode/numberformatter.h" +#include "unicode/dcfmtsym.h" +#include "number_scientific.h" +#include "number_compact.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// NOTE: In Java, the method to get a pattern from the resource bundle exists in NumberFormat. +// In C++, we have to implement that logic here. +// TODO: Make Java and C++ consistent? + +enum CldrPatternStyle { + CLDR_PATTERN_STYLE_DECIMAL, + CLDR_PATTERN_STYLE_CURRENCY, + CLDR_PATTERN_STYLE_ACCOUNTING, + CLDR_PATTERN_STYLE_PERCENT + // TODO: Consider scientific format. +}; + +const char16_t * +doGetPattern(UResourceBundle *res, const char *nsName, const char *patternKey, UErrorCode &publicStatus, + UErrorCode &localStatus) { + // Construct the path into the resource bundle + CharString key; + key.append("NumberElements/", publicStatus); + key.append(nsName, publicStatus); + key.append("/patterns/", publicStatus); + key.append(patternKey, publicStatus); + if (U_FAILURE(publicStatus)) { + return u""; + } + return ures_getStringByKeyWithFallback(res, key.data(), nullptr, &localStatus); +} + +const char16_t *getPatternForStyle(const Locale &locale, const char *nsName, CldrPatternStyle style, + UErrorCode &status) { + const char *patternKey; + switch (style) { + case CLDR_PATTERN_STYLE_DECIMAL: + patternKey = "decimalFormat"; + break; + case CLDR_PATTERN_STYLE_CURRENCY: + patternKey = "currencyFormat"; + break; + case CLDR_PATTERN_STYLE_ACCOUNTING: + patternKey = "accountingFormat"; + break; + case CLDR_PATTERN_STYLE_PERCENT: + default: + patternKey = "percentFormat"; + break; + } + LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status)); + if (U_FAILURE(status)) { return u""; } + + // Attempt to get the pattern with the native numbering system. + UErrorCode localStatus = U_ZERO_ERROR; + const char16_t *pattern; + pattern = doGetPattern(res.getAlias(), nsName, patternKey, status, localStatus); + if (U_FAILURE(status)) { return u""; } + + // Fall back to latn if native numbering system does not have the right pattern + if (U_FAILURE(localStatus) && uprv_strcmp("latn", nsName) != 0) { + localStatus = U_ZERO_ERROR; + pattern = doGetPattern(res.getAlias(), "latn", patternKey, status, localStatus); + if (U_FAILURE(status)) { return u""; } + } + + return pattern; +} + +inline bool unitIsCurrency(const MeasureUnit &unit) { + return uprv_strcmp("currency", unit.getType()) == 0; +} + +inline bool unitIsNoUnit(const MeasureUnit &unit) { + return uprv_strcmp("none", unit.getType()) == 0; +} + +inline bool unitIsPercent(const MeasureUnit &unit) { + return uprv_strcmp("percent", unit.getSubtype()) == 0; +} + +inline bool unitIsPermille(const MeasureUnit &unit) { + return uprv_strcmp("permille", unit.getSubtype()) == 0; +} + +} // namespace + +NumberFormatterImpl *NumberFormatterImpl::fromMacros(const MacroProps ¯os, UErrorCode &status) { + return new NumberFormatterImpl(macros, true, status); +} + +void NumberFormatterImpl::applyStatic(const MacroProps ¯os, DecimalQuantity &inValue, + NumberStringBuilder &outString, UErrorCode &status) { + NumberFormatterImpl impl(macros, false, status); + impl.applyUnsafe(inValue, outString, status); +} + +// NOTE: C++ SPECIFIC DIFFERENCE FROM JAVA: +// The "safe" apply method uses a new MicroProps. In the MicroPropsGenerator, fMicros is copied into the new instance. +// The "unsafe" method simply re-uses fMicros, eliminating the extra copy operation. +// See MicroProps::processQuantity() for details. + +void NumberFormatterImpl::apply(DecimalQuantity &inValue, NumberStringBuilder &outString, + UErrorCode &status) const { + if (U_FAILURE(status)) { return; } + MicroProps micros; + fMicroPropsGenerator->processQuantity(inValue, micros, status); + if (U_FAILURE(status)) { return; } + microsToString(micros, inValue, outString, status); +} + +void NumberFormatterImpl::applyUnsafe(DecimalQuantity &inValue, NumberStringBuilder &outString, + UErrorCode &status) { + if (U_FAILURE(status)) { return; } + fMicroPropsGenerator->processQuantity(inValue, fMicros, status); + if (U_FAILURE(status)) { return; } + microsToString(fMicros, inValue, outString, status); +} + +NumberFormatterImpl::NumberFormatterImpl(const MacroProps ¯os, bool safe, UErrorCode &status) { + fMicroPropsGenerator = macrosToMicroGenerator(macros, safe, status); +} + +////////// + +const MicroPropsGenerator * +NumberFormatterImpl::macrosToMicroGenerator(const MacroProps ¯os, bool safe, UErrorCode &status) { + const MicroPropsGenerator *chain = &fMicros; + + // Check that macros is error-free before continuing. + if (macros.copyErrorTo(status)) { + return nullptr; + } + + // TODO: Accept currency symbols from DecimalFormatSymbols? + + // Pre-compute a few values for efficiency. + bool isCurrency = unitIsCurrency(macros.unit); + bool isNoUnit = unitIsNoUnit(macros.unit); + bool isPercent = isNoUnit && unitIsPercent(macros.unit); + bool isPermille = isNoUnit && unitIsPermille(macros.unit); + bool isCldrUnit = !isCurrency && !isNoUnit; + bool isAccounting = + macros.sign == UNUM_SIGN_ACCOUNTING || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS; + CurrencyUnit currency(kDefaultCurrency, status); + if (isCurrency) { + currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit + } + UNumberUnitWidth unitWidth = UNUM_UNIT_WIDTH_SHORT; + if (macros.unitWidth != UNUM_UNIT_WIDTH_COUNT) { + unitWidth = macros.unitWidth; + } + + // Select the numbering system. + LocalPointer nsLocal; + const NumberingSystem *ns; + if (macros.symbols.isNumberingSystem()) { + ns = macros.symbols.getNumberingSystem(); + } else { + // TODO: Is there a way to avoid creating the NumberingSystem object? + ns = NumberingSystem::createInstance(macros.locale, status); + // Give ownership to the function scope. + nsLocal.adoptInstead(ns); + } + const char *nsName = U_SUCCESS(status) ? ns->getName() : "latn"; + + // Load and parse the pattern string. It is used for grouping sizes and affixes only. + CldrPatternStyle patternStyle; + if (isPercent || isPermille) { + patternStyle = CLDR_PATTERN_STYLE_PERCENT; + } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) { + patternStyle = CLDR_PATTERN_STYLE_DECIMAL; + } else if (isAccounting) { + // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now, + // the API contract allows us to add support to other units in the future. + patternStyle = CLDR_PATTERN_STYLE_ACCOUNTING; + } else { + patternStyle = CLDR_PATTERN_STYLE_CURRENCY; + } + const char16_t *pattern = getPatternForStyle(macros.locale, nsName, patternStyle, status); + auto patternInfo = new ParsedPatternInfo(); + fPatternInfo.adoptInstead(patternInfo); + PatternParser::parseToPatternInfo(UnicodeString(pattern), *patternInfo, status); + + ///////////////////////////////////////////////////////////////////////////////////// + /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR /// + ///////////////////////////////////////////////////////////////////////////////////// + + // Symbols + if (macros.symbols.isDecimalFormatSymbols()) { + fMicros.symbols = macros.symbols.getDecimalFormatSymbols(); + } else { + fMicros.symbols = new DecimalFormatSymbols(macros.locale, *ns, status); + // Give ownership to the NumberFormatterImpl. + fSymbols.adoptInstead(fMicros.symbols); + } + + // Rounding strategy + if (!macros.rounder.isBogus()) { + fMicros.rounding = macros.rounder; + } else if (macros.notation.fType == Notation::NTN_COMPACT) { + fMicros.rounding = Rounder::integer().withMinDigits(2); + } else if (isCurrency) { + fMicros.rounding = Rounder::currency(UCURR_USAGE_STANDARD); + } else { + fMicros.rounding = Rounder::maxFraction(6); + } + fMicros.rounding.setLocaleData(currency, status); + + // Grouping strategy + if (!macros.grouper.isBogus()) { + fMicros.grouping = macros.grouper; + } else if (macros.notation.fType == Notation::NTN_COMPACT) { + // Compact notation uses minGrouping by default since ICU 59 + fMicros.grouping = Grouper::minTwoDigits(); + } else { + fMicros.grouping = Grouper::defaults(); + } + fMicros.grouping.setLocaleData(*fPatternInfo); + + // Padding strategy + if (!macros.padder.isBogus()) { + fMicros.padding = macros.padder; + } else { + fMicros.padding = Padder::none(); + } + + // Integer width + if (!macros.integerWidth.isBogus()) { + fMicros.integerWidth = macros.integerWidth; + } else { + fMicros.integerWidth = IntegerWidth::zeroFillTo(1); + } + + // Sign display + if (macros.sign != UNUM_SIGN_COUNT) { + fMicros.sign = macros.sign; + } else { + fMicros.sign = UNUM_SIGN_AUTO; + } + + // Decimal mark display + if (macros.decimal != UNUM_DECIMAL_SEPARATOR_COUNT) { + fMicros.decimal = macros.decimal; + } else { + fMicros.decimal = UNUM_DECIMAL_SEPARATOR_AUTO; + } + + // Use monetary separator symbols + fMicros.useCurrency = isCurrency; + + // Inner modifier (scientific notation) + if (macros.notation.fType == Notation::NTN_SCIENTIFIC) { + fScientificHandler.adoptInstead(new ScientificHandler(¯os.notation, fMicros.symbols, chain)); + chain = fScientificHandler.getAlias(); + } else { + // No inner modifier required + fMicros.modInner = &fMicros.helpers.emptyStrongModifier; + } + + // Middle modifier (patterns, positive/negative, currency symbols, percent) + auto patternModifier = new MutablePatternModifier(false); + fPatternModifier.adoptInstead(patternModifier); + patternModifier->setPatternInfo(fPatternInfo.getAlias()); + patternModifier->setPatternAttributes(fMicros.sign, isPermille); + if (patternModifier->needsPlurals()) { + patternModifier->setSymbols( + fMicros.symbols, + currency, + unitWidth, + resolvePluralRules(macros.rules, macros.locale, status)); + } else { + patternModifier->setSymbols(fMicros.symbols, currency, unitWidth, nullptr); + } + if (safe) { + fImmutablePatternModifier.adoptInstead(patternModifier->createImmutableAndChain(chain, status)); + chain = fImmutablePatternModifier.getAlias(); + } else { + patternModifier->addToChain(chain); + chain = patternModifier; + } + + // Outer modifier (CLDR units and currency long names) + if (isCldrUnit) { + fLongNameHandler.adoptInstead( + new LongNameHandler( + LongNameHandler::forMeasureUnit( + macros.locale, + macros.unit, + unitWidth, + resolvePluralRules(macros.rules, macros.locale, status), + chain, + status))); + chain = fLongNameHandler.getAlias(); + } else if (isCurrency && unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) { + fLongNameHandler.adoptInstead( + new LongNameHandler( + LongNameHandler::forCurrencyLongNames( + macros.locale, + currency, + resolvePluralRules(macros.rules, macros.locale, status), + chain, + status))); + chain = fLongNameHandler.getAlias(); + } else { + // No outer modifier required + fMicros.modOuter = &fMicros.helpers.emptyWeakModifier; + } + + // Compact notation + // NOTE: Compact notation can (but might not) override the middle modifier and rounding. + // It therefore needs to go at the end of the chain. + if (macros.notation.fType == Notation::NTN_COMPACT) { + CompactType compactType = (isCurrency && unitWidth != UNUM_UNIT_WIDTH_FULL_NAME) + ? CompactType::TYPE_CURRENCY : CompactType::TYPE_DECIMAL; + fCompactHandler.adoptInstead( + new CompactHandler( + macros.notation.fUnion.compactStyle, + macros.locale, + nsName, + compactType, + resolvePluralRules(macros.rules, macros.locale, status), + safe ? patternModifier : nullptr, + chain, + status)); + chain = fCompactHandler.getAlias(); + } + + return chain; +} + +const PluralRules * +NumberFormatterImpl::resolvePluralRules(const PluralRules *rulesPtr, const Locale &locale, + UErrorCode &status) { + if (rulesPtr != nullptr) { + return rulesPtr; + } + // Lazily create PluralRules + if (fRules.isNull()) { + fRules.adoptInstead(PluralRules::forLocale(locale, status)); + } + return fRules.getAlias(); +} + +int32_t NumberFormatterImpl::microsToString(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + micros.rounding.apply(quantity, status); + micros.integerWidth.apply(quantity, status); + int32_t length = writeNumber(micros, quantity, string, status); + // NOTE: When range formatting is added, these modifiers can bubble up. + // For now, apply them all here at once. + // Always apply the inner modifier (which is "strong"). + length += micros.modInner->apply(string, 0, length, status); + if (micros.padding.isValid()) { + length += micros.padding + .padAndApply(*micros.modMiddle, *micros.modOuter, string, 0, length, status); + } else { + length += micros.modMiddle->apply(string, 0, length, status); + length += micros.modOuter->apply(string, 0, length, status); + } + return length; +} + +int32_t NumberFormatterImpl::writeNumber(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + int32_t length = 0; + if (quantity.isInfinite()) { + length += string.insert( + length, + micros.symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kInfinitySymbol), + UNUM_INTEGER_FIELD, + status); + + } else if (quantity.isNaN()) { + length += string.insert( + length, + micros.symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kNaNSymbol), + UNUM_INTEGER_FIELD, + status); + + } else { + // Add the integer digits + length += writeIntegerDigits(micros, quantity, string, status); + + // Add the decimal point + if (quantity.getLowerDisplayMagnitude() < 0 || micros.decimal == UNUM_DECIMAL_SEPARATOR_ALWAYS) { + length += string.insert( + length, + micros.useCurrency ? micros.symbols->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kMonetarySeparatorSymbol) : micros + .symbols + ->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kDecimalSeparatorSymbol), + UNUM_DECIMAL_SEPARATOR_FIELD, + status); + } + + // Add the fraction digits + length += writeFractionDigits(micros, quantity, string, status); + } + + return length; +} + +int32_t NumberFormatterImpl::writeIntegerDigits(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + int length = 0; + int integerCount = quantity.getUpperDisplayMagnitude() + 1; + for (int i = 0; i < integerCount; i++) { + // Add grouping separator + if (micros.grouping.groupAtPosition(i, quantity)) { + length += string.insert( + 0, + micros.useCurrency ? micros.symbols->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kMonetaryGroupingSeparatorSymbol) + : micros.symbols->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kGroupingSeparatorSymbol), + UNUM_GROUPING_SEPARATOR_FIELD, + status); + } + + // Get and append the next digit value + int8_t nextDigit = quantity.getDigit(i); + length += string.insert( + 0, getDigitFromSymbols(nextDigit, *micros.symbols), UNUM_INTEGER_FIELD, status); + } + return length; +} + +int32_t NumberFormatterImpl::writeFractionDigits(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + int length = 0; + int fractionCount = -quantity.getLowerDisplayMagnitude(); + for (int i = 0; i < fractionCount; i++) { + // Get and append the next digit value + int8_t nextDigit = quantity.getDigit(-i - 1); + length += string.append( + getDigitFromSymbols(nextDigit, *micros.symbols), UNUM_FRACTION_FIELD, status); + } + return length; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_formatimpl.h b/deps/icu-small/source/i18n/number_formatimpl.h new file mode 100644 index 00000000000000..cbc04ba30df4c4 --- /dev/null +++ b/deps/icu-small/source/i18n/number_formatimpl.h @@ -0,0 +1,125 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_FORMATIMPL_H__ +#define __NUMBER_FORMATIMPL_H__ + +#include "number_types.h" +#include "number_stringbuilder.h" +#include "number_patternstring.h" +#include "number_utils.h" +#include "number_patternmodifier.h" +#include "number_longnames.h" +#include "number_compact.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +/** + * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a MacroProps and a + * DecimalQuantity and outputting a properly formatted number string. + */ +class NumberFormatterImpl : public UMemory { + public: + /** + * Builds a "safe" MicroPropsGenerator, which is thread-safe and can be used repeatedly. + * The caller owns the returned NumberFormatterImpl. + */ + static NumberFormatterImpl *fromMacros(const MacroProps ¯os, UErrorCode &status); + + /** + * Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once. + */ + static void + applyStatic(const MacroProps ¯os, DecimalQuantity &inValue, NumberStringBuilder &outString, + UErrorCode &status); + + /** + * Evaluates the "safe" MicroPropsGenerator created by "fromMacros". + */ + void apply(DecimalQuantity &inValue, NumberStringBuilder &outString, UErrorCode &status) const; + + private: + // Head of the MicroPropsGenerator linked list: + const MicroPropsGenerator *fMicroPropsGenerator = nullptr; + + // Tail of the list: + MicroProps fMicros; + + // Other fields possibly used by the number formatting pipeline: + // TODO: Convert some of these LocalPointers to value objects to reduce the number of news? + LocalPointer fSymbols; + LocalPointer fRules; + LocalPointer fPatternInfo; + LocalPointer fScientificHandler; + LocalPointer fPatternModifier; + LocalPointer fImmutablePatternModifier; + LocalPointer fLongNameHandler; + LocalPointer fCompactHandler; + + + NumberFormatterImpl(const MacroProps ¯os, bool safe, UErrorCode &status); + + void applyUnsafe(DecimalQuantity &inValue, NumberStringBuilder &outString, UErrorCode &status); + + /** + * If rulesPtr is non-null, return it. Otherwise, return a PluralRules owned by this object for the + * specified locale, creating it if necessary. + */ + const PluralRules * + resolvePluralRules(const PluralRules *rulesPtr, const Locale &locale, UErrorCode &status); + + /** + * Synthesizes the MacroProps into a MicroPropsGenerator. All information, including the locale, is encoded into the + * MicroPropsGenerator, except for the quantity itself, which is left abstract and must be provided to the returned + * MicroPropsGenerator instance. + * + * @see MicroPropsGenerator + * @param macros + * The {@link MacroProps} to consume. This method does not mutate the MacroProps instance. + * @param safe + * If true, the returned MicroPropsGenerator will be thread-safe. If false, the returned value will + * not be thread-safe, intended for a single "one-shot" use only. Building the thread-safe + * object is more expensive. + */ + const MicroPropsGenerator * + macrosToMicroGenerator(const MacroProps ¯os, bool safe, UErrorCode &status); + + /** + * Synthesizes the output string from a MicroProps and DecimalQuantity. + * + * @param micros + * The MicroProps after the quantity has been consumed. Will not be mutated. + * @param quantity + * The DecimalQuantity to be rendered. May be mutated. + * @param string + * The output string. Will be mutated. + */ + static int32_t + microsToString(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); + + static int32_t + writeNumber(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); + + static int32_t + writeIntegerDigits(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); + + static int32_t + writeFractionDigits(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_FORMATIMPL_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_grouping.cpp b/deps/icu-small/source/i18n/number_grouping.cpp new file mode 100644 index 00000000000000..15362825cc68ce --- /dev/null +++ b/deps/icu-small/source/i18n/number_grouping.cpp @@ -0,0 +1,55 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_patternstring.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +Grouper Grouper::defaults() { + return {-2, -2, false}; +} + +Grouper Grouper::minTwoDigits() { + return {-2, -2, true}; +} + +Grouper Grouper::none() { + return {-1, -1, false}; +} + +void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo) { + if (fGrouping1 != -2) { + return; + } + auto grouping1 = static_cast (patternInfo.positive.groupingSizes & 0xffff); + auto grouping2 = static_cast ((patternInfo.positive.groupingSizes >> 16) & 0xffff); + auto grouping3 = static_cast ((patternInfo.positive.groupingSizes >> 32) & 0xffff); + if (grouping2 == -1) { + grouping1 = -1; + } + if (grouping3 == -1) { + grouping2 = grouping1; + } + fGrouping1 = grouping1; + fGrouping2 = grouping2; +} + +bool Grouper::groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const { + U_ASSERT(fGrouping1 > -2); + if (fGrouping1 == -1 || fGrouping1 == 0) { + // Either -1 or 0 means "no grouping" + return false; + } + position -= fGrouping1; + return position >= 0 && (position % fGrouping2) == 0 + && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= (fMin2 ? 2 : 1); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_integerwidth.cpp b/deps/icu-small/source/i18n/number_integerwidth.cpp new file mode 100644 index 00000000000000..10dacfc4acb96f --- /dev/null +++ b/deps/icu-small/source/i18n/number_integerwidth.cpp @@ -0,0 +1,48 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_decimalquantity.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +IntegerWidth::IntegerWidth(int8_t minInt, int8_t maxInt) { + fUnion.minMaxInt.fMinInt = minInt; + fUnion.minMaxInt.fMaxInt = maxInt; +} + +IntegerWidth IntegerWidth::zeroFillTo(int32_t minInt) { + if (minInt >= 0 && minInt <= kMaxIntFracSig) { + return {static_cast(minInt), -1}; + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +IntegerWidth IntegerWidth::truncateAt(int32_t maxInt) { + if (fHasError) { return *this; } // No-op on error + if (maxInt >= 0 && maxInt <= kMaxIntFracSig) { + return {fUnion.minMaxInt.fMinInt, static_cast(maxInt)}; + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +void IntegerWidth::apply(impl::DecimalQuantity &quantity, UErrorCode &status) const { + if (fHasError) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } else if (fUnion.minMaxInt.fMaxInt == -1) { + quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, INT32_MAX); + } else { + quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, fUnion.minMaxInt.fMaxInt); + } +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_longnames.cpp b/deps/icu-small/source/i18n/number_longnames.cpp new file mode 100644 index 00000000000000..88b3413585a0f7 --- /dev/null +++ b/deps/icu-small/source/i18n/number_longnames.cpp @@ -0,0 +1,165 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/ures.h" +#include "ureslocs.h" +#include "charstr.h" +#include "uresimp.h" +#include "number_longnames.h" +#include +#include "cstring.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + + +////////////////////////// +/// BEGIN DATA LOADING /// +////////////////////////// + +class PluralTableSink : public ResourceSink { + public: + explicit PluralTableSink(UnicodeString *outArray) : outArray(outArray) { + // Initialize the array to bogus strings. + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { + outArray[i].setToBogus(); + } + } + + void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE { + ResourceTable pluralsTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) { + // In MeasureUnit data, ignore dnam and per units for now. + if (uprv_strcmp(key, "dnam") == 0 || uprv_strcmp(key, "per") == 0) { + continue; + } + StandardPlural::Form plural = StandardPlural::fromString(key, status); + if (U_FAILURE(status)) { return; } + if (!outArray[plural].isBogus()) { + continue; + } + outArray[plural] = value.getUnicodeString(status); + if (U_FAILURE(status)) { return; } + } + } + + private: + UnicodeString *outArray; +}; + +// NOTE: outArray MUST have room for all StandardPlural values. No bounds checking is performed. + +void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumberUnitWidth &width, + UnicodeString *outArray, UErrorCode &status) { + PluralTableSink sink(outArray); + LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + CharString key; + key.append("units", status); + if (width == UNUM_UNIT_WIDTH_NARROW) { + key.append("Narrow", status); + } else if (width == UNUM_UNIT_WIDTH_SHORT) { + key.append("Short", status); + } + key.append("/", status); + key.append(unit.getType(), status); + key.append("/", status); + key.append(unit.getSubtype(), status); + ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, status); +} + +void getCurrencyLongNameData(const Locale &locale, const CurrencyUnit ¤cy, UnicodeString *outArray, + UErrorCode &status) { + // In ICU4J, this method gets a CurrencyData from CurrencyData.provider. + // TODO(ICU4J): Implement this without going through CurrencyData, like in ICU4C? + PluralTableSink sink(outArray); + LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_CURR, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + ures_getAllItemsWithFallback(unitsBundle.getAlias(), "CurrencyUnitPatterns", sink, status); + if (U_FAILURE(status)) { return; } + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { + UnicodeString &pattern = outArray[i]; + if (pattern.isBogus()) { + continue; + } + UBool isChoiceFormat = FALSE; + int32_t longNameLen = 0; + const char16_t *longName = ucurr_getPluralName( + currency.getISOCurrency(), + locale.getName(), + &isChoiceFormat, + StandardPlural::getKeyword(static_cast(i)), + &longNameLen, + &status); + // Example pattern from data: "{0} {1}" + // Example output after find-and-replace: "{0} US dollars" + pattern.findAndReplace(UnicodeString(u"{1}"), UnicodeString(longName, longNameLen)); + } +} + +//////////////////////// +/// END DATA LOADING /// +//////////////////////// + +} // namespace + +LongNameHandler +LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const UNumberUnitWidth &width, + const PluralRules *rules, const MicroPropsGenerator *parent, + UErrorCode &status) { + LongNameHandler result(rules, parent); + UnicodeString simpleFormats[StandardPlural::Form::COUNT]; + getMeasureData(loc, unit, width, simpleFormats, status); + if (U_FAILURE(status)) { return result; } + // TODO: What field to use for units? + simpleFormatsToModifiers(simpleFormats, UNUM_FIELD_COUNT, result.fModifiers, status); + return result; +} + +LongNameHandler LongNameHandler::forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, + const PluralRules *rules, + const MicroPropsGenerator *parent, + UErrorCode &status) { + LongNameHandler result(rules, parent); + UnicodeString simpleFormats[StandardPlural::Form::COUNT]; + getCurrencyLongNameData(loc, currency, simpleFormats, status); + if (U_FAILURE(status)) { return result; } + simpleFormatsToModifiers(simpleFormats, UNUM_CURRENCY_FIELD, result.fModifiers, status); + return result; +} + +void LongNameHandler::simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field, + SimpleModifier *output, UErrorCode &status) { + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { + UnicodeString simpleFormat = simpleFormats[i]; + if (simpleFormat.isBogus()) { + simpleFormat = simpleFormats[StandardPlural::Form::OTHER]; + } + if (simpleFormat.isBogus()) { + // There should always be data in the "other" plural variant. + status = U_INTERNAL_PROGRAM_ERROR; + return; + } + SimpleFormatter compiledFormatter(simpleFormat, 1, 1, status); + output[i] = SimpleModifier(compiledFormatter, field, false); + } +} + +void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(quantity, micros, status); + // TODO: Avoid the copy here? + DecimalQuantity copy(quantity); + micros.rounding.apply(copy, status); + micros.modOuter = &fModifiers[copy.getStandardPlural(rules)]; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_longnames.h b/deps/icu-small/source/i18n/number_longnames.h new file mode 100644 index 00000000000000..22ecbac30e1ebc --- /dev/null +++ b/deps/icu-small/source/i18n/number_longnames.h @@ -0,0 +1,48 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_LONGNAMES_H__ +#define __NUMBER_LONGNAMES_H__ + +#include "unicode/uversion.h" +#include "number_utils.h" +#include "number_modifiers.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +class LongNameHandler : public MicroPropsGenerator, public UMemory { + public: + static LongNameHandler + forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, const PluralRules *rules, + const MicroPropsGenerator *parent, UErrorCode &status); + + static LongNameHandler + forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const UNumberUnitWidth &width, + const PluralRules *rules, const MicroPropsGenerator *parent, UErrorCode &status); + + void + processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + private: + SimpleModifier fModifiers[StandardPlural::Form::COUNT]; + const PluralRules *rules; + const MicroPropsGenerator *parent; + + LongNameHandler(const PluralRules *rules, const MicroPropsGenerator *parent) + : rules(rules), parent(parent) {} + + static void simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field, + SimpleModifier *output, UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_LONGNAMES_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_modifiers.cpp b/deps/icu-small/source/i18n/number_modifiers.cpp new file mode 100644 index 00000000000000..a19b12d11ed7a2 --- /dev/null +++ b/deps/icu-small/source/i18n/number_modifiers.cpp @@ -0,0 +1,303 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "umutex.h" +#include "ucln_cmn.h" +#include "ucln_in.h" +#include "number_modifiers.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// TODO: This is copied from simpleformatter.cpp +const int32_t ARG_NUM_LIMIT = 0x100; + +// These are the default currency spacing UnicodeSets in CLDR. +// Pre-compute them for performance. +// The Java unit test testCurrencySpacingPatternStability() will start failing if these change in CLDR. +icu::UInitOnce gDefaultCurrencySpacingInitOnce = U_INITONCE_INITIALIZER; + +UnicodeSet *UNISET_DIGIT = nullptr; +UnicodeSet *UNISET_NOTS = nullptr; + +UBool U_CALLCONV cleanupDefaultCurrencySpacing() { + delete UNISET_DIGIT; + UNISET_DIGIT = nullptr; + delete UNISET_NOTS; + UNISET_NOTS = nullptr; + return TRUE; +} + +void U_CALLCONV initDefaultCurrencySpacing(UErrorCode &status) { + ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY_SPACING, cleanupDefaultCurrencySpacing); + UNISET_DIGIT = new UnicodeSet(UnicodeString(u"[:digit:]"), status); + UNISET_NOTS = new UnicodeSet(UnicodeString(u"[:^S:]"), status); + if (UNISET_DIGIT == nullptr || UNISET_NOTS == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + UNISET_DIGIT->freeze(); + UNISET_NOTS->freeze(); +} + +} // namespace + + +int32_t ConstantAffixModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + // Insert the suffix first since inserting the prefix will change the rightIndex + int length = output.insert(rightIndex, fSuffix, fField, status); + length += output.insert(leftIndex, fPrefix, fField, status); + return length; +} + +int32_t ConstantAffixModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + return fPrefix.length(); +} + +int32_t ConstantAffixModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + return fPrefix.countChar32() + fSuffix.countChar32(); +} + +bool ConstantAffixModifier::isStrong() const { + return fStrong; +} + +SimpleModifier::SimpleModifier(const SimpleFormatter &simpleFormatter, Field field, bool strong) + : fCompiledPattern(simpleFormatter.compiledPattern), fField(field), fStrong(strong) { + U_ASSERT(1 == + SimpleFormatter::getArgumentLimit(fCompiledPattern.getBuffer(), fCompiledPattern.length())); + if (fCompiledPattern.charAt(1) != 0) { + fPrefixLength = fCompiledPattern.charAt(1) - ARG_NUM_LIMIT; + fSuffixOffset = 3 + fPrefixLength; + } else { + fPrefixLength = 0; + fSuffixOffset = 2; + } + if (3 + fPrefixLength < fCompiledPattern.length()) { + fSuffixLength = fCompiledPattern.charAt(fSuffixOffset) - ARG_NUM_LIMIT; + } else { + fSuffixLength = 0; + } +} + +SimpleModifier::SimpleModifier() + : fField(UNUM_FIELD_COUNT), fStrong(false), fPrefixLength(0), fSuffixLength(0) { +} + +int32_t SimpleModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + return formatAsPrefixSuffix(output, leftIndex, rightIndex, fField, status); +} + +int32_t SimpleModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + return fPrefixLength; +} + +int32_t SimpleModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + int32_t count = 0; + if (fPrefixLength > 0) { + count += fCompiledPattern.countChar32(2, fPrefixLength); + } + if (fSuffixLength > 0) { + count += fCompiledPattern.countChar32(1 + fSuffixOffset, fSuffixLength); + } + return count; +} + +bool SimpleModifier::isStrong() const { + return fStrong; +} + +int32_t +SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex, + Field field, UErrorCode &status) const { + if (fPrefixLength > 0) { + result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status); + } + if (fSuffixLength > 0) { + result.insert( + endIndex + fPrefixLength, + fCompiledPattern, + 1 + fSuffixOffset, + 1 + fSuffixOffset + fSuffixLength, + field, + status); + } + return fPrefixLength + fSuffixLength; +} + +int32_t ConstantMultiFieldModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + // Insert the suffix first since inserting the prefix will change the rightIndex + int32_t length = output.insert(rightIndex, fSuffix, status); + length += output.insert(leftIndex, fPrefix, status); + return length; +} + +int32_t ConstantMultiFieldModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + return fPrefix.length(); +} + +int32_t ConstantMultiFieldModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + return fPrefix.codePointCount() + fSuffix.codePointCount(); +} + +bool ConstantMultiFieldModifier::isStrong() const { + return fStrong; +} + +CurrencySpacingEnabledModifier::CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix, + const NumberStringBuilder &suffix, + bool strong, + const DecimalFormatSymbols &symbols, + UErrorCode &status) + : ConstantMultiFieldModifier(prefix, suffix, strong) { + // Check for currency spacing. Do not build the UnicodeSets unless there is + // a currency code point at a boundary. + if (prefix.length() > 0 && prefix.fieldAt(prefix.length() - 1) == UNUM_CURRENCY_FIELD) { + int prefixCp = prefix.getLastCodePoint(); + UnicodeSet prefixUnicodeSet = getUnicodeSet(symbols, IN_CURRENCY, PREFIX, status); + if (prefixUnicodeSet.contains(prefixCp)) { + fAfterPrefixUnicodeSet = getUnicodeSet(symbols, IN_NUMBER, PREFIX, status); + fAfterPrefixUnicodeSet.freeze(); + fAfterPrefixInsert = getInsertString(symbols, PREFIX, status); + } else { + fAfterPrefixUnicodeSet.setToBogus(); + fAfterPrefixInsert.setToBogus(); + } + } else { + fAfterPrefixUnicodeSet.setToBogus(); + fAfterPrefixInsert.setToBogus(); + } + if (suffix.length() > 0 && suffix.fieldAt(0) == UNUM_CURRENCY_FIELD) { + int suffixCp = suffix.getLastCodePoint(); + UnicodeSet suffixUnicodeSet = getUnicodeSet(symbols, IN_CURRENCY, SUFFIX, status); + if (suffixUnicodeSet.contains(suffixCp)) { + fBeforeSuffixUnicodeSet = getUnicodeSet(symbols, IN_NUMBER, SUFFIX, status); + fBeforeSuffixUnicodeSet.freeze(); + fBeforeSuffixInsert = getInsertString(symbols, SUFFIX, status); + } else { + fBeforeSuffixUnicodeSet.setToBogus(); + fBeforeSuffixInsert.setToBogus(); + } + } else { + fBeforeSuffixUnicodeSet.setToBogus(); + fBeforeSuffixInsert.setToBogus(); + } +} + +int32_t CurrencySpacingEnabledModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + // Currency spacing logic + int length = 0; + if (rightIndex - leftIndex > 0 && !fAfterPrefixUnicodeSet.isBogus() && + fAfterPrefixUnicodeSet.contains(output.codePointAt(leftIndex))) { + // TODO: Should we use the CURRENCY field here? + length += output.insert(leftIndex, fAfterPrefixInsert, UNUM_FIELD_COUNT, status); + } + if (rightIndex - leftIndex > 0 && !fBeforeSuffixUnicodeSet.isBogus() && + fBeforeSuffixUnicodeSet.contains(output.codePointBefore(rightIndex))) { + // TODO: Should we use the CURRENCY field here? + length += output.insert(rightIndex + length, fBeforeSuffixInsert, UNUM_FIELD_COUNT, status); + } + + // Call super for the remaining logic + length += ConstantMultiFieldModifier::apply(output, leftIndex, rightIndex + length, status); + return length; +} + +int32_t +CurrencySpacingEnabledModifier::applyCurrencySpacing(NumberStringBuilder &output, int32_t prefixStart, + int32_t prefixLen, int32_t suffixStart, + int32_t suffixLen, + const DecimalFormatSymbols &symbols, + UErrorCode &status) { + int length = 0; + bool hasPrefix = (prefixLen > 0); + bool hasSuffix = (suffixLen > 0); + bool hasNumber = (suffixStart - prefixStart - prefixLen > 0); // could be empty string + if (hasPrefix && hasNumber) { + length += applyCurrencySpacingAffix(output, prefixStart + prefixLen, PREFIX, symbols, status); + } + if (hasSuffix && hasNumber) { + length += applyCurrencySpacingAffix(output, suffixStart + length, SUFFIX, symbols, status); + } + return length; +} + +int32_t +CurrencySpacingEnabledModifier::applyCurrencySpacingAffix(NumberStringBuilder &output, int32_t index, + EAffix affix, + const DecimalFormatSymbols &symbols, + UErrorCode &status) { + // NOTE: For prefix, output.fieldAt(index-1) gets the last field type in the prefix. + // This works even if the last code point in the prefix is 2 code units because the + // field value gets populated to both indices in the field array. + Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1) : output.fieldAt(index); + if (affixField != UNUM_CURRENCY_FIELD) { + return 0; + } + int affixCp = (affix == PREFIX) ? output.codePointBefore(index) : output.codePointAt(index); + UnicodeSet affixUniset = getUnicodeSet(symbols, IN_CURRENCY, affix, status); + if (!affixUniset.contains(affixCp)) { + return 0; + } + int numberCp = (affix == PREFIX) ? output.codePointAt(index) : output.codePointBefore(index); + UnicodeSet numberUniset = getUnicodeSet(symbols, IN_NUMBER, affix, status); + if (!numberUniset.contains(numberCp)) { + return 0; + } + UnicodeString spacingString = getInsertString(symbols, affix, status); + + // NOTE: This next line *inserts* the spacing string, triggering an arraycopy. + // It would be more efficient if this could be done before affixes were attached, + // so that it could be prepended/appended instead of inserted. + // However, the build code path is more efficient, and this is the most natural + // place to put currency spacing in the non-build code path. + // TODO: Should we use the CURRENCY field here? + return output.insert(index, spacingString, UNUM_FIELD_COUNT, status); +} + +UnicodeSet +CurrencySpacingEnabledModifier::getUnicodeSet(const DecimalFormatSymbols &symbols, EPosition position, + EAffix affix, UErrorCode &status) { + // Ensure the static defaults are initialized: + umtx_initOnce(gDefaultCurrencySpacingInitOnce, &initDefaultCurrencySpacing, status); + if (U_FAILURE(status)) { + return UnicodeSet(); + } + + const UnicodeString& pattern = symbols.getPatternForCurrencySpacing( + position == IN_CURRENCY ? UNUM_CURRENCY_MATCH : UNUM_CURRENCY_SURROUNDING_MATCH, + affix == SUFFIX, + status); + if (pattern.compare(u"[:digit:]", -1) == 0) { + return *UNISET_DIGIT; + } else if (pattern.compare(u"[:^S:]", -1) == 0) { + return *UNISET_NOTS; + } else { + return UnicodeSet(pattern, status); + } +} + +UnicodeString +CurrencySpacingEnabledModifier::getInsertString(const DecimalFormatSymbols &symbols, EAffix affix, + UErrorCode &status) { + return symbols.getPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, affix == SUFFIX, status); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_modifiers.h b/deps/icu-small/source/i18n/number_modifiers.h new file mode 100644 index 00000000000000..6a88828a44dd71 --- /dev/null +++ b/deps/icu-small/source/i18n/number_modifiers.h @@ -0,0 +1,254 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_MODIFIERS_H__ +#define __NUMBER_MODIFIERS_H__ + +#include +#include +#include "unicode/uniset.h" +#include "unicode/simpleformatter.h" +#include "standardplural.h" +#include "number_stringbuilder.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +/** + * The canonical implementation of {@link Modifier}, containing a prefix and suffix string. + * TODO: This is not currently being used by real code and could be removed. + */ +class U_I18N_API ConstantAffixModifier : public Modifier, public UObject { + public: + ConstantAffixModifier(const UnicodeString &prefix, const UnicodeString &suffix, Field field, + bool strong) + : fPrefix(prefix), fSuffix(suffix), fField(field), fStrong(strong) {} + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + private: + UnicodeString fPrefix; + UnicodeString fSuffix; + Field fField; + bool fStrong; +}; + +/** + * The second primary implementation of {@link Modifier}, this one consuming a {@link SimpleFormatter} + * pattern. + */ +class U_I18N_API SimpleModifier : public Modifier, public UMemory { + public: + SimpleModifier(const SimpleFormatter &simpleFormatter, Field field, bool strong); + + // Default constructor for LongNameHandler.h + SimpleModifier(); + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + /** + * TODO: This belongs in SimpleFormatterImpl. The only reason I haven't moved it there yet is because + * DoubleSidedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not depend on it. + * + *

+ * Formats a value that is already stored inside the StringBuilder result between the indices + * startIndex and endIndex by inserting characters before the start index and after the + * end index. + * + *

+ * This is well-defined only for patterns with exactly one argument. + * + * @param result + * The StringBuilder containing the value argument. + * @param startIndex + * The left index of the value within the string builder. + * @param endIndex + * The right index of the value within the string builder. + * @return The number of characters (UTF-16 code points) that were added to the StringBuilder. + */ + int32_t + formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex, Field field, + UErrorCode &status) const; + + private: + UnicodeString fCompiledPattern; + Field fField; + bool fStrong; + int32_t fPrefixLength; + int32_t fSuffixOffset; + int32_t fSuffixLength; +}; + +/** + * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier. Constructed + * based on the contents of two {@link NumberStringBuilder} instances (one for the prefix, one for the suffix). + */ +class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory { + public: + ConstantMultiFieldModifier(const NumberStringBuilder &prefix, const NumberStringBuilder &suffix, + bool strong) : fPrefix(prefix), fSuffix(suffix), fStrong(strong) {} + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + protected: + // NOTE: In Java, these are stored as array pointers. In C++, the NumberStringBuilder is stored by + // value and is treated internally as immutable. + NumberStringBuilder fPrefix; + NumberStringBuilder fSuffix; + bool fStrong; +}; + +/** Identical to {@link ConstantMultiFieldModifier}, but supports currency spacing. */ +class U_I18N_API CurrencySpacingEnabledModifier : public ConstantMultiFieldModifier { + public: + /** Safe code path */ + CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix, const NumberStringBuilder &suffix, + bool strong, const DecimalFormatSymbols &symbols, UErrorCode &status); + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + /** Unsafe code path */ + static int32_t + applyCurrencySpacing(NumberStringBuilder &output, int32_t prefixStart, int32_t prefixLen, + int32_t suffixStart, int32_t suffixLen, const DecimalFormatSymbols &symbols, + UErrorCode &status); + + private: + UnicodeSet fAfterPrefixUnicodeSet; + UnicodeString fAfterPrefixInsert; + UnicodeSet fBeforeSuffixUnicodeSet; + UnicodeString fBeforeSuffixInsert; + + enum EAffix { + PREFIX, SUFFIX + }; + + enum EPosition { + IN_CURRENCY, IN_NUMBER + }; + + /** Unsafe code path */ + static int32_t applyCurrencySpacingAffix(NumberStringBuilder &output, int32_t index, EAffix affix, + const DecimalFormatSymbols &symbols, UErrorCode &status); + + static UnicodeSet + getUnicodeSet(const DecimalFormatSymbols &symbols, EPosition position, EAffix affix, + UErrorCode &status); + + static UnicodeString + getInsertString(const DecimalFormatSymbols &symbols, EAffix affix, UErrorCode &status); +}; + +/** A Modifier that does not do anything. */ +class U_I18N_API EmptyModifier : public Modifier, public UMemory { + public: + explicit EmptyModifier(bool isStrong) : fStrong(isStrong) {} + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE { + (void)output; + (void)leftIndex; + (void)rightIndex; + (void)status; + return 0; + } + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE { + (void)status; + return 0; + } + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE { + (void)status; + return 0; + } + + bool isStrong() const U_OVERRIDE { + return fStrong; + } + + private: + bool fStrong; +}; + +/** + * A ParameterizedModifier by itself is NOT a Modifier. Rather, it wraps a data structure containing two or more + * Modifiers and returns the modifier appropriate for the current situation. + */ +class U_I18N_API ParameterizedModifier : public UMemory { + public: + // NOTE: mods is zero-initialized (to nullptr) + ParameterizedModifier() : mods() { + } + + // No copying! + ParameterizedModifier(const ParameterizedModifier &other) = delete; + + ~ParameterizedModifier() { + for (const Modifier *mod : mods) { + delete mod; + } + } + + void adoptPositiveNegativeModifiers(const Modifier *positive, const Modifier *negative) { + mods[0] = positive; + mods[1] = negative; + } + + /** The modifier is ADOPTED. */ + void adoptSignPluralModifier(bool isNegative, StandardPlural::Form plural, const Modifier *mod) { + mods[getModIndex(isNegative, plural)] = mod; + } + + /** Returns a reference to the modifier; no ownership change. */ + const Modifier *getModifier(bool isNegative) const { + return mods[isNegative ? 1 : 0]; + } + + /** Returns a reference to the modifier; no ownership change. */ + const Modifier *getModifier(bool isNegative, StandardPlural::Form plural) const { + return mods[getModIndex(isNegative, plural)]; + } + + private: + const Modifier *mods[2 * StandardPlural::COUNT]; + + inline static int32_t getModIndex(bool isNegative, StandardPlural::Form plural) { + return static_cast(plural) * 2 + (isNegative ? 1 : 0); + } +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_MODIFIERS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_notation.cpp b/deps/icu-small/source/i18n/number_notation.cpp new file mode 100644 index 00000000000000..ff0cd9505de299 --- /dev/null +++ b/deps/icu-small/source/i18n/number_notation.cpp @@ -0,0 +1,75 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_types.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + + +ScientificNotation Notation::scientific() { + // NOTE: ISO C++ does not allow C99 designated initializers. + ScientificSettings settings; + settings.fEngineeringInterval = 1; + settings.fRequireMinInt = false; + settings.fMinExponentDigits = 1; + settings.fExponentSignDisplay = UNUM_SIGN_AUTO; + NotationUnion union_; + union_.scientific = settings; + return {NTN_SCIENTIFIC, union_}; +} + +ScientificNotation Notation::engineering() { + ScientificSettings settings; + settings.fEngineeringInterval = 3; + settings.fRequireMinInt = false; + settings.fMinExponentDigits = 1; + settings.fExponentSignDisplay = UNUM_SIGN_AUTO; + NotationUnion union_; + union_.scientific = settings; + return {NTN_SCIENTIFIC, union_}; +} + +Notation Notation::compactShort() { + NotationUnion union_; + union_.compactStyle = CompactStyle::UNUM_SHORT; + return {NTN_COMPACT, union_}; +} + +Notation Notation::compactLong() { + NotationUnion union_; + union_.compactStyle = CompactStyle::UNUM_LONG; + return {NTN_COMPACT, union_}; +} + +Notation Notation::simple() { + return {}; +} + +ScientificNotation +ScientificNotation::withMinExponentDigits(int32_t minExponentDigits) const { + if (minExponentDigits >= 0 && minExponentDigits < kMaxIntFracSig) { + ScientificSettings settings = fUnion.scientific; + settings.fMinExponentDigits = (int8_t) minExponentDigits; + NotationUnion union_ = {settings}; + return {NTN_SCIENTIFIC, union_}; + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +ScientificNotation +ScientificNotation::withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const { + ScientificSettings settings = fUnion.scientific; + settings.fExponentSignDisplay = exponentSignDisplay; + NotationUnion union_ = {settings}; + return {NTN_SCIENTIFIC, union_}; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_padding.cpp b/deps/icu-small/source/i18n/number_padding.cpp new file mode 100644 index 00000000000000..a478af60541dde --- /dev/null +++ b/deps/icu-small/source/i18n/number_padding.cpp @@ -0,0 +1,84 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_stringbuilder.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +int32_t +addPaddingHelper(UChar32 paddingCp, int32_t requiredPadding, NumberStringBuilder &string, int32_t index, + UErrorCode &status) { + for (int32_t i = 0; i < requiredPadding; i++) { + // TODO: If appending to the end, this will cause actual insertion operations. Improve. + string.insertCodePoint(index, paddingCp, UNUM_FIELD_COUNT, status); + } + return U16_LENGTH(paddingCp) * requiredPadding; +} + +} + +Padder::Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position) : fWidth(width) { + fUnion.padding.fCp = cp; + fUnion.padding.fPosition = position; +} + +Padder::Padder(int32_t width) : fWidth(width) {} + +Padder Padder::none() { + return {-1}; +} + +Padder Padder::codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position) { + // TODO: Validate the code point? + if (targetWidth >= 0) { + return {cp, targetWidth, position}; + } else { + return {U_NUMBER_PADDING_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +int32_t Padder::padAndApply(const Modifier &mod1, const Modifier &mod2, + NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const { + int32_t modLength = mod1.getCodePointCount(status) + mod2.getCodePointCount(status); + int32_t requiredPadding = fWidth - modLength - string.codePointCount(); + U_ASSERT(leftIndex == 0 && + rightIndex == string.length()); // fix the previous line to remove this assertion + + int length = 0; + if (requiredPadding <= 0) { + // Padding is not required. + length += mod1.apply(string, leftIndex, rightIndex, status); + length += mod2.apply(string, leftIndex, rightIndex + length, status); + return length; + } + + PadPosition position = fUnion.padding.fPosition; + UChar32 paddingCp = fUnion.padding.fCp; + if (position == UNUM_PAD_AFTER_PREFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, leftIndex, status); + } else if (position == UNUM_PAD_BEFORE_SUFFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, rightIndex + length, status); + } + length += mod1.apply(string, leftIndex, rightIndex + length, status); + length += mod2.apply(string, leftIndex, rightIndex + length, status); + if (position == UNUM_PAD_BEFORE_PREFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, leftIndex, status); + } else if (position == UNUM_PAD_AFTER_SUFFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, rightIndex + length, status); + } + + return length; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.cpp b/deps/icu-small/source/i18n/number_patternmodifier.cpp new file mode 100644 index 00000000000000..0599f92a4f343b --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternmodifier.cpp @@ -0,0 +1,351 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "cstring.h" +#include "number_patternmodifier.h" +#include "unicode/dcfmtsym.h" +#include "unicode/ucurr.h" +#include "unicode/unistr.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +MutablePatternModifier::MutablePatternModifier(bool isStrong) : fStrong(isStrong) {} + +void MutablePatternModifier::setPatternInfo(const AffixPatternProvider *patternInfo) { + this->patternInfo = patternInfo; +} + +void MutablePatternModifier::setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille) { + this->signDisplay = signDisplay; + this->perMilleReplacesPercent = perMille; +} + +void +MutablePatternModifier::setSymbols(const DecimalFormatSymbols *symbols, const CurrencyUnit ¤cy, + const UNumberUnitWidth unitWidth, const PluralRules *rules) { + U_ASSERT((rules != nullptr) == needsPlurals()); + this->symbols = symbols; + uprv_memcpy(static_cast(this->currencyCode), + currency.getISOCurrency(), + sizeof(char16_t) * 4); + this->unitWidth = unitWidth; + this->rules = rules; +} + +void MutablePatternModifier::setNumberProperties(bool isNegative, StandardPlural::Form plural) { + this->isNegative = isNegative; + this->plural = plural; +} + +bool MutablePatternModifier::needsPlurals() const { + UErrorCode statusLocal = U_ZERO_ERROR; + return patternInfo->containsSymbolType(AffixPatternType::TYPE_CURRENCY_TRIPLE, statusLocal); + // Silently ignore any error codes. +} + +ImmutablePatternModifier *MutablePatternModifier::createImmutable(UErrorCode &status) { + return createImmutableAndChain(nullptr, status); +} + +ImmutablePatternModifier * +MutablePatternModifier::createImmutableAndChain(const MicroPropsGenerator *parent, UErrorCode &status) { + + // TODO: Move StandardPlural VALUES to standardplural.h + static const StandardPlural::Form STANDARD_PLURAL_VALUES[] = { + StandardPlural::Form::ZERO, + StandardPlural::Form::ONE, + StandardPlural::Form::TWO, + StandardPlural::Form::FEW, + StandardPlural::Form::MANY, + StandardPlural::Form::OTHER}; + + auto pm = new ParameterizedModifier(); + if (pm == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + + if (needsPlurals()) { + // Slower path when we require the plural keyword. + for (StandardPlural::Form plural : STANDARD_PLURAL_VALUES) { + setNumberProperties(false, plural); + pm->adoptSignPluralModifier(false, plural, createConstantModifier(status)); + setNumberProperties(true, plural); + pm->adoptSignPluralModifier(true, plural, createConstantModifier(status)); + } + if (U_FAILURE(status)) { + delete pm; + return nullptr; + } + return new ImmutablePatternModifier(pm, rules, parent); // adopts pm + } else { + // Faster path when plural keyword is not needed. + setNumberProperties(false, StandardPlural::Form::COUNT); + Modifier *positive = createConstantModifier(status); + setNumberProperties(true, StandardPlural::Form::COUNT); + Modifier *negative = createConstantModifier(status); + pm->adoptPositiveNegativeModifiers(positive, negative); + if (U_FAILURE(status)) { + delete pm; + return nullptr; + } + return new ImmutablePatternModifier(pm, nullptr, parent); // adopts pm + } +} + +ConstantMultiFieldModifier *MutablePatternModifier::createConstantModifier(UErrorCode &status) { + NumberStringBuilder a; + NumberStringBuilder b; + insertPrefix(a, 0, status); + insertSuffix(b, 0, status); + if (patternInfo->hasCurrencySign()) { + return new CurrencySpacingEnabledModifier(a, b, fStrong, *symbols, status); + } else { + return new ConstantMultiFieldModifier(a, b, fStrong); + } +} + +ImmutablePatternModifier::ImmutablePatternModifier(ParameterizedModifier *pm, const PluralRules *rules, + const MicroPropsGenerator *parent) + : pm(pm), rules(rules), parent(parent) {} + +void ImmutablePatternModifier::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(quantity, micros, status); + applyToMicros(micros, quantity); +} + +void ImmutablePatternModifier::applyToMicros(MicroProps µs, DecimalQuantity &quantity) const { + if (rules == nullptr) { + micros.modMiddle = pm->getModifier(quantity.isNegative()); + } else { + // TODO: Fix this. Avoid the copy. + DecimalQuantity copy(quantity); + copy.roundToInfinity(); + StandardPlural::Form plural = copy.getStandardPlural(rules); + micros.modMiddle = pm->getModifier(quantity.isNegative(), plural); + } +} + +/** Used by the unsafe code path. */ +MicroPropsGenerator &MutablePatternModifier::addToChain(const MicroPropsGenerator *parent) { + this->parent = parent; + return *this; +} + +void MutablePatternModifier::processQuantity(DecimalQuantity &fq, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(fq, micros, status); + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + if (needsPlurals()) { + // TODO: Fix this. Avoid the copy. + DecimalQuantity copy(fq); + micros.rounding.apply(copy, status); + nonConstThis->setNumberProperties(fq.isNegative(), copy.getStandardPlural(rules)); + } else { + nonConstThis->setNumberProperties(fq.isNegative(), StandardPlural::Form::COUNT); + } + micros.modMiddle = this; +} + +int32_t MutablePatternModifier::apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const { + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + int32_t prefixLen = nonConstThis->insertPrefix(output, leftIndex, status); + int32_t suffixLen = nonConstThis->insertSuffix(output, rightIndex + prefixLen, status); + CurrencySpacingEnabledModifier::applyCurrencySpacing( + output, leftIndex, prefixLen, rightIndex + prefixLen, suffixLen, *symbols, status); + return prefixLen + suffixLen; +} + +int32_t MutablePatternModifier::getPrefixLength(UErrorCode &status) const { + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + + // Enter and exit CharSequence Mode to get the length. + nonConstThis->enterCharSequenceMode(true); + int result = AffixUtils::unescapedCodePointCount(*this, *this, status); // prefix length + nonConstThis->exitCharSequenceMode(); + return result; +} + +int32_t MutablePatternModifier::getCodePointCount(UErrorCode &status) const { + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + + // Enter and exit CharSequence Mode to get the length. + nonConstThis->enterCharSequenceMode(true); + int result = AffixUtils::unescapedCodePointCount(*this, *this, status); // prefix length + nonConstThis->exitCharSequenceMode(); + nonConstThis->enterCharSequenceMode(false); + result += AffixUtils::unescapedCodePointCount(*this, *this, status); // suffix length + nonConstThis->exitCharSequenceMode(); + return result; +} + +bool MutablePatternModifier::isStrong() const { + return fStrong; +} + +int32_t MutablePatternModifier::insertPrefix(NumberStringBuilder &sb, int position, UErrorCode &status) { + enterCharSequenceMode(true); + int length = AffixUtils::unescape(*this, sb, position, *this, status); + exitCharSequenceMode(); + return length; +} + +int32_t MutablePatternModifier::insertSuffix(NumberStringBuilder &sb, int position, UErrorCode &status) { + enterCharSequenceMode(false); + int length = AffixUtils::unescape(*this, sb, position, *this, status); + exitCharSequenceMode(); + return length; +} + +UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const { + switch (type) { + case AffixPatternType::TYPE_MINUS_SIGN: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol); + case AffixPatternType::TYPE_PLUS_SIGN: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol); + case AffixPatternType::TYPE_PERCENT: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPercentSymbol); + case AffixPatternType::TYPE_PERMILLE: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPerMillSymbol); + case AffixPatternType::TYPE_CURRENCY_SINGLE: { + // UnitWidth ISO and HIDDEN overrides the singular currency symbol. + if (unitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE) { + return UnicodeString(currencyCode, 3); + } else if (unitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN) { + return UnicodeString(); + } else { + UErrorCode status = U_ZERO_ERROR; + UBool isChoiceFormat = FALSE; + int32_t symbolLen = 0; + const char16_t *symbol = ucurr_getName( + currencyCode, + symbols->getLocale().getName(), + UCurrNameStyle::UCURR_SYMBOL_NAME, + &isChoiceFormat, + &symbolLen, + &status); + return UnicodeString(symbol, symbolLen); + } + } + case AffixPatternType::TYPE_CURRENCY_DOUBLE: + return UnicodeString(currencyCode, 3); + case AffixPatternType::TYPE_CURRENCY_TRIPLE: { + // NOTE: This is the code path only for patterns containing "¤¤¤". + // Plural currencies set via the API are formatted in LongNameHandler. + // This code path is used by DecimalFormat via CurrencyPluralInfo. + U_ASSERT(plural != StandardPlural::Form::COUNT); + UErrorCode status = U_ZERO_ERROR; + UBool isChoiceFormat = FALSE; + int32_t symbolLen = 0; + const char16_t *symbol = ucurr_getPluralName( + currencyCode, + symbols->getLocale().getName(), + &isChoiceFormat, + StandardPlural::getKeyword(plural), + &symbolLen, + &status); + return UnicodeString(symbol, symbolLen); + } + case AffixPatternType::TYPE_CURRENCY_QUAD: + return UnicodeString(u"\uFFFD"); + case AffixPatternType::TYPE_CURRENCY_QUINT: + return UnicodeString(u"\uFFFD"); + default: + U_ASSERT(false); + return UnicodeString(); + } +} + +/** This method contains the heart of the logic for rendering LDML affix strings. */ +void MutablePatternModifier::enterCharSequenceMode(bool isPrefix) { + U_ASSERT(!inCharSequenceMode); + inCharSequenceMode = true; + + // Should the output render '+' where '-' would normally appear in the pattern? + plusReplacesMinusSign = !isNegative && ( + signDisplay == UNUM_SIGN_ALWAYS || + signDisplay == UNUM_SIGN_ACCOUNTING_ALWAYS) && + patternInfo->positiveHasPlusSign() == false; + + // Should we use the affix from the negative subpattern? (If not, we will use the positive subpattern.) + bool useNegativeAffixPattern = patternInfo->hasNegativeSubpattern() && ( + isNegative || (patternInfo->negativeHasMinusSign() && plusReplacesMinusSign)); + + // Resolve the flags for the affix pattern. + fFlags = 0; + if (useNegativeAffixPattern) { + fFlags |= AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN; + } + if (isPrefix) { + fFlags |= AffixPatternProvider::AFFIX_PREFIX; + } + if (plural != StandardPlural::Form::COUNT) { + U_ASSERT(plural == (AffixPatternProvider::AFFIX_PLURAL_MASK & plural)); + fFlags |= plural; + } + + // Should we prepend a sign to the pattern? + if (!isPrefix || useNegativeAffixPattern) { + prependSign = false; + } else if (isNegative) { + prependSign = signDisplay != UNUM_SIGN_NEVER; + } else { + prependSign = plusReplacesMinusSign; + } + + // Finally, compute the length of the affix pattern. + fLength = patternInfo->length(fFlags) + (prependSign ? 1 : 0); +} + +void MutablePatternModifier::exitCharSequenceMode() { + U_ASSERT(inCharSequenceMode); + inCharSequenceMode = false; +} + +int32_t MutablePatternModifier::length() const { + U_ASSERT(inCharSequenceMode); + return fLength; +} + +char16_t MutablePatternModifier::charAt(int32_t index) const { + U_ASSERT(inCharSequenceMode); + char16_t candidate; + if (prependSign && index == 0) { + candidate = u'-'; + } else if (prependSign) { + candidate = patternInfo->charAt(fFlags, index - 1); + } else { + candidate = patternInfo->charAt(fFlags, index); + } + if (plusReplacesMinusSign && candidate == u'-') { + return u'+'; + } + if (perMilleReplacesPercent && candidate == u'%') { + return u'‰'; + } + return candidate; +} + +UnicodeString MutablePatternModifier::toUnicodeString() const { + // Never called by AffixUtils + U_ASSERT(false); + return UnicodeString(); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.h b/deps/icu-small/source/i18n/number_patternmodifier.h new file mode 100644 index 00000000000000..705037f0ba7173 --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternmodifier.h @@ -0,0 +1,259 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_PATTERNMODIFIER_H__ +#define __NUMBER_PATTERNMODIFIER_H__ + +#include "standardplural.h" +#include "unicode/numberformatter.h" +#include "number_patternstring.h" +#include "number_types.h" +#include "number_modifiers.h" +#include "number_utils.h" + +U_NAMESPACE_BEGIN + +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of ParameterizedModifier. +// (MSVC requires this, even though it should not be necessary.) +#if defined (_MSC_VER) +// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= +#pragma warning(suppress: 4661) +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalPointer; +#endif + +namespace number { +namespace impl { + +// Forward declaration +class MutablePatternModifier; + +// Exported as U_I18N_API because it is needed for the unit test PatternModifierTest +class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public UMemory { + public: + ~ImmutablePatternModifier() U_OVERRIDE = default; + + void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + void applyToMicros(MicroProps µs, DecimalQuantity &quantity) const; + + private: + ImmutablePatternModifier(ParameterizedModifier *pm, const PluralRules *rules, const MicroPropsGenerator *parent); + + const LocalPointer pm; + const PluralRules *rules; + const MicroPropsGenerator *parent; + + friend class MutablePatternModifier; +}; + +/** + * This class is a {@link Modifier} that wraps a decimal format pattern. It applies the pattern's affixes in + * {@link Modifier#apply}. + * + *

+ * In addition to being a Modifier, this class contains the business logic for substituting the correct locale symbols + * into the affixes of the decimal format pattern. + * + *

+ * In order to use this class, create a new instance and call the following four setters: {@link #setPatternInfo}, + * {@link #setPatternAttributes}, {@link #setSymbols}, and {@link #setNumberProperties}. After calling these four + * setters, the instance will be ready for use as a Modifier. + * + *

+ * This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or attempt to use + * it from multiple threads! Instead, you can obtain a safe, immutable decimal format pattern modifier by calling + * {@link MutablePatternModifier#createImmutable}, in effect treating this instance as a builder for the immutable + * variant. + */ +class U_I18N_API MutablePatternModifier + : public MicroPropsGenerator, + public Modifier, + public SymbolProvider, + public CharSequence, + public UMemory { + public: + + ~MutablePatternModifier() U_OVERRIDE = default; + + /** + * @param isStrong + * Whether the modifier should be considered strong. For more information, see + * {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should be considered + * as non-strong. + */ + explicit MutablePatternModifier(bool isStrong); + + /** + * Sets a reference to the parsed decimal format pattern, usually obtained from + * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is + * accepted. + */ + void setPatternInfo(const AffixPatternProvider *patternInfo); + + /** + * Sets attributes that imply changes to the literal interpretation of the pattern string affixes. + * + * @param signDisplay + * Whether to force a plus sign on positive numbers. + * @param perMille + * Whether to substitute the percent sign in the pattern with a permille sign. + */ + void setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille); + + /** + * Sets locale-specific details that affect the symbols substituted into the pattern string affixes. + * + * @param symbols + * The desired instance of DecimalFormatSymbols. + * @param currency + * The currency to be used when substituting currency values into the affixes. + * @param unitWidth + * The width used to render currencies. + * @param rules + * Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be determined from the + * convenience method {@link #needsPlurals()}. + */ + void + setSymbols(const DecimalFormatSymbols *symbols, const CurrencyUnit ¤cy, UNumberUnitWidth unitWidth, + const PluralRules *rules); + + /** + * Sets attributes of the current number being processed. + * + * @param isNegative + * Whether the number is negative. + * @param plural + * The plural form of the number, required only if the pattern contains the triple currency sign, "¤¤¤" + * (and as indicated by {@link #needsPlurals()}). + */ + void setNumberProperties(bool isNegative, StandardPlural::Form plural); + + /** + * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize. + * This is currently true only if there is a currency long name placeholder in the pattern ("¤¤¤"). + */ + bool needsPlurals() const; + + /** + * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable + * and can be saved for future use. The number properties in the current instance are mutated; all other properties + * are left untouched. + * + *

+ * The resulting modifier cannot be used in a QuantityChain. + * + *

+ * CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP. + * + * @return An immutable that supports both positive and negative numbers. + */ + ImmutablePatternModifier *createImmutable(UErrorCode &status); + + /** + * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable + * and can be saved for future use. The number properties in the current instance are mutated; all other properties + * are left untouched. + * + *

+ * CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP. + * + * @param parent + * The QuantityChain to which to chain this immutable. + * @return An immutable that supports both positive and negative numbers. + */ + ImmutablePatternModifier * + createImmutableAndChain(const MicroPropsGenerator *parent, UErrorCode &status); + + MicroPropsGenerator &addToChain(const MicroPropsGenerator *parent); + + void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + /** + * Returns the string that substitutes a given symbol type in a pattern. + */ + UnicodeString getSymbol(AffixPatternType type) const U_OVERRIDE; + + int32_t length() const U_OVERRIDE; + + char16_t charAt(int32_t index) const U_OVERRIDE; + + // Use default implementation of codePointAt + + UnicodeString toUnicodeString() const U_OVERRIDE; + + private: + // Modifier details (initialized in constructor) + const bool fStrong; + + // Pattern details (initialized in setPatternInfo and setPatternAttributes) + const AffixPatternProvider *patternInfo; + UNumberSignDisplay signDisplay; + bool perMilleReplacesPercent; + + // Symbol details (initialized in setSymbols) + const DecimalFormatSymbols *symbols; + UNumberUnitWidth unitWidth; + char16_t currencyCode[4]; + const PluralRules *rules; + + // Number details (initialized in setNumberProperties) + bool isNegative; + StandardPlural::Form plural; + + // QuantityChain details (initialized in addToChain) + const MicroPropsGenerator *parent; + + // Transient CharSequence fields (initialized in enterCharSequenceMode) + bool inCharSequenceMode = false; + int32_t fFlags; + int32_t fLength; + bool prependSign; + bool plusReplacesMinusSign; + + /** + * Uses the current properties to create a single {@link ConstantMultiFieldModifier} with currency spacing support + * if required. + * + *

+ * CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP. + * + * @param a + * A working NumberStringBuilder object; passed from the outside to prevent the need to create many new + * instances if this method is called in a loop. + * @param b + * Another working NumberStringBuilder object. + * @return The constant modifier object. + */ + ConstantMultiFieldModifier *createConstantModifier(UErrorCode &status); + + int32_t insertPrefix(NumberStringBuilder &sb, int position, UErrorCode &status); + + int32_t insertSuffix(NumberStringBuilder &sb, int position, UErrorCode &status); + + void enterCharSequenceMode(bool isPrefix); + + void exitCharSequenceMode(); +}; + + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_PATTERNMODIFIER_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternstring.cpp b/deps/icu-small/source/i18n/number_patternstring.cpp new file mode 100644 index 00000000000000..c67e3541816547 --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternstring.cpp @@ -0,0 +1,839 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include "number_patternstring.h" +#include "unicode/utf16.h" +#include "number_utils.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +void PatternParser::parseToPatternInfo(const UnicodeString& patternString, ParsedPatternInfo& patternInfo, UErrorCode &status) { + patternInfo.consumePattern(patternString, status); +} + +DecimalFormatProperties +PatternParser::parseToProperties(const UnicodeString& pattern, IgnoreRounding ignoreRounding, + UErrorCode &status) { + DecimalFormatProperties properties; + parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status); + return properties; +} + +void PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties& properties, + IgnoreRounding ignoreRounding, UErrorCode &status) { + parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status); +} + +char16_t ParsedPatternInfo::charAt(int32_t flags, int32_t index) const { + const Endpoints &endpoints = getEndpoints(flags); + if (index < 0 || index >= endpoints.end - endpoints.start) { + U_ASSERT(false); + } + return pattern.charAt(endpoints.start + index); +} + +int32_t ParsedPatternInfo::length(int32_t flags) const { + return getLengthFromEndpoints(getEndpoints(flags)); +} + +int32_t ParsedPatternInfo::getLengthFromEndpoints(const Endpoints &endpoints) { + return endpoints.end - endpoints.start; +} + +UnicodeString ParsedPatternInfo::getString(int32_t flags) const { + const Endpoints &endpoints = getEndpoints(flags); + if (endpoints.start == endpoints.end) { + return UnicodeString(); + } + // Create a new UnicodeString + return UnicodeString(pattern, endpoints.start, endpoints.end - endpoints.start); +} + +const Endpoints &ParsedPatternInfo::getEndpoints(int32_t flags) const { + bool prefix = (flags & AFFIX_PREFIX) != 0; + bool isNegative = (flags & AFFIX_NEGATIVE_SUBPATTERN) != 0; + bool padding = (flags & AFFIX_PADDING) != 0; + if (isNegative && padding) { + return negative.paddingEndpoints; + } else if (padding) { + return positive.paddingEndpoints; + } else if (prefix && isNegative) { + return negative.prefixEndpoints; + } else if (prefix) { + return positive.prefixEndpoints; + } else if (isNegative) { + return negative.suffixEndpoints; + } else { + return positive.suffixEndpoints; + } +} + +bool ParsedPatternInfo::positiveHasPlusSign() const { + return positive.hasPlusSign; +} + +bool ParsedPatternInfo::hasNegativeSubpattern() const { + return fHasNegativeSubpattern; +} + +bool ParsedPatternInfo::negativeHasMinusSign() const { + return negative.hasMinusSign; +} + +bool ParsedPatternInfo::hasCurrencySign() const { + return positive.hasCurrencySign || (fHasNegativeSubpattern && negative.hasCurrencySign); +} + +bool ParsedPatternInfo::containsSymbolType(AffixPatternType type, UErrorCode &status) const { + return AffixUtils::containsType(UnicodeStringCharSequence(pattern), type, status); +} + +///////////////////////////////////////////////////// +/// BEGIN RECURSIVE DESCENT PARSER IMPLEMENTATION /// +///////////////////////////////////////////////////// + +UChar32 ParsedPatternInfo::ParserState::peek() { + if (offset == pattern.length()) { + return -1; + } else { + return pattern.char32At(offset); + } +} + +UChar32 ParsedPatternInfo::ParserState::next() { + int codePoint = peek(); + offset += U16_LENGTH(codePoint); + return codePoint; +} + +void ParsedPatternInfo::consumePattern(const UnicodeString& patternString, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + this->pattern = patternString; + + // pattern := subpattern (';' subpattern)? + currentSubpattern = &positive; + consumeSubpattern(status); + if (U_FAILURE(status)) { return; } + if (state.peek() == u';') { + state.next(); // consume the ';' + // Don't consume the negative subpattern if it is empty (trailing ';') + if (state.peek() != -1) { + fHasNegativeSubpattern = true; + currentSubpattern = &negative; + consumeSubpattern(status); + if (U_FAILURE(status)) { return; } + } + } + if (state.peek() != -1) { + state.toParseException(u"Found unquoted special character"); + status = U_UNQUOTED_SPECIAL; + } +} + +void ParsedPatternInfo::consumeSubpattern(UErrorCode &status) { + // subpattern := literals? number exponent? literals? + consumePadding(PadPosition::UNUM_PAD_BEFORE_PREFIX, status); + if (U_FAILURE(status)) { return; } + consumeAffix(currentSubpattern->prefixEndpoints, status); + if (U_FAILURE(status)) { return; } + consumePadding(PadPosition::UNUM_PAD_AFTER_PREFIX, status); + if (U_FAILURE(status)) { return; } + consumeFormat(status); + if (U_FAILURE(status)) { return; } + consumeExponent(status); + if (U_FAILURE(status)) { return; } + consumePadding(PadPosition::UNUM_PAD_BEFORE_SUFFIX, status); + if (U_FAILURE(status)) { return; } + consumeAffix(currentSubpattern->suffixEndpoints, status); + if (U_FAILURE(status)) { return; } + consumePadding(PadPosition::UNUM_PAD_AFTER_SUFFIX, status); + if (U_FAILURE(status)) { return; } +} + +void ParsedPatternInfo::consumePadding(PadPosition paddingLocation, UErrorCode &status) { + if (state.peek() != u'*') { + return; + } + if (!currentSubpattern->paddingLocation.isNull()) { + state.toParseException(u"Cannot have multiple pad specifiers"); + status = U_MULTIPLE_PAD_SPECIFIERS; + return; + } + currentSubpattern->paddingLocation = paddingLocation; + state.next(); // consume the '*' + currentSubpattern->paddingEndpoints.start = state.offset; + consumeLiteral(status); + currentSubpattern->paddingEndpoints.end = state.offset; +} + +void ParsedPatternInfo::consumeAffix(Endpoints &endpoints, UErrorCode &status) { + // literals := { literal } + endpoints.start = state.offset; + while (true) { + switch (state.peek()) { + case u'#': + case u'@': + case u';': + case u'*': + case u'.': + case u',': + case u'0': + case u'1': + case u'2': + case u'3': + case u'4': + case u'5': + case u'6': + case u'7': + case u'8': + case u'9': + case -1: + // Characters that cannot appear unquoted in a literal + // break outer; + goto after_outer; + + case u'%': + currentSubpattern->hasPercentSign = true; + break; + + case u'‰': + currentSubpattern->hasPerMilleSign = true; + break; + + case u'¤': + currentSubpattern->hasCurrencySign = true; + break; + + case u'-': + currentSubpattern->hasMinusSign = true; + break; + + case u'+': + currentSubpattern->hasPlusSign = true; + break; + + default: + break; + } + consumeLiteral(status); + if (U_FAILURE(status)) { return; } + } + after_outer: + endpoints.end = state.offset; +} + +void ParsedPatternInfo::consumeLiteral(UErrorCode &status) { + if (state.peek() == -1) { + state.toParseException(u"Expected unquoted literal but found EOL"); + status = U_PATTERN_SYNTAX_ERROR; + return; + } else if (state.peek() == u'\'') { + state.next(); // consume the starting quote + while (state.peek() != u'\'') { + if (state.peek() == -1) { + state.toParseException(u"Expected quoted literal but found EOL"); + status = U_PATTERN_SYNTAX_ERROR; + return; + } else { + state.next(); // consume a quoted character + } + } + state.next(); // consume the ending quote + } else { + // consume a non-quoted literal character + state.next(); + } +} + +void ParsedPatternInfo::consumeFormat(UErrorCode &status) { + consumeIntegerFormat(status); + if (U_FAILURE(status)) { return; } + if (state.peek() == u'.') { + state.next(); // consume the decimal point + currentSubpattern->hasDecimal = true; + currentSubpattern->widthExceptAffixes += 1; + consumeFractionFormat(status); + if (U_FAILURE(status)) { return; } + } +} + +void ParsedPatternInfo::consumeIntegerFormat(UErrorCode &status) { + // Convenience reference: + ParsedSubpatternInfo &result = *currentSubpattern; + + while (true) { + switch (state.peek()) { + case u',': + result.widthExceptAffixes += 1; + result.groupingSizes <<= 16; + break; + + case u'#': + if (result.integerNumerals > 0) { + state.toParseException(u"# cannot follow 0 before decimal point"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.groupingSizes += 1; + if (result.integerAtSigns > 0) { + result.integerTrailingHashSigns += 1; + } else { + result.integerLeadingHashSigns += 1; + } + result.integerTotal += 1; + break; + + case u'@': + if (result.integerNumerals > 0) { + state.toParseException(u"Cannot mix 0 and @"); + status = U_UNEXPECTED_TOKEN; + return; + } + if (result.integerTrailingHashSigns > 0) { + state.toParseException(u"Cannot nest # inside of a run of @"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.groupingSizes += 1; + result.integerAtSigns += 1; + result.integerTotal += 1; + break; + + case u'0': + case u'1': + case u'2': + case u'3': + case u'4': + case u'5': + case u'6': + case u'7': + case u'8': + case u'9': + if (result.integerAtSigns > 0) { + state.toParseException(u"Cannot mix @ and 0"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.groupingSizes += 1; + result.integerNumerals += 1; + result.integerTotal += 1; + if (!result.rounding.isZero() || state.peek() != u'0') { + result.rounding.appendDigit(static_cast(state.peek() - u'0'), 0, true); + } + break; + + default: + goto after_outer; + } + state.next(); // consume the symbol + } + + after_outer: + // Disallow patterns with a trailing ',' or with two ',' next to each other + auto grouping1 = static_cast (result.groupingSizes & 0xffff); + auto grouping2 = static_cast ((result.groupingSizes >> 16) & 0xffff); + auto grouping3 = static_cast ((result.groupingSizes >> 32) & 0xffff); + if (grouping1 == 0 && grouping2 != -1) { + state.toParseException(u"Trailing grouping separator is invalid"); + status = U_UNEXPECTED_TOKEN; + return; + } + if (grouping2 == 0 && grouping3 != -1) { + state.toParseException(u"Grouping width of zero is invalid"); + status = U_PATTERN_SYNTAX_ERROR; + return; + } +} + +void ParsedPatternInfo::consumeFractionFormat(UErrorCode &status) { + // Convenience reference: + ParsedSubpatternInfo &result = *currentSubpattern; + + int32_t zeroCounter = 0; + while (true) { + switch (state.peek()) { + case u'#': + result.widthExceptAffixes += 1; + result.fractionHashSigns += 1; + result.fractionTotal += 1; + zeroCounter++; + break; + + case u'0': + case u'1': + case u'2': + case u'3': + case u'4': + case u'5': + case u'6': + case u'7': + case u'8': + case u'9': + if (result.fractionHashSigns > 0) { + state.toParseException(u"0 cannot follow # after decimal point"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.fractionNumerals += 1; + result.fractionTotal += 1; + if (state.peek() == u'0') { + zeroCounter++; + } else { + result.rounding + .appendDigit(static_cast(state.peek() - u'0'), zeroCounter, false); + zeroCounter = 0; + } + break; + + default: + return; + } + state.next(); // consume the symbol + } +} + +void ParsedPatternInfo::consumeExponent(UErrorCode &status) { + // Convenience reference: + ParsedSubpatternInfo &result = *currentSubpattern; + + if (state.peek() != u'E') { + return; + } + if ((result.groupingSizes & 0xffff0000L) != 0xffff0000L) { + state.toParseException(u"Cannot have grouping separator in scientific notation"); + status = U_MALFORMED_EXPONENTIAL_PATTERN; + return; + } + state.next(); // consume the E + result.widthExceptAffixes++; + if (state.peek() == u'+') { + state.next(); // consume the + + result.exponentHasPlusSign = true; + result.widthExceptAffixes++; + } + while (state.peek() == u'0') { + state.next(); // consume the 0 + result.exponentZeros += 1; + result.widthExceptAffixes++; + } +} + +/////////////////////////////////////////////////// +/// END RECURSIVE DESCENT PARSER IMPLEMENTATION /// +/////////////////////////////////////////////////// + +void +PatternParser::parseToExistingPropertiesImpl(const UnicodeString& pattern, DecimalFormatProperties &properties, + IgnoreRounding ignoreRounding, UErrorCode &status) { + if (pattern.length() == 0) { + // Backwards compatibility requires that we reset to the default values. + // TODO: Only overwrite the properties that "saveToProperties" normally touches? + properties.clear(); + return; + } + + ParsedPatternInfo patternInfo; + parseToPatternInfo(pattern, patternInfo, status); + if (U_FAILURE(status)) { return; } + patternInfoToProperties(properties, patternInfo, ignoreRounding, status); +} + +void PatternParser::patternInfoToProperties(DecimalFormatProperties &properties, + ParsedPatternInfo& patternInfo, + IgnoreRounding _ignoreRounding, UErrorCode &status) { + // Translate from PatternParseResult to Properties. + // Note that most data from "negative" is ignored per the specification of DecimalFormat. + + const ParsedSubpatternInfo &positive = patternInfo.positive; + + bool ignoreRounding; + if (_ignoreRounding == IGNORE_ROUNDING_NEVER) { + ignoreRounding = false; + } else if (_ignoreRounding == IGNORE_ROUNDING_IF_CURRENCY) { + ignoreRounding = positive.hasCurrencySign; + } else { + U_ASSERT(_ignoreRounding == IGNORE_ROUNDING_ALWAYS); + ignoreRounding = true; + } + + // Grouping settings + auto grouping1 = static_cast (positive.groupingSizes & 0xffff); + auto grouping2 = static_cast ((positive.groupingSizes >> 16) & 0xffff); + auto grouping3 = static_cast ((positive.groupingSizes >> 32) & 0xffff); + if (grouping2 != -1) { + properties.groupingSize = grouping1; + } else { + properties.groupingSize = -1; + } + if (grouping3 != -1) { + properties.secondaryGroupingSize = grouping2; + } else { + properties.secondaryGroupingSize = -1; + } + + // For backwards compatibility, require that the pattern emit at least one min digit. + int minInt, minFrac; + if (positive.integerTotal == 0 && positive.fractionTotal > 0) { + // patterns like ".##" + minInt = 0; + minFrac = uprv_max(1, positive.fractionNumerals); + } else if (positive.integerNumerals == 0 && positive.fractionNumerals == 0) { + // patterns like "#.##" + minInt = 1; + minFrac = 0; + } else { + minInt = positive.integerNumerals; + minFrac = positive.fractionNumerals; + } + + // Rounding settings + // Don't set basic rounding when there is a currency sign; defer to CurrencyUsage + if (positive.integerAtSigns > 0) { + properties.minimumFractionDigits = -1; + properties.maximumFractionDigits = -1; + properties.roundingIncrement = 0.0; + properties.minimumSignificantDigits = positive.integerAtSigns; + properties.maximumSignificantDigits = + positive.integerAtSigns + positive.integerTrailingHashSigns; + } else if (!positive.rounding.isZero()) { + if (!ignoreRounding) { + properties.minimumFractionDigits = minFrac; + properties.maximumFractionDigits = positive.fractionTotal; + properties.roundingIncrement = positive.rounding.toDouble(); + } else { + properties.minimumFractionDigits = -1; + properties.maximumFractionDigits = -1; + properties.roundingIncrement = 0.0; + } + properties.minimumSignificantDigits = -1; + properties.maximumSignificantDigits = -1; + } else { + if (!ignoreRounding) { + properties.minimumFractionDigits = minFrac; + properties.maximumFractionDigits = positive.fractionTotal; + properties.roundingIncrement = 0.0; + } else { + properties.minimumFractionDigits = -1; + properties.maximumFractionDigits = -1; + properties.roundingIncrement = 0.0; + } + properties.minimumSignificantDigits = -1; + properties.maximumSignificantDigits = -1; + } + + // If the pattern ends with a '.' then force the decimal point. + if (positive.hasDecimal && positive.fractionTotal == 0) { + properties.decimalSeparatorAlwaysShown = true; + } else { + properties.decimalSeparatorAlwaysShown = false; + } + + // Scientific notation settings + if (positive.exponentZeros > 0) { + properties.exponentSignAlwaysShown = positive.exponentHasPlusSign; + properties.minimumExponentDigits = positive.exponentZeros; + if (positive.integerAtSigns == 0) { + // patterns without '@' can define max integer digits, used for engineering notation + properties.minimumIntegerDigits = positive.integerNumerals; + properties.maximumIntegerDigits = positive.integerTotal; + } else { + // patterns with '@' cannot define max integer digits + properties.minimumIntegerDigits = 1; + properties.maximumIntegerDigits = -1; + } + } else { + properties.exponentSignAlwaysShown = false; + properties.minimumExponentDigits = -1; + properties.minimumIntegerDigits = minInt; + properties.maximumIntegerDigits = -1; + } + + // Compute the affix patterns (required for both padding and affixes) + UnicodeString posPrefix = patternInfo.getString(AffixPatternProvider::AFFIX_PREFIX); + UnicodeString posSuffix = patternInfo.getString(0); + + // Padding settings + if (!positive.paddingLocation.isNull()) { + // The width of the positive prefix and suffix templates are included in the padding + int paddingWidth = + positive.widthExceptAffixes + AffixUtils::estimateLength(UnicodeStringCharSequence(posPrefix), status) + + AffixUtils::estimateLength(UnicodeStringCharSequence(posSuffix), status); + properties.formatWidth = paddingWidth; + UnicodeString rawPaddingString = patternInfo.getString(AffixPatternProvider::AFFIX_PADDING); + if (rawPaddingString.length() == 1) { + properties.padString = rawPaddingString; + } else if (rawPaddingString.length() == 2) { + if (rawPaddingString.charAt(0) == u'\'') { + properties.padString.setTo(u"'", -1); + } else { + properties.padString = rawPaddingString; + } + } else { + properties.padString = UnicodeString(rawPaddingString, 1, rawPaddingString.length() - 2); + } + properties.padPosition = positive.paddingLocation; + } else { + properties.formatWidth = -1; + properties.padString.setToBogus(); + properties.padPosition.nullify(); + } + + // Set the affixes + // Always call the setter, even if the prefixes are empty, especially in the case of the + // negative prefix pattern, to prevent default values from overriding the pattern. + properties.positivePrefixPattern = posPrefix; + properties.positiveSuffixPattern = posSuffix; + if (patternInfo.fHasNegativeSubpattern) { + properties.negativePrefixPattern = patternInfo.getString( + AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN | AffixPatternProvider::AFFIX_PREFIX); + properties.negativeSuffixPattern = patternInfo.getString( + AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN); + } else { + properties.negativePrefixPattern.setToBogus(); + properties.negativeSuffixPattern.setToBogus(); + } + + // Set the magnitude multiplier + if (positive.hasPercentSign) { + properties.magnitudeMultiplier = 2; + } else if (positive.hasPerMilleSign) { + properties.magnitudeMultiplier = 3; + } else { + properties.magnitudeMultiplier = 0; + } +} + +/////////////////////////////////////////////////////////////////// +/// End PatternStringParser.java; begin PatternStringUtils.java /// +/////////////////////////////////////////////////////////////////// + +UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatProperties &properties, + UErrorCode &status) { + UnicodeString sb; + + // Convenience references + // The uprv_min() calls prevent DoS + int dosMax = 100; + int groupingSize = uprv_min(properties.secondaryGroupingSize, dosMax); + int firstGroupingSize = uprv_min(properties.groupingSize, dosMax); + int paddingWidth = uprv_min(properties.formatWidth, dosMax); + NullableValue paddingLocation = properties.padPosition; + UnicodeString paddingString = properties.padString; + int minInt = uprv_max(uprv_min(properties.minimumIntegerDigits, dosMax), 0); + int maxInt = uprv_min(properties.maximumIntegerDigits, dosMax); + int minFrac = uprv_max(uprv_min(properties.minimumFractionDigits, dosMax), 0); + int maxFrac = uprv_min(properties.maximumFractionDigits, dosMax); + int minSig = uprv_min(properties.minimumSignificantDigits, dosMax); + int maxSig = uprv_min(properties.maximumSignificantDigits, dosMax); + bool alwaysShowDecimal = properties.decimalSeparatorAlwaysShown; + int exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax); + bool exponentShowPlusSign = properties.exponentSignAlwaysShown; + UnicodeString pp = properties.positivePrefix; + UnicodeString ppp = properties.positivePrefixPattern; + UnicodeString ps = properties.positiveSuffix; + UnicodeString psp = properties.positiveSuffixPattern; + UnicodeString np = properties.negativePrefix; + UnicodeString npp = properties.negativePrefixPattern; + UnicodeString ns = properties.negativeSuffix; + UnicodeString nsp = properties.negativeSuffixPattern; + + // Prefixes + if (!ppp.isBogus()) { + sb.append(ppp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(pp))); + int afterPrefixPos = sb.length(); + + // Figure out the grouping sizes. + int grouping1, grouping2, grouping; + if (groupingSize != uprv_min(dosMax, -1) && firstGroupingSize != uprv_min(dosMax, -1) && + groupingSize != firstGroupingSize) { + grouping = groupingSize; + grouping1 = groupingSize; + grouping2 = firstGroupingSize; + } else if (groupingSize != uprv_min(dosMax, -1)) { + grouping = groupingSize; + grouping1 = 0; + grouping2 = groupingSize; + } else if (firstGroupingSize != uprv_min(dosMax, -1)) { + grouping = groupingSize; + grouping1 = 0; + grouping2 = firstGroupingSize; + } else { + grouping = 0; + grouping1 = 0; + grouping2 = 0; + } + int groupingLength = grouping1 + grouping2 + 1; + + // Figure out the digits we need to put in the pattern. + double roundingInterval = properties.roundingIncrement; + UnicodeString digitsString; + int digitsStringScale = 0; + if (maxSig != uprv_min(dosMax, -1)) { + // Significant Digits. + while (digitsString.length() < minSig) { + digitsString.append(u'@'); + } + while (digitsString.length() < maxSig) { + digitsString.append(u'#'); + } + } else if (roundingInterval != 0.0) { + // Rounding Interval. + digitsStringScale = minFrac; + // TODO: Check for DoS here? + DecimalQuantity incrementQuantity; + incrementQuantity.setToDouble(roundingInterval); + incrementQuantity.adjustMagnitude(minFrac); + incrementQuantity.roundToMagnitude(0, kDefaultMode, status); + UnicodeString str = incrementQuantity.toPlainString(); + if (str.charAt(0) == u'-') { + // TODO: Unsupported operation exception or fail silently? + digitsString.append(str, 1, str.length() - 1); + } else { + digitsString.append(str); + } + } + while (digitsString.length() + digitsStringScale < minInt) { + digitsString.insert(0, u'0'); + } + while (-digitsStringScale < minFrac) { + digitsString.append(u'0'); + digitsStringScale--; + } + + // Write the digits to the string builder + int m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale); + m0 = (maxInt != dosMax) ? uprv_max(maxInt, m0) - 1 : m0 - 1; + int mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale; + for (int magnitude = m0; magnitude >= mN; magnitude--) { + int di = digitsString.length() + digitsStringScale - magnitude - 1; + if (di < 0 || di >= digitsString.length()) { + sb.append(u'#'); + } else { + sb.append(digitsString.charAt(di)); + } + if (magnitude > grouping2 && grouping > 0 && (magnitude - grouping2) % grouping == 0) { + sb.append(u','); + } else if (magnitude > 0 && magnitude == grouping2) { + sb.append(u','); + } else if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) { + sb.append(u'.'); + } + } + + // Exponential notation + if (exponentDigits != uprv_min(dosMax, -1)) { + sb.append(u'E'); + if (exponentShowPlusSign) { + sb.append(u'+'); + } + for (int i = 0; i < exponentDigits; i++) { + sb.append(u'0'); + } + } + + // Suffixes + int beforeSuffixPos = sb.length(); + if (!psp.isBogus()) { + sb.append(psp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(ps))); + + // Resolve Padding + if (paddingWidth != -1 && !paddingLocation.isNull()) { + while (paddingWidth - sb.length() > 0) { + sb.insert(afterPrefixPos, u'#'); + beforeSuffixPos++; + } + int addedLength; + switch (paddingLocation.get(status)) { + case PadPosition::UNUM_PAD_BEFORE_PREFIX: + addedLength = escapePaddingString(paddingString, sb, 0, status); + sb.insert(0, u'*'); + afterPrefixPos += addedLength + 1; + beforeSuffixPos += addedLength + 1; + break; + case PadPosition::UNUM_PAD_AFTER_PREFIX: + addedLength = escapePaddingString(paddingString, sb, afterPrefixPos, status); + sb.insert(afterPrefixPos, u'*'); + afterPrefixPos += addedLength + 1; + beforeSuffixPos += addedLength + 1; + break; + case PadPosition::UNUM_PAD_BEFORE_SUFFIX: + escapePaddingString(paddingString, sb, beforeSuffixPos, status); + sb.insert(beforeSuffixPos, u'*'); + break; + case PadPosition::UNUM_PAD_AFTER_SUFFIX: + sb.append(u'*'); + escapePaddingString(paddingString, sb, sb.length(), status); + break; + } + if (U_FAILURE(status)) { return sb; } + } + + // Negative affixes + // Ignore if the negative prefix pattern is "-" and the negative suffix is empty + if (!np.isBogus() || !ns.isBogus() || (npp.isBogus() && !nsp.isBogus()) || + (!npp.isBogus() && (npp.length() != 1 || npp.charAt(0) != u'-' || nsp.length() != 0))) { + sb.append(u';'); + if (!npp.isBogus()) { + sb.append(npp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(np))); + // Copy the positive digit format into the negative. + // This is optional; the pattern is the same as if '#' were appended here instead. + sb.append(sb, afterPrefixPos, beforeSuffixPos); + if (!nsp.isBogus()) { + sb.append(nsp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(ns))); + } + + return sb; +} + +int PatternStringUtils::escapePaddingString(UnicodeString input, UnicodeString& output, int startIndex, + UErrorCode &status) { + (void)status; + if (input.length() == 0) { + input.setTo(kFallbackPaddingString, -1); + } + int startLength = output.length(); + if (input.length() == 1) { + if (input.compare(u"'", -1) == 0) { + output.insert(startIndex, u"''", -1); + } else { + output.insert(startIndex, input); + } + } else { + output.insert(startIndex, u'\''); + int offset = 1; + for (int i = 0; i < input.length(); i++) { + // it's okay to deal in chars here because the quote mark is the only interesting thing. + char16_t ch = input.charAt(i); + if (ch == u'\'') { + output.insert(startIndex + offset, u"''", -1); + offset += 2; + } else { + output.insert(startIndex + offset, ch); + offset += 1; + } + } + output.insert(startIndex + offset, u'\''); + } + return output.length() - startLength; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternstring.h b/deps/icu-small/source/i18n/number_patternstring.h new file mode 100644 index 00000000000000..6e1bb7f44ddc02 --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternstring.h @@ -0,0 +1,266 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_PATTERNSTRING_H__ +#define __NUMBER_PATTERNSTRING_H__ + + +#include +#include "unicode/unum.h" +#include "unicode/unistr.h" +#include "number_types.h" +#include "number_decimalquantity.h" +#include "number_decimfmtprops.h" +#include "number_affixutils.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +// Forward declaration +class PatternParser; + +// Exported as U_I18N_API because it is a public member field of exported ParsedSubpatternInfo +struct U_I18N_API Endpoints { + int32_t start = 0; + int32_t end = 0; +}; + +// Exported as U_I18N_API because it is a public member field of exported ParsedPatternInfo +struct U_I18N_API ParsedSubpatternInfo { + int64_t groupingSizes = 0x0000ffffffff0000L; + int32_t integerLeadingHashSigns = 0; + int32_t integerTrailingHashSigns = 0; + int32_t integerNumerals = 0; + int32_t integerAtSigns = 0; + int32_t integerTotal = 0; // for convenience + int32_t fractionNumerals = 0; + int32_t fractionHashSigns = 0; + int32_t fractionTotal = 0; // for convenience + bool hasDecimal = false; + int32_t widthExceptAffixes = 0; + NullableValue paddingLocation; + DecimalQuantity rounding; + bool exponentHasPlusSign = false; + int32_t exponentZeros = 0; + bool hasPercentSign = false; + bool hasPerMilleSign = false; + bool hasCurrencySign = false; + bool hasMinusSign = false; + bool hasPlusSign = false; + + Endpoints prefixEndpoints; + Endpoints suffixEndpoints; + Endpoints paddingEndpoints; +}; + +// Exported as U_I18N_API because it is needed for the unit test PatternStringTest +struct U_I18N_API ParsedPatternInfo : public AffixPatternProvider, public UMemory { + UnicodeString pattern; + ParsedSubpatternInfo positive; + ParsedSubpatternInfo negative; + + ParsedPatternInfo() : state(this->pattern), currentSubpattern(nullptr) {} + + ~ParsedPatternInfo() U_OVERRIDE = default; + + static int32_t getLengthFromEndpoints(const Endpoints &endpoints); + + char16_t charAt(int32_t flags, int32_t index) const U_OVERRIDE; + + int32_t length(int32_t flags) const U_OVERRIDE; + + UnicodeString getString(int32_t flags) const; + + bool positiveHasPlusSign() const U_OVERRIDE; + + bool hasNegativeSubpattern() const U_OVERRIDE; + + bool negativeHasMinusSign() const U_OVERRIDE; + + bool hasCurrencySign() const U_OVERRIDE; + + bool containsSymbolType(AffixPatternType type, UErrorCode &status) const U_OVERRIDE; + + private: + struct U_I18N_API ParserState { + const UnicodeString &pattern; // reference to the parent + int32_t offset = 0; + + explicit ParserState(const UnicodeString &_pattern) : pattern(_pattern) {}; + + UChar32 peek(); + + UChar32 next(); + + // TODO: We don't currently do anything with the message string. + // This method is here as a shell for Java compatibility. + inline void toParseException(const char16_t *message) { (void)message; } + } + state; + + // NOTE: In Java, these are written as pure functions. + // In C++, they're written as methods. + // The behavior is the same. + + // Mutable transient pointer: + ParsedSubpatternInfo *currentSubpattern; + + // In Java, "negative == null" tells us whether or not we had a negative subpattern. + // In C++, we need to remember in another boolean. + bool fHasNegativeSubpattern = false; + + const Endpoints &getEndpoints(int32_t flags) const; + + /** Run the recursive descent parser. */ + void consumePattern(const UnicodeString &patternString, UErrorCode &status); + + void consumeSubpattern(UErrorCode &status); + + void consumePadding(PadPosition paddingLocation, UErrorCode &status); + + void consumeAffix(Endpoints &endpoints, UErrorCode &status); + + void consumeLiteral(UErrorCode &status); + + void consumeFormat(UErrorCode &status); + + void consumeIntegerFormat(UErrorCode &status); + + void consumeFractionFormat(UErrorCode &status); + + void consumeExponent(UErrorCode &status); + + friend class PatternParser; +}; + +class U_I18N_API PatternParser { + public: + /** + * Runs the recursive descent parser on the given pattern string, returning a data structure with raw information + * about the pattern string. + * + *

+ * To obtain a more useful form of the data, consider using {@link #parseToProperties} instead. + * + * TODO: Change argument type to const char16_t* instead of UnicodeString? + * + * @param patternString + * The LDML decimal format pattern (Excel-style pattern) to parse. + * @return The results of the parse. + */ + static void + parseToPatternInfo(const UnicodeString& patternString, ParsedPatternInfo &patternInfo, UErrorCode &status); + + enum IgnoreRounding { + IGNORE_ROUNDING_NEVER = 0, IGNORE_ROUNDING_IF_CURRENCY = 1, IGNORE_ROUNDING_ALWAYS = 2 + }; + + /** + * Parses a pattern string into a new property bag. + * + * @param pattern + * The pattern string, like "#,##0.00" + * @param ignoreRounding + * Whether to leave out rounding information (minFrac, maxFrac, and rounding increment) when parsing the + * pattern. This may be desirable if a custom rounding mode, such as CurrencyUsage, is to be used + * instead. + * @return A property bag object. + * @throws IllegalArgumentException + * If there is a syntax error in the pattern string. + */ + static DecimalFormatProperties + parseToProperties(const UnicodeString& pattern, IgnoreRounding ignoreRounding, UErrorCode &status); + + /** + * Parses a pattern string into an existing property bag. All properties that can be encoded into a pattern string + * will be overwritten with either their default value or with the value coming from the pattern string. Properties + * that cannot be encoded into a pattern string, such as rounding mode, are not modified. + * + * @param pattern + * The pattern string, like "#,##0.00" + * @param properties + * The property bag object to overwrite. + * @param ignoreRounding + * See {@link #parseToProperties(String pattern, int ignoreRounding)}. + * @throws IllegalArgumentException + * If there was a syntax error in the pattern string. + */ + static void parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties& properties, + IgnoreRounding ignoreRounding, UErrorCode &status); + + private: + static void + parseToExistingPropertiesImpl(const UnicodeString& pattern, DecimalFormatProperties &properties, + IgnoreRounding ignoreRounding, UErrorCode &status); + + /** Finalizes the temporary data stored in the ParsedPatternInfo to the Properties. */ + static void + patternInfoToProperties(DecimalFormatProperties &properties, ParsedPatternInfo& patternInfo, + IgnoreRounding _ignoreRounding, UErrorCode &status); +}; + +class U_I18N_API PatternStringUtils { + public: + /** + * Creates a pattern string from a property bag. + * + *

+ * Since pattern strings support only a subset of the functionality available in a property bag, a new property bag + * created from the string returned by this function may not be the same as the original property bag. + * + * @param properties + * The property bag to serialize. + * @return A pattern string approximately serializing the property bag. + */ + static UnicodeString + propertiesToPatternString(const DecimalFormatProperties &properties, UErrorCode &status); + + + /** + * Converts a pattern between standard notation and localized notation. Localized notation means that instead of + * using generic placeholders in the pattern, you use the corresponding locale-specific characters instead. For + * example, in locale fr-FR, the period in the pattern "0.000" means "decimal" in standard notation (as it + * does in every other locale), but it means "grouping" in localized notation. + * + *

+ * A greedy string-substitution strategy is used to substitute locale symbols. If two symbols are ambiguous or have + * the same prefix, the result is not well-defined. + * + *

+ * Locale symbols are not allowed to contain the ASCII quote character. + * + *

+ * This method is provided for backwards compatibility and should not be used in any new code. + * + * TODO(C++): This method is not yet implemented. + * + * @param input + * The pattern to convert. + * @param symbols + * The symbols corresponding to the localized pattern. + * @param toLocalized + * true to convert from standard to localized notation; false to convert from localized to standard + * notation. + * @return The pattern expressed in the other notation. + */ + static UnicodeString + convertLocalized(UnicodeString input, DecimalFormatSymbols symbols, bool toLocalized, + UErrorCode &status); + + private: + /** @return The number of chars inserted. */ + static int + escapePaddingString(UnicodeString input, UnicodeString &output, int startIndex, UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_PATTERNSTRING_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_rounding.cpp b/deps/icu-small/source/i18n/number_rounding.cpp new file mode 100644 index 00000000000000..5c494f09544425 --- /dev/null +++ b/deps/icu-small/source/i18n/number_rounding.cpp @@ -0,0 +1,347 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_decimalquantity.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +int32_t getRoundingMagnitudeFraction(int maxFrac) { + if (maxFrac == -1) { + return INT32_MIN; + } + return -maxFrac; +} + +int32_t getRoundingMagnitudeSignificant(const DecimalQuantity &value, int maxSig) { + if (maxSig == -1) { + return INT32_MIN; + } + int magnitude = value.isZero() ? 0 : value.getMagnitude(); + return magnitude - maxSig + 1; +} + +int32_t getDisplayMagnitudeFraction(int minFrac) { + if (minFrac == 0) { + return INT32_MAX; + } + return -minFrac; +} + +int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) { + int magnitude = value.isZero() ? 0 : value.getMagnitude(); + return magnitude - minSig + 1; +} + +} + + +Rounder Rounder::unlimited() { + return Rounder(RND_NONE, {}, kDefaultMode); +} + +FractionRounder Rounder::integer() { + return constructFraction(0, 0); +} + +FractionRounder Rounder::fixedFraction(int32_t minMaxFractionPlaces) { + if (minMaxFractionPlaces >= 0 && minMaxFractionPlaces <= kMaxIntFracSig) { + return constructFraction(minMaxFractionPlaces, minMaxFractionPlaces); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::minFraction(int32_t minFractionPlaces) { + if (minFractionPlaces >= 0 && minFractionPlaces <= kMaxIntFracSig) { + return constructFraction(minFractionPlaces, -1); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::maxFraction(int32_t maxFractionPlaces) { + if (maxFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig) { + return constructFraction(0, maxFractionPlaces); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces) { + if (minFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig && + minFractionPlaces <= maxFractionPlaces) { + return constructFraction(minFractionPlaces, maxFractionPlaces); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::fixedDigits(int32_t minMaxSignificantDigits) { + if (minMaxSignificantDigits >= 0 && minMaxSignificantDigits <= kMaxIntFracSig) { + return constructSignificant(minMaxSignificantDigits, minMaxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::minDigits(int32_t minSignificantDigits) { + if (minSignificantDigits >= 0 && minSignificantDigits <= kMaxIntFracSig) { + return constructSignificant(minSignificantDigits, -1); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::maxDigits(int32_t maxSignificantDigits) { + if (maxSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig) { + return constructSignificant(0, maxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::minMaxDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits) { + if (minSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig && + minSignificantDigits <= maxSignificantDigits) { + return constructSignificant(minSignificantDigits, maxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +IncrementRounder Rounder::increment(double roundingIncrement) { + if (roundingIncrement > 0.0) { + return constructIncrement(roundingIncrement, 0); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +CurrencyRounder Rounder::currency(UCurrencyUsage currencyUsage) { + return constructCurrency(currencyUsage); +} + +Rounder Rounder::withMode(RoundingMode roundingMode) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + return {fType, fUnion, roundingMode}; +} + +Rounder FractionRounder::withMinDigits(int32_t minSignificantDigits) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + if (minSignificantDigits >= 0 && minSignificantDigits <= kMaxIntFracSig) { + return constructFractionSignificant(*this, minSignificantDigits, -1); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder FractionRounder::withMaxDigits(int32_t maxSignificantDigits) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + if (maxSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig) { + return constructFractionSignificant(*this, -1, maxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +// Private method on base class +Rounder Rounder::withCurrency(const CurrencyUnit ¤cy, UErrorCode &status) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + U_ASSERT(fType == RND_CURRENCY); + const char16_t *isoCode = currency.getISOCurrency(); + double increment = ucurr_getRoundingIncrementForUsage(isoCode, fUnion.currencyUsage, &status); + int32_t minMaxFrac = ucurr_getDefaultFractionDigitsForUsage( + isoCode, fUnion.currencyUsage, &status); + if (increment != 0.0) { + return constructIncrement(increment, minMaxFrac); + } else { + return constructFraction(minMaxFrac, minMaxFrac); + } +} + +// Public method on CurrencyRounder subclass +Rounder CurrencyRounder::withCurrency(const CurrencyUnit ¤cy) const { + UErrorCode localStatus = U_ZERO_ERROR; + Rounder result = Rounder::withCurrency(currency, localStatus); + if (U_FAILURE(localStatus)) { + return {localStatus}; + } + return result; +} + +Rounder IncrementRounder::withMinFraction(int32_t minFrac) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + if (minFrac >= 0 && minFrac <= kMaxIntFracSig) { + return constructIncrement(fUnion.increment.fIncrement, minFrac); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::constructFraction(int32_t minFrac, int32_t maxFrac) { + FractionSignificantSettings settings; + settings.fMinFrac = static_cast (minFrac); + settings.fMaxFrac = static_cast (maxFrac); + settings.fMinSig = -1; + settings.fMaxSig = -1; + RounderUnion union_; + union_.fracSig = settings; + return {RND_FRACTION, union_, kDefaultMode}; +} + +Rounder Rounder::constructSignificant(int32_t minSig, int32_t maxSig) { + FractionSignificantSettings settings; + settings.fMinFrac = -1; + settings.fMaxFrac = -1; + settings.fMinSig = static_cast(minSig); + settings.fMaxSig = static_cast(maxSig); + RounderUnion union_; + union_.fracSig = settings; + return {RND_SIGNIFICANT, union_, kDefaultMode}; +} + +Rounder +Rounder::constructFractionSignificant(const FractionRounder &base, int32_t minSig, int32_t maxSig) { + FractionSignificantSettings settings = base.fUnion.fracSig; + settings.fMinSig = static_cast(minSig); + settings.fMaxSig = static_cast(maxSig); + RounderUnion union_; + union_.fracSig = settings; + return {RND_FRACTION_SIGNIFICANT, union_, kDefaultMode}; +} + +IncrementRounder Rounder::constructIncrement(double increment, int32_t minFrac) { + IncrementSettings settings; + settings.fIncrement = increment; + settings.fMinFrac = minFrac; + RounderUnion union_; + union_.increment = settings; + return {RND_INCREMENT, union_, kDefaultMode}; +} + +CurrencyRounder Rounder::constructCurrency(UCurrencyUsage usage) { + RounderUnion union_; + union_.currencyUsage = usage; + return {RND_CURRENCY, union_, kDefaultMode}; +} + +Rounder Rounder::constructPassThrough() { + RounderUnion union_; + union_.errorCode = U_ZERO_ERROR; // initialize the variable + return {RND_PASS_THROUGH, union_, kDefaultMode}; +} + +void Rounder::setLocaleData(const CurrencyUnit ¤cy, UErrorCode &status) { + if (fType == RND_CURRENCY) { + *this = withCurrency(currency, status); + } +} + +int32_t +Rounder::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer, + UErrorCode &status) { + // TODO: Make a better and more efficient implementation. + // TODO: Avoid the object creation here. + DecimalQuantity copy(input); + + U_ASSERT(!input.isZero()); + int32_t magnitude = input.getMagnitude(); + int32_t multiplier = producer.getMultiplier(magnitude); + input.adjustMagnitude(multiplier); + apply(input, status); + + // If the number turned to zero when rounding, do not re-attempt the rounding. + if (!input.isZero() && input.getMagnitude() == magnitude + multiplier + 1) { + magnitude += 1; + input = copy; + multiplier = producer.getMultiplier(magnitude); + input.adjustMagnitude(multiplier); + U_ASSERT(input.getMagnitude() == magnitude + multiplier - 1); + apply(input, status); + U_ASSERT(input.getMagnitude() == magnitude + multiplier); + } + + return multiplier; +} + +/** This is the method that contains the actual rounding logic. */ +void Rounder::apply(impl::DecimalQuantity &value, UErrorCode& status) const { + switch (fType) { + case RND_BOGUS: + case RND_ERROR: + // Errors should be caught before the apply() method is called + status = U_INTERNAL_PROGRAM_ERROR; + break; + + case RND_NONE: + value.roundToInfinity(); + break; + + case RND_FRACTION: + value.roundToMagnitude( + getRoundingMagnitudeFraction(fUnion.fracSig.fMaxFrac), fRoundingMode, status); + value.setFractionLength( + uprv_max(0, -getDisplayMagnitudeFraction(fUnion.fracSig.fMinFrac)), INT32_MAX); + break; + + case RND_SIGNIFICANT: + value.roundToMagnitude( + getRoundingMagnitudeSignificant(value, fUnion.fracSig.fMaxSig), + fRoundingMode, + status); + value.setFractionLength( + uprv_max(0, -getDisplayMagnitudeSignificant(value, fUnion.fracSig.fMinSig)), + INT32_MAX); + break; + + case RND_FRACTION_SIGNIFICANT: { + int32_t displayMag = getDisplayMagnitudeFraction(fUnion.fracSig.fMinFrac); + int32_t roundingMag = getRoundingMagnitudeFraction(fUnion.fracSig.fMaxFrac); + if (fUnion.fracSig.fMinSig == -1) { + // Max Sig override + int32_t candidate = getRoundingMagnitudeSignificant(value, fUnion.fracSig.fMaxSig); + roundingMag = uprv_max(roundingMag, candidate); + } else { + // Min Sig override + int32_t candidate = getDisplayMagnitudeSignificant(value, fUnion.fracSig.fMinSig); + roundingMag = uprv_min(roundingMag, candidate); + } + value.roundToMagnitude(roundingMag, fRoundingMode, status); + value.setFractionLength(uprv_max(0, -displayMag), INT32_MAX); + break; + } + + case RND_INCREMENT: + value.roundToIncrement( + fUnion.increment.fIncrement, fRoundingMode, fUnion.increment.fMinFrac, status); + value.setFractionLength(fUnion.increment.fMinFrac, fUnion.increment.fMinFrac); + break; + + case RND_CURRENCY: + // Call .withCurrency() before .apply()! + U_ASSERT(false); + + case RND_PASS_THROUGH: + break; + } +} + +void Rounder::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode /*status*/) { + // This method is intended for the one specific purpose of helping print "00.000E0". + U_ASSERT(fType == RND_SIGNIFICANT); + U_ASSERT(value.isZero()); + value.setFractionLength(fUnion.fracSig.fMinSig - minInt, INT32_MAX); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_roundingutils.h b/deps/icu-small/source/i18n/number_roundingutils.h new file mode 100644 index 00000000000000..6868ee0b86817e --- /dev/null +++ b/deps/icu-small/source/i18n/number_roundingutils.h @@ -0,0 +1,141 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_ROUNDINGUTILS_H__ +#define __NUMBER_ROUNDINGUTILS_H__ + +#include "number_types.h" + +U_NAMESPACE_BEGIN +namespace number { +namespace impl { +namespace roundingutils { + +enum Section { + SECTION_LOWER_EDGE = -1, + SECTION_UPPER_EDGE = -2, + SECTION_LOWER = 1, + SECTION_MIDPOINT = 2, + SECTION_UPPER = 3 +}; + +/** + * Converts a rounding mode and metadata about the quantity being rounded to a boolean determining + * whether the value should be rounded toward infinity or toward zero. + * + *

The parameters are of type int because benchmarks on an x86-64 processor against OpenJDK + * showed that ints were demonstrably faster than enums in switch statements. + * + * @param isEven Whether the digit immediately before the rounding magnitude is even. + * @param isNegative Whether the quantity is negative. + * @param section Whether the part of the quantity to the right of the rounding magnitude is + * exactly halfway between two digits, whether it is in the lower part (closer to zero), or + * whether it is in the upper part (closer to infinity). See {@link #SECTION_LOWER}, {@link + * #SECTION_MIDPOINT}, and {@link #SECTION_UPPER}. + * @param roundingMode The integer version of the {@link RoundingMode}, which you can get via + * {@link RoundingMode#ordinal}. + * @param status Error code, set to U_FORMAT_INEXACT_ERROR if the rounding mode is kRoundUnnecessary. + * @return true if the number should be rounded toward zero; false if it should be rounded toward + * infinity. + */ +inline bool +getRoundingDirection(bool isEven, bool isNegative, Section section, RoundingMode roundingMode, + UErrorCode &status) { + switch (roundingMode) { + case RoundingMode::UNUM_ROUND_UP: + // round away from zero + return false; + + case RoundingMode::UNUM_ROUND_DOWN: + // round toward zero + return true; + + case RoundingMode::UNUM_ROUND_CEILING: + // round toward positive infinity + return isNegative; + + case RoundingMode::UNUM_ROUND_FLOOR: + // round toward negative infinity + return !isNegative; + + case RoundingMode::UNUM_ROUND_HALFUP: + switch (section) { + case SECTION_MIDPOINT: + return false; + case SECTION_LOWER: + return true; + case SECTION_UPPER: + return false; + default: + break; + } + break; + + case RoundingMode::UNUM_ROUND_HALFDOWN: + switch (section) { + case SECTION_MIDPOINT: + return true; + case SECTION_LOWER: + return true; + case SECTION_UPPER: + return false; + default: + break; + } + break; + + case RoundingMode::UNUM_ROUND_HALFEVEN: + switch (section) { + case SECTION_MIDPOINT: + return isEven; + case SECTION_LOWER: + return true; + case SECTION_UPPER: + return false; + default: + break; + } + break; + + default: + break; + } + + status = U_FORMAT_INEXACT_ERROR; + return false; +} + +/** + * Gets whether the given rounding mode's rounding boundary is at the midpoint. The rounding + * boundary is the point at which a number switches from being rounded down to being rounded up. + * For example, with rounding mode HALF_EVEN, HALF_UP, or HALF_DOWN, the rounding boundary is at + * the midpoint, and this function would return true. However, for UP, DOWN, CEILING, and FLOOR, + * the rounding boundary is at the "edge", and this function would return false. + * + * @param roundingMode The integer version of the {@link RoundingMode}. + * @return true if rounding mode is HALF_EVEN, HALF_UP, or HALF_DOWN; false otherwise. + */ +inline bool roundsAtMidpoint(int roundingMode) { + switch (roundingMode) { + case RoundingMode::UNUM_ROUND_UP: + case RoundingMode::UNUM_ROUND_DOWN: + case RoundingMode::UNUM_ROUND_CEILING: + case RoundingMode::UNUM_ROUND_FLOOR: + return false; + + default: + return true; + } +} + +} // namespace roundingutils +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_ROUNDINGUTILS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_scientific.cpp b/deps/icu-small/source/i18n/number_scientific.cpp new file mode 100644 index 00000000000000..a2f2bf85a1fc9d --- /dev/null +++ b/deps/icu-small/source/i18n/number_scientific.cpp @@ -0,0 +1,138 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include +#include "number_scientific.h" +#include "number_utils.h" +#include "number_stringbuilder.h" +#include "unicode/unum.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +// NOTE: The object lifecycle of ScientificModifier and ScientificHandler differ greatly in Java and C++. +// +// During formatting, we need to provide an object with state (the exponent) as the inner modifier. +// +// In Java, where the priority is put on reducing object creations, the unsafe code path re-uses the +// ScientificHandler as a ScientificModifier, and the safe code path pre-computes 25 ScientificModifier +// instances. This scheme reduces the number of object creations by 1 in both safe and unsafe. +// +// In C++, MicroProps provides a pre-allocated ScientificModifier, and ScientificHandler simply populates +// the state (the exponent) into that ScientificModifier. There is no difference between safe and unsafe. + +ScientificModifier::ScientificModifier() : fExponent(0), fHandler(nullptr) {} + +void ScientificModifier::set(int32_t exponent, const ScientificHandler *handler) { + // ScientificModifier should be set only once. + U_ASSERT(fHandler == nullptr); + fExponent = exponent; + fHandler = handler; +} + +int32_t ScientificModifier::apply(NumberStringBuilder &output, int32_t /*leftIndex*/, int32_t rightIndex, + UErrorCode &status) const { + // FIXME: Localized exponent separator location. + int i = rightIndex; + // Append the exponent separator and sign + i += output.insert( + i, + fHandler->fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kExponentialSymbol), + UNUM_EXPONENT_SYMBOL_FIELD, + status); + if (fExponent < 0 && fHandler->fSettings.fExponentSignDisplay != UNUM_SIGN_NEVER) { + i += output.insert( + i, + fHandler->fSymbols + ->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol), + UNUM_EXPONENT_SIGN_FIELD, + status); + } else if (fExponent >= 0 && fHandler->fSettings.fExponentSignDisplay == UNUM_SIGN_ALWAYS) { + i += output.insert( + i, + fHandler->fSymbols + ->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol), + UNUM_EXPONENT_SIGN_FIELD, + status); + } + // Append the exponent digits (using a simple inline algorithm) + int32_t disp = std::abs(fExponent); + for (int j = 0; j < fHandler->fSettings.fMinExponentDigits || disp > 0; j++, disp /= 10) { + auto d = static_cast(disp % 10); + const UnicodeString &digitString = getDigitFromSymbols(d, *fHandler->fSymbols); + i += output.insert(i - j, digitString, UNUM_EXPONENT_FIELD, status); + } + return i - rightIndex; +} + +int32_t ScientificModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + // TODO: Localized exponent separator location. + return 0; +} + +int32_t ScientificModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + // This method is not used for strong modifiers. + U_ASSERT(false); + return 0; +} + +bool ScientificModifier::isStrong() const { + // Scientific is always strong + return true; +} + +// Note: Visual Studio does not compile this function without full name space. Why? +icu::number::impl::ScientificHandler::ScientificHandler(const Notation *notation, const DecimalFormatSymbols *symbols, + const MicroPropsGenerator *parent) : + fSettings(notation->fUnion.scientific), fSymbols(symbols), fParent(parent) {} + +void ScientificHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + fParent->processQuantity(quantity, micros, status); + if (U_FAILURE(status)) { return; } + + // Treat zero as if it had magnitude 0 + int32_t exponent; + if (quantity.isZero()) { + if (fSettings.fRequireMinInt && micros.rounding.fType == Rounder::RND_SIGNIFICANT) { + // Show "00.000E0" on pattern "00.000E0" + micros.rounding.apply(quantity, fSettings.fEngineeringInterval, status); + exponent = 0; + } else { + micros.rounding.apply(quantity, status); + exponent = 0; + } + } else { + exponent = -micros.rounding.chooseMultiplierAndApply(quantity, *this, status); + } + + // Use MicroProps's helper ScientificModifier and save it as the modInner. + ScientificModifier &mod = micros.helpers.scientificModifier; + mod.set(exponent, this); + micros.modInner = &mod; +} + +int32_t ScientificHandler::getMultiplier(int32_t magnitude) const { + int32_t interval = fSettings.fEngineeringInterval; + int32_t digitsShown; + if (fSettings.fRequireMinInt) { + // For patterns like "000.00E0" and ".00E0" + digitsShown = interval; + } else if (interval <= 1) { + // For patterns like "0.00E0" and "@@@E0" + digitsShown = 1; + } else { + // For patterns like "##0.00" + digitsShown = ((magnitude % interval + interval) % interval) + 1; + } + return digitsShown - magnitude - 1; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_scientific.h b/deps/icu-small/source/i18n/number_scientific.h new file mode 100644 index 00000000000000..f5e4d30e6a9737 --- /dev/null +++ b/deps/icu-small/source/i18n/number_scientific.h @@ -0,0 +1,62 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_SCIENTIFIC_H__ +#define __NUMBER_SCIENTIFIC_H__ + +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +// Forward-declare +class ScientificHandler; + +class U_I18N_API ScientificModifier : public UMemory, public Modifier { + public: + ScientificModifier(); + + void set(int32_t exponent, const ScientificHandler *handler); + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + private: + int32_t fExponent; + const ScientificHandler *fHandler; +}; + +class ScientificHandler : public UMemory, public MicroPropsGenerator, public MultiplierProducer { + public: + ScientificHandler(const Notation *notation, const DecimalFormatSymbols *symbols, + const MicroPropsGenerator *parent); + + void + processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE; + + private: + const Notation::ScientificSettings& fSettings; + const DecimalFormatSymbols *fSymbols; + const MicroPropsGenerator *fParent; + + friend class ScientificModifier; +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_SCIENTIFIC_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_stringbuilder.cpp b/deps/icu-small/source/i18n/number_stringbuilder.cpp new file mode 100644 index 00000000000000..e6e86bd4291d6e --- /dev/null +++ b/deps/icu-small/source/i18n/number_stringbuilder.cpp @@ -0,0 +1,460 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "number_stringbuilder.h" +#include "unicode/utf16.h" +#include "uvectr32.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// A version of uprv_memcpy that checks for length 0. +// By default, uprv_memcpy requires a length of at least 1. +inline void uprv_memcpy2(void* dest, const void* src, size_t len) { + if (len > 0) { + uprv_memcpy(dest, src, len); + } +} + +// A version of uprv_memmove that checks for length 0. +// By default, uprv_memmove requires a length of at least 1. +inline void uprv_memmove2(void* dest, const void* src, size_t len) { + if (len > 0) { + uprv_memmove(dest, src, len); + } +} + +} // namespace + +NumberStringBuilder::NumberStringBuilder() = default; + +NumberStringBuilder::~NumberStringBuilder() { + if (fUsingHeap) { + uprv_free(fChars.heap.ptr); + uprv_free(fFields.heap.ptr); + } +} + +NumberStringBuilder::NumberStringBuilder(const NumberStringBuilder &other) { + *this = other; +} + +NumberStringBuilder &NumberStringBuilder::operator=(const NumberStringBuilder &other) { + // Check for self-assignment + if (this == &other) { + return *this; + } + + // Continue with deallocation and copying + if (fUsingHeap) { + uprv_free(fChars.heap.ptr); + uprv_free(fFields.heap.ptr); + fUsingHeap = false; + } + + int32_t capacity = other.getCapacity(); + if (capacity > DEFAULT_CAPACITY) { + // FIXME: uprv_malloc + // C++ note: malloc appears in two places: here and in prepareForInsertHelper. + auto newChars = static_cast (uprv_malloc(sizeof(char16_t) * capacity)); + auto newFields = static_cast(uprv_malloc(sizeof(Field) * capacity)); + if (newChars == nullptr || newFields == nullptr) { + // UErrorCode is not available; fail silently. + uprv_free(newChars); + uprv_free(newFields); + *this = NumberStringBuilder(); // can't fail + return *this; + } + + fUsingHeap = true; + fChars.heap.capacity = capacity; + fChars.heap.ptr = newChars; + fFields.heap.capacity = capacity; + fFields.heap.ptr = newFields; + } + + uprv_memcpy2(getCharPtr(), other.getCharPtr(), sizeof(char16_t) * capacity); + uprv_memcpy2(getFieldPtr(), other.getFieldPtr(), sizeof(Field) * capacity); + + fZero = other.fZero; + fLength = other.fLength; + return *this; +} + +int32_t NumberStringBuilder::length() const { + return fLength; +} + +int32_t NumberStringBuilder::codePointCount() const { + return u_countChar32(getCharPtr() + fZero, fLength); +} + +UChar32 NumberStringBuilder::getFirstCodePoint() const { + if (fLength == 0) { + return -1; + } + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, 0, fLength, cp); + return cp; +} + +UChar32 NumberStringBuilder::getLastCodePoint() const { + if (fLength == 0) { + return -1; + } + int32_t offset = fLength; + U16_BACK_1(getCharPtr() + fZero, 0, offset); + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, offset, fLength, cp); + return cp; +} + +UChar32 NumberStringBuilder::codePointAt(int32_t index) const { + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, index, fLength, cp); + return cp; +} + +UChar32 NumberStringBuilder::codePointBefore(int32_t index) const { + int32_t offset = index; + U16_BACK_1(getCharPtr() + fZero, 0, offset); + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, offset, fLength, cp); + return cp; +} + +NumberStringBuilder &NumberStringBuilder::clear() { + // TODO: Reset the heap here? + fZero = getCapacity() / 2; + fLength = 0; + return *this; +} + +int32_t NumberStringBuilder::appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status) { + return insertCodePoint(fLength, codePoint, field, status); +} + +int32_t +NumberStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status) { + int32_t count = U16_LENGTH(codePoint); + int32_t position = prepareForInsert(index, count, status); + if (U_FAILURE(status)) { + return count; + } + if (count == 1) { + getCharPtr()[position] = (char16_t) codePoint; + getFieldPtr()[position] = field; + } else { + getCharPtr()[position] = U16_LEAD(codePoint); + getCharPtr()[position + 1] = U16_TRAIL(codePoint); + getFieldPtr()[position] = getFieldPtr()[position + 1] = field; + } + return count; +} + +int32_t NumberStringBuilder::append(const UnicodeString &unistr, Field field, UErrorCode &status) { + return insert(fLength, unistr, field, status); +} + +int32_t NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, Field field, + UErrorCode &status) { + if (unistr.length() == 0) { + // Nothing to insert. + return 0; + } else if (unistr.length() == 1) { + // Fast path: insert using insertCodePoint. + return insertCodePoint(index, unistr.charAt(0), field, status); + } else { + return insert(index, unistr, 0, unistr.length(), field, status); + } +} + +int32_t +NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, + Field field, UErrorCode &status) { + int32_t count = end - start; + int32_t position = prepareForInsert(index, count, status); + if (U_FAILURE(status)) { + return count; + } + for (int32_t i = 0; i < count; i++) { + getCharPtr()[position + i] = unistr.charAt(start + i); + getFieldPtr()[position + i] = field; + } + return count; +} + +int32_t NumberStringBuilder::append(const NumberStringBuilder &other, UErrorCode &status) { + return insert(fLength, other, status); +} + +int32_t +NumberStringBuilder::insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status) { + if (this == &other) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t count = other.fLength; + if (count == 0) { + // Nothing to insert. + return 0; + } + int32_t position = prepareForInsert(index, count, status); + if (U_FAILURE(status)) { + return count; + } + for (int32_t i = 0; i < count; i++) { + getCharPtr()[position + i] = other.charAt(i); + getFieldPtr()[position + i] = other.fieldAt(i); + } + return count; +} + +int32_t NumberStringBuilder::prepareForInsert(int32_t index, int32_t count, UErrorCode &status) { + if (index == 0 && fZero - count >= 0) { + // Append to start + fZero -= count; + fLength += count; + return fZero; + } else if (index == fLength && fZero + fLength + count < getCapacity()) { + // Append to end + fLength += count; + return fZero + fLength - count; + } else { + // Move chars around and/or allocate more space + return prepareForInsertHelper(index, count, status); + } +} + +int32_t NumberStringBuilder::prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status) { + int32_t oldCapacity = getCapacity(); + int32_t oldZero = fZero; + char16_t *oldChars = getCharPtr(); + Field *oldFields = getFieldPtr(); + if (fLength + count > oldCapacity) { + int32_t newCapacity = (fLength + count) * 2; + int32_t newZero = newCapacity / 2 - (fLength + count) / 2; + + // C++ note: malloc appears in two places: here and in the assignment operator. + auto newChars = static_cast (uprv_malloc(sizeof(char16_t) * newCapacity)); + auto newFields = static_cast(uprv_malloc(sizeof(Field) * newCapacity)); + if (newChars == nullptr || newFields == nullptr) { + uprv_free(newChars); + uprv_free(newFields); + status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } + + // First copy the prefix and then the suffix, leaving room for the new chars that the + // caller wants to insert. + // C++ note: memcpy is OK because the src and dest do not overlap. + uprv_memcpy2(newChars + newZero, oldChars + oldZero, sizeof(char16_t) * index); + uprv_memcpy2(newChars + newZero + index + count, + oldChars + oldZero + index, + sizeof(char16_t) * (fLength - index)); + uprv_memcpy2(newFields + newZero, oldFields + oldZero, sizeof(Field) * index); + uprv_memcpy2(newFields + newZero + index + count, + oldFields + oldZero + index, + sizeof(Field) * (fLength - index)); + + if (fUsingHeap) { + uprv_free(oldChars); + uprv_free(oldFields); + } + fUsingHeap = true; + fChars.heap.ptr = newChars; + fChars.heap.capacity = newCapacity; + fFields.heap.ptr = newFields; + fFields.heap.capacity = newCapacity; + fZero = newZero; + fLength += count; + } else { + int32_t newZero = oldCapacity / 2 - (fLength + count) / 2; + + // C++ note: memmove is required because src and dest may overlap. + // First copy the entire string to the location of the prefix, and then move the suffix + // to make room for the new chars that the caller wants to insert. + uprv_memmove2(oldChars + newZero, oldChars + oldZero, sizeof(char16_t) * fLength); + uprv_memmove2(oldChars + newZero + index + count, + oldChars + newZero + index, + sizeof(char16_t) * (fLength - index)); + uprv_memmove2(oldFields + newZero, oldFields + oldZero, sizeof(Field) * fLength); + uprv_memmove2(oldFields + newZero + index + count, + oldFields + newZero + index, + sizeof(Field) * (fLength - index)); + + fZero = newZero; + fLength += count; + } + return fZero + index; +} + +UnicodeString NumberStringBuilder::toUnicodeString() const { + return UnicodeString(getCharPtr() + fZero, fLength); +} + +UnicodeString NumberStringBuilder::toDebugString() const { + UnicodeString sb; + sb.append(u"", -1); + return sb; +} + +const char16_t *NumberStringBuilder::chars() const { + return getCharPtr() + fZero; +} + +bool NumberStringBuilder::contentEquals(const NumberStringBuilder &other) const { + if (fLength != other.fLength) { + return false; + } + for (int32_t i = 0; i < fLength; i++) { + if (charAt(i) != other.charAt(i) || fieldAt(i) != other.fieldAt(i)) { + return false; + } + } + return true; +} + +void NumberStringBuilder::populateFieldPosition(FieldPosition &fp, int32_t offset, UErrorCode &status) const { + int32_t rawField = fp.getField(); + + if (rawField == FieldPosition::DONT_CARE) { + return; + } + + if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + auto field = static_cast(rawField); + + bool seenStart = false; + int32_t fractionStart = -1; + for (int i = fZero; i <= fZero + fLength; i++) { + Field _field = UNUM_FIELD_COUNT; + if (i < fZero + fLength) { + _field = getFieldPtr()[i]; + } + if (seenStart && field != _field) { + // Special case: GROUPING_SEPARATOR counts as an INTEGER. + if (field == UNUM_INTEGER_FIELD && _field == UNUM_GROUPING_SEPARATOR_FIELD) { + continue; + } + fp.setEndIndex(i - fZero + offset); + break; + } else if (!seenStart && field == _field) { + fp.setBeginIndex(i - fZero + offset); + seenStart = true; + } + if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) { + fractionStart = i - fZero + 1; + } + } + + // Backwards compatibility: FRACTION needs to start after INTEGER if empty + if (field == UNUM_FRACTION_FIELD && !seenStart) { + fp.setBeginIndex(fractionStart + offset); + fp.setEndIndex(fractionStart + offset); + } +} + +void NumberStringBuilder::populateFieldPositionIterator(FieldPositionIterator &fpi, UErrorCode &status) const { + // TODO: Set an initial capacity on uvec? + LocalPointer uvec(new UVector32(status)); + if (U_FAILURE(status)) { + return; + } + + Field current = UNUM_FIELD_COUNT; + int32_t currentStart = -1; + for (int32_t i = 0; i < fLength; i++) { + Field field = fieldAt(i); + if (current == UNUM_INTEGER_FIELD && field == UNUM_GROUPING_SEPARATOR_FIELD) { + // Special case: GROUPING_SEPARATOR counts as an INTEGER. + // Add the field, followed by the start index, followed by the end index to uvec. + uvec->addElement(UNUM_GROUPING_SEPARATOR_FIELD, status); + uvec->addElement(i, status); + uvec->addElement(i + 1, status); + } else if (current != field) { + if (current != UNUM_FIELD_COUNT) { + // Add the field, followed by the start index, followed by the end index to uvec. + uvec->addElement(current, status); + uvec->addElement(currentStart, status); + uvec->addElement(i, status); + } + current = field; + currentStart = i; + } + if (U_FAILURE(status)) { + return; + } + } + if (current != UNUM_FIELD_COUNT) { + // Add the field, followed by the start index, followed by the end index to uvec. + uvec->addElement(current, status); + uvec->addElement(currentStart, status); + uvec->addElement(fLength, status); + } + + // Give uvec to the FieldPositionIterator, which adopts it. + fpi.setData(uvec.orphan(), status); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_stringbuilder.h b/deps/icu-small/source/i18n/number_stringbuilder.h new file mode 100644 index 00000000000000..f08dcb1d1bed6a --- /dev/null +++ b/deps/icu-small/source/i18n/number_stringbuilder.h @@ -0,0 +1,135 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_STRINGBUILDER_H__ +#define __NUMBER_STRINGBUILDER_H__ + + +#include +#include "unicode/numfmt.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "uassert.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +class U_I18N_API NumberStringBuilder : public UMemory { + private: + static const int32_t DEFAULT_CAPACITY = 40; + + template + union ValueOrHeapArray { + T value[DEFAULT_CAPACITY]; + struct { + T *ptr; + int32_t capacity; + } heap; + }; + + public: + NumberStringBuilder(); + + ~NumberStringBuilder(); + + NumberStringBuilder(const NumberStringBuilder &other); + + NumberStringBuilder &operator=(const NumberStringBuilder &other); + + int32_t length() const; + + int32_t codePointCount() const; + + inline char16_t charAt(int32_t index) const { + U_ASSERT(index >= 0); + U_ASSERT(index < fLength); + return getCharPtr()[fZero + index]; + } + + inline Field fieldAt(int32_t index) const { + U_ASSERT(index >= 0); + U_ASSERT(index < fLength); + return getFieldPtr()[fZero + index]; + } + + UChar32 getFirstCodePoint() const; + + UChar32 getLastCodePoint() const; + + UChar32 codePointAt(int32_t index) const; + + UChar32 codePointBefore(int32_t index) const; + + NumberStringBuilder &clear(); + + int32_t appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status); + + int32_t insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status); + + int32_t append(const UnicodeString &unistr, Field field, UErrorCode &status); + + int32_t insert(int32_t index, const UnicodeString &unistr, Field field, UErrorCode &status); + + int32_t insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, Field field, + UErrorCode &status); + + int32_t append(const NumberStringBuilder &other, UErrorCode &status); + + int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status); + + UnicodeString toUnicodeString() const; + + UnicodeString toDebugString() const; + + const char16_t *chars() const; + + bool contentEquals(const NumberStringBuilder &other) const; + + void populateFieldPosition(FieldPosition &fp, int32_t offset, UErrorCode &status) const; + + void populateFieldPositionIterator(FieldPositionIterator &fpi, UErrorCode &status) const; + + private: + bool fUsingHeap = false; + ValueOrHeapArray fChars; + ValueOrHeapArray fFields; + int32_t fZero = DEFAULT_CAPACITY / 2; + int32_t fLength = 0; + + inline char16_t *getCharPtr() { + return fUsingHeap ? fChars.heap.ptr : fChars.value; + } + + inline const char16_t *getCharPtr() const { + return fUsingHeap ? fChars.heap.ptr : fChars.value; + } + + inline Field *getFieldPtr() { + return fUsingHeap ? fFields.heap.ptr : fFields.value; + } + + inline const Field *getFieldPtr() const { + return fUsingHeap ? fFields.heap.ptr : fFields.value; + } + + inline int32_t getCapacity() const { + return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY; + } + + int32_t prepareForInsert(int32_t index, int32_t count, UErrorCode &status); + + int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_STRINGBUILDER_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_types.h b/deps/icu-small/source/i18n/number_types.h new file mode 100644 index 00000000000000..2bc21bd40dcb18 --- /dev/null +++ b/deps/icu-small/source/i18n/number_types.h @@ -0,0 +1,293 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_TYPES_H__ +#define __NUMBER_TYPES_H__ + +#include +#include "unicode/decimfmt.h" +#include "unicode/unum.h" +#include "unicode/numsys.h" +#include "unicode/numberformatter.h" +#include "unicode/utf16.h" +#include "uassert.h" +#include "unicode/platform.h" + +U_NAMESPACE_BEGIN +namespace number { +namespace impl { + +// Typedef several enums for brevity and for easier comparison to Java. + +typedef UNumberFormatFields Field; + +typedef UNumberFormatRoundingMode RoundingMode; + +typedef UNumberFormatPadPosition PadPosition; + +typedef UNumberCompactStyle CompactStyle; + +// ICU4J Equivalent: RoundingUtils.MAX_INT_FRAC_SIG +static constexpr int32_t kMaxIntFracSig = 100; + +// ICU4J Equivalent: RoundingUtils.DEFAULT_ROUNDING_MODE +static constexpr RoundingMode kDefaultMode = RoundingMode::UNUM_FOUND_HALFEVEN; + +// ICU4J Equivalent: Padder.FALLBACK_PADDING_STRING +static constexpr char16_t kFallbackPaddingString[] = u" "; + +// ICU4J Equivalent: NumberFormatterImpl.DEFAULT_CURRENCY +static constexpr char16_t kDefaultCurrency[] = u"XXX"; + +// FIXME: New error codes: +static constexpr UErrorCode U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR = U_ILLEGAL_ARGUMENT_ERROR; +static constexpr UErrorCode U_NUMBER_PADDING_WIDTH_OUTOFBOUNDS_ERROR = U_ILLEGAL_ARGUMENT_ERROR; + +// Forward declarations: + +class Modifier; +class MutablePatternModifier; +class DecimalQuantity; +class NumberStringBuilder; +struct MicroProps; + + +enum AffixPatternType { + // Represents a literal character; the value is stored in the code point field. + TYPE_CODEPOINT = 0, + + // Represents a minus sign symbol '-'. + TYPE_MINUS_SIGN = -1, + + // Represents a plus sign symbol '+'. + TYPE_PLUS_SIGN = -2, + + // Represents a percent sign symbol '%'. + TYPE_PERCENT = -3, + + // Represents a permille sign symbol '‰'. + TYPE_PERMILLE = -4, + + // Represents a single currency symbol '¤'. + TYPE_CURRENCY_SINGLE = -5, + + // Represents a double currency symbol '¤¤'. + TYPE_CURRENCY_DOUBLE = -6, + + // Represents a triple currency symbol '¤¤¤'. + TYPE_CURRENCY_TRIPLE = -7, + + // Represents a quadruple currency symbol '¤¤¤¤'. + TYPE_CURRENCY_QUAD = -8, + + // Represents a quintuple currency symbol '¤¤¤¤¤'. + TYPE_CURRENCY_QUINT = -9, + + // Represents a sequence of six or more currency symbols. + TYPE_CURRENCY_OVERFLOW = -15 +}; + +enum CompactType { + TYPE_DECIMAL, + TYPE_CURRENCY +}; + + +// TODO: Should this be moved somewhere else, maybe where other ICU classes can use it? +// Exported as U_I18N_API because it is a base class for other exported types +class U_I18N_API CharSequence { +public: + virtual ~CharSequence() = default; + + virtual int32_t length() const = 0; + + virtual char16_t charAt(int32_t index) const = 0; + + virtual UChar32 codePointAt(int32_t index) const { + // Default implementation; can be overridden with a more efficient version + char16_t leading = charAt(index); + if (U16_IS_LEAD(leading) && length() > index + 1) { + char16_t trailing = charAt(index + 1); + return U16_GET_SUPPLEMENTARY(leading, trailing); + } else { + return leading; + } + } + + virtual UnicodeString toUnicodeString() const = 0; +}; + +class U_I18N_API AffixPatternProvider { + public: + static const int32_t AFFIX_PLURAL_MASK = 0xff; + static const int32_t AFFIX_PREFIX = 0x100; + static const int32_t AFFIX_NEGATIVE_SUBPATTERN = 0x200; + static const int32_t AFFIX_PADDING = 0x400; + + virtual ~AffixPatternProvider() = default; + + virtual char16_t charAt(int flags, int i) const = 0; + + virtual int length(int flags) const = 0; + + virtual bool hasCurrencySign() const = 0; + + virtual bool positiveHasPlusSign() const = 0; + + virtual bool hasNegativeSubpattern() const = 0; + + virtual bool negativeHasMinusSign() const = 0; + + virtual bool containsSymbolType(AffixPatternType, UErrorCode &) const = 0; +}; + +/** + * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied to the string + * builder. A Modifier usually contains a prefix and a suffix that are applied, but it could contain something else, + * like a {@link com.ibm.icu.text.SimpleFormatter} pattern. + * + * A Modifier is usually immutable, except in cases such as {@link MurkyModifier}, which are mutable for performance + * reasons. + * + * Exported as U_I18N_API because it is a base class for other exported types + */ +class U_I18N_API Modifier { + public: + virtual ~Modifier() = default; + + /** + * Apply this Modifier to the string builder. + * + * @param output + * The string builder to which to apply this modifier. + * @param leftIndex + * The left index of the string within the builder. Equal to 0 when only one number is being formatted. + * @param rightIndex + * The right index of the string within the string builder. Equal to length when only one number is being + * formatted. + * @return The number of characters (UTF-16 code units) that were added to the string builder. + */ + virtual int32_t + apply(NumberStringBuilder &output, int leftIndex, int rightIndex, UErrorCode &status) const = 0; + + /** + * Gets the length of the prefix. This information can be used in combination with {@link #apply} to extract the + * prefix and suffix strings. + * + * @return The number of characters (UTF-16 code units) in the prefix. + */ + virtual int32_t getPrefixLength(UErrorCode& status) const = 0; + + /** + * Returns the number of code points in the modifier, prefix plus suffix. + */ + virtual int32_t getCodePointCount(UErrorCode &status) const = 0; + + /** + * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately and not allowed + * to bubble up. With regard to padding, strong modifiers are considered to be on the inside of the prefix and + * suffix. + * + * @return Whether the modifier is strong. + */ + virtual bool isStrong() const = 0; +}; + +/** + * This interface is used when all number formatting settings, including the locale, are known, except for the quantity + * itself. The {@link #processQuantity} method performs the final step in the number processing pipeline: it uses the + * quantity to generate a finalized {@link MicroProps}, which can be used to render the number to output. + * + *

+ * In other words, this interface is used for the parts of number processing that are quantity-dependent. + * + *

+ * In order to allow for multiple different objects to all mutate the same MicroProps, a "chain" of MicroPropsGenerators + * are linked together, and each one is responsible for manipulating a certain quantity-dependent part of the + * MicroProps. At the tail of the linked list is a base instance of {@link MicroProps} with properties that are not + * quantity-dependent. Each element in the linked list calls {@link #processQuantity} on its "parent", then does its + * work, and then returns the result. + * + * Exported as U_I18N_API because it is a base class for other exported types + * + */ +class U_I18N_API MicroPropsGenerator { + public: + virtual ~MicroPropsGenerator() = default; + + /** + * Considers the given {@link DecimalQuantity}, optionally mutates it, and returns a {@link MicroProps}. + * + * @param quantity + * The quantity for consideration and optional mutation. + * @param micros + * The MicroProps instance to populate. + * @return A MicroProps instance resolved for the quantity. + */ + virtual void processQuantity(DecimalQuantity& quantity, MicroProps& micros, UErrorCode& status) const = 0; +}; + +class MultiplierProducer { + public: + virtual ~MultiplierProducer() = default; + + virtual int32_t getMultiplier(int32_t magnitude) const = 0; +}; + +// Exported as U_I18N_API because it is a public member field of exported DecimalFormatProperties +template +class U_I18N_API NullableValue { + public: + NullableValue() : fNull(true) {} + + NullableValue(const NullableValue &other) = default; + + explicit NullableValue(const T &other) { + fValue = other; + fNull = false; + } + + NullableValue &operator=(const NullableValue &other) = default; + + NullableValue &operator=(const T &other) { + fValue = other; + fNull = false; + return *this; + } + + bool operator==(const NullableValue &other) const { + // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings) + return fNull ? other.fNull : (other.fNull ? false : static_cast(fValue == other.fValue)); + } + + void nullify() { + // TODO: It might be nice to call the destructor here. + fNull = true; + } + + bool isNull() const { + return fNull; + } + + T get(UErrorCode &status) const { + if (fNull) { + status = U_UNDEFINED_VARIABLE; + } + return fValue; + } + + private: + bool fNull; + T fValue; +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_TYPES_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_utils.h b/deps/icu-small/source/i18n/number_utils.h new file mode 100644 index 00000000000000..3a408d6007a2cd --- /dev/null +++ b/deps/icu-small/source/i18n/number_utils.h @@ -0,0 +1,130 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_UTILS_H__ +#define __NUMBER_UTILS_H__ + +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_decimalquantity.h" +#include "number_scientific.h" +#include "number_patternstring.h" +#include "number_modifiers.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +class UnicodeStringCharSequence : public CharSequence { + public: + explicit UnicodeStringCharSequence(const UnicodeString &other) { + fStr = other; + } + + ~UnicodeStringCharSequence() U_OVERRIDE = default; + + int32_t length() const U_OVERRIDE { + return fStr.length(); + } + + char16_t charAt(int32_t index) const U_OVERRIDE { + return fStr.charAt(index); + } + + UChar32 codePointAt(int32_t index) const U_OVERRIDE { + return fStr.char32At(index); + } + + UnicodeString toUnicodeString() const U_OVERRIDE { + // Allocate a UnicodeString of the correct length + UnicodeString output(length(), 0, -1); + for (int32_t i = 0; i < length(); i++) { + output.append(charAt(i)); + } + return output; + } + + private: + UnicodeString fStr; +}; + +struct MicroProps : public MicroPropsGenerator { + + // NOTE: All of these fields are properly initialized in NumberFormatterImpl. + Rounder rounding; + Grouper grouping; + Padder padding; + IntegerWidth integerWidth; + UNumberSignDisplay sign; + UNumberDecimalSeparatorDisplay decimal; + bool useCurrency; + + // Note: This struct has no direct ownership of the following pointers. + const DecimalFormatSymbols *symbols; + const Modifier *modOuter; + const Modifier *modMiddle; + const Modifier *modInner; + + // The following "helper" fields may optionally be used during the MicroPropsGenerator. + // They live here to retain memory. + struct { + ScientificModifier scientificModifier; + EmptyModifier emptyWeakModifier{false}; + EmptyModifier emptyStrongModifier{true}; + } helpers; + + + MicroProps() = default; + + MicroProps(const MicroProps &other) = default; + + MicroProps &operator=(const MicroProps &other) = default; + + void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const U_OVERRIDE { + (void)status; + if (this == µs) { + // Unsafe path: no need to perform a copy. + U_ASSERT(!exhausted); + micros.exhausted = true; + U_ASSERT(exhausted); + } else { + // Safe path: copy self into the output micros. + micros = *this; + } + } + + private: + // Internal fields: + bool exhausted = false; +}; + +/** + * This struct provides the result of the number formatting pipeline to FormattedNumber. + * + * The DecimalQuantity is not currently being used by FormattedNumber, but at some point it could be used + * to add a toDecNumber() or similar method. + */ +struct NumberFormatterResults : public UMemory { + DecimalQuantity quantity; + NumberStringBuilder string; +}; + +inline const UnicodeString getDigitFromSymbols(int8_t digit, const DecimalFormatSymbols &symbols) { + // TODO: Implement DecimalFormatSymbols.getCodePointZero()? + if (digit == 0) { + return symbols.getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kZeroDigitSymbol); + } else { + return symbols.getSymbol(static_cast( + DecimalFormatSymbols::ENumberFormatSymbol::kOneDigitSymbol + digit - 1)); + } +} + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_UTILS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index 90c53ce390674b..fee3bed8bfb352 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -1509,6 +1509,24 @@ NumberFormat::makeInstance(const Locale& desiredLocale, return f; } +/** + * Get the rounding mode. + * @return A rounding mode + */ +NumberFormat::ERoundingMode NumberFormat::getRoundingMode() const { + // Default value. ICU4J throws an exception and we can't change this API. + return NumberFormat::ERoundingMode::kRoundUnnecessary; +} + +/** + * Set the rounding mode. This has no effect unless the rounding + * increment is greater than zero. + * @param roundingMode A rounding mode + */ +void NumberFormat::setRoundingMode(NumberFormat::ERoundingMode /*roundingMode*/) { + // No-op ICU4J throws an exception, and we can't change this API. +} + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index b24340f0d2e2c9..087dd277eb4dd8 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -25,6 +25,7 @@ #include "unicode/schriter.h" #include "unicode/numsys.h" #include "cstring.h" +#include "uassert.h" #include "uresimp.h" #include "numsys_impl.h" @@ -115,7 +116,13 @@ NumberingSystem::createInstance(const Locale & inLocale, UErrorCode& status) { UBool usingFallback = FALSE; char buffer[ULOC_KEYWORDS_CAPACITY]; int32_t count = inLocale.getKeywordValue("numbers",buffer, sizeof(buffer),status); + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { + // the "numbers" keyword exceeds ULOC_KEYWORDS_CAPACITY; ignore and use default. + count = 0; + status = U_ZERO_ERROR; + } if ( count > 0 ) { // @numbers keyword was specified in the locale + U_ASSERT(count < ULOC_KEYWORDS_CAPACITY); buffer[count] = '\0'; // Make sure it is null terminated. if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) || !uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) { diff --git a/deps/icu-small/source/i18n/persncal.cpp b/deps/icu-small/source/i18n/persncal.cpp index 0ccff4d2bdc0d3..3d391f4e3fbe8e 100644 --- a/deps/icu-small/source/i18n/persncal.cpp +++ b/deps/icu-small/source/i18n/persncal.cpp @@ -213,7 +213,7 @@ void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*statu int32_t year, month, dayOfMonth, dayOfYear; int32_t daysSinceEpoch = julianDay - PERSIAN_EPOCH; - year = 1 + ClockMath::floorDivide(33 * daysSinceEpoch + 3, 12053); + year = 1 + (int32_t)ClockMath::floorDivide(33 * (int64_t)daysSinceEpoch + 3, (int64_t)12053); int32_t farvardin1 = 365 * (year - 1) + ClockMath::floorDivide(8 * year + 21, 33); dayOfYear = (daysSinceEpoch - farvardin1); // 0-based diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 08ea969b5ae6fb..6733a23e00362f 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -268,7 +268,7 @@ PluralRules::select(const Formattable& obj, const NumberFormat& fmt, UErrorCode& } UnicodeString -PluralRules::select(const FixedDecimal &number) const { +PluralRules::select(const IFixedDecimal &number) const { if (mRules == NULL) { return UnicodeString(TRUE, PLURAL_DEFAULT_RULE, -1); } @@ -783,15 +783,17 @@ AndConstraint::~AndConstraint() { UBool -AndConstraint::isFulfilled(const FixedDecimal &number) { +AndConstraint::isFulfilled(const IFixedDecimal &number) { UBool result = TRUE; if (digitsType == none) { // An empty AndConstraint, created by a rule with a keyword but no following expression. return TRUE; } - double n = number.get(digitsType); // pulls n | i | v | f value for the number. - // Will always be positive. - // May be non-integer (n option only) + + PluralOperand operand = tokenTypeToPluralOperand(digitsType); + double n = number.getPluralOperand(operand); // pulls n | i | v | f value for the number. + // Will always be positive. + // May be non-integer (n option only) do { if (integerOnly && n != uprv_floor(n)) { result = FALSE; @@ -873,7 +875,7 @@ OrConstraint::add() } UBool -OrConstraint::isFulfilled(const FixedDecimal &number) { +OrConstraint::isFulfilled(const IFixedDecimal &number) { OrConstraint* orRule=this; UBool result=FALSE; @@ -914,8 +916,8 @@ RuleChain::~RuleChain() { UnicodeString -RuleChain::select(const FixedDecimal &number) const { - if (!number.isNanOrInfinity) { +RuleChain::select(const IFixedDecimal &number) const { + if (!number.isNaN() && !number.isInfinite()) { for (const RuleChain *rules = this; rules != NULL; rules = rules->fNext) { if (rules->ruleHeader->isFulfilled(number)) { return rules->fKeyword; @@ -1405,13 +1407,34 @@ PluralKeywordEnumeration::count(UErrorCode& /*status*/) const { PluralKeywordEnumeration::~PluralKeywordEnumeration() { } +PluralOperand tokenTypeToPluralOperand(tokenType tt) { + switch(tt) { + case tVariableN: + return PLURAL_OPERAND_N; + case tVariableI: + return PLURAL_OPERAND_I; + case tVariableF: + return PLURAL_OPERAND_F; + case tVariableV: + return PLURAL_OPERAND_V; + case tVariableT: + return PLURAL_OPERAND_T; + default: + U_ASSERT(FALSE); // unexpected. + return PLURAL_OPERAND_N; + } +} + +IFixedDecimal::~IFixedDecimal() = default; + FixedDecimal::FixedDecimal(const VisibleDigits &digits) { digits.getFixedDecimal( source, intValue, decimalDigits, decimalDigitsWithoutTrailingZeros, visibleDecimalDigitCount, hasIntegerValue); isNegative = digits.isNegative(); - isNanOrInfinity = digits.isNaNOrInfinity(); + _isNaN = digits.isNaN(); + _isInfinite = digits.isInfinite(); } FixedDecimal::FixedDecimal(double n, int32_t v, int64_t f) { @@ -1476,9 +1499,12 @@ FixedDecimal::FixedDecimal(const FixedDecimal &other) { intValue = other.intValue; hasIntegerValue = other.hasIntegerValue; isNegative = other.isNegative; - isNanOrInfinity = other.isNanOrInfinity; + _isNaN = other._isNaN; + _isInfinite = other._isInfinite; } +FixedDecimal::~FixedDecimal() = default; + void FixedDecimal::init(double n) { int32_t numFractionDigits = decimals(n); @@ -1489,8 +1515,9 @@ void FixedDecimal::init(double n) { void FixedDecimal::init(double n, int32_t v, int64_t f) { isNegative = n < 0.0; source = fabs(n); - isNanOrInfinity = uprv_isNaN(source) || uprv_isPositiveInfinity(source); - if (isNanOrInfinity) { + _isNaN = uprv_isNaN(source); + _isInfinite = uprv_isInfinite(source); + if (_isNaN || _isInfinite) { v = 0; f = 0; intValue = 0; @@ -1610,19 +1637,31 @@ void FixedDecimal::adjustForMinFractionDigits(int32_t minFractionDigits) { } -double FixedDecimal::get(tokenType operand) const { +double FixedDecimal::getPluralOperand(PluralOperand operand) const { switch(operand) { - case tVariableN: return source; - case tVariableI: return (double)intValue; - case tVariableF: return (double)decimalDigits; - case tVariableT: return (double)decimalDigitsWithoutTrailingZeros; - case tVariableV: return visibleDecimalDigitCount; + case PLURAL_OPERAND_N: return source; + case PLURAL_OPERAND_I: return static_cast(intValue); + case PLURAL_OPERAND_F: return static_cast(decimalDigits); + case PLURAL_OPERAND_T: return static_cast(decimalDigitsWithoutTrailingZeros); + case PLURAL_OPERAND_V: return visibleDecimalDigitCount; default: U_ASSERT(FALSE); // unexpected. return source; } } +bool FixedDecimal::isNaN() const { + return _isNaN; +} + +bool FixedDecimal::isInfinite() const { + return _isInfinite; +} + +bool FixedDecimal::isNanOrInfinity() const { + return _isNaN || _isInfinite; +} + int32_t FixedDecimal::getVisibleFractionDigitCount() const { return visibleDecimalDigitCount; } @@ -1665,7 +1704,7 @@ const char *PluralAvailableLocalesEnumeration::next(int32_t *resultLength, UErro } const char *result = ures_getKey(fRes); if (resultLength != NULL) { - *resultLength = uprv_strlen(result); + *resultLength = static_cast(uprv_strlen(result)); } return result; } diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h index 9f5f66c1b74122..b93fc501baced2 100644 --- a/deps/icu-small/source/i18n/plurrule_impl.h +++ b/deps/icu-small/source/i18n/plurrule_impl.h @@ -28,6 +28,7 @@ #include "unicode/ures.h" #include "uvector.h" #include "hash.h" +#include "uassert.h" class PluralRulesTest; @@ -177,6 +178,74 @@ class PluralRuleParser: public UMemory { }; +enum PluralOperand { + /** + * The double value of the entire number. + */ + PLURAL_OPERAND_N, + + /** + * The integer value, with the fraction digits truncated off. + */ + PLURAL_OPERAND_I, + + /** + * All visible fraction digits as an integer, including trailing zeros. + */ + PLURAL_OPERAND_F, + + /** + * Visible fraction digits as an integer, not including trailing zeros. + */ + PLURAL_OPERAND_T, + + /** + * Number of visible fraction digits. + */ + PLURAL_OPERAND_V, + + /** + * Number of visible fraction digits, not including trailing zeros. + */ + PLURAL_OPERAND_W, + + /** + * THIS OPERAND IS DEPRECATED AND HAS BEEN REMOVED FROM THE SPEC. + * + *

Returns the integer value, but will fail if the number has fraction digits. + * That is, using "j" instead of "i" is like implicitly adding "v is 0". + * + *

For example, "j is 3" is equivalent to "i is 3 and v is 0": it matches + * "3" but not "3.1" or "3.0". + */ + PLURAL_OPERAND_J +}; + +/** + * Converts from the tokenType enum to PluralOperand. Asserts that the given + * tokenType can be mapped to a PluralOperand. + */ +PluralOperand tokenTypeToPluralOperand(tokenType tt); + +/** + * An interface to FixedDecimal, allowing for other implementations. + * @internal + */ +class U_I18N_API IFixedDecimal { + public: + virtual ~IFixedDecimal(); + + /** + * Returns the value corresponding to the specified operand (n, i, f, t, v, or w). + * If the operand is 'n', returns a double; otherwise, returns an integer. + */ + virtual double getPluralOperand(PluralOperand operand) const = 0; + + virtual bool isNaN() const = 0; + + virtual bool isInfinite() const = 0; +}; + /** * class FixedDecimal serves to communicate the properties * of a formatted number from a decimal formatter to PluralRules::select() @@ -184,7 +253,7 @@ class PluralRuleParser: public UMemory { * see DecimalFormat::getFixedDecimal() * @internal */ -class U_I18N_API FixedDecimal: public UMemory { +class U_I18N_API FixedDecimal: public IFixedDecimal, public UObject { public: /** * @param n the number, e.g. 12.345 @@ -196,10 +265,16 @@ class U_I18N_API FixedDecimal: public UMemory { explicit FixedDecimal(double n); explicit FixedDecimal(const VisibleDigits &n); FixedDecimal(); + ~FixedDecimal() U_OVERRIDE; FixedDecimal(const UnicodeString &s, UErrorCode &ec); FixedDecimal(const FixedDecimal &other); - double get(tokenType operand) const; + double getPluralOperand(PluralOperand operand) const U_OVERRIDE; + bool isNaN() const U_OVERRIDE; + bool isInfinite() const U_OVERRIDE; + + bool isNanOrInfinity() const; // used in decimfmtimpl.cpp + int32_t getVisibleFractionDigitCount() const; void init(double n, int32_t v, int64_t f); @@ -217,7 +292,8 @@ class U_I18N_API FixedDecimal: public UMemory { int64_t intValue; UBool hasIntegerValue; UBool isNegative; - UBool isNanOrInfinity; + UBool _isNaN; + UBool _isInfinite; }; class AndConstraint : public UMemory { @@ -240,7 +316,7 @@ class AndConstraint : public UMemory { virtual ~AndConstraint(); AndConstraint* add(); // UBool isFulfilled(double number); - UBool isFulfilled(const FixedDecimal &number); + UBool isFulfilled(const IFixedDecimal &number); }; class OrConstraint : public UMemory { @@ -253,7 +329,7 @@ class OrConstraint : public UMemory { virtual ~OrConstraint(); AndConstraint* add(); // UBool isFulfilled(double number); - UBool isFulfilled(const FixedDecimal &number); + UBool isFulfilled(const IFixedDecimal &number); }; class RuleChain : public UMemory { @@ -271,7 +347,7 @@ class RuleChain : public UMemory { RuleChain(const RuleChain& other); virtual ~RuleChain(); - UnicodeString select(const FixedDecimal &number) const; + UnicodeString select(const IFixedDecimal &number) const; void dumpRules(UnicodeString& result); UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const; UBool isKeyword(const UnicodeString& keyword) const; diff --git a/deps/icu-small/source/i18n/precision.cpp b/deps/icu-small/source/i18n/precision.cpp index 4a68b0d8867053..97dc13dc385651 100644 --- a/deps/icu-small/source/i18n/precision.cpp +++ b/deps/icu-small/source/i18n/precision.cpp @@ -239,10 +239,10 @@ FixedPrecision::initVisibleDigits( } } // Try fast path - if (n >= 0 && initVisibleDigits(scaled, -n, digits, status)) { + if (n >= 0 && initVisibleDigits(static_cast(scaled), -n, digits, status)) { digits.fAbsDoubleValue = fabs(value); digits.fAbsDoubleValueSet = U_SUCCESS(status) && !digits.isOverMaxDigits(); - // Adjust for negative 0 becuase when we cast to an int64, + // Adjust for negative 0 because when we cast to an int64, // negative 0 becomes positive 0. if (scaled == 0.0 && uprv_isNegative(scaled)) { digits.setNegative(); diff --git a/deps/icu-small/source/i18n/rbnf.cpp b/deps/icu-small/source/i18n/rbnf.cpp index d4fd57499825cc..5b54e303f3ab20 100644 --- a/deps/icu-small/source/i18n/rbnf.cpp +++ b/deps/icu-small/source/i18n/rbnf.cpp @@ -316,13 +316,33 @@ class LocDataParser { private: - void inc(void) { ++p; ch = 0xffff; } - UBool checkInc(UChar c) { if (p < e && (ch == c || *p == c)) { inc(); return TRUE; } return FALSE; } - UBool check(UChar c) { return p < e && (ch == c || *p == c); } - void skipWhitespace(void) { while (p < e && PatternProps::isWhiteSpace(ch != 0xffff ? ch : *p)) inc();} - UBool inList(UChar c, const UChar* list) const { - if (*list == SPACE && PatternProps::isWhiteSpace(c)) return TRUE; - while (*list && *list != c) ++list; return *list == c; + inline void inc(void) { + ++p; + ch = 0xffff; + } + inline UBool checkInc(UChar c) { + if (p < e && (ch == c || *p == c)) { + inc(); + return TRUE; + } + return FALSE; + } + inline UBool check(UChar c) { + return p < e && (ch == c || *p == c); + } + inline void skipWhitespace(void) { + while (p < e && PatternProps::isWhiteSpace(ch != 0xffff ? ch : *p)) { + inc(); + } + } + inline UBool inList(UChar c, const UChar* list) const { + if (*list == SPACE && PatternProps::isWhiteSpace(c)) { + return TRUE; + } + while (*list && *list != c) { + ++list; + } + return *list == c; } void parseError(const char* msg); @@ -667,6 +687,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -691,6 +712,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -715,6 +737,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -738,6 +761,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -762,6 +786,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -783,6 +808,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -849,6 +875,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs) , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -878,6 +905,7 @@ RuleBasedNumberFormat::operator=(const RuleBasedNumberFormat& rhs) setDecimalFormatSymbols(*rhs.getDecimalFormatSymbols()); init(rhs.originalDescription, rhs.localizations ? rhs.localizations->ref() : NULL, perror, status); setDefaultRuleSet(rhs.getDefaultRuleSetName(), status); + setRoundingMode(rhs.getRoundingMode()); capitalizationInfoSet = rhs.capitalizationInfoSet; capitalizationForUIListMenu = rhs.capitalizationForUIListMenu; @@ -1172,12 +1200,11 @@ RuleBasedNumberFormat::format(double number, UnicodeString& toAppendTo, FieldPosition& /* pos */) const { - int32_t startPos = toAppendTo.length(); UErrorCode status = U_ZERO_ERROR; if (defaultRuleSet) { - defaultRuleSet->format(number, toAppendTo, toAppendTo.length(), 0, status); + format(number, *defaultRuleSet, toAppendTo, status); } - return adjustForCapitalizationContext(startPos, toAppendTo, status); + return toAppendTo; } @@ -1228,15 +1255,31 @@ RuleBasedNumberFormat::format(double number, } else { NFRuleSet *rs = findRuleSet(ruleSetName, status); if (rs) { - int32_t startPos = toAppendTo.length(); - rs->format(number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo, status); + format(number, *rs, toAppendTo, status); } } } return toAppendTo; } +void +RuleBasedNumberFormat::format(double number, + NFRuleSet& rs, + UnicodeString& toAppendTo, + UErrorCode& status) const +{ + int32_t startPos = toAppendTo.length(); + if (getRoundingMode() != DecimalFormat::ERoundingMode::kRoundUnnecessary && !uprv_isNaN(number) && !uprv_isInfinite(number)) { + DigitList digitList; + digitList.set(number); + digitList.setRoundingMode(getRoundingMode()); + digitList.roundFixedPoint(getMaximumFractionDigits()); + number = digitList.getDouble(); + } + rs.format(number, toAppendTo, toAppendTo.length(), 0, status); + adjustForCapitalizationContext(startPos, toAppendTo, status); +} + /** * Bottleneck through which all the public format() methods * that take a long pass. By the time we get here, we know @@ -1939,6 +1982,23 @@ RuleBasedNumberFormat::createPluralFormat(UPluralType pluralType, return new PluralFormat(locale, pluralType, pattern, status); } +/** + * Get the rounding mode. + * @return A rounding mode + */ +DecimalFormat::ERoundingMode RuleBasedNumberFormat::getRoundingMode() const { + return roundingMode; +} + +/** + * Set the rounding mode. This has no effect unless the rounding + * increment is greater than zero. + * @param roundingMode A rounding mode + */ +void RuleBasedNumberFormat::setRoundingMode(DecimalFormat::ERoundingMode roundingMode) { + this->roundingMode = roundingMode; +} + U_NAMESPACE_END /* U_HAVE_RBNF */ diff --git a/deps/icu-small/source/i18n/regexcst.pl b/deps/icu-small/source/i18n/regexcst.pl old mode 100755 new mode 100644 diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index 18c073b9eee1df..5cf053db9a98fb 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -560,7 +560,7 @@ struct RelDateTimeFmtDataSink : public ResourceSink { RelDateTimeFmtDataSink::~RelDateTimeFmtDataSink() {} } // namespace -DateFormatSymbols::DtWidthType styleToDateFormatSymbolWidth[UDAT_STYLE_COUNT] = { +static const DateFormatSymbols::DtWidthType styleToDateFormatSymbolWidth[UDAT_STYLE_COUNT] = { DateFormatSymbols::WIDE, DateFormatSymbols::SHORT, DateFormatSymbols::NARROW }; diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index e3fdff7484506f..1bdad187762a25 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -2200,7 +2200,7 @@ int32_t RegexMatcher::split(UText *input, if (dest[i] == NULL) { dest[i] = utext_openUChars(NULL, NULL, 0, &status); } else { - static UChar emptyString[] = {(UChar)0}; + static const UChar emptyString[] = {(UChar)0}; utext_replace(dest[i], 0, utext_nativeLength(dest[i]), emptyString, 0, &status); } } diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 3c0670446b3876..27fbbd8f7a9ef5 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -71,6 +71,7 @@ #include "uvector.h" #include "cstr.h" #include "dayperiodrules.h" +#include "tznames_impl.h" // ZONE_NAME_U16_MAX #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) #include @@ -1690,7 +1691,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, case UDAT_TIMEZONE_ISO_FIELD: // 'X' case UDAT_TIMEZONE_ISO_LOCAL_FIELD: // 'x' { - UChar zsbuf[64]; + UChar zsbuf[ZONE_NAME_U16_MAX]; UnicodeString zoneString(zsbuf, 0, UPRV_LENGTHOF(zsbuf)); const TimeZone& tz = cal.getTimeZone(); UDate date = cal.getTime(status); @@ -3053,9 +3054,9 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // is treated literally: "2250", "-1", "1", "002". if (fDateOverride.compare(hebr)==0 && value < 1000) { value += HEBREW_CAL_CUR_MILLENIUM_START_YEAR; - } else if ((pos.getIndex() - start) == 2 && !isChineseCalendar - && u_isdigit(text.charAt(start)) - && u_isdigit(text.charAt(start+1))) + } else if (text.moveIndex32(start, 2) == pos.getIndex() && !isChineseCalendar + && u_isdigit(text.char32At(start)) + && u_isdigit(text.char32At(text.moveIndex32(start, 1)))) { // only adjust year for patterns less than 3. if(count < 3) { @@ -3093,9 +3094,9 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // Comment is the same as for UDAT_Year_FIELDs - look above if (fDateOverride.compare(hebr)==0 && value < 1000) { value += HEBREW_CAL_CUR_MILLENIUM_START_YEAR; - } else if ((pos.getIndex() - start) == 2 - && u_isdigit(text.charAt(start)) - && u_isdigit(text.charAt(start+1)) + } else if (text.moveIndex32(start, 2) == pos.getIndex() + && u_isdigit(text.char32At(start)) + && u_isdigit(text.char32At(text.moveIndex32(start, 1))) && fHaveDefaultCentury ) { int32_t ambiguousTwoDigitYear = fDefaultCenturyStartYear % 100; @@ -3201,7 +3202,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC case UDAT_FRACTIONAL_SECOND_FIELD: // Fractional seconds left-justify - i = pos.getIndex() - start; + i = countDigits(text, start, pos.getIndex()); if (i < 3) { while (i < 3) { value *= 10; @@ -3727,6 +3728,19 @@ void SimpleDateFormat::parseInt(const UnicodeString& text, } } +int32_t SimpleDateFormat::countDigits(const UnicodeString& text, int32_t start, int32_t end) const { + int32_t numDigits = 0; + int32_t idx = start; + while (idx < end) { + UChar32 cp = text.char32At(idx); + if (u_isdigit(cp)) { + numDigits++; + } + idx += U16_LENGTH(cp); + } + return numDigits; +} + //---------------------------------------------------------------------- void SimpleDateFormat::translatePattern(const UnicodeString& originalPattern, diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index d864ad34636178..331f4efdeb339a 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -46,11 +46,29 @@ static const UChar LOCALE_SEP = 95; // '_' //static const UChar VARIANT_SEP = 0x002F; // '/' // String constants -static const UChar ANY[] = { 65, 110, 121, 0 }; // Any +static const UChar ANY[] = { 0x41, 0x6E, 0x79, 0 }; // Any +static const UChar LAT[] = { 0x4C, 0x61, 0x74, 0 }; // Lat // empty string #define NO_VARIANT UnicodeString() +// initial estimate for specDAG size +// ICU 60 Transliterator::countAvailableSources() +#define SPECDAG_INIT_SIZE 149 + +// initial estimate for number of variant names +#define VARIANT_LIST_INIT_SIZE 11 +#define VARIANT_LIST_MAX_SIZE 31 + +// initial estimate for availableIDs count (default estimate is 8 => multiple reallocs) +// ICU 60 Transliterator::countAvailableIDs() +#define AVAILABLE_IDS_INIT_SIZE 641 + +// initial estimate for number of targets for source "Any", "Lat" +// ICU 60 Transliterator::countAvailableTargets("Any")/("Latn") +#define ANY_TARGETS_INIT_SIZE 125 +#define LAT_TARGETS_INIT_SIZE 23 + /** * Resource bundle key for the RuleBasedTransliterator rule. */ @@ -517,10 +535,17 @@ U_CDECL_END TransliteratorRegistry::TransliteratorRegistry(UErrorCode& status) : registry(TRUE, status), - specDAG(TRUE, status), - availableIDs(status) + specDAG(TRUE, SPECDAG_INIT_SIZE, status), + variantList(VARIANT_LIST_INIT_SIZE, status), + availableIDs(AVAILABLE_IDS_INIT_SIZE, status) { registry.setValueDeleter(deleteEntry); + variantList.setDeleter(uprv_deleteUObject); + variantList.setComparer(uhash_compareCaselessUnicodeString); + UnicodeString *emptyString = new UnicodeString(); + if (emptyString != NULL) { + variantList.addElement(emptyString, status); + } availableIDs.setDeleter(uprv_deleteUObject); availableIDs.setComparer(uhash_compareCaselessUnicodeString); specDAG.setValueDeleter(uhash_deleteHashtable); @@ -781,9 +806,15 @@ int32_t TransliteratorRegistry::countAvailableVariants(const UnicodeString& sour if (targets == 0) { return 0; } - UVector *variants = (UVector*) targets->get(target); - // variants may be 0 if the source/target are invalid - return (variants == 0) ? 0 : variants->size(); + uint32_t varMask = targets->geti(target); + int32_t varCount = 0; + while (varMask > 0) { + if (varMask & 1) { + varCount++; + } + varMask >>= 1; + } + return varCount; } UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, @@ -795,17 +826,25 @@ UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, result.truncate(0); // invalid source return result; } - UVector *variants = (UVector*) targets->get(target); - if (variants == 0) { - result.truncate(0); // invalid target - return result; - } - UnicodeString *v = (UnicodeString*) variants->elementAt(index); - if (v == 0) { - result.truncate(0); // invalid index - } else { - result = *v; + uint32_t varMask = targets->geti(target); + int32_t varCount = 0; + int32_t varListIndex = 0; + while (varMask > 0) { + if (varMask & 1) { + if (varCount == index) { + UnicodeString *v = (UnicodeString*) variantList.elementAt(varListIndex); + if (v != NULL) { + result = *v; + return result; + } + break; + } + varCount++; + } + varMask >>= 1; + varListIndex++; } + result.truncate(0); // invalid target or index return result; } @@ -911,9 +950,9 @@ void TransliteratorRegistry::registerEntry(const UnicodeString& ID, UnicodeString *newID = (UnicodeString *)ID.clone(); // Check to make sure newID was created. if (newID != NULL) { - // NUL-terminate the ID string - newID->getTerminatedBuffer(); - availableIDs.addElement(newID, status); + // NUL-terminate the ID string + newID->getTerminatedBuffer(); + availableIDs.addElement(newID, status); } } } else { @@ -924,9 +963,7 @@ void TransliteratorRegistry::registerEntry(const UnicodeString& ID, /** * Register a source-target/variant in the specDAG. Variant may be - * empty, but source and target must not be. If variant is empty then - * the special variant NO_VARIANT is stored in slot zero of the - * UVector of variants. + * empty, but source and target must not be. */ void TransliteratorRegistry::registerSTV(const UnicodeString& source, const UnicodeString& target, @@ -936,39 +973,38 @@ void TransliteratorRegistry::registerSTV(const UnicodeString& source, UErrorCode status = U_ZERO_ERROR; Hashtable *targets = (Hashtable*) specDAG.get(source); if (targets == 0) { - targets = new Hashtable(TRUE, status); - if (U_FAILURE(status) || targets == 0) { + int32_t size = 3; + if (source.compare(ANY,3) == 0) { + size = ANY_TARGETS_INIT_SIZE; + } else if (source.compare(LAT,3) == 0) { + size = LAT_TARGETS_INIT_SIZE; + } + targets = new Hashtable(TRUE, size, status); + if (U_FAILURE(status) || targets == NULL) { return; } - targets->setValueDeleter(uprv_deleteUObject); specDAG.put(source, targets, status); } - UVector *variants = (UVector*) targets->get(target); - if (variants == 0) { - variants = new UVector(uprv_deleteUObject, - uhash_compareCaselessUnicodeString, status); - if (variants == 0) { + int32_t variantListIndex = variantList.indexOf((void*) &variant, 0); + if (variantListIndex < 0) { + if (variantList.size() >= VARIANT_LIST_MAX_SIZE) { + // can't handle any more variants return; } - targets->put(target, variants, status); - } - // assert(NO_VARIANT == ""); - // We add the variant string. If it is the special "no variant" - // string, that is, the empty string, we add it at position zero. - if (!variants->contains((void*) &variant)) { - UnicodeString *tempus; // Used for null pointer check. - if (variant.length() > 0) { - tempus = new UnicodeString(variant); - if (tempus != NULL) { - variants->addElement(tempus, status); - } - } else { - tempus = new UnicodeString(); // = NO_VARIANT - if (tempus != NULL) { - variants->insertElementAt(tempus, 0, status); - } + UnicodeString *variantEntry = new UnicodeString(variant); + if (variantEntry != NULL) { + variantList.addElement(variantEntry, status); + if (U_SUCCESS(status)) { + variantListIndex = variantList.size() - 1; + } + } + if (variantListIndex < 0) { + return; } } + uint32_t addMask = 1 << variantListIndex; + uint32_t varMask = targets->geti(target); + targets->puti(target, varMask | addMask, status); } /** @@ -979,17 +1015,24 @@ void TransliteratorRegistry::removeSTV(const UnicodeString& source, const UnicodeString& variant) { // assert(source.length() > 0); // assert(target.length() > 0); -// UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; Hashtable *targets = (Hashtable*) specDAG.get(source); - if (targets == 0) { + if (targets == NULL) { return; // should never happen for valid s-t/v } - UVector *variants = (UVector*) targets->get(target); - if (variants == 0) { + uint32_t varMask = targets->geti(target); + if (varMask == 0) { return; // should never happen for valid s-t/v } - variants->removeElement((void*) &variant); - if (variants->size() == 0) { + int32_t variantListIndex = variantList.indexOf((void*) &variant, 0); + if (variantListIndex < 0) { + return; // should never happen for valid s-t/v + } + int32_t remMask = 1 << variantListIndex; + varMask &= (~remMask); + if (varMask != 0) { + targets->puti(target, varMask, status); + } else { targets->remove(target); // should delete variants if (targets->count() == 0) { specDAG.remove(source); // should delete targets @@ -1281,8 +1324,8 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID UVector* rbts = new UVector(entry->u.dataVector->size(), status); // Check for null pointer if (rbts == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; } int32_t passNumber = 1; for (int32_t i = 0; U_SUCCESS(status) && i < entry->u.dataVector->size(); i++) { diff --git a/deps/icu-small/source/i18n/transreg.h b/deps/icu-small/source/i18n/transreg.h index 6fc35c8247b341..041244e1b02d77 100644 --- a/deps/icu-small/source/i18n/transreg.h +++ b/deps/icu-small/source/i18n/transreg.h @@ -440,13 +440,15 @@ class TransliteratorRegistry : public UMemory { /** * DAG of visible IDs by spec. Hashtable: source => (Hashtable: - * target => (UVector: variant)) The UVector of variants is never - * empty. For a source-target with no variant, the special - * variant NO_VARIANT (the empty string) is stored in slot zero of - * the UVector. + * target => variant bitmask) */ Hashtable specDAG; + /** + * Vector of all variant names + */ + UVector variantList; + /** * Vector of public full IDs. */ diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index 45eda6ffb61043..69da4667bc89ac 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -18,6 +18,7 @@ #include "unicode/uchar.h" #include "unicode/udat.h" #include "unicode/ustring.h" +#include "unicode/utf16.h" #include "tzgnames.h" #include "cmemory.h" #include "cstring.h" @@ -30,6 +31,7 @@ #include "uvector.h" #include "zonemeta.h" #include "tznames_impl.h" // TextTrieMap +#include "patternprops.h" U_NAMESPACE_BEGIN @@ -320,7 +322,7 @@ TimeZoneFormat::TimeZoneFormat(const Locale& locale, UErrorCode& status) } const char* region = fLocale.getCountry(); - int32_t regionLen = uprv_strlen(region); + int32_t regionLen = static_cast(uprv_strlen(region)); if (regionLen == 0) { char loc[ULOC_FULLNAME_CAPACITY]; uloc_addLikelySubtags(fLocale.getName(), loc, sizeof(loc), &status); @@ -788,7 +790,7 @@ TimeZoneFormat::format(const Formattable& obj, UnicodeString& appendTo, if (tz != NULL) { int32_t rawOffset, dstOffset; tz->getOffset(date, FALSE, rawOffset, dstOffset, status); - UChar buf[32]; + UChar buf[ZONE_NAME_U16_MAX]; UnicodeString result(buf, 0, UPRV_LENGTHOF(buf)); formatOffsetLocalizedGMT(rawOffset + dstOffset, result, status); if (U_SUCCESS(status)) { @@ -1414,7 +1416,7 @@ TimeZoneFormat::getTZDBTimeZoneNames(UErrorCode& status) const { UnicodeString& TimeZoneFormat::formatExemplarLocation(const TimeZone& tz, UnicodeString& name) const { - UChar locationBuf[64]; + UChar locationBuf[ZONE_NAME_U16_MAX]; UnicodeString location(locationBuf, 0, UPRV_LENGTHOF(locationBuf)); const UChar* canonicalID = ZoneMeta::getCanonicalCLDRID(tz); @@ -1812,7 +1814,9 @@ TimeZoneFormat::parseOffsetFields(const UnicodeString& text, int32_t start, UBoo // but it should be parsed as 00:10:20. int32_t tmpLen = 0; int32_t tmpSign = 1; - int32_t tmpH, tmpM, tmpS; + int32_t tmpH = 0; + int32_t tmpM = 0; + int32_t tmpS = 0; for (int32_t patidx = 0; PARSE_GMT_OFFSET_TYPES[patidx] >= 0; patidx++) { int32_t gmtPatType = PARSE_GMT_OFFSET_TYPES[patidx]; @@ -1860,6 +1864,27 @@ TimeZoneFormat::parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t if (fieldType == GMTOffsetField::TEXT) { const UChar* patStr = field->getPatternText(); len = u_strlen(patStr); + if (i == 0) { + // When TimeZoneFormat parse() is called from SimpleDateFormat, + // leading space characters might be truncated. If the first pattern text + // starts with such character (e.g. Bidi control), then we need to + // skip the leading space charcters. + if (idx < text.length() && !PatternProps::isWhiteSpace(text.char32At(idx))) { + while (len > 0) { + UChar32 ch; + int32_t chLen; + U16_GET(patStr, 0, 0, len, ch) + if (PatternProps::isWhiteSpace(ch)) { + chLen = U16_LENGTH(ch); + len -= chLen; + patStr += chLen; + } + else { + break; + } + } + } + } if (text.caseCompare(idx, len, patStr, 0) != 0) { failed = TRUE; break; @@ -2428,7 +2453,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re isPrevQuote = TRUE; if (itemType != GMTOffsetField::TEXT) { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, (uint8_t)itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); if (U_FAILURE(status)) { break; @@ -2463,7 +2488,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re } } else { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); if (U_FAILURE(status)) { break; @@ -2481,7 +2506,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re // a string literal if (itemType != GMTOffsetField::TEXT) { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); if (U_FAILURE(status)) { break; @@ -2506,7 +2531,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re } } else { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); } else { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -2752,7 +2777,7 @@ static void U_CALLCONV initZoneIdTrie(UErrorCode &status) { } StringEnumeration *tzenum = TimeZone::createEnumeration(); const UnicodeString *id; - while ((id = tzenum->snext(status))) { + while ((id = tzenum->snext(status)) != NULL) { const UChar* uid = ZoneMeta::findTimeZoneID(*id); if (uid) { gZoneIdTrie->put(uid, const_cast(uid), status); @@ -2799,7 +2824,7 @@ static void U_CALLCONV initShortZoneIdTrie(UErrorCode &status) { status = U_MEMORY_ALLOCATION_ERROR; } else { const UnicodeString *id; - while ((id = tzenum->snext(status))) { + while ((id = tzenum->snext(status)) != NULL) { const UChar* uID = ZoneMeta::findTimeZoneID(*id); const UChar* shortID = ZoneMeta::getShortID(*id); if (shortID && uID) { diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index b14e9835d9ab97..c2e685272e9b36 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -615,7 +615,7 @@ TZGNCore::formatGenericNonLocationName(const TimeZone& tz, UTimeZoneGenericNameT UErrorCode status = U_ZERO_ERROR; UBool useStandard = FALSE; int32_t raw, sav; - UChar tmpNameBuf[64]; + UChar tmpNameBuf[ZONE_NAME_U16_MAX]; tz.getOffset(date, FALSE, raw, sav, status); if (U_FAILURE(status)) { @@ -683,7 +683,7 @@ TZGNCore::formatGenericNonLocationName(const TimeZone& tz, UTimeZoneGenericNameT // for some meta zones in some locales. This looks like a data bugs. // For now, we check if the standard name is different from its generic // name below. - UChar genNameBuf[64]; + UChar genNameBuf[ZONE_NAME_U16_MAX]; UnicodeString mzGenericName(genNameBuf, 0, UPRV_LENGTHOF(genNameBuf)); fTimeZoneNames->getMetaZoneDisplayName(mzID, nameType, mzGenericName); if (stdName.caseCompare(mzGenericName, 0) == 0) { @@ -856,7 +856,7 @@ TZGNCore::loadStrings(const UnicodeString& tzCanonicalID) { }; StringEnumeration *mzIDs = fTimeZoneNames->getAvailableMetaZoneIDs(tzCanonicalID, status); - while ((mzID = mzIDs->snext(status))) { + while ((mzID = mzIDs->snext(status)) != NULL) { if (U_FAILURE(status)) { break; } @@ -1044,7 +1044,7 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); if (U_SUCCESS(status)) { const UnicodeString *tzID; - while ((tzID = tzIDs->snext(status))) { + while ((tzID = tzIDs->snext(status)) != NULL) { if (U_FAILURE(status)) { break; } @@ -1164,7 +1164,7 @@ static void sweepCache() { const UHashElement* elem; double now = (double)uprv_getUTCtime(); - while ((elem = uhash_nextElement(gTZGNCoreCache, &pos))) { + while ((elem = uhash_nextElement(gTZGNCoreCache, &pos)) != NULL) { TZGNCoreRef *entry = (TZGNCoreRef *)elem->value.pointer; if (entry->refCount <= 0 && (now - entry->lastAccess) > CACHE_EXPIRATION) { // delete this entry diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index d00d7e114543bf..ef04b31c1357f4 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -18,6 +18,7 @@ #include "unicode/strenum.h" #include "unicode/ustring.h" #include "unicode/timezone.h" +#include "unicode/utf16.h" #include "tznames_impl.h" #include "cmemory.h" @@ -69,7 +70,7 @@ enum UTimeZoneNameTypeIndex { UTZNM_INDEX_SHORT_DAYLIGHT, UTZNM_INDEX_COUNT }; -static const UChar* EMPTY_NAMES[UTZNM_INDEX_COUNT] = {0,0,0,0,0,0,0}; +static const UChar* const EMPTY_NAMES[UTZNM_INDEX_COUNT] = {0,0,0,0,0,0,0}; U_CDECL_BEGIN static UBool U_CALLCONV tzdbTimeZoneNames_cleanup(void) { @@ -411,25 +412,29 @@ TextTrieMap::search(CharacterNode *node, const UnicodeString &text, int32_t star return; } } - UChar32 c = text.char32At(index); if (fIgnoreCase) { - // size of character may grow after fold operation - UnicodeString tmp(c); + // for folding we need to get a complete code point. + // size of character may grow after fold operation; + // then we need to get result as UTF16 code units. + UChar32 c32 = text.char32At(index); + index += U16_LENGTH(c32); + UnicodeString tmp(c32); tmp.foldCase(); int32_t tmpidx = 0; while (tmpidx < tmp.length()) { - c = tmp.char32At(tmpidx); + UChar c = tmp.charAt(tmpidx++); node = getChildNode(node, c); if (node == NULL) { break; } - tmpidx = tmp.moveIndex32(tmpidx, 1); } } else { + // here we just get the next UTF16 code unit + UChar c = text.charAt(index++); node = getChildNode(node, c); } if (node != NULL) { - search(node, text, start, index+1, handler, status); + search(node, text, start, index, handler, status); } } @@ -1070,7 +1075,7 @@ TimeZoneNamesImpl::loadStrings(const UnicodeString& tzCanonicalID, UErrorCode& s U_ASSERT(!mzIDs.isNull()); const UnicodeString *mzID; - while ((mzID = mzIDs->snext(status)) && U_SUCCESS(status)) { + while (((mzID = mzIDs->snext(status)) != NULL) && U_SUCCESS(status)) { loadMetaZoneNames(*mzID, status); } } @@ -1651,7 +1656,7 @@ void TimeZoneNamesImpl::internalLoadAllDisplayNames(UErrorCode& status) { StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration( UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); if (U_SUCCESS(status)) { - while ((id = tzIDs->snext(status))) { + while ((id = tzIDs->snext(status)) != NULL) { if (U_FAILURE(status)) { break; } @@ -2056,6 +2061,9 @@ static void U_CALLCONV prepareFind(UErrorCode &status) { if (U_SUCCESS(status)) { while ((mzID = mzIDs->snext(status)) && U_SUCCESS(status)) { const TZDBNames *names = TZDBTimeZoneNames::getMetaZoneNames(*mzID, status); + if (U_FAILURE(status)) { + break; + } if (names == NULL) { continue; } @@ -2187,9 +2195,11 @@ TZDBTimeZoneNames::getMetaZoneDisplayName(const UnicodeString& mzID, UErrorCode status = U_ZERO_ERROR; const TZDBNames *tzdbNames = TZDBTimeZoneNames::getMetaZoneNames(mzID, status); if (U_SUCCESS(status)) { - const UChar *s = tzdbNames->getName(type); - if (s != NULL) { - name.setTo(TRUE, s, -1); + if (tzdbNames != NULL) { + const UChar *s = tzdbNames->getName(type); + if (s != NULL) { + name.setTo(TRUE, s, -1); + } } } diff --git a/deps/icu-small/source/i18n/tznames_impl.h b/deps/icu-small/source/i18n/tznames_impl.h index 9251f9ef470f6e..4db036e7475e35 100644 --- a/deps/icu-small/source/i18n/tznames_impl.h +++ b/deps/icu-small/source/i18n/tznames_impl.h @@ -27,6 +27,9 @@ #include "uvector.h" #include "umutex.h" +// Some zone display names involving supplementary characters can be over 50 chars, 100 UTF-16 code units, 200 UTF-8 bytes +#define ZONE_NAME_U16_MAX 128 + U_NAMESPACE_BEGIN /* @@ -246,6 +249,8 @@ class TZDBTimeZoneNames : public TimeZoneNames { TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const; + // When TZDBNames for the metazone is not available, this method returns NULL, + // but does NOT set U_MISSING_RESOURCE_ERROR to status. static const TZDBNames* getMetaZoneNames(const UnicodeString& mzId, UErrorCode& status); private: diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 35a8a23e90c22a..40a5c36d87a9f7 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -26,6 +26,7 @@ as the functions are suppose to be called. It's usually best to have child dependencies called first. */ typedef enum ECleanupI18NType { UCLN_I18N_START = -1, + UCLN_I18N_CURRENCY_SPACING, UCLN_I18N_SPOOF, UCLN_I18N_SPOOFDATA, UCLN_I18N_TRANSLITERATOR, diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index d1597021c3ee47..0f1d6d23b132ae 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -62,7 +62,7 @@ namespace { static const UChar *rootRules = NULL; static int32_t rootRulesLength = 0; static UResourceBundle *rootBundle = NULL; -static UInitOnce gInitOnce = U_INITONCE_INITIALIZER; +static UInitOnce gInitOnceUcolRes = U_INITONCE_INITIALIZER; } // namespace @@ -74,7 +74,7 @@ ucol_res_cleanup() { rootRulesLength = 0; ures_close(rootBundle); rootBundle = NULL; - gInitOnce.reset(); + gInitOnceUcolRes.reset(); return TRUE; } @@ -97,7 +97,7 @@ U_CDECL_END void CollationLoader::appendRootRules(UnicodeString &s) { UErrorCode errorCode = U_ZERO_ERROR; - umtx_initOnce(gInitOnce, CollationLoader::loadRootRules, errorCode); + umtx_initOnce(gInitOnceUcolRes, CollationLoader::loadRootRules, errorCode); if(U_SUCCESS(errorCode)) { s.append(rootRules, rootRulesLength); } @@ -110,7 +110,7 @@ CollationLoader::loadRules(const char *localeID, const char *collationType, U_ASSERT(collationType != NULL && *collationType != 0); // Copy the type for lowercasing. char type[16]; - int32_t typeLength = uprv_strlen(collationType); + int32_t typeLength = static_cast(uprv_strlen(collationType)); if(typeLength >= UPRV_LENGTHOF(type)) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; @@ -318,7 +318,7 @@ CollationLoader::loadFromCollations(UErrorCode &errorCode) { // Load the collations/type tailoring, with type fallback. LocalUResourceBundlePointer localData( ures_getByKeyWithFallback(collations, type, NULL, &errorCode)); - int32_t typeLength = uprv_strlen(type); + int32_t typeLength = static_cast(uprv_strlen(type)); if(errorCode == U_MISSING_RESOURCE_ERROR) { errorCode = U_USING_DEFAULT_WARNING; typeFallback = TRUE; diff --git a/deps/icu-small/source/i18n/ucol_sit.cpp b/deps/icu-small/source/i18n/ucol_sit.cpp index cf507f61ed3521..765613084f84e1 100644 --- a/deps/icu-small/source/i18n/ucol_sit.cpp +++ b/deps/icu-small/source/i18n/ucol_sit.cpp @@ -465,8 +465,15 @@ ucol_prepareShortStringOpen( const char *definition, UResourceBundle *collElem = NULL; char keyBuffer[256]; // if there is a keyword, we pick it up and try to get elements - if(!uloc_getKeywordValue(buffer, "collation", keyBuffer, 256, status)) { - // no keyword. we try to find the default setting, which will give us the keyword value + int32_t keyLen = uloc_getKeywordValue(buffer, "collation", keyBuffer, sizeof(keyBuffer), status); + // Treat too long a value as no keyword. + if(keyLen >= (int32_t)sizeof(keyBuffer)) { + keyLen = 0; + *status = U_ZERO_ERROR; + } + if(keyLen == 0) { + // no keyword + // we try to find the default setting, which will give us the keyword value UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, status); if(U_SUCCESS(*status)) { int32_t defaultKeyLen = 0; diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index a385eb487d55d3..7f6ba9532feebe 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -321,7 +321,7 @@ umsg_applyPattern(UMessageFormat *fmt, if(status ==NULL||U_FAILURE(*status)){ return ; } - if(fmt==NULL||pattern==NULL||patternLength<-1){ + if(fmt==NULL || (pattern==NULL && patternLength!=0) || patternLength<-1) { *status=U_ILLEGAL_ARGUMENT_ERROR; return ; } @@ -329,10 +329,8 @@ umsg_applyPattern(UMessageFormat *fmt, if(parseError==NULL){ parseError = &tErr; } - if(patternLength<-1){ - patternLength=u_strlen(pattern); - } + // UnicodeString(pattern, -1) calls u_strlen(). ((MessageFormat*)fmt)->applyPattern(UnicodeString(pattern,patternLength),*parseError,*status); } diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h index e43c181c8a3368..48021534b422f6 100644 --- a/deps/icu-small/source/i18n/unicode/calendar.h +++ b/deps/icu-small/source/i18n/unicode/calendar.h @@ -1741,7 +1741,7 @@ class U_I18N_API Calendar : public UObject { * reflects local zone wall time. * @internal */ - int32_t computeMillisInDay(); + double computeMillisInDay(); /** * This method can assume EXTENDED_YEAR has been set. @@ -1752,7 +1752,7 @@ class U_I18N_API Calendar : public UObject { * when this function fails. * @internal */ - int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec); + int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec); /** diff --git a/deps/icu-small/source/i18n/unicode/coll.h b/deps/icu-small/source/i18n/unicode/coll.h index 7e467df80e0409..d03570509ecebb 100644 --- a/deps/icu-small/source/i18n/unicode/coll.h +++ b/deps/icu-small/source/i18n/unicode/coll.h @@ -672,7 +672,7 @@ class U_I18N_API Collator : public UObject { UErrorCode& status); /** - * Get name of the object for the desired Locale, in the desired langauge + * Get name of the object for the desired Locale, in the desired language * @param objectLocale must be from getAvailableLocales * @param displayLocale specifies the desired locale for output * @param name the fill-in parameter of the return value @@ -685,7 +685,7 @@ class U_I18N_API Collator : public UObject { UnicodeString& name); /** - * Get name of the object for the desired Locale, in the langauge of the + * Get name of the object for the desired Locale, in the language of the * default locale. * @param objectLocale must be from getAvailableLocales * @param name the fill-in parameter of the return value diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index b72dc5e68dd645..e7e0dc72da8292 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -36,6 +36,12 @@ U_NAMESPACE_BEGIN */ class U_I18N_API CurrencyUnit: public MeasureUnit { public: + /** + * Default constructor. Initializes currency code to "XXX" (no currency). + * @draft ICU 60 + */ + CurrencyUnit(); + /** * Construct an object with the given ISO currency code. * @param isoCode the 3-letter ISO 4217 currency code; must not be @@ -52,6 +58,18 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { */ CurrencyUnit(const CurrencyUnit& other); +#ifndef U_HIDE_DRAFT_API + /** + * Copy constructor from MeasureUnit. This constructor allows you to + * restore a CurrencyUnit that was sliced to MeasureUnit. + * + * @param measureUnit The MeasureUnit to copy from. + * @param ec Set to a failing value if the MeasureUnit is not a currency. + * @draft ICU 60 + */ + CurrencyUnit(const MeasureUnit& measureUnit, UErrorCode &ec); +#endif /* U_HIDE_DRAFT_API */ + /** * Assignment operator * @stable ICU 3.0 diff --git a/deps/icu-small/source/i18n/unicode/dcfmtsym.h b/deps/icu-small/source/i18n/unicode/dcfmtsym.h index 3a502d0ec03d1c..4dc6f950f294ca 100644 --- a/deps/icu-small/source/i18n/unicode/dcfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dcfmtsym.h @@ -34,6 +34,7 @@ #include "unicode/uobject.h" #include "unicode/locid.h" +#include "unicode/numsys.h" #include "unicode/unum.h" #include "unicode/unistr.h" @@ -184,6 +185,26 @@ class U_I18N_API DecimalFormatSymbols : public UObject { */ DecimalFormatSymbols(const Locale& locale, UErrorCode& status); +#ifndef U_HIDE_DRAFT_API + /** + * Creates a DecimalFormatSymbols instance for the given locale with digits and symbols + * corresponding to the given NumberingSystem. + * + * This constructor behaves equivalently to the normal constructor called with a locale having a + * "numbers=xxxx" keyword specifying the numbering system by name. + * + * In this constructor, the NumberingSystem argument will be used even if the locale has its own + * "numbers=xxxx" keyword. + * + * @param locale The locale to get symbols for. + * @param ns The numbering system. + * @param status Input/output parameter, set to success or + * failure code upon return. + * @draft ICU 60 + */ + DecimalFormatSymbols(const Locale& locale, const NumberingSystem& ns, UErrorCode& status); +#endif /* U_HIDE_DRAFT_API */ + /** * Create a DecimalFormatSymbols object for the default locale. * This constructor will not fail. If the resource file data is @@ -346,8 +367,11 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @param success Input/output parameter, set to success or * failure code upon return. * @param useLastResortData determine if use last resort data + * @param ns The NumberingSystem to use; otherwise, fall + * back to the locale. */ - void initialize(const Locale& locale, UErrorCode& success, UBool useLastResortData = FALSE); + void initialize(const Locale& locale, UErrorCode& success, + UBool useLastResortData = FALSE, const NumberingSystem* ns = nullptr); /** * Initialize the symbols with default values. diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index 1deff5bf921c87..790053636d5957 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -668,28 +668,6 @@ template class U_I18N_API EnumSet - *

Sample code

- * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample - *

+ *

+ *

Sample code

+ * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 + * \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample + *

*/ UDateTimePatternConflict addPattern(const UnicodeString& pattern, UBool override, @@ -312,11 +313,11 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return bestPattern * The best pattern found from the given skeleton. * @stable ICU 3.8 - *

- *

Sample code

- * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample - *

+ *

+ *

Sample code

+ * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 + * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample + *

*/ UnicodeString getBestPattern(const UnicodeString& skeleton, UErrorCode& status); @@ -360,11 +361,11 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @return pattern adjusted to match the skeleton fields widths and subtypes. * @stable ICU 3.8 - *

- *

Sample code

- * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample - *

+ *

+ *

Sample code

+ * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 + * \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample + *

*/ UnicodeString replaceFieldTypes(const UnicodeString& pattern, const UnicodeString& skeleton, @@ -526,9 +527,8 @@ class U_I18N_API DateTimePatternGenerator : public UObject { enum { kDTPGNoFlags = 0, kDTPGFixFractionalSeconds = 1, - kDTPGSkeletonUsesCapJ = 2, - kDTPGSkeletonUsesLowB = 3, - kDTPGSkeletonUsesCapB = 4 + kDTPGSkeletonUsesCapJ = 2 + // with #13183, no longer need flags for b, B }; void initData(const Locale &locale, UErrorCode &status); @@ -546,6 +546,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { UDateTimePatternField getAppendNameNumber(const char* field) const; UnicodeString& getMutableAppendItemName(UDateTimePatternField field); void getAppendName(UDateTimePatternField field, UnicodeString& value); + UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status); int32_t getCanonicalIndex(const UnicodeString& field); const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, const PtnSkeleton** specifiedSkeletonPtr = 0); UnicodeString adjustFieldTypes(const UnicodeString& pattern, const PtnSkeleton* specifiedSkeleton, int32_t flags, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS); diff --git a/deps/icu-small/source/i18n/unicode/fpositer.h b/deps/icu-small/source/i18n/unicode/fpositer.h index 898b66ceea50a8..8e9d69c547f849 100644 --- a/deps/icu-small/source/i18n/unicode/fpositer.h +++ b/deps/icu-small/source/i18n/unicode/fpositer.h @@ -47,6 +47,13 @@ U_NAMESPACE_BEGIN class UVector32; +// Forward declaration for number formatting: +namespace number { +namespace impl { +class NumberStringBuilder; +} +} + /** * FieldPositionIterator returns the field ids and their start/limit positions generated * by a call to Format::format. See Format, NumberFormat, DecimalFormat. @@ -99,8 +106,6 @@ class U_I18N_API FieldPositionIterator : public UObject { UBool next(FieldPosition& fp); private: - friend class FieldPositionIteratorHandler; - /** * Sets the data used by the iterator, and resets the position. * Returns U_ILLEGAL_ARGUMENT_ERROR in status if the data is not valid @@ -108,6 +113,9 @@ class U_I18N_API FieldPositionIterator : public UObject { */ void setData(UVector32 *adopt, UErrorCode& status); + friend class FieldPositionIteratorHandler; + friend class number::impl::NumberStringBuilder; + UVector32 *data; int32_t pos; }; diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index dcd4f423430a05..251fd213b50da7 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -210,7 +210,6 @@ class U_I18N_API MeasureFormat : public Format { FieldPosition &pos, UErrorCode &status) const; -#ifndef U_HIDE_DRAFT_API /** * Gets the display name of the specified {@link MeasureUnit} corresponding to the current * locale and format width. @@ -220,10 +219,9 @@ class U_I18N_API MeasureFormat : public Format { * {@link MeasureFormat#getInstance}, or null if there is no display name available * for the specified unit. * - * @draft ICU 58 + * @stable ICU 58 */ UnicodeString getUnitDisplayName(const MeasureUnit& unit, UErrorCode &status) const; -#endif /* U_HIDE_DRAFT_API */ /** diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 1cb97ed549a121..08c8d6f588dac7 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -40,11 +40,10 @@ class U_I18N_API MeasureUnit: public UObject { /** * Default constructor. + * Populates the instance with the base dimensionless unit. * @stable ICU 3.0 */ - MeasureUnit() : fTypeId(0), fSubTypeId(0) { - fCurrency[0] = 0; - } + MeasureUnit(); /** * Copy constructor. @@ -149,7 +148,7 @@ class U_I18N_API MeasureUnit: public UObject { *

      * .   Base* polymorphic_pointer = createPolymorphicObject();
      * .   if (polymorphic_pointer->getDynamicClassID() ==
-     * .       erived::getStaticClassID()) ...
+     * .       Derived::getStaticClassID()) ...
      * 
* @return The class ID for all objects of this class. * @stable ICU 53 @@ -1317,6 +1316,12 @@ class U_I18N_API MeasureUnit: public UObject { */ void initCurrency(const char *isoCurrency); + /** + * For ICU use only. + * @internal + */ + void initNoUnit(const char *subtype); + #endif /* U_HIDE_INTERNAL_API */ private: diff --git a/deps/icu-small/source/i18n/unicode/nounit.h b/deps/icu-small/source/i18n/unicode/nounit.h new file mode 100644 index 00000000000000..04fc84b33aa338 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/nounit.h @@ -0,0 +1,111 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* + ******************************************************************************* + * Copyright (C) 2009-2017, International Business Machines Corporation, * + * Google, and others. All Rights Reserved. * + ******************************************************************************* + */ + +#ifndef __NOUNIT_H__ +#define __NOUNIT_H__ + + +/** + * \file + * \brief C++ API: units for percent and permille + */ + + +#include "unicode/measunit.h" + +#if !UCONFIG_NO_FORMATTING + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_DRAFT_API +/** + * Dimensionless unit for percent and permille. + * @see NumberFormatter + * @draft ICU 60 + */ +class U_I18N_API NoUnit: public MeasureUnit { +public: + /** + * Returns an instance for the base unit (dimensionless and no scaling). + * + * @return a NoUnit instance + * @draft ICU 60 + */ + static NoUnit U_EXPORT2 base(); + + /** + * Returns an instance for percent, or 1/100 of a base unit. + * + * @return a NoUnit instance + * @draft ICU 60 + */ + static NoUnit U_EXPORT2 percent(); + + /** + * Returns an instance for permille, or 1/1000 of a base unit. + * + * @return a NoUnit instance + * @draft ICU 60 + */ + static NoUnit U_EXPORT2 permille(); + + /** + * Copy operator. + * @draft ICU 60 + */ + NoUnit(const NoUnit& other); + + /** + * Return a polymorphic clone of this object. The result will + * have the same class as returned by getDynamicClassID(). + * @draft ICU 60 + */ + virtual UObject* clone() const; + + /** + * Returns a unique class ID for this object POLYMORPHICALLY. + * This method implements a simple form of RTTI used by ICU. + * @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. + * @draft ICU 60 + */ + virtual UClassID getDynamicClassID() const; + + /** + * Returns the class ID for this class. This is used to compare to + * the return value of getDynamicClassID(). + * @return The class ID for all objects of this class. + * @draft ICU 60 + */ + static UClassID U_EXPORT2 getStaticClassID(); + + /** + * Destructor. + * @draft ICU 60 + */ + virtual ~NoUnit(); + +private: + /** + * Constructor + * @internal (private) + */ + NoUnit(const char* subtype); + +}; +#endif /* U_HIDE_DRAFT_API */ + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif // __NOUNIT_H__ +//eof +// diff --git a/deps/icu-small/source/i18n/unicode/numberformatter.h b/deps/icu-small/source/i18n/unicode/numberformatter.h new file mode 100644 index 00000000000000..4a11c2f9157e61 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/numberformatter.h @@ -0,0 +1,1998 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING +#ifndef __NUMBERFORMATTER_H__ +#define __NUMBERFORMATTER_H__ + +#include "unicode/appendable.h" +#include "unicode/dcfmtsym.h" +#include "unicode/currunit.h" +#include "unicode/fieldpos.h" +#include "unicode/fpositer.h" +#include "unicode/measunit.h" +#include "unicode/nounit.h" +#include "unicode/plurrule.h" +#include "unicode/ucurr.h" +#include "unicode/unum.h" + +#ifndef U_HIDE_DRAFT_API + +/** + * \file + * \brief C++ API: Library for localized number formatting introduced in ICU 60. + * + * This library was introduced in ICU 60 to simplify the process of formatting localized number strings. + * Basic usage examples: + * + *
+ * // Most basic usage:
+ * NumberFormatter::withLocale(...).format(123).toString();  // 1,234 in en-US
+ *
+ * // Custom notation, unit, and rounding strategy:
+ * NumberFormatter::with()
+ *     .notation(Notation::compactShort())
+ *     .unit(CurrencyUnit("EUR", status))
+ *     .rounding(Rounder::maxDigits(2))
+ *     .locale(...)
+ *     .format(1234)
+ *     .toString();  // €1.2K in en-US
+ *
+ * // Create a formatter in a singleton for use later:
+ * static const LocalizedNumberFormatter formatter = NumberFormatter::withLocale(...)
+ *     .unit(NoUnit::percent())
+ *     .rounding(Rounder::fixedFraction(3));
+ * formatter.format(5.9831).toString();  // 5.983% in en-US
+ *
+ * // Create a "template" in a singleton but without setting a locale until the call site:
+ * static const UnlocalizedNumberFormatter template = NumberFormatter::with()
+ *     .sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS)
+ *     .adoptUnit(MeasureUnit::createMeter(status))
+ *     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME);
+ * template.locale(...).format(1234).toString();  // +1,234 meters in en-US
+ * 
+ * + *

+ * This API offers more features than DecimalFormat and is geared toward new users of ICU. + * + *

+ * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration method has no + * effect on the receiving instance; you must store and use the new number formatter instance it returns instead. + * + *

+ * UnlocalizedNumberFormatter formatter = UnlocalizedNumberFormatter::with().notation(Notation::scientific());
+ * formatter.rounding(Rounder.maxFraction(2)); // does nothing!
+ * formatter.locale(Locale.getEnglish()).format(9.8765).toString(); // prints "9.8765E0", not "9.88E0"
+ * 
+ * + *

+ * This API is based on the fluent design pattern popularized by libraries such as Google's Guava. For + * extensive details on the design of this API, read the design doc. + * + * @author Shane Carr + */ + +/** + * An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123 + * meters in en-CA: + * + *

+ *

    + *
  • NARROW*: "$123.00" and "123 m" + *
  • SHORT: "US$ 123.00" and "123 m" + *
  • FULL_NAME: "123.00 US dollars" and "123 meters" + *
  • ISO_CODE: "USD 123.00" and undefined behavior + *
  • HIDDEN: "123.00" and "123" + *
+ * + *

+ * * The narrow format for currencies is not currently supported; this is a known issue that will be fixed in a + * future version. See #11666 for more information. + * + *

+ * This enum is similar to {@link com.ibm.icu.text.MeasureFormat.FormatWidth}. + * + * @draft ICU 60 + */ +typedef enum UNumberUnitWidth { + /** + * Print an abbreviated version of the unit name. Similar to SHORT, but always use the shortest available + * abbreviation or symbol. This option can be used when the context hints at the identity of the unit. For more + * information on the difference between NARROW and SHORT, see SHORT. + * + *

+ * In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤" placeholder for + * currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_NARROW, + + /** + * Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider abbreviation or + * symbol when there may be ambiguity. This is the default behavior. + * + *

+ * For example, in es-US, the SHORT form for Fahrenheit is "{0} °F", but the NARROW form is "{0}°", + * since Fahrenheit is the customary unit for temperature in that locale. + * + *

+ * In CLDR, this option corresponds to the "Short" format for measure units and the "¤" placeholder for + * currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_SHORT, + + /** + * Print the full name of the unit, without any abbreviations. + * + *

+ * In CLDR, this option corresponds to the default format for measure units and the "¤¤¤" placeholder for + * currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_FULL_NAME, + + /** + * Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The behavior of this + * option is currently undefined for use with measure units. + * + *

+ * In CLDR, this option corresponds to the "¤¤" placeholder for currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_ISO_CODE, + + /** + * Format the number according to the specified unit, but do not display the unit. For currencies, apply + * monetary symbols and formats as with SHORT, but omit the currency symbol. For measure units, the behavior is + * equivalent to not specifying the unit at all. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_HIDDEN, + + /** + * One more than the highest UNumberUnitWidth value. + * + * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420. + */ + UNUM_UNIT_WIDTH_COUNT +} UNumberUnitWidth; + +/** + * An enum declaring how to denote positive and negative numbers. Example outputs when formatting 123 and -123 in + * en-US: + * + *

+ *

    + *
  • AUTO: "123", "-123" + *
  • ALWAYS: "+123", "-123" + *
  • NEVER: "123", "123" + *
  • ACCOUNTING: "$123", "($123)" + *
  • ACCOUNTING_ALWAYS: "+$123", "($123)" + *
+ * + *

+ * The exact format, including the position and the code point of the sign, differ by locale. + * + * @draft ICU 60 + */ +typedef enum UNumberSignDisplay { + /** + * Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is the default + * behavior. + * + * @draft ICU 60 + */ + UNUM_SIGN_AUTO, + + /** + * Show the minus sign on negative numbers and the plus sign on positive numbers. + * + * @draft ICU 60 + */ + UNUM_SIGN_ALWAYS, + + /** + * Do not show the sign on positive or negative numbers. + * + * @draft ICU 60 + */ + UNUM_SIGN_NEVER, + + /** + * Use the locale-dependent accounting format on negative numbers, and do not show the sign on positive numbers. + * + *

+ * The accounting format is defined in CLDR and varies by locale; in many Western locales, the format is a pair + * of parentheses around the number. + * + *

+ * Note: Since CLDR defines the accounting format in the monetary context only, this option falls back to the + * AUTO sign display strategy when formatting without a currency unit. This limitation may be lifted in the + * future. + * + * @draft ICU 60 + */ + UNUM_SIGN_ACCOUNTING, + + /** + * Use the locale-dependent accounting format on negative numbers, and show the plus sign on positive numbers. + * For more information on the accounting format, see the ACCOUNTING sign display strategy. + * + * @draft ICU 60 + */ + UNUM_SIGN_ACCOUNTING_ALWAYS, + + /** + * One more than the highest UNumberSignDisplay value. + * + * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420. + */ + UNUM_SIGN_COUNT +} UNumberSignDisplay; + +/** + * An enum declaring how to render the decimal separator. + * + *

+ *

    + *
  • UNUM_DECIMAL_SEPARATOR_AUTO: "1", "1.1" + *
  • UNUM_DECIMAL_SEPARATOR_ALWAYS: "1.", "1.1" + *
+ */ +typedef enum UNumberDecimalSeparatorDisplay { + /** + * Show the decimal separator when there are one or more digits to display after the separator, and do not show + * it otherwise. This is the default behavior. + * + * @draft ICU 60 + */ + UNUM_DECIMAL_SEPARATOR_AUTO, + + /** + * Always show the decimal separator, even if there are no digits to display after the separator. + * + * @draft ICU 60 + */ + UNUM_DECIMAL_SEPARATOR_ALWAYS, + + /** + * One more than the highest UNumberDecimalSeparatorDisplay value. + * + * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420. + */ + UNUM_DECIMAL_SEPARATOR_COUNT +} UNumberDecimalMarkDisplay; + +U_NAMESPACE_BEGIN namespace number { // icu::number + +// Forward declarations: +class UnlocalizedNumberFormatter; +class LocalizedNumberFormatter; +class FormattedNumber; +class Notation; +class ScientificNotation; +class Rounder; +class FractionRounder; +class CurrencyRounder; +class IncrementRounder; +class Grouper; +class IntegerWidth; + +namespace impl { + +// Forward declarations: +class Padder; +struct MacroProps; +struct MicroProps; +class DecimalQuantity; +struct NumberFormatterResults; +class NumberFormatterImpl; +struct ParsedPatternInfo; +class ScientificModifier; +class MultiplierProducer; +class MutablePatternModifier; +class LongNameHandler; +class ScientificHandler; +class CompactHandler; +class Modifier; +class NumberStringBuilder; + +} // namespace impl + +// Reserve extra names in case they are added as classes in the future: +typedef Notation CompactNotation; +typedef Notation SimpleNotation; + +/** + * A class that defines the notation style to be used when formatting numbers in NumberFormatter. + * + * @draft ICU 60 + */ +class U_I18N_API Notation : public UMemory { + public: + /** + * Print the number using scientific notation (also known as scientific form, standard index form, or standard form + * in the UK). The format for scientific notation varies by locale; for example, many Western locales display the + * number in the form "#E0", where the number is displayed with one digit before the decimal separator, zero or more + * digits after the decimal separator, and the corresponding power of 10 displayed after the "E". + * + *

+ * Example outputs in en-US when printing 8.765E4 through 8.765E-3: + * + *

+     * 8.765E4
+     * 8.765E3
+     * 8.765E2
+     * 8.765E1
+     * 8.765E0
+     * 8.765E-1
+     * 8.765E-2
+     * 8.765E-3
+     * 0E0
+     * 
+ * + * @return A ScientificNotation for chaining or passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static ScientificNotation scientific(); + + /** + * Print the number using engineering notation, a variant of scientific notation in which the exponent must be + * divisible by 3. + * + *

+ * Example outputs in en-US when printing 8.765E4 through 8.765E-3: + * + *

+     * 87.65E3
+     * 8.765E3
+     * 876.5E0
+     * 87.65E0
+     * 8.765E0
+     * 876.5E-3
+     * 87.65E-3
+     * 8.765E-3
+     * 0E0
+     * 
+ * + * @return A ScientificNotation for chaining or passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static ScientificNotation engineering(); + + /** + * Print the number using short-form compact notation. + * + *

+ * Compact notation, defined in Unicode Technical Standard #35 Part 3 Section 2.4.1, prints numbers with + * localized prefixes or suffixes corresponding to different powers of ten. Compact notation is similar to + * engineering notation in how it scales numbers. + * + *

+ * Compact notation is ideal for displaying large numbers (over ~1000) to humans while at the same time minimizing + * screen real estate. + * + *

+ * In short form, the powers of ten are abbreviated. In en-US, the abbreviations are "K" for thousands, "M" + * for millions, "B" for billions, and "T" for trillions. Example outputs in en-US when printing 8.765E7 + * through 8.765E0: + * + *

+     * 88M
+     * 8.8M
+     * 876K
+     * 88K
+     * 8.8K
+     * 876
+     * 88
+     * 8.8
+     * 
+ * + *

+ * When compact notation is specified without an explicit rounding strategy, numbers are rounded off to the closest + * integer after scaling the number by the corresponding power of 10, but with a digit shown after the decimal + * separator if there is only one digit before the decimal separator. The default compact notation rounding strategy + * is equivalent to: + * + *

+     * Rounder.integer().withMinDigits(2)
+     * 
+ * + * @return A CompactNotation for passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static CompactNotation compactShort(); + + /** + * Print the number using long-form compact notation. For more information on compact notation, see + * {@link #compactShort}. + * + *

+ * In long form, the powers of ten are spelled out fully. Example outputs in en-US when printing 8.765E7 + * through 8.765E0: + * + *

+     * 88 million
+     * 8.8 million
+     * 876 thousand
+     * 88 thousand
+     * 8.8 thousand
+     * 876
+     * 88
+     * 8.8
+     * 
+ * + * @return A CompactNotation for passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static CompactNotation compactLong(); + + /** + * Print the number using simple notation without any scaling by powers of ten. This is the default behavior. + * + *

+ * Since this is the default behavior, this method needs to be called only when it is necessary to override a + * previous setting. + * + *

+ * Example outputs in en-US when printing 8.765E7 through 8.765E0: + * + *

+     * 87,650,000
+     * 8,765,000
+     * 876,500
+     * 87,650
+     * 8,765
+     * 876.5
+     * 87.65
+     * 8.765
+     * 
+ * + * @return A SimpleNotation for passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static SimpleNotation simple(); + + private: + enum NotationType { + NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR + } fType; + + union NotationUnion { + // For NTN_SCIENTIFIC + struct ScientificSettings { + int8_t fEngineeringInterval; + bool fRequireMinInt; + int8_t fMinExponentDigits; + UNumberSignDisplay fExponentSignDisplay; + } scientific; + + // For NTN_COMPACT + UNumberCompactStyle compactStyle; + + // For NTN_ERROR + UErrorCode errorCode; + } fUnion; + + typedef NotationUnion::ScientificSettings ScientificSettings; + + Notation(const NotationType &type, const NotationUnion &union_) : fType(type), fUnion(union_) {} + + Notation(UErrorCode errorCode) : fType(NTN_ERROR) { + fUnion.errorCode = errorCode; + } + + Notation() : fType(NTN_SIMPLE), fUnion() {} + + UBool copyErrorTo(UErrorCode &status) const { + if (fType == NTN_ERROR) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + // To allow MacroProps to initialize empty instances: + friend struct impl::MacroProps; + friend class ScientificNotation; + + // To allow implementation to access internal types: + friend class impl::NumberFormatterImpl; + friend class impl::ScientificModifier; + friend class impl::ScientificHandler; +}; + +/** + * A class that defines the scientific notation style to be used when formatting numbers in NumberFormatter. + * + *

+ * To create a ScientificNotation, use one of the factory methods in {@link Notation}. + * + * @draft ICU 60 + */ +class U_I18N_API ScientificNotation : public Notation { + public: + /** + * Sets the minimum number of digits to show in the exponent of scientific notation, padding with zeros if + * necessary. Useful for fixed-width display. + * + *

+ * For example, with minExponentDigits=2, the number 123 will be printed as "1.23E02" in en-US instead of + * the default "1.23E2". + * + * @param minExponentDigits + * The minimum number of digits to show in the exponent. + * @return A ScientificNotation, for chaining. + * @draft ICU 60 + */ + ScientificNotation withMinExponentDigits(int32_t minExponentDigits) const; + + /** + * Sets whether to show the sign on positive and negative exponents in scientific notation. The default is AUTO, + * showing the minus sign but not the plus sign. + * + *

+ * For example, with exponentSignDisplay=ALWAYS, the number 123 will be printed as "1.23E+2" in en-US + * instead of the default "1.23E2". + * + * @param exponentSignDisplay + * The strategy for displaying the sign in the exponent. + * @return A ScientificNotation, for chaining. + * @draft ICU 60 + */ + ScientificNotation withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const; + + private: + // Inherit constructor + using Notation::Notation; + + friend class Notation; +}; + +// Reserve extra names in case they are added as classes in the future: +typedef Rounder DigitRounder; + +/** + * A class that defines the rounding strategy to be used when formatting numbers in NumberFormatter. + * + *

+ * To create a Rounder, use one of the factory methods. + * + * @draft ICU 60 + */ +class U_I18N_API Rounder : public UMemory { + + public: + /** + * Show all available digits to full precision. + * + *

+ * NOTE: When formatting a double, this method, along with {@link #minFraction} and + * {@link #minDigits}, will trigger complex algorithm similar to Dragon4 to determine the low-order digits + * and the number of digits to display based on the value of the double. If the number of fraction places or + * significant digits can be bounded, consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize + * performance. For more information, read the following blog post. + * + *

+ * http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/ + * + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static Rounder unlimited(); + + /** + * Show numbers rounded if necessary to the nearest integer. + * + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder integer(); + + /** + * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator). + * Additionally, pad with zeros to ensure that this number of places are always shown. + * + *

+ * Example output with minMaxFractionPlaces = 3: + * + *

+ * 87,650.000
+ * 8,765.000
+ * 876.500
+ * 87.650
+ * 8.765
+ * 0.876
+ * 0.088
+ * 0.009
+ * 0.000 (zero) + * + *

+ * This method is equivalent to {@link #minMaxFraction} with both arguments equal. + * + * @param minMaxFractionPlaces + * The minimum and maximum number of numerals to display after the decimal separator (rounding if too + * long or padding with zeros if too short). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder fixedFraction(int32_t minMaxFractionPlaces); + + /** + * Always show at least a certain number of fraction places after the decimal separator, padding with zeros if + * necessary. Do not perform rounding (display numbers to their full precision). + * + *

+ * NOTE: If you are formatting doubles, see the performance note in {@link #unlimited}. + * + * @param minFractionPlaces + * The minimum number of numerals to display after the decimal separator (padding with zeros if + * necessary). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder minFraction(int32_t minFractionPlaces); + + /** + * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator). + * Unlike the other fraction rounding strategies, this strategy does not pad zeros to the end of the + * number. + * + * @param maxFractionPlaces + * The maximum number of numerals to display after the decimal mark (rounding if necessary). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder maxFraction(int32_t maxFractionPlaces); + + /** + * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator); + * in addition, always show at least a certain number of places after the decimal separator, padding with zeros if + * necessary. + * + * @param minFractionPlaces + * The minimum number of numerals to display after the decimal separator (padding with zeros if + * necessary). + * @param maxFractionPlaces + * The maximum number of numerals to display after the decimal separator (rounding if necessary). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces); + + /** + * Show numbers rounded if necessary to a certain number of significant digits or significant figures. Additionally, + * pad with zeros to ensure that this number of significant digits/figures are always shown. + * + *

+ * This method is equivalent to {@link #minMaxDigits} with both arguments equal. + * + * @param minMaxSignificantDigits + * The minimum and maximum number of significant digits to display (rounding if too long or padding with + * zeros if too short). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder fixedDigits(int32_t minMaxSignificantDigits); + + /** + * Always show at least a certain number of significant digits/figures, padding with zeros if necessary. Do not + * perform rounding (display numbers to their full precision). + * + *

+ * NOTE: If you are formatting doubles, see the performance note in {@link #unlimited}. + * + * @param minSignificantDigits + * The minimum number of significant digits to display (padding with zeros if too short). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder minDigits(int32_t minSignificantDigits); + + /** + * Show numbers rounded if necessary to a certain number of significant digits/figures. + * + * @param maxSignificantDigits + * The maximum number of significant digits to display (rounding if too long). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder maxDigits(int32_t maxSignificantDigits); + + /** + * Show numbers rounded if necessary to a certain number of significant digits/figures; in addition, always show at + * least a certain number of significant digits, padding with zeros if necessary. + * + * @param minSignificantDigits + * The minimum number of significant digits to display (padding with zeros if necessary). + * @param maxSignificantDigits + * The maximum number of significant digits to display (rounding if necessary). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder minMaxDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits); + + /** + * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For example, if the + * rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5. + * + *

+ * In order to ensure that numbers are padded to the appropriate number of fraction places, call + * withMinFraction() on the return value of this method. + * For example, to round to the nearest 0.5 and always display 2 numerals after the + * decimal separator (to display 1.2 as "1.00" and 1.3 as "1.50"), you can run: + * + *

+     * Rounder::increment(0.5).withMinFraction(2)
+     * 
+ * + * @param roundingIncrement + * The increment to which to round numbers. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static IncrementRounder increment(double roundingIncrement); + + /** + * Show numbers rounded and padded according to the rules for the currency unit. The most common rounding settings + * for currencies include Rounder.fixedFraction(2), Rounder.integer(), and + * Rounder.increment(0.05) for cash transactions ("nickel rounding"). + * + *

+ * The exact rounding details will be resolved at runtime based on the currency unit specified in the + * NumberFormatter chain. To round according to the rules for one currency while displaying the symbol for another + * currency, the withCurrency() method can be called on the return value of this method. + * + * @param currencyUsage + * Either STANDARD (for digital transactions) or CASH (for transactions where the rounding increment may + * be limited by the available denominations of cash or coins). + * @return A CurrencyRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static CurrencyRounder currency(UCurrencyUsage currencyUsage); + + /** + * Sets the rounding mode to use when picking the direction to round (up or down). Common values + * include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN. + * + * @param roundingMode + * The RoundingMode to use. + * @return A Rounder for passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMode(UNumberFormatRoundingMode roundingMode) const; + + private: + enum RounderType { + RND_BOGUS, + RND_NONE, + RND_FRACTION, + RND_SIGNIFICANT, + RND_FRACTION_SIGNIFICANT, + RND_INCREMENT, + RND_CURRENCY, + RND_PASS_THROUGH, + RND_ERROR + } fType; + + union RounderUnion { + struct FractionSignificantSettings { + // For RND_FRACTION, RND_SIGNIFICANT, and RND_FRACTION_SIGNIFICANT + int8_t fMinFrac; + int8_t fMaxFrac; + int8_t fMinSig; + int8_t fMaxSig; + } fracSig; + struct IncrementSettings { + double fIncrement; + int32_t fMinFrac; + } increment; // For RND_INCREMENT + UCurrencyUsage currencyUsage; // For RND_CURRENCY + UErrorCode errorCode; // For RND_ERROR + } fUnion; + + typedef RounderUnion::FractionSignificantSettings FractionSignificantSettings; + typedef RounderUnion::IncrementSettings IncrementSettings; + + UNumberFormatRoundingMode fRoundingMode; + + Rounder(const RounderType &type, const RounderUnion &union_, UNumberFormatRoundingMode roundingMode) + : fType(type), fUnion(union_), fRoundingMode(roundingMode) {} + + Rounder(UErrorCode errorCode) : fType(RND_ERROR) { + fUnion.errorCode = errorCode; + } + + Rounder() : fType(RND_BOGUS) {} + + bool isBogus() const { + return fType == RND_BOGUS; + } + + UBool copyErrorTo(UErrorCode &status) const { + if (fType == RND_ERROR) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + // On the parent type so that this method can be called internally on Rounder instances. + Rounder withCurrency(const CurrencyUnit ¤cy, UErrorCode &status) const; + + /** NON-CONST: mutates the current instance. */ + void setLocaleData(const CurrencyUnit ¤cy, UErrorCode &status); + + void apply(impl::DecimalQuantity &value, UErrorCode &status) const; + + /** Version of {@link #apply} that obeys minInt constraints. Used for scientific notation compatibility mode. */ + void apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode status); + + int32_t + chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer, + UErrorCode &status); + + static FractionRounder constructFraction(int32_t minFrac, int32_t maxFrac); + + static Rounder constructSignificant(int32_t minSig, int32_t maxSig); + + static Rounder + constructFractionSignificant(const FractionRounder &base, int32_t minSig, int32_t maxSig); + + static IncrementRounder constructIncrement(double increment, int32_t minFrac); + + static CurrencyRounder constructCurrency(UCurrencyUsage usage); + + static Rounder constructPassThrough(); + + // To allow MacroProps/MicroProps to initialize bogus instances: + friend struct impl::MacroProps; + friend struct impl::MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and other internal methods: + friend class impl::NumberFormatterImpl; + + // To give access to apply() and chooseMultiplierAndApply(): + friend class impl::MutablePatternModifier; + friend class impl::LongNameHandler; + friend class impl::ScientificHandler; + friend class impl::CompactHandler; + + // To allow child classes to call private methods: + friend class FractionRounder; + friend class CurrencyRounder; + friend class IncrementRounder; +}; + +/** + * A class that defines a rounding strategy based on a number of fraction places and optionally significant digits to be + * used when formatting numbers in NumberFormatter. + * + *

+ * To create a FractionRounder, use one of the factory methods on Rounder. + * + * @draft ICU 60 + */ +class U_I18N_API FractionRounder : public Rounder { + public: + /** + * Ensure that no less than this number of significant digits are retained when rounding according to fraction + * rules. + * + *

+ * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures set to 2, 3.141 + * becomes "3.1" instead. + * + *

+ * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3", not "3.0". + * + * @param minSignificantDigits + * The number of significant figures to guarantee. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMinDigits(int32_t minSignificantDigits) const; + + /** + * Ensure that no more than this number of significant digits are retained when rounding according to fraction + * rules. + * + *

+ * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures set to 2, 123.4 + * becomes "120" instead. + * + *

+ * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2, 123.4 would + * become "120.00". + * + * @param maxSignificantDigits + * Round the number to no more than this number of significant figures. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMaxDigits(int32_t maxSignificantDigits) const; + + private: + // Inherit constructor + using Rounder::Rounder; + + // To allow parent class to call this class's constructor: + friend class Rounder; +}; + +/** + * A class that defines a rounding strategy parameterized by a currency to be used when formatting numbers in + * NumberFormatter. + * + *

+ * To create a CurrencyRounder, use one of the factory methods on Rounder. + * + * @draft ICU 60 + */ +class U_I18N_API CurrencyRounder : public Rounder { + public: + /** + * Associates a currency with this rounding strategy. + * + *

+ * Calling this method is not required, because the currency specified in unit() + * is automatically applied to currency rounding strategies. However, + * this method enables you to override that automatic association. + * + *

+ * This method also enables numbers to be formatted using currency rounding rules without explicitly using a + * currency format. + * + * @param currency + * The currency to associate with this rounding strategy. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withCurrency(const CurrencyUnit ¤cy) const; + + private: + // Inherit constructor + using Rounder::Rounder; + + // To allow parent class to call this class's constructor: + friend class Rounder; +}; + +/** + * A class that defines a rounding strategy parameterized by a rounding increment to be used when formatting numbers in + * NumberFormatter. + * + *

+ * To create an IncrementRounder, use one of the factory methods on Rounder. + * + * @draft ICU 60 + */ +class U_I18N_API IncrementRounder : public Rounder { + public: + /** + * Specifies the minimum number of fraction digits to render after the decimal separator, padding with zeros if + * necessary. By default, no trailing zeros are added. + * + *

+ * For example, if the rounding increment is 0.5 and minFrac is 2, then the resulting strings include "0.00", + * "0.50", "1.00", and "1.50". + * + *

+ * Note: In ICU4J, this functionality is accomplished via the scale of the BigDecimal rounding increment. + * + * @param minFrac The minimum number of digits after the decimal separator. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMinFraction(int32_t minFrac) const; + + private: + // Inherit constructor + using Rounder::Rounder; + + // To allow parent class to call this class's constructor: + friend class Rounder; +}; + +/** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ +class U_I18N_API Grouper : public UMemory { + public: + /** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ + static Grouper defaults(); + + /** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ + static Grouper minTwoDigits(); + + /** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ + static Grouper none(); + + private: + int8_t fGrouping1; // -3 means "bogus"; -2 means "needs locale data"; -1 means "no grouping" + int8_t fGrouping2; + bool fMin2; + + Grouper(int8_t grouping1, int8_t grouping2, bool min2) + : fGrouping1(grouping1), fGrouping2(grouping2), fMin2(min2) {} + + Grouper() : fGrouping1(-3) {}; + + bool isBogus() const { + return fGrouping1 == -3; + } + + /** NON-CONST: mutates the current instance. */ + void setLocaleData(const impl::ParsedPatternInfo &patternInfo); + + bool groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const; + + // To allow MacroProps/MicroProps to initialize empty instances: + friend struct impl::MacroProps; + friend struct impl::MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and perform other operations: + friend class impl::NumberFormatterImpl; +}; + +/** + * A class that defines the strategy for padding and truncating integers before the decimal separator. + * + *

+ * To create an IntegerWidth, use one of the factory methods. + * + * @draft ICU 60 + * @see NumberFormatter + */ +class U_I18N_API IntegerWidth : public UMemory { + public: + /** + * Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the decimal separator. + * + *

+ * For example, with minInt=3, the number 55 will get printed as "055". + * + * @param minInt + * The minimum number of places before the decimal separator. + * @return An IntegerWidth for chaining or passing to the NumberFormatter integerWidth() setter. + * @draft ICU 60 + * @see NumberFormatter + */ + static IntegerWidth zeroFillTo(int32_t minInt); + + /** + * Truncate numbers exceeding a certain number of numerals before the decimal separator. + * + * For example, with maxInt=3, the number 1234 will get printed as "234". + * + * @param maxInt + * The maximum number of places before the decimal separator. + * @return An IntegerWidth for passing to the NumberFormatter integerWidth() setter. + * @draft ICU 60 + * @see NumberFormatter + */ + IntegerWidth truncateAt(int32_t maxInt); + + private: + union { + struct { + int8_t fMinInt; + int8_t fMaxInt; + } minMaxInt; + UErrorCode errorCode; + } fUnion; + bool fHasError = false; + + IntegerWidth(int8_t minInt, int8_t maxInt); + + IntegerWidth(UErrorCode errorCode) { // NOLINT + fUnion.errorCode = errorCode; + fHasError = true; + } + + IntegerWidth() { // NOLINT + fUnion.minMaxInt.fMinInt = -1; + } + + bool isBogus() const { + return !fHasError && fUnion.minMaxInt.fMinInt == -1; + } + + UBool copyErrorTo(UErrorCode &status) const { + if (fHasError) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + void apply(impl::DecimalQuantity &quantity, UErrorCode &status) const; + + // To allow MacroProps/MicroProps to initialize empty instances: + friend struct impl::MacroProps; + friend struct impl::MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and perform other operations: + friend class impl::NumberFormatterImpl; +}; + +namespace impl { + +/** + * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built + * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path. + * + * @internal + */ +static constexpr int32_t DEFAULT_THRESHOLD = 3; + +/** @internal */ +class U_I18N_API SymbolsWrapper : public UMemory { + public: + /** @internal */ + SymbolsWrapper() : fType(SYMPTR_NONE), fPtr{nullptr} {} + + /** @internal */ + SymbolsWrapper(const SymbolsWrapper &other); + + /** @internal */ + ~SymbolsWrapper(); + + /** @internal */ + SymbolsWrapper &operator=(const SymbolsWrapper &other); + + /** + * The provided object is copied, but we do not adopt it. + * @internal + */ + void setTo(const DecimalFormatSymbols &dfs); + + /** + * Adopt the provided object. + * @internal + */ + void setTo(const NumberingSystem *ns); + + /** + * Whether the object is currently holding a DecimalFormatSymbols. + * @internal + */ + bool isDecimalFormatSymbols() const; + + /** + * Whether the object is currently holding a NumberingSystem. + * @internal + */ + bool isNumberingSystem() const; + + /** + * Get the DecimalFormatSymbols pointer. No ownership change. + * @internal + */ + const DecimalFormatSymbols *getDecimalFormatSymbols() const; + + /** + * Get the NumberingSystem pointer. No ownership change. + * @internal + */ + const NumberingSystem *getNumberingSystem() const; + + /** @internal */ + UBool copyErrorTo(UErrorCode &status) const { + if (fType == SYMPTR_DFS && fPtr.dfs == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return TRUE; + } else if (fType == SYMPTR_NS && fPtr.ns == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return TRUE; + } + return FALSE; + } + + private: + enum SymbolsPointerType { + SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS + } fType; + + union { + const DecimalFormatSymbols *dfs; + const NumberingSystem *ns; + } fPtr; + + void doCopyFrom(const SymbolsWrapper &other); + + void doCleanup(); +}; + +/** @internal */ +class U_I18N_API Padder : public UMemory { + public: + /** @internal */ + static Padder none(); + + /** @internal */ + static Padder codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position); + + private: + UChar32 fWidth; // -3 = error; -2 = bogus; -1 = no padding + union { + struct { + int32_t fCp; + UNumberFormatPadPosition fPosition; + } padding; + UErrorCode errorCode; + } fUnion; + + Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position); + + Padder(int32_t width); + + Padder(UErrorCode errorCode) : fWidth(-3) { // NOLINT + fUnion.errorCode = errorCode; + } + + Padder() : fWidth(-2) {} // NOLINT + + bool isBogus() const { + return fWidth == -2; + } + + UBool copyErrorTo(UErrorCode &status) const { + if (fWidth == -3) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + bool isValid() const { + return fWidth > 0; + } + + int32_t padAndApply(const impl::Modifier &mod1, const impl::Modifier &mod2, + impl::NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const; + + // To allow MacroProps/MicroProps to initialize empty instances: + friend struct MacroProps; + friend struct MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and perform other operations: + friend class impl::NumberFormatterImpl; +}; + +/** @internal */ +struct U_I18N_API MacroProps : public UMemory { + /** @internal */ + Notation notation; + + /** @internal */ + MeasureUnit unit; // = NoUnit::base(); + + /** @internal */ + Rounder rounder; // = Rounder(); (bogus) + + /** @internal */ + Grouper grouper; // = Grouper(); (bogus) + + /** @internal */ + Padder padder; // = Padder(); (bogus) + + /** @internal */ + IntegerWidth integerWidth; // = IntegerWidth(); (bogus) + + /** @internal */ + SymbolsWrapper symbols; + + // UNUM_XYZ_COUNT denotes null (bogus) values. + + /** @internal */ + UNumberUnitWidth unitWidth = UNUM_UNIT_WIDTH_COUNT; + + /** @internal */ + UNumberSignDisplay sign = UNUM_SIGN_COUNT; + + /** @internal */ + UNumberDecimalSeparatorDisplay decimal = UNUM_DECIMAL_SEPARATOR_COUNT; + + /** @internal */ + PluralRules *rules = nullptr; // no ownership + + /** @internal */ + int32_t threshold = DEFAULT_THRESHOLD; + Locale locale; + + /** + * Check all members for errors. + * @internal + */ + bool copyErrorTo(UErrorCode &status) const { + return notation.copyErrorTo(status) || rounder.copyErrorTo(status) || + padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) || + symbols.copyErrorTo(status); + } +}; + +} // namespace impl + +/** + * An abstract base class for specifying settings related to number formatting. This class is implemented by + * {@link UnlocalizedNumberFormatter} and {@link LocalizedNumberFormatter}. + */ +template +class U_I18N_API NumberFormatterSettings { + public: + /** + * Specifies the notation style (simple, scientific, or compact) for rendering numbers. + * + *

    + *
  • Simple notation: "12,300" + *
  • Scientific notation: "1.23E4" + *
  • Compact notation: "12K" + *
+ * + *

+ * All notation styles will be properly localized with locale data, and all notation styles are compatible with + * units, rounding strategies, and other number formatter settings. + * + *

+ * Pass this method the return value of a {@link Notation} factory method. For example: + * + *

+     * NumberFormatter::with().notation(Notation::compactShort())
+     * 
+ * + * The default is to use simple notation. + * + * @param notation + * The notation strategy to use. + * @return The fluent chain. + * @see Notation + * @draft ICU 60 + */ + Derived notation(const Notation ¬ation) const; + + /** + * Specifies the unit (unit of measure, currency, or percent) to associate with rendered numbers. + * + *
    + *
  • Unit of measure: "12.3 meters" + *
  • Currency: "$12.30" + *
  • Percent: "12.3%" + *
+ * + *

+ * All units will be properly localized with locale data, and all units are compatible with notation styles, + * rounding strategies, and other number formatter settings. + * + *

+ * Pass this method any instance of {@link MeasureUnit}. For units of measure: + * + *

+     * NumberFormatter.with().adoptUnit(MeasureUnit::createMeter(status))
+     * 
+ * + * Currency: + * + *
+     * NumberFormatter.with()::unit(CurrencyUnit(u"USD", status))
+     * 
+ * + * Percent: + * + *
+     * NumberFormatter.with()::unit(NoUnit.percent())
+     * 
+ * + * The default is to render without units (equivalent to NoUnit.base()). + * + * @param unit + * The unit to render. + * @return The fluent chain. + * @see MeasureUnit + * @see Currency + * @see NoUnit + * @draft ICU 60 + */ + Derived unit(const icu::MeasureUnit &unit) const; + + /** + * Like unit(), but takes ownership of a pointer. Convenient for use with the MeasureFormat factory + * methods, which return pointers that need ownership. + * + * @param unit + * The unit to render. + * @return The fluent chain. + * @see #unit + * @see MeasureUnit + * @draft ICU 60 + */ + Derived adoptUnit(const icu::MeasureUnit *unit) const; + + /** + * Specifies the rounding strategy to use when formatting numbers. + * + *
    + *
  • Round to 3 decimal places: "3.142" + *
  • Round to 3 significant figures: "3.14" + *
  • Round to the closest nickel: "3.15" + *
  • Do not perform rounding: "3.1415926..." + *
+ * + *

+ * Pass this method the return value of one of the factory methods on {@link Rounder}. For example: + * + *

+     * NumberFormatter::with().rounding(Rounder::fixedFraction(2))
+     * 
+ * + *

+ * In most cases, the default rounding strategy is to round to 6 fraction places; i.e., + * Rounder.maxFraction(6). The exceptions are if compact notation is being used, then the compact + * notation rounding strategy is used (see {@link Notation#compactShort} for details), or if the unit is a currency, + * then standard currency rounding is used, which varies from currency to currency (see {@link Rounder#currency} for + * details). + * + * @param rounder + * The rounding strategy to use. + * @return The fluent chain. + * @see Rounder + * @provisional This API might change or be removed in a future release. + * @draft ICU 60 + */ + Derived rounding(const Rounder &rounder) const; + +#ifndef U_HIDE_INTERNAL_API + + /** + * Specifies the grouping strategy to use when formatting numbers. + * + *

    + *
  • Default grouping: "12,300" and "1,230" + *
  • Grouping with at least 2 digits: "12,300" and "1230" + *
  • No grouping: "12300" and "1230" + *
+ * + *

+ * The exact grouping widths will be chosen based on the locale. + * + *

+ * Pass this method the return value of one of the factory methods on {@link Grouper}. For example: + * + *

+     * NumberFormatter::with().grouping(Grouper::min2())
+     * 
+ * + * The default is to perform grouping without concern for the minimum grouping digits. + * + * @param grouper + * The grouping strategy to use. + * @return The fluent chain. + * @see Grouper + * @see Notation + * @internal + * @internal ICU 60: This API is technical preview. + */ + Derived grouping(const Grouper &grouper) const; + +#endif /* U_HIDE_INTERNAL_API */ + + /** + * Specifies the minimum and maximum number of digits to render before the decimal mark. + * + *
    + *
  • Zero minimum integer digits: ".08" + *
  • One minimum integer digit: "0.08" + *
  • Two minimum integer digits: "00.08" + *
+ * + *

+ * Pass this method the return value of {@link IntegerWidth#zeroFillTo(int)}. For example: + * + *

+     * NumberFormatter::with().integerWidth(IntegerWidth::zeroFillTo(2))
+     * 
+ * + * The default is to have one minimum integer digit. + * + * @param style + * The integer width to use. + * @return The fluent chain. + * @see IntegerWidth + * @draft ICU 60 + */ + Derived integerWidth(const IntegerWidth &style) const; + + /** + * Specifies the symbols (decimal separator, grouping separator, percent sign, numerals, etc.) to use when rendering + * numbers. + * + *
    + *
  • en_US symbols: "12,345.67" + *
  • fr_FR symbols: "12 345,67" + *
  • de_CH symbols: "12’345.67" + *
  • my_MY symbols: "၁၂,၃၄၅.၆၇" + *
+ * + *

+ * Pass this method an instance of {@link DecimalFormatSymbols}. For example: + * + *

+     * NumberFormatter::with().symbols(DecimalFormatSymbols(Locale("de_CH"), status))
+     * 
+ * + *

+ * Note: DecimalFormatSymbols automatically chooses the best numbering system based on the locale. + * In the examples above, the first three are using the Latin numbering system, and the fourth is using the Myanmar + * numbering system. + * + *

+ * Note: The instance of DecimalFormatSymbols will be copied: changes made to the symbols object + * after passing it into the fluent chain will not be seen. + * + *

+ * Note: Calling this method will override the NumberingSystem previously specified in + * {@link #symbols(NumberingSystem)}. + * + *

+ * The default is to choose the symbols based on the locale specified in the fluent chain. + * + * @param symbols + * The DecimalFormatSymbols to use. + * @return The fluent chain. + * @see DecimalFormatSymbols + * @draft ICU 60 + */ + Derived symbols(const DecimalFormatSymbols &symbols) const; + + /** + * Specifies that the given numbering system should be used when fetching symbols. + * + *

    + *
  • Latin numbering system: "12,345" + *
  • Myanmar numbering system: "၁၂,၃၄၅" + *
  • Math Sans Bold numbering system: "𝟭𝟮,𝟯𝟰𝟱" + *
+ * + *

+ * Pass this method an instance of {@link NumberingSystem}. For example, to force the locale to always use the Latin + * alphabet numbering system (ASCII digits): + * + *

+     * NumberFormatter::with().adoptSymbols(NumberingSystem::createInstanceByName("latn", status))
+     * 
+ * + *

+ * Note: Calling this method will override the DecimalFormatSymbols previously specified in + * {@link #symbols(DecimalFormatSymbols)}. + * + *

+ * The default is to choose the best numbering system for the locale. + * + *

+ * This method takes ownership of a pointer in order to work nicely with the NumberingSystem factory methods. + * + * @param symbols + * The NumberingSystem to use. + * @return The fluent chain. + * @see NumberingSystem + * @draft ICU 60 + */ + Derived adoptSymbols(const NumberingSystem *symbols) const; + + /** + * Sets the width of the unit (measure unit or currency). Most common values: + * + *

    + *
  • Short: "$12.00", "12 m" + *
  • ISO Code: "USD 12.00" + *
  • Full name: "12.00 US dollars", "12 meters" + *
+ * + *

+ * Pass an element from the {@link UNumberUnitWidth} enum to this setter. For example: + * + *

+     * NumberFormatter::with().unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME)
+     * 
+ * + *

+ * The default is the SHORT width. + * + * @param width + * The width to use when rendering numbers. + * @return The fluent chain + * @see UNumberUnitWidth + * @draft ICU 60 + */ + Derived unitWidth(const UNumberUnitWidth &width) const; + + /** + * Sets the plus/minus sign display strategy. Most common values: + * + *

    + *
  • Auto: "123", "-123" + *
  • Always: "+123", "-123" + *
  • Accounting: "$123", "($123)" + *
+ * + *

+ * Pass an element from the {@link UNumberSignDisplay} enum to this setter. For example: + * + *

+     * NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS)
+     * 
+ * + *

+ * The default is AUTO sign display. + * + * @param width + * The sign display strategy to use when rendering numbers. + * @return The fluent chain + * @see UNumberSignDisplay + * @provisional This API might change or be removed in a future release. + * @draft ICU 60 + */ + Derived sign(const UNumberSignDisplay &width) const; + + /** + * Sets the decimal separator display strategy. This affects integer numbers with no fraction part. Most common + * values: + * + *

    + *
  • Auto: "1" + *
  • Always: "1." + *
+ * + *

+ * Pass an element from the {@link UNumberDecimalSeparatorDisplay} enum to this setter. For example: + * + *

+     * NumberFormatter::with().decimal(UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_ALWAYS)
+     * 
+ * + *

+ * The default is AUTO decimal separator display. + * + * @param width + * The decimal separator display strategy to use when rendering numbers. + * @return The fluent chain + * @see UNumberDecimalSeparatorDisplay + * @provisional This API might change or be removed in a future release. + * @draft ICU 60 + */ + Derived decimal(const UNumberDecimalSeparatorDisplay &width) const; + +#ifndef U_HIDE_INTERNAL_API + + /** + * Set the padding strategy. May be added to ICU 61; see #13338. + * + * @internal ICU 60: This API is ICU internal only. + */ + Derived padding(const impl::Padder &padder) const; + + /** + * Internal fluent setter to support a custom regulation threshold. A threshold of 1 causes the data structures to + * be built right away. A threshold of 0 prevents the data structures from being built. + * + * @internal ICU 60: This API is ICU internal only. + */ + Derived threshold(int32_t threshold) const; + +#endif /* U_HIDE_INTERNAL_API */ + + /** + * Sets the UErrorCode if an error occurred in the fluent chain. + * Preserves older error codes in the outErrorCode. + * @return TRUE if U_FAILURE(outErrorCode) + * @draft ICU 60 + */ + UBool copyErrorTo(UErrorCode &outErrorCode) const { + if (U_FAILURE(outErrorCode)) { + // Do not overwrite the older error code + return TRUE; + } + fMacros.copyErrorTo(outErrorCode); + return U_FAILURE(outErrorCode); + } + + protected: + impl::MacroProps fMacros; + + private: + // Don't construct me directly! Use (Un)LocalizedNumberFormatter. + NumberFormatterSettings() = default; + + friend class LocalizedNumberFormatter; + friend class UnlocalizedNumberFormatter; +}; + +/** + * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be specified. + * + * @see NumberFormatter + * @draft ICU 60 + */ +class U_I18N_API UnlocalizedNumberFormatter + : public NumberFormatterSettings, public UMemory { + + public: + /** + * Associate the given locale with the number formatter. The locale is used for picking the appropriate symbols, + * formats, and other data for number display. + * + *

+ * To use the Java default locale, call Locale::getDefault(): + * + *

+     * NumberFormatter::with(). ... .locale(Locale::getDefault())
+     * 
+ * + * @param locale + * The locale to use when loading data for number formatting. + * @return The fluent chain. + * @draft ICU 60 + */ + LocalizedNumberFormatter locale(const icu::Locale &locale) const; + + // Make default copy constructor call the NumberFormatterSettings copy constructor. + /** + * Returns a copy of this UnlocalizedNumberFormatter. + * @draft ICU 60 + */ + UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter &other) : UnlocalizedNumberFormatter( + static_cast &>(other)) {} + + private: + UnlocalizedNumberFormatter() = default; + + explicit UnlocalizedNumberFormatter( + const NumberFormatterSettings &other); + + // To give the fluent setters access to this class's constructor: + friend class NumberFormatterSettings; + + // To give NumberFormatter::with() access to this class's constructor: + friend class NumberFormatter; +}; + +/** + * A NumberFormatter that has a locale associated with it; this means .format() methods are available. + * + * @see NumberFormatter + * @draft ICU 60 + */ +class U_I18N_API LocalizedNumberFormatter + : public NumberFormatterSettings, public UMemory { + public: + /** + * Format the given integer number to a string using the settings specified in the NumberFormatter fluent + * setting chain. + * + * @param value + * The number to format. + * @param status + * Set to an ErrorCode if one occurred in the setter chain or during formatting. + * @return A FormattedNumber object; call .toString() to get the string. + * @draft ICU 60 + */ + FormattedNumber formatInt(int64_t value, UErrorCode &status) const; + + /** + * Format the given float or double to a string using the settings specified in the NumberFormatter fluent setting + * chain. + * + * @param value + * The number to format. + * @param status + * Set to an ErrorCode if one occurred in the setter chain or during formatting. + * @return A FormattedNumber object; call .toString() to get the string. + * @draft ICU 60 + */ + FormattedNumber formatDouble(double value, UErrorCode &status) const; + + /** + * Format the given decimal number to a string using the settings + * specified in the NumberFormatter fluent setting chain. + * The syntax of the unformatted number is a "numeric string" + * as defined in the Decimal Arithmetic Specification, available at + * http://speleotrove.com/decimal + * + * @param value + * The number to format. + * @param status + * Set to an ErrorCode if one occurred in the setter chain or during formatting. + * @return A FormattedNumber object; call .toString() to get the string. + * @draft ICU 60 + */ + FormattedNumber formatDecimal(StringPiece value, UErrorCode &status) const; + + // Make default copy constructor call the NumberFormatterSettings copy constructor. + /** + * Returns a copy of this LocalizedNumberFormatter. + * @draft ICU 60 + */ + LocalizedNumberFormatter(const LocalizedNumberFormatter &other) : LocalizedNumberFormatter( + static_cast &>(other)) {} + + /** + * Destruct this LocalizedNumberFormatter, cleaning up any memory it might own. + * @draft ICU 60 + */ + ~LocalizedNumberFormatter(); + + private: + const impl::NumberFormatterImpl* fCompiled {nullptr}; + char fUnsafeCallCount[8] {}; // internally cast to u_atomic_int32_t + + LocalizedNumberFormatter() = default; + + explicit LocalizedNumberFormatter(const NumberFormatterSettings &other); + + LocalizedNumberFormatter(const impl::MacroProps ¯os, const Locale &locale); + + /** + * This is the core entrypoint to the number formatting pipeline. It performs self-regulation: a static code path + * for the first few calls, and compiling a more efficient data structure if called repeatedly. + * + *

+ * This function is very hot, being called in every call to the number formatting pipeline. + * + * @param results + * The results object. This method takes ownership. + * @return The formatted number result. + */ + FormattedNumber formatImpl(impl::NumberFormatterResults *results, UErrorCode &status) const; + + // To give the fluent setters access to this class's constructor: + friend class NumberFormatterSettings; + friend class NumberFormatterSettings; + + // To give UnlocalizedNumberFormatter::locale() access to this class's constructor: + friend class UnlocalizedNumberFormatter; +}; + +/** + * The result of a number formatting operation. This class allows the result to be exported in several data types, + * including a UnicodeString and a FieldPositionIterator. + * + * @draft ICU 60 + */ +class U_I18N_API FormattedNumber : public UMemory { + public: + /** + * Returns a UnicodeString representation of the formatted number. + * + * @return a UnicodeString containing the localized number. + * @draft ICU 60 + */ + UnicodeString toString() const; + + /** + * Appends the formatted number to an Appendable. + * + * @param appendable + * The Appendable to which to append the formatted number string. + * @return The same Appendable, for chaining. + * @draft ICU 60 + * @see Appendable + */ + Appendable &appendTo(Appendable &appendable); + + /** + * Determine the start and end indices of the first occurrence of the given field in the output string. + * This allows you to determine the locations of the integer part, fraction part, and sign. + * + *

+ * If multiple different field attributes are needed, this method can be called repeatedly, or if all field + * attributes are needed, consider using populateFieldPositionIterator(). + * + *

+ * If a field occurs multiple times in an output string, such as a grouping separator, this method will only ever + * return the first occurrence. Use populateFieldPositionIterator() to access all occurrences of an attribute. + * + * @param fieldPosition + * The FieldPosition to populate with the start and end indices of the desired field. + * @param status + * Set if an error occurs while populating the FieldPosition. + * @draft ICU 60 + * @see UNumberFormatFields + */ + void populateFieldPosition(FieldPosition &fieldPosition, UErrorCode &status); + + /** + * Export the formatted number to a FieldPositionIterator. This allows you to determine which characters in + * the output string correspond to which fields, such as the integer part, fraction part, and sign. + * + *

+ * If information on only one field is needed, consider using populateFieldPosition() instead. + * + * @param iterator + * The FieldPositionIterator to populate with all of the fields present in the formatted number. + * @param status + * Set if an error occurs while populating the FieldPositionIterator. + * @draft ICU 60 + * @see UNumberFormatFields + */ + void populateFieldPositionIterator(FieldPositionIterator &iterator, UErrorCode &status); + + /** + * Destruct an instance of FormattedNumber, cleaning up any memory it might own. + * @draft ICU 60 + */ + ~FormattedNumber(); + + private: + // Can't use LocalPointer because NumberFormatterResults is forward-declared + const impl::NumberFormatterResults *fResults; + + // Error code for the terminal methods + UErrorCode fErrorCode; + + explicit FormattedNumber(impl::NumberFormatterResults *results) + : fResults(results), fErrorCode(U_ZERO_ERROR) {}; + + explicit FormattedNumber(UErrorCode errorCode) + : fResults(nullptr), fErrorCode(errorCode) {}; + + // To give LocalizedNumberFormatter format methods access to this class's constructor: + friend class LocalizedNumberFormatter; +}; + +/** + * See the main description in numberformatter.h for documentation and examples. + * + * @draft ICU 60 + */ +class U_I18N_API NumberFormatter final { + public: + /** + * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is not currently known at + * the call site. + * + * @return An {@link UnlocalizedNumberFormatter}, to be used for chaining. + * @draft ICU 60 + */ + static UnlocalizedNumberFormatter with(); + + /** + * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known at the call + * site. + * + * @param locale + * The locale from which to load formats and symbols for number formatting. + * @return A {@link LocalizedNumberFormatter}, to be used for chaining. + * @draft ICU 60 + */ + static LocalizedNumberFormatter withLocale(const Locale &locale); + + /** + * Use factory methods instead of the constructor to create a NumberFormatter. + * @draft ICU 60 + */ + NumberFormatter() = delete; +}; + +} // namespace number +U_NAMESPACE_END + +#endif // U_HIDE_DRAFT_API + +#endif // __NUMBERFORMATTER_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index 7147204a7cbd8c..d6b2a6d53c081d 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -58,6 +58,11 @@ class StringEnumeration; * formatting and parsing a number. Also provides methods for * determining which locales have number formats, and what their names * are. + * + *

NOTE: Starting in ICU 60, there is a new set of APIs for localized number + * formatting that are designed to be an improvement over DecimalFormat. New users are discouraged + * from using DecimalFormat. For more information, see numberformatter.h. + * * \headerfile unicode/numfmt.h "unicode/numfmt.h" *

* NumberFormat helps you to format and parse numbers for any locale. @@ -168,6 +173,33 @@ class StringEnumeration; */ class U_I18N_API NumberFormat : public Format { public: + /** + * Rounding mode. + * + *

+ * For more detail on rounding modes, see: + * http://userguide.icu-project.org/formatparse/numbers/rounding-modes + * + * @stable ICU 2.4 + */ + enum ERoundingMode { + kRoundCeiling, /**< Round towards positive infinity */ + kRoundFloor, /**< Round towards negative infinity */ + kRoundDown, /**< Round towards zero */ + kRoundUp, /**< Round away from zero */ + kRoundHalfEven, /**< Round towards the nearest integer, or + towards the nearest even integer if equidistant */ + kRoundHalfDown, /**< Round towards the nearest integer, or + towards zero if equidistant */ + kRoundHalfUp, /**< Round towards the nearest integer, or + away from zero if equidistant */ + /** + * Return U_FORMAT_INEXACT_ERROR if number does not format exactly. + * @stable ICU 4.8 + */ + kRoundUnnecessary + }; + /** * Alignment Field constants used to construct a FieldPosition object. * Signifies that the position of the integer part or fraction part of @@ -814,7 +846,7 @@ class U_I18N_API NumberFormat : public Format { * Returns true if grouping is used in this format. For example, * in the English locale, with grouping on, the number 1234567 * might be formatted as "1,234,567". The grouping separator as - * well as the size of each group is locale dependant and is + * well as the size of each group is locale dependent and is * determined by sub-classes of NumberFormat. * @see setGroupingUsed * @stable ICU 2.0 @@ -965,6 +997,21 @@ class U_I18N_API NumberFormat : public Format { */ virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; + /** + * Get the rounding mode. This will always return NumberFormat::ERoundingMode::kRoundUnnecessary + * if the subclass does not support rounding. + * @return A rounding mode + * @draft ICU 60 + */ + virtual ERoundingMode getRoundingMode(void) const; + + /** + * Set the rounding mode. If a subclass does not support rounding, this will do nothing. + * @param roundingMode A rounding mode + * @draft ICU 60 + */ + virtual void setRoundingMode(ERoundingMode roundingMode); + public: /** diff --git a/deps/icu-small/source/i18n/unicode/plurrule.h b/deps/icu-small/source/i18n/unicode/plurrule.h index a14f392b7a2e52..d372d79c845179 100644 --- a/deps/icu-small/source/i18n/unicode/plurrule.h +++ b/deps/icu-small/source/i18n/unicode/plurrule.h @@ -43,7 +43,7 @@ U_NAMESPACE_BEGIN class Hashtable; -class FixedDecimal; +class IFixedDecimal; class VisibleDigitsWithExponent; class RuleChain; class PluralRuleParser; @@ -367,7 +367,7 @@ class U_I18N_API PluralRules : public UObject { /** * @internal */ - UnicodeString select(const FixedDecimal &number) const; + UnicodeString select(const IFixedDecimal &number) const; /** * @internal */ @@ -402,7 +402,7 @@ class U_I18N_API PluralRules : public UObject { /** * Deprecated Function, does not produce useful results. * - * Orginally intended to return all the values for which select() would return the keyword. + * Originally intended to return all the values for which select() would return the keyword. * If the keyword is unknown, returns no values, but this is not an error. If * the number of values is unlimited, returns no values and -1 as the * count. diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h index b4cbb0673249b4..d8d33420c2a015 100644 --- a/deps/icu-small/source/i18n/unicode/rbnf.h +++ b/deps/icu-small/source/i18n/unicode/rbnf.h @@ -1010,6 +1010,20 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { */ virtual void setContext(UDisplayContext value, UErrorCode& status); + /** + * Get the rounding mode. + * @return A rounding mode + * @draft ICU 60 + */ + virtual ERoundingMode getRoundingMode(void) const; + + /** + * Set the rounding mode. + * @param roundingMode A rounding mode + * @draft ICU 60 + */ + virtual void setRoundingMode(ERoundingMode roundingMode); + public: /** * ICU "poor man's RTTI", returns a UClassID for this class. @@ -1059,7 +1073,6 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { void dispose(); void stripWhitespace(UnicodeString& src); void initDefaultRuleSet(); - void format(double number, NFRuleSet& ruleSet); NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const; /* friend access */ @@ -1079,6 +1092,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const; UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult, UErrorCode& status) const; UnicodeString& format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const; + void format(double number, NFRuleSet& rs, UnicodeString& toAppendTo, UErrorCode& status) const; private: NFRuleSet **ruleSets; @@ -1090,6 +1104,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { DecimalFormatSymbols* decimalFormatSymbols; NFRule *defaultInfinityRule; NFRule *defaultNaNRule; + ERoundingMode roundingMode; UBool lenient; UnicodeString* lenientParseRules; LocalizationInfo* localizations; diff --git a/deps/icu-small/source/i18n/unicode/selfmt.h b/deps/icu-small/source/i18n/unicode/selfmt.h old mode 100755 new mode 100644 diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index 4733e759aa705f..9801b29bdb749b 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -1433,6 +1433,16 @@ class U_I18N_API SimpleDateFormat: public DateFormat { int32_t checkIntSuffix(const UnicodeString& text, int32_t start, int32_t patLoc, UBool isNegative) const; + /** + * Counts number of digit code points in the specified text. + * + * @param text input text + * @param start start index, inclusive + * @param end end index, exclusive + * @return number of digits found in the text in the specified range. + */ + int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const; + /** * Translate a pattern, mapping each character in the from string to the * corresponding character in the to string. Return an error if the original diff --git a/deps/icu-small/source/i18n/unicode/tznames.h b/deps/icu-small/source/i18n/unicode/tznames.h index 60f0e5e4a1a975..399265d85ae66c 100644 --- a/deps/icu-small/source/i18n/unicode/tznames.h +++ b/deps/icu-small/source/i18n/unicode/tznames.h @@ -291,14 +291,12 @@ class U_I18N_API TimeZoneNames : public UObject { virtual UnicodeString& getDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UDate date, UnicodeString& name) const; /** - * @internal For specific users only until proposed publicly. - * @deprecated This API is ICU internal only. + * @internal ICU internal only, for specific users only until proposed publicly. */ virtual void loadAllDisplayNames(UErrorCode& status); /** - * @internal For specific users only until proposed publicly. - * @deprecated This API is ICU internal only. + * @internal ICU internal only, for specific users only until proposed publicly. */ virtual void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const; diff --git a/deps/icu-small/source/i18n/unicode/ucoleitr.h b/deps/icu-small/source/i18n/unicode/ucoleitr.h index 1d644fc259b429..96c67f2018a6c3 100644 --- a/deps/icu-small/source/i18n/unicode/ucoleitr.h +++ b/deps/icu-small/source/i18n/unicode/ucoleitr.h @@ -152,7 +152,7 @@ ucol_reset(UCollationElements *elems); * A single character may contain more than one collation element. * @param elems The UCollationElements containing the text. * @param status A pointer to a UErrorCode to receive any errors. - * @return The next collation elements ordering, otherwise returns NULLORDER + * @return The next collation elements ordering, otherwise returns UCOL_NULLORDER * if an error has occured or if the end of string has been reached * @stable ICU 2.0 */ @@ -168,7 +168,7 @@ ucol_next(UCollationElements *elems, UErrorCode *status); * a U_BUFFER_OVERFLOW_ERROR is returned if the internal stack * buffer has been exhausted. * @return The previous collation elements ordering, otherwise returns - * NULLORDER if an error has occured or if the start of string has + * UCOL_NULLORDER if an error has occured or if the start of string has * been reached. * @stable ICU 2.0 */ diff --git a/deps/icu-small/source/i18n/unicode/unum.h b/deps/icu-small/source/i18n/unicode/unum.h index 5fc65486fc9374..9154bce661ae03 100644 --- a/deps/icu-small/source/i18n/unicode/unum.h +++ b/deps/icu-small/source/i18n/unicode/unum.h @@ -115,7 +115,7 @@ *

* You can also control the display of numbers with such function as * unum_getAttributes() and unum_setAttributes(), which let you set the - * miminum fraction digits, grouping, etc. + * minimum fraction digits, grouping, etc. * @see UNumberFormatAttributes for more details *

* You can also use forms of the parse and format methods with @@ -126,7 +126,7 @@ * *

* It is also possible to change or set the symbols used for a particular - * locale like the currency symbol, the grouping seperator , monetary seperator + * locale like the currency symbol, the grouping separator , monetary separator * etc by making use of functions unum_setSymbols() and unum_getSymbols(). */ @@ -265,7 +265,12 @@ typedef enum UNumberFormatStyle { } UNumberFormatStyle; /** The possible number format rounding modes. - * @stable ICU 2.0 + * + *

+ * For more detail on rounding modes, see: + * http://userguide.icu-project.org/formatparse/numbers/rounding-modes + * + * @stable ICU 2.0 */ typedef enum UNumberFormatRoundingMode { UNUM_ROUND_CEILING, @@ -883,7 +888,7 @@ unum_parseToUFormattable(const UNumberFormat* fmt, * @param localized TRUE if the pattern is localized, FALSE otherwise. * @param pattern The new pattern * @param patternLength The length of pattern, or -1 if null-terminated. - * @param parseError A pointer to UParseError to recieve information + * @param parseError A pointer to UParseError to receive information * about errors occurred during parsing, or NULL if no parse error * information is desired. * @param status A pointer to an input-output UErrorCode. diff --git a/deps/icu-small/source/i18n/unicode/uspoof.h b/deps/icu-small/source/i18n/unicode/uspoof.h index 6c2ac5e109fd55..9fcfcd3ede836c 100644 --- a/deps/icu-small/source/i18n/unicode/uspoof.h +++ b/deps/icu-small/source/i18n/unicode/uspoof.h @@ -368,18 +368,17 @@ */ struct USpoofChecker; -typedef struct USpoofChecker USpoofChecker; /**< typedef for C of USpoofChecker */ - -#ifndef U_HIDE_DRAFT_API /** - * @see uspoof_openCheckResult + * @stable ICU 4.2 */ +typedef struct USpoofChecker USpoofChecker; /**< typedef for C of USpoofChecker */ + struct USpoofCheckResult; /** * @see uspoof_openCheckResult + * @stable ICU 58 */ typedef struct USpoofCheckResult USpoofCheckResult; -#endif /* U_HIDE_DRAFT_API */ /** * Enum for the kinds of checks that USpoofChecker can perform. @@ -419,7 +418,6 @@ typedef enum USpoofChecks { */ USPOOF_WHOLE_SCRIPT_CONFUSABLE = 4, -#ifndef U_HIDE_DRAFT_API /** * Enable this flag in {@link uspoof_setChecks} to turn on all types of confusables. You may set * the checks to some subset of SINGLE_SCRIPT_CONFUSABLE, MIXED_SCRIPT_CONFUSABLE, or WHOLE_SCRIPT_CONFUSABLE to @@ -427,10 +425,9 @@ typedef enum USpoofChecks { * * @see uspoof_areConfusable * @see uspoof_getSkeleton - * @draft ICU 58 + * @stable ICU 58 */ USPOOF_CONFUSABLE = USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_WHOLE_SCRIPT_CONFUSABLE, -#endif /* U_HIDE_DRAFT_API */ #ifndef U_HIDE_DEPRECATED_API /** @@ -1058,7 +1055,6 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, #endif -#ifndef U_HIDE_DRAFT_API /** * Check the specified string for possible security issues. * The text to be checked will typically be an identifier of some sort. @@ -1085,9 +1081,9 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, * @see uspoof_openCheckResult * @see uspoof_check2UTF8 * @see uspoof_check2UnicodeString - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_check2(const USpoofChecker *sc, const UChar* id, int32_t length, USpoofCheckResult* checkResult, @@ -1122,9 +1118,9 @@ uspoof_check2(const USpoofChecker *sc, * @see uspoof_openCheckResult * @see uspoof_check2 * @see uspoof_check2UnicodeString - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_check2UTF8(const USpoofChecker *sc, const char *id, int32_t length, USpoofCheckResult* checkResult, @@ -1154,9 +1150,9 @@ uspoof_check2UTF8(const USpoofChecker *sc, * @see uspoof_openCheckResult * @see uspoof_check2 * @see uspoof_check2UTF8 - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_check2UnicodeString(const USpoofChecker *sc, const icu::UnicodeString &id, USpoofCheckResult* checkResult, @@ -1179,9 +1175,9 @@ uspoof_check2UnicodeString(const USpoofChecker *sc, * @see uspoof_check2 * @see uspoof_check2UTF8 * @see uspoof_check2UnicodeString - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT USpoofCheckResult* U_EXPORT2 +U_STABLE USpoofCheckResult* U_EXPORT2 uspoof_openCheckResult(UErrorCode *status); /** @@ -1189,9 +1185,9 @@ uspoof_openCheckResult(UErrorCode *status); * its implementation. * * @param checkResult The instance of USpoofCheckResult to close - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uspoof_closeCheckResult(USpoofCheckResult *checkResult); #if U_SHOW_CPLUSPLUS_API @@ -1205,7 +1201,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 58 + * @stable ICU 58 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer, USpoofCheckResult, uspoof_closeCheckResult); @@ -1225,9 +1221,9 @@ U_NAMESPACE_END * will be zero if the input string passes all of the * enabled checks. * @see uspoof_setChecks - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_getCheckResultChecks(const USpoofCheckResult *checkResult, UErrorCode *status); /** @@ -1238,9 +1234,9 @@ uspoof_getCheckResultChecks(const USpoofCheckResult *checkResult, UErrorCode *st * @param status The error code, set if an error occurred. * @return The restriction level contained in the USpoofCheckResult * @see uspoof_setRestrictionLevel - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT URestrictionLevel U_EXPORT2 +U_STABLE URestrictionLevel U_EXPORT2 uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult *checkResult, UErrorCode *status); /** @@ -1252,11 +1248,10 @@ uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult *checkResult, UErr * @param checkResult The instance of USpoofCheckResult created by {@link uspoof_openCheckResult} * @return The set of numerics contained in the USpoofCheckResult * @param status The error code, set if an error occurred. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT const USet* U_EXPORT2 +U_STABLE const USet* U_EXPORT2 uspoof_getCheckResultNumerics(const USpoofCheckResult *checkResult, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** diff --git a/deps/icu-small/source/i18n/unum.cpp b/deps/icu-small/source/i18n/unum.cpp index 95c744c128de78..907a1cd95e138f 100644 --- a/deps/icu-small/source/i18n/unum.cpp +++ b/deps/icu-small/source/i18n/unum.cpp @@ -298,7 +298,7 @@ unum_formatDecimal(const UNumberFormat* fmt, } if (length < 0) { - length = uprv_strlen(number); + length = static_cast(uprv_strlen(number)); } StringPiece numSP(number, length); Formattable numFmtbl(numSP, *status); @@ -507,20 +507,43 @@ U_CAPI int32_t U_EXPORT2 unum_getAttribute(const UNumberFormat* fmt, UNumberFormatAttribute attr) { - const NumberFormat* nf = reinterpret_cast(fmt); - if ( attr == UNUM_LENIENT_PARSE ) { - // Supported for all subclasses - return nf->isLenient(); - } + const NumberFormat* nf = reinterpret_cast(fmt); + if (attr == UNUM_LENIENT_PARSE) { + // Supported for all subclasses + return nf->isLenient(); + } + else if (attr == UNUM_MAX_INTEGER_DIGITS) { + return nf->getMaximumIntegerDigits(); + } + else if (attr == UNUM_MIN_INTEGER_DIGITS) { + return nf->getMinimumIntegerDigits(); + } + else if (attr == UNUM_INTEGER_DIGITS) { + // TODO: what should this return? + return nf->getMinimumIntegerDigits(); + } + else if (attr == UNUM_MAX_FRACTION_DIGITS) { + return nf->getMaximumFractionDigits(); + } + else if (attr == UNUM_MIN_FRACTION_DIGITS) { + return nf->getMinimumFractionDigits(); + } + else if (attr == UNUM_FRACTION_DIGITS) { + // TODO: what should this return? + return nf->getMinimumFractionDigits(); + } + else if (attr == UNUM_ROUNDING_MODE) { + return nf->getRoundingMode(); + } - // The remaining attributea are only supported for DecimalFormat - const DecimalFormat* df = dynamic_cast(nf); - if (df != NULL) { - UErrorCode ignoredStatus = U_ZERO_ERROR; - return df->getAttribute( attr, ignoredStatus ); - } + // The remaining attributes are only supported for DecimalFormat + const DecimalFormat* df = dynamic_cast(nf); + if (df != NULL) { + UErrorCode ignoredStatus = U_ZERO_ERROR; + return df->getAttribute(attr, ignoredStatus); + } - return -1; + return -1; } U_CAPI void U_EXPORT2 @@ -528,18 +551,42 @@ unum_setAttribute( UNumberFormat* fmt, UNumberFormatAttribute attr, int32_t newValue) { - NumberFormat* nf = reinterpret_cast(fmt); - if ( attr == UNUM_LENIENT_PARSE ) { - // Supported for all subclasses - // keep this here as the class may not be a DecimalFormat - return nf->setLenient(newValue != 0); - } - // The remaining attributea are only supported for DecimalFormat - DecimalFormat* df = dynamic_cast(nf); - if (df != NULL) { - UErrorCode ignoredStatus = U_ZERO_ERROR; - df->setAttribute(attr, newValue, ignoredStatus); - } + NumberFormat* nf = reinterpret_cast(fmt); + if (attr == UNUM_LENIENT_PARSE) { + // Supported for all subclasses + // keep this here as the class may not be a DecimalFormat + return nf->setLenient(newValue != 0); + } + else if (attr == UNUM_MAX_INTEGER_DIGITS) { + return nf->setMaximumIntegerDigits(newValue); + } + else if (attr == UNUM_MIN_INTEGER_DIGITS) { + return nf->setMinimumIntegerDigits(newValue); + } + else if (attr == UNUM_INTEGER_DIGITS) { + nf->setMinimumIntegerDigits(newValue); + return nf->setMaximumIntegerDigits(newValue); + } + else if (attr == UNUM_MAX_FRACTION_DIGITS) { + return nf->setMaximumFractionDigits(newValue); + } + else if (attr == UNUM_MIN_FRACTION_DIGITS) { + return nf->setMinimumFractionDigits(newValue); + } + else if (attr == UNUM_FRACTION_DIGITS) { + nf->setMinimumFractionDigits(newValue); + return nf->setMaximumFractionDigits(newValue); + } + else if (attr == UNUM_ROUNDING_MODE) { + return nf->setRoundingMode((NumberFormat::ERoundingMode)newValue); + } + + // The remaining attributes are only supported for DecimalFormat + DecimalFormat* df = dynamic_cast(nf); + if (df != NULL) { + UErrorCode ignoredStatus = U_ZERO_ERROR; + df->setAttribute(attr, newValue, ignoredStatus); + } } U_CAPI double U_EXPORT2 diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 1cb726e0b0c60e..019819b11cdde1 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -374,7 +374,7 @@ uspoof_check2UTF8(const USpoofChecker *sc, if (U_FAILURE(*status)) { return 0; } - UnicodeString idStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : uprv_strlen(id))); + UnicodeString idStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : static_cast(uprv_strlen(id)))); int32_t result = uspoof_check2UnicodeString(sc, idStr, checkResult, status); return result; } @@ -413,8 +413,8 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc, *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString id1Str = UnicodeString::fromUTF8(StringPiece(id1, length1>=0? length1 : uprv_strlen(id1))); - UnicodeString id2Str = UnicodeString::fromUTF8(StringPiece(id2, length2>=0? length2 : uprv_strlen(id2))); + UnicodeString id1Str = UnicodeString::fromUTF8(StringPiece(id1, length1>=0? length1 : static_cast(uprv_strlen(id1)))); + UnicodeString id2Str = UnicodeString::fromUTF8(StringPiece(id2, length2>=0? length2 : static_cast(uprv_strlen(id2)))); int32_t results = uspoof_areConfusableUnicodeString(sc, id1Str, id2Str, status); return results; } @@ -680,7 +680,7 @@ uspoof_getSkeletonUTF8(const USpoofChecker *sc, return 0; } - UnicodeString srcStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : uprv_strlen(id))); + UnicodeString srcStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : static_cast(uprv_strlen(id)))); UnicodeString destStr; uspoof_getSkeletonUnicodeString(sc, type, srcStr, destStr, status); if (U_FAILURE(*status)) { diff --git a/deps/icu-small/source/i18n/uspoof_conf.cpp b/deps/icu-small/source/i18n/uspoof_conf.cpp index e5d9bb633835b2..3a061d9dfcffe1 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.cpp +++ b/deps/icu-small/source/i18n/uspoof_conf.cpp @@ -396,6 +396,7 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { for (i=0; ielementAti(i); UChar32 codePoint = ConfusableDataUtils::keyToCodePoint(key); + (void)previousCodePoint; // Suppress unused variable warning. // strictly greater because there can be only one entry per code point U_ASSERT(codePoint > previousCodePoint); keys[i] = key; diff --git a/deps/icu-small/source/i18n/uspoof_conf.h b/deps/icu-small/source/i18n/uspoof_conf.h index ee8aa2678e90c5..ad040edf105271 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.h +++ b/deps/icu-small/source/i18n/uspoof_conf.h @@ -21,6 +21,8 @@ #ifndef __USPOOF_BUILDCONF_H__ #define __USPOOF_BUILDCONF_H__ +#include "unicode/utypes.h" + #if !UCONFIG_NO_NORMALIZATION #if !UCONFIG_NO_REGULAR_EXPRESSIONS diff --git a/deps/icu-small/source/i18n/utf8collationiterator.cpp b/deps/icu-small/source/i18n/utf8collationiterator.cpp index 85d4b76b08e00b..345b1994ef0e77 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf8collationiterator.cpp @@ -49,26 +49,25 @@ UTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode & /*errorCode*/) { } // Optimized combination of U8_NEXT_OR_FFFD() and UTRIE2_U8_NEXT32(). c = u8[pos++]; - if(c < 0xc0) { - // ASCII 00..7F; trail bytes 80..BF map to error values. + if(U8_IS_SINGLE(c)) { + // ASCII 00..7F return trie->data32[c]; } uint8_t t1, t2; - if(c < 0xe0 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { - // U+0080..U+07FF; 00..7F map to error values. + if(0xe0 <= c && c < 0xf0 && + ((pos + 1) < length || length < 0) && + U8_IS_VALID_LEAD3_AND_T1(c, t1 = u8[pos]) && + (t2 = (u8[pos + 1] - 0x80)) <= 0x3f) { + // U+0800..U+FFFF except surrogates + c = (((c & 0xf) << 12) | ((t1 & 0x3f) << 6) | t2); + pos += 2; + return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c); + } else if(c < 0xe0 && c >= 0xc2 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { + // U+0080..U+07FF uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1]; c = ((c & 0x1f) << 6) | t1; ++pos; return ce32; - } else if(c <= 0xef && - ((pos + 1) < length || length < 0) && - (t1 = (u8[pos] - 0x80)) <= 0x3f && (c != 0xe0 || t1 >= 0x20) && - (t2 = (u8[pos + 1] - 0x80)) <= 0x3f - ) { - // U+0800..U+FFFF; caller maps surrogates to error values. - c = (UChar)((c << 12) | (t1 << 6) | t2); - pos += 2; - return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c); } else { // Function call for supplementary code points and error cases. // Illegal byte sequences yield U+FFFD. @@ -158,28 +157,17 @@ FCDUTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) { return Collation::FALLBACK_CE32; } c = u8[pos++]; - if(c < 0xc0) { - // ASCII 00..7F; trail bytes 80..BF map to error values. + if(U8_IS_SINGLE(c)) { + // ASCII 00..7F return trie->data32[c]; } uint8_t t1, t2; - if(c < 0xe0 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { - // U+0080..U+07FF; 00..7F map to error values. - uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1]; - c = ((c & 0x1f) << 6) | t1; - ++pos; - if(CollationFCD::hasTccc(c) && pos != length && nextHasLccc()) { - pos -= 2; - } else { - return ce32; - } - } else if(c <= 0xef && - ((pos + 1) < length || length < 0) && - (t1 = (u8[pos] - 0x80)) <= 0x3f && (c != 0xe0 || t1 >= 0x20) && - (t2 = (u8[pos + 1] - 0x80)) <= 0x3f - ) { - // U+0800..U+FFFF; caller maps surrogates to error values. - c = (UChar)((c << 12) | (t1 << 6) | t2); + if(0xe0 <= c && c < 0xf0 && + ((pos + 1) < length || length < 0) && + U8_IS_VALID_LEAD3_AND_T1(c, t1 = u8[pos]) && + (t2 = (u8[pos + 1] - 0x80)) <= 0x3f) { + // U+0800..U+FFFF except surrogates + c = (((c & 0xf) << 12) | ((t1 & 0x3f) << 6) | t2); pos += 2; if(CollationFCD::hasTccc(c) && (CollationFCD::maybeTibetanCompositeVowel(c) || @@ -188,6 +176,16 @@ FCDUTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) { } else { break; // return CE32(BMP) } + } else if(c < 0xe0 && c >= 0xc2 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { + // U+0080..U+07FF + uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1]; + c = ((c & 0x1f) << 6) | t1; + ++pos; + if(CollationFCD::hasTccc(c) && pos != length && nextHasLccc()) { + pos -= 2; + } else { + return ce32; + } } else { // Function call for supplementary code points and error cases. // Illegal byte sequences yield U+FFFD. @@ -237,7 +235,7 @@ UBool FCDUTF8CollationIterator::previousHasTccc() const { U_ASSERT(state == CHECK_BWD && pos != 0); UChar32 c = u8[pos - 1]; - if(c < 0x80) { return FALSE; } + if(U8_IS_SINGLE(c)) { return FALSE; } int32_t i = pos; U8_PREV_OR_FFFD(u8, 0, i, c); if(c > 0xffff) { c = U16_LEAD(c); } @@ -271,7 +269,7 @@ FCDUTF8CollationIterator::nextCodePoint(UErrorCode &errorCode) { if(pos == length || ((c = u8[pos]) == 0 && length < 0)) { return U_SENTINEL; } - if(c < 0x80) { + if(U8_IS_SINGLE(c)) { ++pos; return c; } @@ -309,7 +307,7 @@ FCDUTF8CollationIterator::previousCodePoint(UErrorCode &errorCode) { if(pos == 0) { return U_SENTINEL; } - if((c = u8[pos - 1]) < 0x80) { + if(U8_IS_SINGLE(c = u8[pos - 1])) { --pos; return c; } diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp index 85b42b0e06639d..0c76c9b6c98bf2 100644 --- a/deps/icu-small/source/i18n/vtzone.cpp +++ b/deps/icu-small/source/i18n/vtzone.cpp @@ -1747,26 +1747,16 @@ VTimeZone::write(VTZWriter& writer, UErrorCode& status) const { } } } else { - UVector *customProps = NULL; + UnicodeString icutzprop; + UVector customProps(nullptr, uhash_compareUnicodeString, status); if (olsonzid.length() > 0 && icutzver.length() > 0) { - customProps = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status); - if (U_FAILURE(status)) { - return; - } - UnicodeString *icutzprop = new UnicodeString(ICU_TZINFO_PROP); - icutzprop->append(olsonzid); - icutzprop->append((UChar)0x005B/*'['*/); - icutzprop->append(icutzver); - icutzprop->append((UChar)0x005D/*']'*/); - customProps->addElement(icutzprop, status); - if (U_FAILURE(status)) { - delete icutzprop; - delete customProps; - return; - } + icutzprop.append(olsonzid); + icutzprop.append(u'['); + icutzprop.append(icutzver); + icutzprop.append(u']'); + customProps.addElement(&icutzprop, status); } - writeZone(writer, *tz, customProps, status); - delete customProps; + writeZone(writer, *tz, &customProps, status); } } diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp index 70a9364a0cf3cc..e8e32abd3ff477 100644 --- a/deps/icu-small/source/i18n/windtfmt.cpp +++ b/deps/icu-small/source/i18n/windtfmt.cpp @@ -102,7 +102,7 @@ static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeSt char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". - int32_t length = uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); + (void)uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); if (U_SUCCESS(status)) { @@ -219,7 +219,7 @@ Format *Win32DateFormat::clone(void) const } // TODO: Is just ignoring pos the right thing? -UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, FieldPosition &pos) const +UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, FieldPosition & /* pos */) const { FILETIME ft; SYSTEMTIME st_gmt; @@ -263,7 +263,7 @@ UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, F return appendTo; } -void Win32DateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& pos) const +void Win32DateFormat::parse(const UnicodeString& /* text */, Calendar& /* cal */, ParsePosition& pos) const { pos.setErrorIndex(pos.getIndex()); } diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp index 40b4b647763abb..b1724b62c27279 100644 --- a/deps/icu-small/source/i18n/winnmfmt.cpp +++ b/deps/icu-small/source/i18n/winnmfmt.cpp @@ -147,7 +147,7 @@ static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeSt char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". - int32_t length = uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); + (void) uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); if (U_SUCCESS(status)) { @@ -299,17 +299,17 @@ Format *Win32NumberFormat::clone(void) const return new Win32NumberFormat(*this); } -UnicodeString& Win32NumberFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos) const +UnicodeString& Win32NumberFormat::format(double number, UnicodeString& appendTo, FieldPosition& /* pos */) const { return format(getMaximumFractionDigits(), appendTo, L"%.16f", number); } -UnicodeString& Win32NumberFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const +UnicodeString& Win32NumberFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& /* pos */) const { return format(getMinimumFractionDigits(), appendTo, L"%I32d", number); } -UnicodeString& Win32NumberFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const +UnicodeString& Win32NumberFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& /* pos */) const { return format(getMinimumFractionDigits(), appendTo, L"%I64d", number); } diff --git a/deps/icu-small/source/i18n/wintzimpl.cpp b/deps/icu-small/source/i18n/wintzimpl.cpp index 07aad2178701a7..c55ed95fa8aea2 100644 --- a/deps/icu-small/source/i18n/wintzimpl.cpp +++ b/deps/icu-small/source/i18n/wintzimpl.cpp @@ -65,12 +65,12 @@ static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SY // Always use DOW type rule int32_t hour, min, sec, mil; standardDate.wYear = 0; - standardDate.wMonth = std->getRule()->getRuleMonth() + 1; - standardDate.wDay = std->getRule()->getRuleWeekInMonth(); + standardDate.wMonth = static_cast(std->getRule()->getRuleMonth()) + 1; + standardDate.wDay = static_cast(std->getRule()->getRuleWeekInMonth()); if (standardDate.wDay < 0) { standardDate.wDay = 5; } - standardDate.wDayOfWeek = std->getRule()->getRuleDayOfWeek() - 1; + standardDate.wDayOfWeek = static_cast(std->getRule()->getRuleDayOfWeek()) - 1; mil = std->getRule()->getRuleMillisInDay(); hour = mil/3600000; @@ -80,18 +80,18 @@ static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SY sec = mil/1000; mil %= 1000; - standardDate.wHour = hour; - standardDate.wMinute = min; - standardDate.wSecond = sec; - standardDate.wMilliseconds = mil; + standardDate.wHour = static_cast(hour); + standardDate.wMinute = static_cast(min); + standardDate.wSecond = static_cast(sec); + standardDate.wMilliseconds = static_cast(mil); daylightDate.wYear = 0; - daylightDate.wMonth = dst->getRule()->getRuleMonth() + 1; - daylightDate.wDay = dst->getRule()->getRuleWeekInMonth(); + daylightDate.wMonth = static_cast(dst->getRule()->getRuleMonth()) + 1; + daylightDate.wDay = static_cast(dst->getRule()->getRuleWeekInMonth()); if (daylightDate.wDay < 0) { daylightDate.wDay = 5; } - daylightDate.wDayOfWeek = dst->getRule()->getRuleDayOfWeek() - 1; + daylightDate.wDayOfWeek = static_cast(dst->getRule()->getRuleDayOfWeek()) - 1; mil = dst->getRule()->getRuleMillisInDay(); hour = mil/3600000; @@ -101,10 +101,10 @@ static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SY sec = mil/1000; mil %= 1000; - daylightDate.wHour = hour; - daylightDate.wMinute = min; - daylightDate.wSecond = sec; - daylightDate.wMilliseconds = mil; + daylightDate.wHour = static_cast(hour); + daylightDate.wMinute = static_cast(min); + daylightDate.wSecond = static_cast(sec); + daylightDate.wMilliseconds = static_cast(mil); } } else { result = FALSE; diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index 84a965780291c9..c386b0cae5e2ca 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -690,7 +690,6 @@ ZoneMeta::createMetazoneMappings(const UnicodeString &tzid) { mzMappings = new UVector(deleteOlsonToMetaMappingEntry, NULL, status); if (U_FAILURE(status)) { delete mzMappings; - deleteOlsonToMetaMappingEntry(entry); uprv_free(entry); break; } @@ -792,7 +791,7 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { break; } const char *mzID = ures_getKey(&res); - int32_t len = uprv_strlen(mzID); + int32_t len = static_cast(uprv_strlen(mzID)); UChar *uMzID = (UChar*)uprv_malloc(sizeof(UChar) * (len + 1)); if (uMzID == NULL) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp index 1127cd4ffb8bec..13bfbd3789fda7 100644 --- a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -17,15 +17,10 @@ static const char kSPACE = 0x20, kTAB = 0x09, kLF = 0x0A, - kCR = 0x0D, + kCR = 0x0D; // kHASH = 0x23, // kSLASH = 0x2f, - kBKSLASH = 0x5C, // kSTAR = 0x2A, - kL_U = 0x75, - kU_U = 0x55, - kQUOT = 0x27, - kDBLQ = 0x22; # include "cptbl.h" @@ -273,7 +268,7 @@ bool fixAt(std::string &linestr, size_t pos) { U8_NEXT(s, i, length, c); } if(c<0) { - fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", old_pos); + fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", (int)old_pos); fprintf(stderr, "Line: >>%s<<\n", linestr.c_str()); return true; } diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 88b08c21d0c72c..f003aa3abfab89 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -763,8 +763,8 @@ GenrbImporter::getRules( } /* Parse the data into an SRBRoot */ - struct SRBRoot *data = - parse(ucbuf.getAlias(), inputDir, outputDir, filename.data(), FALSE, FALSE, &errorCode); + LocalPointer data( + parse(ucbuf.getAlias(), inputDir, outputDir, filename.data(), FALSE, FALSE, &errorCode)); if (U_FAILURE(errorCode)) { return; } diff --git a/deps/icu-small/source/tools/genrb/wrtjava.cpp b/deps/icu-small/source/tools/genrb/wrtjava.cpp index a0d72f72d8fe0f..f1eb229760f12f 100644 --- a/deps/icu-small/source/tools/genrb/wrtjava.cpp +++ b/deps/icu-small/source/tools/genrb/wrtjava.cpp @@ -33,6 +33,7 @@ #include "uhash.h" #include "uresimp.h" #include "unicode/ustring.h" +#include "unicode/utf8.h" void res_write_java(struct SResource *res,UErrorCode *status); @@ -244,7 +245,8 @@ str_write_java(const UChar *src, int32_t srcLen, UBool printEndLine, UErrorCode memset(buf,0,length); bufLen = uCharsToChars(buf,length,src,srcLen,status); - + // buflen accounts for extra bytes added due to multi byte encoding of + // non ASCII characters if(printEndLine) write_tabs(out); @@ -284,10 +286,22 @@ str_write_java(const UChar *src, int32_t srcLen, UBool printEndLine, UErrorCode } } T_FileStream_write(out,"\"",1); + uint32_t byteIndex = 0; + uint32_t trailBytes = 0; if(len+addfLength; - if(srcLen>0 ) { byteArray = res->fData; diff --git a/deps/icu-small/source/tools/genrb/wrtxml.cpp b/deps/icu-small/source/tools/genrb/wrtxml.cpp index 2bfcfebf9efd70..58e055d5718c03 100644 --- a/deps/icu-small/source/tools/genrb/wrtxml.cpp +++ b/deps/icu-small/source/tools/genrb/wrtxml.cpp @@ -368,6 +368,7 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength #define LF 0x000D #define AT_SIGN 0x0040 +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 static void trim(char **src, int32_t *len){ @@ -420,6 +421,8 @@ print(UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd, UErro } } +#endif + static void printNoteElements(const UString *src, UErrorCode *status){ @@ -471,6 +474,7 @@ static void printAttribute(const char *name, const char *value, int32_t /*len*/) write_utf8_file(out, UnicodeString("\"")); } +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */ static void printAttribute(const char *name, const UnicodeString value, int32_t /*len*/) { write_utf8_file(out, UnicodeString(" ")); @@ -479,6 +483,7 @@ static void printAttribute(const char *name, const UnicodeString value, int32_t write_utf8_file(out, value); write_utf8_file(out, UnicodeString("\"")); } +#endif static void printComments(struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){ diff --git a/deps/icu-small/source/tools/toolutil/package.cpp b/deps/icu-small/source/tools/toolutil/package.cpp index e3354b3524325c..d96c6dd36ddb41 100644 --- a/deps/icu-small/source/tools/toolutil/package.cpp +++ b/deps/icu-small/source/tools/toolutil/package.cpp @@ -663,7 +663,7 @@ Package::readPackage(const char *filename) { // set the last item's platform type typeEnum=getTypeEnumForInputData(items[itemCount-1].data, items[itemCount-1].length, &errorCode); if(typeEnum<0 || U_FAILURE(errorCode)) { - fprintf(stderr, "icupkg: not an ICU data file: item \"%s\" in \"%s\"\n", items[i-1].name, filename); + fprintf(stderr, "icupkg: not an ICU data file: item \"%s\" in \"%s\"\n", items[itemCount-1].name, filename); exit(U_INVALID_FORMAT_ERROR); } items[itemCount-1].type=makeTypeLetter(typeEnum); diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp index ec2cb2b67f0b84..5ab0d846302179 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp @@ -47,6 +47,7 @@ #include "unicode/uclean.h" #include "uoptions.h" #include "pkg_genc.h" +#include "filetools.h" #define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU)) @@ -284,7 +285,7 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr } #if defined (WINDOWS_WITH_GNUC) && U_PLATFORM != U_PF_CYGWIN - /* Need to fix the file seperator character when using MinGW. */ + /* Need to fix the file separator character when using MinGW. */ swapFileSepChar(outFilePath, U_FILE_SEP_CHAR, '/'); #endif diff --git a/deps/icu-small/source/tools/toolutil/ppucd.cpp b/deps/icu-small/source/tools/toolutil/ppucd.cpp index cccde81c7abfac..b11efa7f7c4601 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.cpp +++ b/deps/icu-small/source/tools/toolutil/ppucd.cpp @@ -98,6 +98,7 @@ static const char *lineTypeStrings[]={ "defaults", "block", "cp", + "unassigned", "algnamesrange" }; @@ -203,8 +204,17 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { UChar32 start, end; if(!parseCodePointRange(field, start, end, errorCode)) { return NULL; } UniProps *props; + UBool insideBlock=FALSE; // TRUE if cp or unassigned range inside the block range. switch(lineType) { case DEFAULTS_LINE: + // Should occur before any block/cp/unassigned line. + if(blockLineIndex>=0) { + fprintf(stderr, + "error in preparsed UCD: default line %ld after one or more block lines\n", + (long)lineNumber); + errorCode=U_PARSE_ERROR; + return NULL; + } if(defaultLineIndex>=0) { fprintf(stderr, "error in preparsed UCD: second line with default properties on line %ld\n", @@ -228,9 +238,22 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { blockLineIndex=lineIndex; break; case CP_LINE: + case UNASSIGNED_LINE: if(blockProps.start<=start && end<=blockProps.end) { - // Code point range fully inside the last block inherits the block properties. - cpProps=blockProps; + insideBlock=TRUE; + if(lineType==CP_LINE) { + // Code point range fully inside the last block inherits the block properties. + cpProps=blockProps; + } else { + // Unassigned line inside the block is based on default properties + // which override block properties. + cpProps=defaultProps; + newValues=blockValues; + // Except, it inherits the one blk=Block property. + int32_t blkIndex=UCHAR_BLOCK-UCHAR_INT_START; + cpProps.intProps[blkIndex]=blockProps.intProps[blkIndex]; + newValues.remove((UChar32)UCHAR_BLOCK); + } } else if(start>blockProps.end || end