From b72fc90f35933099152a9707d055943ef5aab3fa Mon Sep 17 00:00:00 2001 From: Ujjwal Sharma Date: Tue, 23 Apr 2019 15:35:49 +0530 Subject: [PATCH 1/2] deps: update ICU to 64.2 Update the version of the bundled ICU (deps/icu-small) to ICU version 64.2 (Unicode 12, CLDR 35) Fixes: https://github.com/nodejs/node/issues/26388 --- deps/icu-small/LICENSE | 4 +- deps/icu-small/README-SMALL-ICU.txt | 4 +- deps/icu-small/source/common/brkeng.cpp | 3 +- deps/icu-small/source/common/capi_helper.h | 97 + .../source/common/characterproperties.cpp | 110 +- deps/icu-small/source/common/cmemory.h | 128 +- deps/icu-small/source/common/dictbe.cpp | 16 +- deps/icu-small/source/common/dictionarydata.h | 2 +- deps/icu-small/source/common/hash.h | 40 +- .../source/common/loadednormalizer2impl.cpp | 2 +- .../icu-small/source/common/localebuilder.cpp | 436 ++ deps/icu-small/source/common/localsvc.h | 2 +- deps/icu-small/source/common/locavailable.cpp | 20 +- deps/icu-small/source/common/locdispnames.cpp | 51 +- deps/icu-small/source/common/locdspnm.cpp | 4 +- deps/icu-small/source/common/locid.cpp | 217 +- deps/icu-small/source/common/loclikely.cpp | 670 +- deps/icu-small/source/common/locmap.cpp | 67 +- deps/icu-small/source/common/locmap.h | 4 +- deps/icu-small/source/common/locresdata.cpp | 29 +- deps/icu-small/source/common/locutil.cpp | 6 +- deps/icu-small/source/common/norm2_nfc_data.h | 661 +- .../source/common/normalizer2impl.cpp | 3 +- .../icu-small/source/common/normalizer2impl.h | 4 +- deps/icu-small/source/common/normlzr.cpp | 2 +- deps/icu-small/source/common/patternprops.cpp | 10 + deps/icu-small/source/common/patternprops.h | 7 + deps/icu-small/source/common/propname_data.h | 1519 ++-- deps/icu-small/source/common/putil.cpp | 102 +- deps/icu-small/source/common/putilimp.h | 18 +- deps/icu-small/source/common/rbbi.cpp | 14 +- deps/icu-small/source/common/rbbi_cache.cpp | 11 +- deps/icu-small/source/common/rbbi_cache.h | 4 +- deps/icu-small/source/common/rbbiscan.h | 2 +- deps/icu-small/source/common/resbund.cpp | 2 +- deps/icu-small/source/common/serv.cpp | 21 +- deps/icu-small/source/common/servls.cpp | 2 +- deps/icu-small/source/common/servnotf.cpp | 13 +- .../source/common/simpleformatter.cpp | 19 +- .../source/common/static_unicode_sets.cpp | 44 +- .../source/common/static_unicode_sets.h | 29 +- deps/icu-small/source/common/uassert.h | 29 +- deps/icu-small/source/common/ubidi.cpp | 9 +- .../source/common/ubidi_props_data.h | 1108 +-- deps/icu-small/source/common/ubidiln.cpp | 12 +- deps/icu-small/source/common/ubidiwrt.cpp | 2 +- .../source/common/ucase_props_data.h | 1501 ++-- deps/icu-small/source/common/uchar.cpp | 8 +- .../source/common/uchar_props_data.h | 6235 +++++++++-------- deps/icu-small/source/common/ucln_cmn.cpp | 4 +- deps/icu-small/source/common/ucnv_bld.cpp | 31 +- deps/icu-small/source/common/ucnvmbcs.cpp | 8 +- deps/icu-small/source/common/ucptrie.cpp | 33 +- deps/icu-small/source/common/ucurr.cpp | 100 +- deps/icu-small/source/common/uhash.cpp | 3 +- deps/icu-small/source/common/uinvchar.cpp | 3 +- deps/icu-small/source/common/ulayout_props.h | 46 + .../source/common/ulayout_props_data.h | 722 -- deps/icu-small/source/common/uloc.cpp | 237 +- deps/icu-small/source/common/uloc_keytype.cpp | 161 +- deps/icu-small/source/common/uloc_tag.cpp | 1192 ++-- deps/icu-small/source/common/ulocimp.h | 132 +- deps/icu-small/source/common/umapfile.cpp | 122 +- .../source/common/umutablecptrie.cpp | 404 +- deps/icu-small/source/common/umutex.cpp | 320 +- deps/icu-small/source/common/umutex.h | 322 +- deps/icu-small/source/common/unames.cpp | 64 +- .../icu-small/source/common/unicode/brkiter.h | 6 +- .../icu-small/source/common/unicode/docmain.h | 11 +- .../icu-small/source/common/unicode/dtintrv.h | 6 +- .../source/common/unicode/localebuilder.h | 292 + .../source/common/unicode/localpointer.h | 145 +- .../source/common/unicode/locdspnm.h | 2 +- deps/icu-small/source/common/unicode/locid.h | 4 +- .../source/common/unicode/parsepos.h | 14 +- deps/icu-small/source/common/unicode/rbbi.h | 4 +- .../source/common/unicode/simpleformatter.h | 37 +- deps/icu-small/source/common/unicode/uchar.h | 25 +- .../icu-small/source/common/unicode/uconfig.h | 12 + deps/icu-small/source/common/unicode/ucurr.h | 21 +- deps/icu-small/source/common/unicode/uniset.h | 63 +- deps/icu-small/source/common/unicode/unistr.h | 813 ++- .../icu-small/source/common/unicode/uobject.h | 23 +- .../icu-small/source/common/unicode/urename.h | 48 +- deps/icu-small/source/common/unicode/ures.h | 10 +- .../icu-small/source/common/unicode/uscript.h | 11 +- deps/icu-small/source/common/unicode/utext.h | 3 +- deps/icu-small/source/common/unicode/utf8.h | 4 +- deps/icu-small/source/common/unicode/utypes.h | 8 +- .../icu-small/source/common/unicode/uvernum.h | 42 +- deps/icu-small/source/common/unifiedcache.cpp | 34 +- deps/icu-small/source/common/unifiedcache.h | 2 +- deps/icu-small/source/common/uniset.cpp | 484 +- .../source/common/uniset_closure.cpp | 42 +- deps/icu-small/source/common/uniset_props.cpp | 89 +- deps/icu-small/source/common/unistr.cpp | 7 +- deps/icu-small/source/common/uobject.cpp | 12 +- deps/icu-small/source/common/uprops.cpp | 155 +- deps/icu-small/source/common/uprops.h | 10 +- deps/icu-small/source/common/uresbund.cpp | 69 +- deps/icu-small/source/common/uresimp.h | 78 + deps/icu-small/source/common/uscript.cpp | 13 +- .../icu-small/source/common/uscript_props.cpp | 4 + deps/icu-small/source/common/uset.cpp | 2 +- deps/icu-small/source/common/usetiter.cpp | 2 +- deps/icu-small/source/common/usprep.cpp | 27 +- deps/icu-small/source/common/ustr_cnv.cpp | 12 +- .../source/common/ustr_titlecase_brkiter.cpp | 14 +- deps/icu-small/source/common/utrace.cpp | 3 +- .../source/common/utrie2_builder.cpp | 2 + deps/icu-small/source/common/uvector.h | 26 +- deps/icu-small/source/common/uvectr32.h | 26 +- deps/icu-small/source/common/uvectr64.h | 18 +- deps/icu-small/source/common/wintz.cpp | 16 +- deps/icu-small/source/common/wintz.h | 2 +- .../data/in/{icudt63l.dat => icudt64l.dat} | Bin 2824512 -> 2879744 bytes deps/icu-small/source/i18n/astro.cpp | 17 +- deps/icu-small/source/i18n/brktrans.cpp | 10 +- deps/icu-small/source/i18n/calendar.cpp | 67 +- deps/icu-small/source/i18n/chnsecal.cpp | 17 +- deps/icu-small/source/i18n/coll.cpp | 14 +- .../source/i18n/collationbuilder.cpp | 3 +- .../source/i18n/collationdatabuilder.cpp | 3 +- deps/icu-small/source/i18n/collationfcd.cpp | 4 +- .../source/i18n/collationruleparser.cpp | 5 +- deps/icu-small/source/i18n/csdetect.cpp | 4 +- deps/icu-small/source/i18n/currfmt.cpp | 11 +- deps/icu-small/source/i18n/currfmt.h | 4 - deps/icu-small/source/i18n/currunit.cpp | 26 + deps/icu-small/source/i18n/datefmt.cpp | 7 +- deps/icu-small/source/i18n/decNumberLocal.h | 10 +- deps/icu-small/source/i18n/decimfmt.cpp | 605 +- .../i18n/double-conversion-bignum-dtoa.cpp | 2 +- .../source/i18n/double-conversion-bignum.cpp | 9 +- .../source/i18n/double-conversion-bignum.h | 2 +- .../i18n/double-conversion-cached-powers.cpp | 6 +- .../source/i18n/double-conversion-ieee.h | 4 +- .../source/i18n/double-conversion-utils.h | 56 +- .../source/i18n/double-conversion.cpp | 256 +- .../icu-small/source/i18n/double-conversion.h | 51 +- deps/icu-small/source/i18n/dtfmtsym.cpp | 29 +- deps/icu-small/source/i18n/dtitvfmt.cpp | 289 +- deps/icu-small/source/i18n/dtitvinf.cpp | 4 +- deps/icu-small/source/i18n/dtptngen.cpp | 114 +- deps/icu-small/source/i18n/erarules.cpp | 25 +- deps/icu-small/source/i18n/erarules.h | 11 +- deps/icu-small/source/i18n/fmtable.cpp | 9 +- .../icu-small/source/i18n/formattedval_impl.h | 259 + .../source/i18n/formattedval_iterimpl.cpp | 176 + .../source/i18n/formattedval_sbimpl.cpp | 46 + deps/icu-small/source/i18n/formattedvalue.cpp | 232 + deps/icu-small/source/i18n/fphdlimp.cpp | 18 +- deps/icu-small/source/i18n/fphdlimp.h | 31 +- deps/icu-small/source/i18n/fpositer.cpp | 6 +- deps/icu-small/source/i18n/gender.cpp | 3 +- deps/icu-small/source/i18n/islamcal.cpp | 9 +- deps/icu-small/source/i18n/japancal.cpp | 27 +- deps/icu-small/source/i18n/japancal.h | 7 + deps/icu-small/source/i18n/listformatter.cpp | 55 +- deps/icu-small/source/i18n/measfmt.cpp | 495 +- deps/icu-small/source/i18n/measunit.cpp | 1056 ++- deps/icu-small/source/i18n/msgfmt.cpp | 62 +- .../source/i18n/number_affixutils.cpp | 34 +- .../icu-small/source/i18n/number_affixutils.h | 3 +- .../icu-small/source/i18n/number_asformat.cpp | 8 +- deps/icu-small/source/i18n/number_capi.cpp | 147 +- deps/icu-small/source/i18n/number_compact.cpp | 6 +- .../source/i18n/number_decimalquantity.cpp | 216 +- .../source/i18n/number_decimalquantity.h | 82 +- .../source/i18n/number_decimfmtprops.cpp | 7 + .../source/i18n/number_decimfmtprops.h | 13 +- deps/icu-small/source/i18n/number_fluent.cpp | 147 +- .../source/i18n/number_formatimpl.cpp | 18 +- .../icu-small/source/i18n/number_formatimpl.h | 4 + .../icu-small/source/i18n/number_grouping.cpp | 5 +- .../source/i18n/number_integerwidth.cpp | 5 +- .../source/i18n/number_longnames.cpp | 56 +- deps/icu-small/source/i18n/number_longnames.h | 6 + deps/icu-small/source/i18n/number_mapper.cpp | 54 +- deps/icu-small/source/i18n/number_mapper.h | 3 +- .../icu-small/source/i18n/number_microprops.h | 1 + .../source/i18n/number_modifiers.cpp | 18 +- deps/icu-small/source/i18n/number_modifiers.h | 2 +- .../source/i18n/number_multiplier.cpp | 3 + deps/icu-small/source/i18n/number_output.cpp | 50 + .../source/i18n/number_patternmodifier.cpp | 43 +- .../source/i18n/number_patternmodifier.h | 18 +- .../source/i18n/number_patternstring.cpp | 139 +- .../source/i18n/number_patternstring.h | 24 +- .../icu-small/source/i18n/number_rounding.cpp | 75 +- .../source/i18n/number_roundingutils.h | 5 +- .../source/i18n/number_scientific.cpp | 3 +- .../source/i18n/number_skeletons.cpp | 83 +- deps/icu-small/source/i18n/number_skeletons.h | 9 +- .../source/i18n/number_stringbuilder.cpp | 195 +- .../source/i18n/number_stringbuilder.h | 12 + deps/icu-small/source/i18n/number_types.h | 7 +- deps/icu-small/source/i18n/number_utils.cpp | 6 +- deps/icu-small/source/i18n/number_utils.h | 59 + deps/icu-small/source/i18n/number_utypes.h | 51 +- deps/icu-small/source/i18n/numfmt.cpp | 2 +- .../source/i18n/numparse_affixes.cpp | 65 +- deps/icu-small/source/i18n/numparse_affixes.h | 46 +- deps/icu-small/source/i18n/numparse_impl.cpp | 51 +- deps/icu-small/source/i18n/numparse_impl.h | 5 +- .../source/i18n/numparse_parsednumber.cpp | 7 +- .../source/i18n/numparse_symbols.cpp | 2 +- deps/icu-small/source/i18n/numparse_types.h | 9 +- .../icu-small/source/i18n/numrange_fluent.cpp | 109 +- deps/icu-small/source/i18n/numrange_impl.cpp | 77 +- deps/icu-small/source/i18n/numrange_impl.h | 17 +- deps/icu-small/source/i18n/numsys.cpp | 116 +- deps/icu-small/source/i18n/numsys_impl.h | 12 +- deps/icu-small/source/i18n/olsontz.cpp | 34 +- deps/icu-small/source/i18n/plurfmt.cpp | 2 +- deps/icu-small/source/i18n/plurrule.cpp | 21 +- .../source/i18n/quantityformatter.cpp | 35 + .../icu-small/source/i18n/quantityformatter.h | 29 + deps/icu-small/source/i18n/rbt.cpp | 3 +- deps/icu-small/source/i18n/rbtz.cpp | 2 +- deps/icu-small/source/i18n/regexcmp.cpp | 77 +- deps/icu-small/source/i18n/reldatefmt.cpp | 360 +- deps/icu-small/source/i18n/rematch.cpp | 26 +- .../source/i18n/rulebasedcollator.cpp | 12 +- deps/icu-small/source/i18n/scriptset.h | 2 +- deps/icu-small/source/i18n/simpletz.cpp | 2 +- deps/icu-small/source/i18n/smpdtfmt.cpp | 73 +- deps/icu-small/source/i18n/timezone.cpp | 145 +- deps/icu-small/source/i18n/tmunit.cpp | 3 +- deps/icu-small/source/i18n/tmutfmt.cpp | 2 +- deps/icu-small/source/i18n/translit.cpp | 43 +- deps/icu-small/source/i18n/transreg.cpp | 6 +- deps/icu-small/source/i18n/tridpars.cpp | 11 +- deps/icu-small/source/i18n/tzfmt.cpp | 20 +- deps/icu-small/source/i18n/tzgnames.cpp | 40 +- deps/icu-small/source/i18n/tzgnames.h | 2 +- deps/icu-small/source/i18n/tznames.cpp | 17 +- deps/icu-small/source/i18n/tznames_impl.cpp | 27 +- deps/icu-small/source/i18n/ucln_in.h | 1 + deps/icu-small/source/i18n/ucol_res.cpp | 4 +- .../source/i18n/udateintervalformat.cpp | 28 + deps/icu-small/source/i18n/ulistformatter.cpp | 98 +- deps/icu-small/source/i18n/umsg.cpp | 10 +- .../source/i18n/unicode/alphaindex.h | 2 +- deps/icu-small/source/i18n/unicode/currunit.h | 14 + deps/icu-small/source/i18n/unicode/decimfmt.h | 180 +- deps/icu-small/source/i18n/unicode/dtitvfmt.h | 173 +- deps/icu-small/source/i18n/unicode/dtitvinf.h | 1 - deps/icu-small/source/i18n/unicode/dtptngen.h | 5 +- .../source/i18n/unicode/formattedvalue.h | 317 + .../source/i18n/unicode/listformatter.h | 102 +- deps/icu-small/source/i18n/unicode/measfmt.h | 30 +- deps/icu-small/source/i18n/unicode/measunit.h | 2184 +++++- deps/icu-small/source/i18n/unicode/msgfmt.h | 27 +- deps/icu-small/source/i18n/unicode/nounit.h | 4 +- .../source/i18n/unicode/numberformatter.h | 373 +- .../i18n/unicode/numberrangeformatter.h | 85 +- deps/icu-small/source/i18n/unicode/numfmt.h | 6 + deps/icu-small/source/i18n/unicode/numsys.h | 28 +- deps/icu-small/source/i18n/unicode/plurrule.h | 35 +- deps/icu-small/source/i18n/unicode/regex.h | 230 +- .../source/i18n/unicode/reldatefmt.h | 218 +- deps/icu-small/source/i18n/unicode/smpdtfmt.h | 3 + deps/icu-small/source/i18n/unicode/timezone.h | 37 +- deps/icu-small/source/i18n/unicode/ucal.h | 14 +- deps/icu-small/source/i18n/unicode/udat.h | 21 + .../source/i18n/unicode/udateintervalformat.h | 100 + deps/icu-small/source/i18n/unicode/udatpg.h | 16 +- .../source/i18n/unicode/uformattedvalue.h | 440 ++ .../source/i18n/unicode/ulistformatter.h | 107 + deps/icu-small/source/i18n/unicode/unum.h | 57 +- .../source/i18n/unicode/unumberformatter.h | 125 +- deps/icu-small/source/i18n/unicode/unumsys.h | 1 + .../source/i18n/unicode/upluralrules.h | 40 +- deps/icu-small/source/i18n/unicode/uregex.h | 2 +- .../source/i18n/unicode/ureldatefmt.h | 152 + deps/icu-small/source/i18n/upluralrules.cpp | 24 + deps/icu-small/source/i18n/uregex.cpp | 4 +- deps/icu-small/source/i18n/usearch.cpp | 8 +- deps/icu-small/source/i18n/uspoof.cpp | 74 +- deps/icu-small/source/i18n/uspoof_impl.cpp | 41 +- deps/icu-small/source/i18n/uspoof_impl.h | 10 +- deps/icu-small/source/i18n/zonemeta.cpp | 37 +- .../source/tools/escapesrc/escapesrc.cpp | 17 +- .../icu-small/source/tools/genrb/filterrb.cpp | 236 + deps/icu-small/source/tools/genrb/filterrb.h | 180 + deps/icu-small/source/tools/genrb/genrb.cpp | 176 +- deps/icu-small/source/tools/genrb/parse.cpp | 2 + deps/icu-small/source/tools/genrb/reslist.cpp | 124 +- deps/icu-small/source/tools/genrb/reslist.h | 30 +- .../source/tools/pkgdata/pkgdata.cpp | 32 +- .../source/tools/toolutil/pkg_genc.cpp | 42 +- .../source/tools/toolutil/pkg_gencmn.cpp | 8 +- .../source/tools/toolutil/swapimpl.cpp | 105 + .../source/tools/toolutil/toolutil.cpp | 2 +- .../icu-small/source/tools/toolutil/ucbuf.cpp | 4 +- .../source/tools/toolutil/ucmstate.cpp | 3 +- 297 files changed, 20512 insertions(+), 13162 deletions(-) create mode 100644 deps/icu-small/source/common/capi_helper.h create mode 100644 deps/icu-small/source/common/localebuilder.cpp create mode 100644 deps/icu-small/source/common/ulayout_props.h delete mode 100644 deps/icu-small/source/common/ulayout_props_data.h mode change 100644 => 100755 deps/icu-small/source/common/umutex.h create mode 100644 deps/icu-small/source/common/unicode/localebuilder.h rename deps/icu-small/source/data/in/{icudt63l.dat => icudt64l.dat} (58%) create mode 100644 deps/icu-small/source/i18n/formattedval_impl.h create mode 100644 deps/icu-small/source/i18n/formattedval_iterimpl.cpp create mode 100644 deps/icu-small/source/i18n/formattedval_sbimpl.cpp create mode 100644 deps/icu-small/source/i18n/formattedvalue.cpp create mode 100644 deps/icu-small/source/i18n/number_output.cpp create mode 100644 deps/icu-small/source/i18n/unicode/formattedvalue.h create mode 100644 deps/icu-small/source/i18n/unicode/uformattedvalue.h create mode 100644 deps/icu-small/source/tools/genrb/filterrb.cpp create mode 100644 deps/icu-small/source/tools/genrb/filterrb.h diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 25b6eb9d3415e6..2e01e368768a4b 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -1,7 +1,7 @@ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) -Copyright © 1991-2018 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in http://www.unicode.org/copyright.html. +Copyright © 1991-2019 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in https://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation diff --git a/deps/icu-small/README-SMALL-ICU.txt b/deps/icu-small/README-SMALL-ICU.txt index 2ff8a36061cfad..efc3ebe925cbba 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 63 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt63l.dat : Reduced-size data file +It is a strict subset of ICU 64 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt64l.dat : Reduced-size data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index a513bafb160c85..42771b3617747d 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -124,13 +124,12 @@ static void U_CALLCONV _deleteEngine(void *obj) { U_CDECL_END U_NAMESPACE_BEGIN -static UMutex gBreakEngineMutex = U_MUTEX_INITIALIZER; - const LanguageBreakEngine * ICULanguageBreakFactory::getEngineFor(UChar32 c) { const LanguageBreakEngine *lbe = NULL; UErrorCode status = U_ZERO_ERROR; + static UMutex gBreakEngineMutex = U_MUTEX_INITIALIZER; Mutex m(&gBreakEngineMutex); if (fEngines == NULL) { diff --git a/deps/icu-small/source/common/capi_helper.h b/deps/icu-small/source/common/capi_helper.h new file mode 100644 index 00000000000000..54b1db9e331805 --- /dev/null +++ b/deps/icu-small/source/common/capi_helper.h @@ -0,0 +1,97 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#ifndef __CAPI_HELPER_H__ +#define __CAPI_HELPER_H__ + +#include "unicode/utypes.h" + +U_NAMESPACE_BEGIN + +/** + * An internal helper class to help convert between C and C++ APIs. + */ +template +class IcuCApiHelper { + public: + /** + * Convert from the C type to the C++ type (const version). + */ + static const CPPType* validate(const CType* input, UErrorCode& status); + + /** + * Convert from the C type to the C++ type (non-const version). + */ + static CPPType* validate(CType* input, UErrorCode& status); + + /** + * Convert from the C++ type to the C type (const version). + */ + const CType* exportConstForC() const; + + /** + * Convert from the C++ type to the C type (non-const version). + */ + CType* exportForC(); + + /** + * Invalidates the object. + */ + ~IcuCApiHelper(); + + private: + /** + * While the object is valid, fMagic equals kMagic. + */ + int32_t fMagic = kMagic; +}; + + +template +const CPPType* +IcuCApiHelper::validate(const CType* input, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + if (input == nullptr) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + auto* impl = reinterpret_cast(input); + if (static_cast*>(impl)->fMagic != kMagic) { + status = U_INVALID_FORMAT_ERROR; + return nullptr; + } + return impl; +} + +template +CPPType* +IcuCApiHelper::validate(CType* input, UErrorCode& status) { + auto* constInput = static_cast(input); + auto* validated = validate(constInput, status); + return const_cast(validated); +} + +template +const CType* +IcuCApiHelper::exportConstForC() const { + return reinterpret_cast(static_cast(this)); +} + +template +CType* +IcuCApiHelper::exportForC() { + return reinterpret_cast(static_cast(this)); +} + +template +IcuCApiHelper::~IcuCApiHelper() { + // head off application errors by preventing use of of deleted objects. + fMagic = 0; +} + + +U_NAMESPACE_END + +#endif // __CAPI_HELPER_H__ diff --git a/deps/icu-small/source/common/characterproperties.cpp b/deps/icu-small/source/common/characterproperties.cpp index 3aff85b3f1193e..5a57364375b372 100644 --- a/deps/icu-small/source/common/characterproperties.cpp +++ b/deps/icu-small/source/common/characterproperties.cpp @@ -23,6 +23,11 @@ #include "umutex.h" #include "uprops.h" +using icu::LocalPointer; +#if !UCONFIG_NO_NORMALIZATION +using icu::Normalizer2Factory; +using icu::Normalizer2Impl; +#endif using icu::UInitOnce; using icu::UnicodeSet; @@ -30,17 +35,22 @@ namespace { UBool U_CALLCONV characterproperties_cleanup(); +constexpr int32_t NUM_INCLUSIONS = UPROPS_SRC_COUNT + UCHAR_INT_LIMIT - UCHAR_INT_START; + struct Inclusion { UnicodeSet *fSet; UInitOnce fInitOnce; }; -Inclusion gInclusions[UPROPS_SRC_COUNT]; // cached getInclusions() +Inclusion gInclusions[NUM_INCLUSIONS]; // cached getInclusions() UnicodeSet *sets[UCHAR_BINARY_LIMIT] = {}; UCPMap *maps[UCHAR_INT_LIMIT - UCHAR_INT_START] = {}; -UMutex cpMutex = U_MUTEX_INITIALIZER; +icu::UMutex *cpMutex() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} //---------------------------------------------------------------- // Inclusions list @@ -80,35 +90,22 @@ UBool U_CALLCONV characterproperties_cleanup() { return TRUE; } -} // namespace - -U_NAMESPACE_BEGIN - -/* -Reduce excessive reallocation, and make it easier to detect initialization problems. -Usually you don't see smaller sets than this for Unicode 5.0. -*/ -constexpr int32_t DEFAULT_INCLUSION_CAPACITY = 3072; - -void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCode &errorCode) { +void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) { // This function is invoked only via umtx_initOnce(). - // This function is a friend of class UnicodeSet. - U_ASSERT(0 <= src && src < UPROPS_SRC_COUNT); if (src == UPROPS_SRC_NONE) { errorCode = U_INTERNAL_PROGRAM_ERROR; return; } - UnicodeSet * &incl = gInclusions[src].fSet; - U_ASSERT(incl == nullptr); + U_ASSERT(gInclusions[src].fSet == nullptr); - incl = new UnicodeSet(); - if (incl == nullptr) { + LocalPointer incl(new UnicodeSet()); + if (incl.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } USetAdder sa = { - (USet *)incl, + (USet *)incl.getAlias(), _set_add, _set_addRange, _set_addString, @@ -116,7 +113,6 @@ void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCo nullptr // don't need removeRange() }; - incl->ensureCapacity(DEFAULT_INCLUSION_CAPACITY, errorCode); switch(src) { case UPROPS_SRC_CHAR: uchar_addPropertyStarts(&sa, &errorCode); @@ -183,12 +179,15 @@ void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCo } if (U_FAILURE(errorCode)) { - delete incl; - incl = nullptr; return; } - // Compact for caching + if (incl->isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + // Compact for caching. incl->compact(); + gInclusions[src].fSet = incl.orphan(); ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup); } @@ -199,15 +198,66 @@ const UnicodeSet *getInclusionsForSource(UPropertySource src, UErrorCode &errorC return nullptr; } Inclusion &i = gInclusions[src]; - umtx_initOnce(i.fInitOnce, &CharacterProperties::initInclusion, src, errorCode); + umtx_initOnce(i.fInitOnce, &initInclusion, src, errorCode); return i.fSet; } +void U_CALLCONV initIntPropInclusion(UProperty prop, UErrorCode &errorCode) { + // This function is invoked only via umtx_initOnce(). + U_ASSERT(UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT); + int32_t inclIndex = UPROPS_SRC_COUNT + prop - UCHAR_INT_START; + U_ASSERT(gInclusions[inclIndex].fSet == nullptr); + UPropertySource src = uprops_getSource(prop); + const UnicodeSet *incl = getInclusionsForSource(src, errorCode); + if (U_FAILURE(errorCode)) { + return; + } + + LocalPointer intPropIncl(new UnicodeSet(0, 0)); + if (intPropIncl.isNull()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + int32_t numRanges = incl->getRangeCount(); + int32_t prevValue = 0; + for (int32_t i = 0; i < numRanges; ++i) { + UChar32 rangeEnd = incl->getRangeEnd(i); + for (UChar32 c = incl->getRangeStart(i); c <= rangeEnd; ++c) { + // TODO: Get a UCharacterProperty.IntProperty to avoid the property dispatch. + int32_t value = u_getIntPropertyValue(c, prop); + if (value != prevValue) { + intPropIncl->add(c); + prevValue = value; + } + } + } + + if (intPropIncl->isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + // Compact for caching. + intPropIncl->compact(); + gInclusions[inclIndex].fSet = intPropIncl.orphan(); + ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup); +} + +} // namespace + +U_NAMESPACE_BEGIN + const UnicodeSet *CharacterProperties::getInclusionsForProperty( UProperty prop, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } - UPropertySource src = uprops_getSource(prop); - return getInclusionsForSource(src, errorCode); + if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) { + int32_t inclIndex = UPROPS_SRC_COUNT + prop - UCHAR_INT_START; + Inclusion &i = gInclusions[inclIndex]; + umtx_initOnce(i.fInitOnce, &initIntPropInclusion, prop, errorCode); + return i.fSet; + } else { + UPropertySource src = uprops_getSource(prop); + return getInclusionsForSource(src, errorCode); + } } U_NAMESPACE_END @@ -216,7 +266,7 @@ namespace { UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } - icu::LocalPointer set(new UnicodeSet()); + LocalPointer set(new UnicodeSet()); if (set.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -311,7 +361,7 @@ u_getBinaryPropertySet(UProperty property, UErrorCode *pErrorCode) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - Mutex m(&cpMutex); + Mutex m(cpMutex()); UnicodeSet *set = sets[property]; if (set == nullptr) { sets[property] = set = makeSet(property, *pErrorCode); @@ -327,7 +377,7 @@ u_getIntPropertyMap(UProperty property, UErrorCode *pErrorCode) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - Mutex m(&cpMutex); + Mutex m(cpMutex()); UCPMap *map = maps[property - UCHAR_INT_START]; if (map == nullptr) { maps[property - UCHAR_INT_START] = map = makeMap(property, *pErrorCode); diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index a6dd209d80b2f3..f501b20a14ca13 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -50,6 +50,7 @@ #define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) #define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size) #define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size) +#define uprv_memchr(ptr, value, num) U_STANDARD_CPP_NAMESPACE memchr(ptr, value, num) U_CAPI void * U_EXPORT2 uprv_malloc(size_t s) U_MALLOC_ATTR U_ALLOC_SIZE_ATTR(1); @@ -122,6 +123,9 @@ uprv_deleteUObject(void *obj); #ifdef __cplusplus +#include +#include "unicode/uobject.h" + U_NAMESPACE_BEGIN /** @@ -161,17 +165,6 @@ class LocalMemory : public LocalPointerBase { * @return *this */ LocalMemory &operator=(LocalMemory &&src) U_NOEXCEPT { - return moveFrom(src); - } - /** - * Move assignment, leaves src with isNull(). - * The behavior is undefined if *this and src are the same object. - * - * Can be called explicitly, does not need C++11 support. - * @param src source smart pointer - * @return *this - */ - LocalMemory &moveFrom(LocalMemory &src) U_NOEXCEPT { uprv_free(LocalPointerBase::ptr); LocalPointerBase::ptr=src.ptr; src.ptr=NULL; @@ -282,11 +275,18 @@ inline T *LocalMemory::allocateInsteadAndCopy(int32_t newCapacity, int32_t le * * WARNING: MaybeStackArray only works with primitive (plain-old data) types. * It does NOT know how to call a destructor! If you work with classes with - * destructors, consider LocalArray in localpointer.h. + * destructors, consider LocalArray in localpointer.h or MemoryPool. */ template class MaybeStackArray { public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif + /** * Default constructor initializes with internal T[stackCapacity] buffer. */ @@ -298,7 +298,7 @@ class MaybeStackArray { */ MaybeStackArray(int32_t newCapacity) : MaybeStackArray() { if (capacity < newCapacity) { resize(newCapacity); } - }; + } /** * Destructor deletes the array (if owned). */ @@ -399,20 +399,6 @@ class MaybeStackArray { /* No ownership transfer: No copy constructor, no assignment operator. */ MaybeStackArray(const MaybeStackArray & /*other*/) {} void operator=(const MaybeStackArray & /*other*/) {} - - // No heap allocation. Use only on the stack. - // (Declaring these functions private triggers a cascade of problems: - // MSVC insists on exporting an instantiation of MaybeStackArray, which - // requires that all functions be defined. - // An empty implementation of new() is rejected, it must return a value. - // Returning NULL is rejected by gcc for operator new. - // The expedient thing is just not to override operator new. - // While relatively pointless, heap allocated instances will function. - // static void * U_EXPORT2 operator new(size_t size); - // static void * U_EXPORT2 operator new[](size_t size); -#if U_HAVE_PLACEMENT_NEW - // static void * U_EXPORT2 operator new(size_t, void *ptr); -#endif }; template @@ -509,6 +495,13 @@ inline T *MaybeStackArray::orphanOrClone(int32_t length, int32 template class MaybeStackHeaderAndArray { public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif + /** * Default constructor initializes with internal H+T[stackCapacity] buffer. */ @@ -605,15 +598,6 @@ class MaybeStackHeaderAndArray { /* No ownership transfer: No copy constructor, no assignment operator. */ MaybeStackHeaderAndArray(const MaybeStackHeaderAndArray & /*other*/) {} void operator=(const MaybeStackHeaderAndArray & /*other*/) {} - - // No heap allocation. Use only on the stack. - // (Declaring these functions private triggers a cascade of problems; - // see the MaybeStackArray class for details.) - // static void * U_EXPORT2 operator new(size_t size); - // static void * U_EXPORT2 operator new[](size_t size); -#if U_HAVE_PLACEMENT_NEW - // static void * U_EXPORT2 operator new(size_t, void *ptr); -#endif }; template @@ -675,6 +659,78 @@ inline H *MaybeStackHeaderAndArray::orphanOrClone(int32_t l return p; } +/** + * A simple memory management class that creates new heap allocated objects (of + * any class that has a public constructor), keeps track of them and eventually + * deletes them all in its own destructor. + * + * A typical use-case would be code like this: + * + * MemoryPool pool; + * + * MyType* o1 = pool.create(); + * if (o1 != nullptr) { + * foo(o1); + * } + * + * MyType* o2 = pool.create(1, 2, 3); + * if (o2 != nullptr) { + * bar(o2); + * } + * + * // MemoryPool will take care of deleting the MyType objects. + * + * It doesn't do anything more than that, and is intentionally kept minimalist. + */ +template +class MemoryPool : public UMemory { +public: + MemoryPool() : count(0), pool() {} + + ~MemoryPool() { + for (int32_t i = 0; i < count; ++i) { + delete pool[i]; + } + } + + MemoryPool(const MemoryPool&) = delete; + MemoryPool& operator=(const MemoryPool&) = delete; + + MemoryPool(MemoryPool&& other) U_NOEXCEPT : count(other.count), + pool(std::move(other.pool)) { + other.count = 0; + } + + MemoryPool& operator=(MemoryPool&& other) U_NOEXCEPT { + count = other.count; + pool = std::move(other.pool); + other.count = 0; + return *this; + } + + /** + * Creates a new object of typename T, by forwarding any and all arguments + * to the typename T constructor. + * + * @param args Arguments to be forwarded to the typename T constructor. + * @return A pointer to the newly created object, or nullptr on error. + */ + template + T* create(Args&&... args) { + int32_t capacity = pool.getCapacity(); + if (count == capacity && + pool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity, + capacity) == nullptr) { + return nullptr; + } + return pool[count++] = new T(std::forward(args)...); + } + +private: + int32_t count; + MaybeStackArray pool; +}; + U_NAMESPACE_END #endif /* __cplusplus */ diff --git a/deps/icu-small/source/common/dictbe.cpp b/deps/icu-small/source/common/dictbe.cpp index 0e4d0850fac912..6ceba21a244047 100644 --- a/deps/icu-small/source/common/dictbe.cpp +++ b/deps/icu-small/source/common/dictbe.cpp @@ -7,6 +7,8 @@ ******************************************************************************* */ +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_BREAK_ITERATION @@ -101,8 +103,8 @@ class PossibleWord { int32_t cpLengths[POSSIBLE_WORD_LIST_MAX]; // Word Lengths, in code points. public: - PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {}; - ~PossibleWord() {}; + PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {} + ~PossibleWord() {} // Fill the list of candidates if needed, select the longest, and return the number found int32_t candidates( UText *text, DictionaryMatcher *dict, int32_t rangeEnd ); @@ -116,13 +118,13 @@ class PossibleWord { // Return the longest prefix this candidate location shares with a dictionary word // Return value is in code points. - int32_t longestPrefix() { return prefix; }; + int32_t longestPrefix() { return prefix; } // Mark the current candidate as the one we like - void markCurrent() { mark = current; }; + void markCurrent() { mark = current; } // Get length in code points of the marked word. - int32_t markedCPLength() { return cpLengths[mark]; }; + int32_t markedCPLength() { return cpLengths[mark]; } }; @@ -1204,8 +1206,8 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, inputMap->elementAti(inString.length()) : inString.length()+rangeStart; normalizedMap->addElement(nativeEnd, status); - inputMap.moveFrom(normalizedMap); - inString.moveFrom(normalizedInput); + inputMap = std::move(normalizedMap); + inString = std::move(normalizedInput); } int32_t numCodePts = inString.countChar32(); diff --git a/deps/icu-small/source/common/dictionarydata.h b/deps/icu-small/source/common/dictionarydata.h index 5aec8fe0283630..d86c6dfdbbc71b 100644 --- a/deps/icu-small/source/common/dictionarydata.h +++ b/deps/icu-small/source/common/dictionarydata.h @@ -68,7 +68,7 @@ class U_COMMON_API DictionaryData : public UMemory { */ class U_COMMON_API DictionaryMatcher : public UMemory { public: - DictionaryMatcher() {}; + DictionaryMatcher() {} virtual ~DictionaryMatcher(); // this should emulate CompactTrieDictionary::matches() /* @param text The text in which to look for matching words. Matching begins diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index cc82ad2454b440..fa1e4ee9affc7b 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -41,7 +41,7 @@ class U_COMMON_API Hashtable : public UMemory { * @param ignoreKeyCase If true, keys are case insensitive. * @param status Error code */ - Hashtable(UBool ignoreKeyCase, UErrorCode& status); + inline Hashtable(UBool ignoreKeyCase, UErrorCode& status); /** * Construct a hashtable @@ -49,7 +49,7 @@ class U_COMMON_API Hashtable : public UMemory { * @param size initial size allocation * @param status Error code */ - Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); + inline Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); /** * Construct a hashtable @@ -57,57 +57,57 @@ class U_COMMON_API Hashtable : public UMemory { * @param valueComp Comparator for comparing the values * @param status Error code */ - Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + inline Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); /** * Construct a hashtable * @param status Error code */ - Hashtable(UErrorCode& status); + inline Hashtable(UErrorCode& status); /** * Construct a hashtable, _disregarding any error_. Use this constructor * with caution. */ - Hashtable(); + inline Hashtable(); /** * Non-virtual destructor; make this virtual if Hashtable is subclassed * in the future. */ - ~Hashtable(); + inline ~Hashtable(); - UObjectDeleter *setValueDeleter(UObjectDeleter *fn); + inline UObjectDeleter *setValueDeleter(UObjectDeleter *fn); - int32_t count() const; + inline int32_t count() const; - void* put(const UnicodeString& key, void* value, UErrorCode& status); + inline void* put(const UnicodeString& key, void* value, UErrorCode& status); - int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); + inline int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); - void* get(const UnicodeString& key) const; + inline void* get(const UnicodeString& key) const; - int32_t geti(const UnicodeString& key) const; + inline int32_t geti(const UnicodeString& key) const; - void* remove(const UnicodeString& key); + inline void* remove(const UnicodeString& key); - int32_t removei(const UnicodeString& key); + inline int32_t removei(const UnicodeString& key); - void removeAll(void); + inline void removeAll(void); - const UHashElement* find(const UnicodeString& key) const; + inline const UHashElement* find(const UnicodeString& key) const; /** * @param pos - must be UHASH_FIRST on first call, and untouched afterwards. * @see uhash_nextElement */ - const UHashElement* nextElement(int32_t& pos) const; + inline const UHashElement* nextElement(int32_t& pos) const; - UKeyComparator* setKeyComparator(UKeyComparator*keyComp); + inline UKeyComparator* setKeyComparator(UKeyComparator*keyComp); - UValueComparator* setValueComparator(UValueComparator* valueComp); + inline UValueComparator* setValueComparator(UValueComparator* valueComp); - UBool equals(const Hashtable& that) const; + inline UBool equals(const Hashtable& that) const; private: Hashtable(const Hashtable &other); // forbid copying of this class Hashtable &operator=(const Hashtable &other); // forbid copying of this class diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index 82cb325b723311..e4b36f1055f15d 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -157,7 +157,7 @@ static void U_CALLCONV initSingletons(const char *what, UErrorCode &errorCode) { } else if (uprv_strcmp(what, "nfkc_cf") == 0) { nfkc_cfSingleton = Norm2AllModes::createInstance(NULL, "nfkc_cf", errorCode); } else { - U_ASSERT(FALSE); // Unknown singleton + UPRV_UNREACHABLE; // Unknown singleton } ucln_common_registerCleanup(UCLN_COMMON_LOADED_NORMALIZER2, uprv_loaded_normalizer2_cleanup); } diff --git a/deps/icu-small/source/common/localebuilder.cpp b/deps/icu-small/source/common/localebuilder.cpp new file mode 100644 index 00000000000000..fe931fcf759dfd --- /dev/null +++ b/deps/icu-small/source/common/localebuilder.cpp @@ -0,0 +1,436 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include + +#include "bytesinkutil.h" // CharStringByteSink +#include "charstr.h" +#include "cstring.h" +#include "ulocimp.h" +#include "unicode/localebuilder.h" +#include "unicode/locid.h" + +U_NAMESPACE_BEGIN + +#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) +#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) + +const char* kAttributeKey = "attribute"; + +static bool _isExtensionSubtags(char key, const char* s, int32_t len) { + switch (uprv_tolower(key)) { + case 'u': + return ultag_isUnicodeExtensionSubtags(s, len); + case 't': + return ultag_isTransformedExtensionSubtags(s, len); + case 'x': + return ultag_isPrivateuseValueSubtags(s, len); + default: + return ultag_isExtensionSubtags(s, len); + } +} + +LocaleBuilder::LocaleBuilder() : UObject(), status_(U_ZERO_ERROR), language_(), + script_(), region_(), variant_(nullptr), extensions_(nullptr) +{ + language_[0] = 0; + script_[0] = 0; + region_[0] = 0; +} + +LocaleBuilder::~LocaleBuilder() +{ + delete variant_; + delete extensions_; +} + +LocaleBuilder& LocaleBuilder::setLocale(const Locale& locale) +{ + clear(); + setLanguage(locale.getLanguage()); + setScript(locale.getScript()); + setRegion(locale.getCountry()); + setVariant(locale.getVariant()); + extensions_ = locale.clone(); + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + } + return *this; +} + +LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag) +{ + Locale l = Locale::forLanguageTag(tag, status_); + if (U_FAILURE(status_)) { return *this; } + // Because setLocale will reset status_ we need to return + // first if we have error in forLanguageTag. + setLocale(l); + return *this; +} + +static void setField(StringPiece input, char* dest, UErrorCode& errorCode, + UBool (*test)(const char*, int32_t)) { + if (U_FAILURE(errorCode)) { return; } + if (input.empty()) { + dest[0] = '\0'; + } else if (test(input.data(), input.length())) { + uprv_memcpy(dest, input.data(), input.length()); + dest[input.length()] = '\0'; + } else { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } +} + +LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language) +{ + setField(language, language_, status_, &ultag_isLanguageSubtag); + return *this; +} + +LocaleBuilder& LocaleBuilder::setScript(StringPiece script) +{ + setField(script, script_, status_, &ultag_isScriptSubtag); + return *this; +} + +LocaleBuilder& LocaleBuilder::setRegion(StringPiece region) +{ + setField(region, region_, status_, &ultag_isRegionSubtag); + return *this; +} + +static void transform(char* data, int32_t len) { + for (int32_t i = 0; i < len; i++, data++) { + if (*data == '_') { + *data = '-'; + } else { + *data = uprv_tolower(*data); + } + } +} + +LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) +{ + if (U_FAILURE(status_)) { return *this; } + if (variant.empty()) { + delete variant_; + variant_ = nullptr; + return *this; + } + CharString* new_variant = new CharString(variant, status_); + if (U_FAILURE(status_)) { return *this; } + if (new_variant == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + transform(new_variant->data(), new_variant->length()); + if (!ultag_isVariantSubtags(new_variant->data(), new_variant->length())) { + delete new_variant; + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + delete variant_; + variant_ = new_variant; + return *this; +} + +static bool +_isKeywordValue(const char* key, const char* value, int32_t value_len) +{ + if (key[1] == '\0') { + // one char key + return (UPRV_ISALPHANUM(uprv_tolower(key[0])) && + _isExtensionSubtags(key[0], value, value_len)); + } else if (uprv_strcmp(key, kAttributeKey) == 0) { + // unicode attributes + return ultag_isUnicodeLocaleAttributes(value, value_len); + } + // otherwise: unicode extension value + // We need to convert from legacy key/value to unicode + // key/value + const char* unicode_locale_key = uloc_toUnicodeLocaleKey(key); + const char* unicode_locale_type = uloc_toUnicodeLocaleType(key, value); + + return unicode_locale_key && unicode_locale_type && + ultag_isUnicodeLocaleKey(unicode_locale_key, -1) && + ultag_isUnicodeLocaleType(unicode_locale_type, -1); +} + +static void +_copyExtensions(const Locale& from, Locale* to, bool validate, UErrorCode& errorCode) +{ + if (U_FAILURE(errorCode)) { return; } + LocalPointer iter(from.createKeywords(errorCode)); + if (U_FAILURE(errorCode) || iter.isNull()) { return; } + const char* key; + while ((key = iter->next(nullptr, errorCode)) != nullptr) { + CharString value; + CharStringByteSink sink(&value); + from.getKeywordValue(key, sink, errorCode); + if (U_FAILURE(errorCode)) { return; } + if (uprv_strcmp(key, kAttributeKey) == 0) { + transform(value.data(), value.length()); + } + if (validate && + !_isKeywordValue(key, value.data(), value.length())) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + to->setKeywordValue(key, value.data(), errorCode); + if (U_FAILURE(errorCode)) { return; } + } +} + +void static +_clearUAttributesAndKeyType(Locale* locale, UErrorCode& errorCode) +{ + // Clear Unicode attributes + locale->setKeywordValue(kAttributeKey, "", errorCode); + + // Clear all Unicode keyword values + LocalPointer iter(locale->createUnicodeKeywords(errorCode)); + if (U_FAILURE(errorCode) || iter.isNull()) { return; } + const char* key; + while ((key = iter->next(nullptr, errorCode)) != nullptr) { + locale->setUnicodeKeywordValue(key, nullptr, errorCode); + } +} + +static void +_setUnicodeExtensions(Locale* locale, const CharString& value, UErrorCode& errorCode) +{ + // Add the unicode extensions to extensions_ + CharString locale_str("und-u-", errorCode); + locale_str.append(value, errorCode); + _copyExtensions( + Locale::forLanguageTag(locale_str.data(), errorCode), + locale, false, errorCode); +} + +LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) +{ + if (U_FAILURE(status_)) { return *this; } + if (!UPRV_ISALPHANUM(key)) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + CharString value_str(value, status_); + if (U_FAILURE(status_)) { return *this; } + transform(value_str.data(), value_str.length()); + if (!value_str.isEmpty() && + !_isExtensionSubtags(key, value_str.data(), value_str.length())) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { + extensions_ = new Locale(); + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + } + if (uprv_tolower(key) != 'u') { + // for t, x and others extension. + extensions_->setKeywordValue(StringPiece(&key, 1), value_str.data(), + status_); + return *this; + } + _clearUAttributesAndKeyType(extensions_, status_); + if (U_FAILURE(status_)) { return *this; } + if (!value.empty()) { + _setUnicodeExtensions(extensions_, value_str, status_); + } + return *this; +} + +LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword( + StringPiece key, StringPiece type) +{ + if (U_FAILURE(status_)) { return *this; } + if (!ultag_isUnicodeLocaleKey(key.data(), key.length()) || + (!type.empty() && + !ultag_isUnicodeLocaleType(type.data(), type.length()))) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { + extensions_ = new Locale(); + } + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + extensions_->setUnicodeKeywordValue(key, type, status_); + return *this; +} + +LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute( + StringPiece value) +{ + CharString value_str(value, status_); + if (U_FAILURE(status_)) { return *this; } + transform(value_str.data(), value_str.length()); + if (!ultag_isUnicodeLocaleAttribute(value_str.data(), value_str.length())) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { + extensions_ = new Locale(); + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + extensions_->setKeywordValue(kAttributeKey, value_str.data(), status_); + return *this; + } + + CharString attributes; + CharStringByteSink sink(&attributes); + UErrorCode localErrorCode = U_ZERO_ERROR; + extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + if (U_FAILURE(localErrorCode)) { + CharString new_attributes(value_str.data(), status_); + // No attributes, set the attribute. + extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_); + return *this; + } + + transform(attributes.data(),attributes.length()); + const char* start = attributes.data(); + const char* limit = attributes.data() + attributes.length(); + CharString new_attributes; + bool inserted = false; + while (start < limit) { + if (!inserted) { + int cmp = uprv_strcmp(start, value_str.data()); + if (cmp == 0) { return *this; } // Found it in attributes: Just return + if (cmp > 0) { + if (!new_attributes.isEmpty()) new_attributes.append('_', status_); + new_attributes.append(value_str.data(), status_); + inserted = true; + } + } + if (!new_attributes.isEmpty()) { + new_attributes.append('_', status_); + } + new_attributes.append(start, status_); + start += uprv_strlen(start) + 1; + } + if (!inserted) { + if (!new_attributes.isEmpty()) { + new_attributes.append('_', status_); + } + new_attributes.append(value_str.data(), status_); + } + // Not yet in the attributes, set the attribute. + extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_); + return *this; +} + +LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute( + StringPiece value) +{ + CharString value_str(value, status_); + if (U_FAILURE(status_)) { return *this; } + transform(value_str.data(), value_str.length()); + if (!ultag_isUnicodeLocaleAttribute(value_str.data(), value_str.length())) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { return *this; } + UErrorCode localErrorCode = U_ZERO_ERROR; + CharString attributes; + CharStringByteSink sink(&attributes); + extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + // get failure, just return + if (U_FAILURE(localErrorCode)) { return *this; } + // Do not have any attributes, just return. + if (attributes.isEmpty()) { return *this; } + + char* p = attributes.data(); + // Replace null terminiator in place for _ and - so later + // we can use uprv_strcmp to compare. + for (int32_t i = 0; i < attributes.length(); i++, p++) { + *p = (*p == '_' || *p == '-') ? '\0' : uprv_tolower(*p); + } + + const char* start = attributes.data(); + const char* limit = attributes.data() + attributes.length(); + CharString new_attributes; + bool found = false; + while (start < limit) { + if (uprv_strcmp(start, value_str.data()) == 0) { + found = true; + } else { + if (!new_attributes.isEmpty()) { + new_attributes.append('_', status_); + } + new_attributes.append(start, status_); + } + start += uprv_strlen(start) + 1; + } + // Found the value in attributes, set the attribute. + if (found) { + extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_); + } + return *this; +} + +LocaleBuilder& LocaleBuilder::clear() +{ + status_ = U_ZERO_ERROR; + language_[0] = 0; + script_[0] = 0; + region_[0] = 0; + delete variant_; + variant_ = nullptr; + clearExtensions(); + return *this; +} + +LocaleBuilder& LocaleBuilder::clearExtensions() +{ + delete extensions_; + extensions_ = nullptr; + return *this; +} + +Locale makeBogusLocale() { + Locale bogus; + bogus.setToBogus(); + return bogus; +} + +Locale LocaleBuilder::build(UErrorCode& errorCode) +{ + if (U_FAILURE(errorCode)) { + return makeBogusLocale(); + } + if (U_FAILURE(status_)) { + errorCode = status_; + return makeBogusLocale(); + } + CharString locale_str(language_, errorCode); + if (uprv_strlen(script_) > 0) { + locale_str.append('-', errorCode).append(StringPiece(script_), errorCode); + } + if (uprv_strlen(region_) > 0) { + locale_str.append('-', errorCode).append(StringPiece(region_), errorCode); + } + if (variant_ != nullptr) { + locale_str.append('-', errorCode).append(StringPiece(variant_->data()), errorCode); + } + if (U_FAILURE(errorCode)) { + return makeBogusLocale(); + } + Locale product(locale_str.data()); + if (extensions_ != nullptr) { + _copyExtensions(*extensions_, &product, true, errorCode); + } + if (U_FAILURE(errorCode)) { + return makeBogusLocale(); + } + return product; +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/localsvc.h b/deps/icu-small/source/common/localsvc.h index 724216aa64169e..0339a44dcd95ec 100644 --- a/deps/icu-small/source/common/localsvc.h +++ b/deps/icu-small/source/common/localsvc.h @@ -12,7 +12,7 @@ #include "unicode/utypes.h" -#if U_LOCAL_SERVICE_HOOK +#if defined(U_LOCAL_SERVICE_HOOK) && U_LOCAL_SERVICE_HOOK /** * Prototype for user-supplied service hook. This function is expected to return * a type of factory object specific to the requested service. diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index b3a3346a195995..1e608ffb9e1c84 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -125,8 +125,6 @@ static UBool U_CALLCONV uloc_cleanup(void) { // via the initOnce mechanism. static void U_CALLCONV loadInstalledLocales() { - UResourceBundle *indexLocale = NULL; - UResourceBundle installed; UErrorCode status = U_ZERO_ERROR; int32_t i = 0; int32_t localeCount; @@ -135,25 +133,25 @@ static void U_CALLCONV loadInstalledLocales() { U_ASSERT(_installedLocalesCount == 0); _installedLocalesCount = 0; - ures_initStackObject(&installed); - indexLocale = ures_openDirect(NULL, _kIndexLocaleName, &status); - ures_getByKey(indexLocale, _kIndexTag, &installed, &status); + + icu::LocalUResourceBundlePointer indexLocale(ures_openDirect(NULL, _kIndexLocaleName, &status)); + icu::StackUResourceBundle installed; + + ures_getByKey(indexLocale.getAlias(), _kIndexTag, installed.getAlias(), &status); if(U_SUCCESS(status)) { - localeCount = ures_getSize(&installed); + localeCount = ures_getSize(installed.getAlias()); _installedLocales = (char **) uprv_malloc(sizeof(char*) * (localeCount+1)); if (_installedLocales != NULL) { - ures_resetIterator(&installed); - while(ures_hasNext(&installed)) { - ures_getNextString(&installed, NULL, (const char **)&_installedLocales[i++], &status); + ures_resetIterator(installed.getAlias()); + while(ures_hasNext(installed.getAlias())) { + ures_getNextString(installed.getAlias(), NULL, (const char **)&_installedLocales[i++], &status); } _installedLocales[i] = NULL; _installedLocalesCount = localeCount; ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup); } } - ures_close(&installed); - ures_close(indexLocale); } static void _load_installedLocales() diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index 83c7bc30c02703..7216a3a3083e3d 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -22,6 +22,7 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" #include "unicode/locid.h" +#include "unicode/uenum.h" #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/ustring.h" @@ -306,14 +307,11 @@ _getStringOrCopyKey(const char *path, const char *locale, if(itemKey==NULL) { /* top-level item: normal resource bundle access */ - UResourceBundle *rb; - - rb=ures_open(path, locale, pErrorCode); + icu::LocalUResourceBundlePointer rb(ures_open(path, locale, pErrorCode)); if(U_SUCCESS(*pErrorCode)) { - s=ures_getStringByKey(rb, tableKey, &length, pErrorCode); + s=ures_getStringByKey(rb.getAlias(), tableKey, &length, pErrorCode); /* see comment about closing rb near "return item;" in _res_getTableStringWithFallback() */ - ures_close(rb); } } else { /* Language code should not be a number. If it is, set the error code. */ @@ -376,7 +374,12 @@ _getDisplayNameForComponent(const char *locale, return 0; } if(length==0) { - return u_terminateUChars(dest, destCapacity, 0, pErrorCode); + // For the display name, we treat this as unknown language (ICU-20273). + if (getter == uloc_getLanguage) { + uprv_strcpy(localeBuffer, "und"); + } else { + return u_terminateUChars(dest, destCapacity, 0, pErrorCode); + } } root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG; @@ -510,15 +513,14 @@ uloc_getDisplayName(const char *locale, { UErrorCode status = U_ZERO_ERROR; - UResourceBundle* locbundle=ures_open(U_ICUDATA_LANG, displayLocale, &status); - UResourceBundle* dspbundle=ures_getByKeyWithFallback(locbundle, _kLocaleDisplayPattern, - NULL, &status); - separator=ures_getStringByKeyWithFallback(dspbundle, _kSeparator, &sepLen, &status); - pattern=ures_getStringByKeyWithFallback(dspbundle, _kPattern, &patLen, &status); + icu::LocalUResourceBundlePointer locbundle( + ures_open(U_ICUDATA_LANG, displayLocale, &status)); + icu::LocalUResourceBundlePointer dspbundle( + ures_getByKeyWithFallback(locbundle.getAlias(), _kLocaleDisplayPattern, NULL, &status)); - ures_close(dspbundle); - ures_close(locbundle); + separator=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kSeparator, &sepLen, &status); + pattern=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kPattern, &patLen, &status); } /* If we couldn't find any data, then use the defaults */ @@ -586,7 +588,7 @@ uloc_getDisplayName(const char *locale, int32_t langPos=0; /* position in output of language substitution */ int32_t restLen=0; /* length of 'everything else' substitution */ int32_t restPos=0; /* position in output of 'everything else' substitution */ - UEnumeration* kenum = NULL; /* keyword enumeration */ + icu::LocalUEnumerationPointer kenum; /* keyword enumeration */ /* prefix of pattern, extremely likely to be empty */ if(sub0Pos) { @@ -639,12 +641,11 @@ uloc_getDisplayName(const char *locale, len=uloc_getDisplayVariant(locale, displayLocale, p, cap, pErrorCode); break; case 3: - kenum = uloc_openKeywords(locale, pErrorCode); + kenum.adoptInstead(uloc_openKeywords(locale, pErrorCode)); U_FALLTHROUGH; default: { - const char* kw=uenum_next(kenum, &len, pErrorCode); + const char* kw=uenum_next(kenum.getAlias(), &len, pErrorCode); if (kw == NULL) { - uenum_close(kenum); len=0; /* mark that we didn't add a component */ subdone=TRUE; } else { @@ -833,16 +834,14 @@ uloc_getDisplayKeywordValue( const char* locale, int32_t dispNameLen = 0; const UChar *dispName = NULL; - UResourceBundle *bundle = ures_open(U_ICUDATA_CURR, displayLocale, status); - UResourceBundle *currencies = ures_getByKey(bundle, _kCurrencies, NULL, status); - UResourceBundle *currency = ures_getByKeyWithFallback(currencies, keywordValue, NULL, status); - - dispName = ures_getStringByIndex(currency, UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); + icu::LocalUResourceBundlePointer bundle( + ures_open(U_ICUDATA_CURR, displayLocale, status)); + icu::LocalUResourceBundlePointer currencies( + ures_getByKey(bundle.getAlias(), _kCurrencies, NULL, status)); + icu::LocalUResourceBundlePointer currency( + ures_getByKeyWithFallback(currencies.getAlias(), keywordValue, NULL, status)); - /*close the bundles */ - ures_close(currency); - ures_close(currencies); - ures_close(bundle); + dispName = ures_getStringByIndex(currency.getAlias(), UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); if(U_FAILURE(*status)){ if(*status == U_MISSING_RESOURCE_ERROR){ diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 2d9389e910a2ab..da35be9e766e50 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -286,7 +286,6 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { #else UObject* capitalizationBrkIter; #endif - static UMutex capitalizationBrkIterLock; UnicodeString formatOpenParen; UnicodeString formatReplaceOpenParen; UnicodeString formatCloseParen; @@ -352,8 +351,6 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { struct CapitalizationContextSink; }; -UMutex LocaleDisplayNamesImpl::capitalizationBrkIterLock = U_MUTEX_INITIALIZER; - LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, UDialectHandling dialectHandling) : dialectHandling(dialectHandling) @@ -552,6 +549,7 @@ LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage, if ( result.length() > 0 && u_islower(result.char32At(0)) && capitalizationBrkIter!= NULL && ( capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || fCapitalization[usage] ) ) { // note fCapitalization[usage] won't be set unless capitalizationContext is UI_LIST_OR_MENU or STANDALONE + static UMutex capitalizationBrkIterLock = U_MUTEX_INITIALIZER; Mutex lock(&capitalizationBrkIterLock); result.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); } diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index e0dcc8a88ec0ec..06986b636adc31 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -62,7 +62,10 @@ static Locale *gLocaleCache = NULL; static UInitOnce gLocaleCacheInitOnce = U_INITONCE_INITIALIZER; // gDefaultLocaleMutex protects all access to gDefaultLocalesHashT and gDefaultLocale. -static UMutex gDefaultLocaleMutex = U_MUTEX_INITIALIZER; +static UMutex *gDefaultLocaleMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable *gDefaultLocalesHashT = NULL; static Locale *gDefaultLocale = NULL; @@ -171,7 +174,7 @@ U_NAMESPACE_BEGIN Locale *locale_set_default_internal(const char *id, UErrorCode& status) { // Synchronize this entire function. - Mutex lock(&gDefaultLocaleMutex); + Mutex lock(gDefaultLocaleMutex()); UBool canonicalize = FALSE; @@ -569,9 +572,13 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) variantBegin = length; /* after uloc_getName/canonicalize() we know that only '_' are separators */ + /* But _ could also appeared in timezone such as "en@timezone=America/Los_Angeles" */ separator = field[0] = fullName; fieldIdx = 1; - while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && fieldIdx < UPRV_LENGTHOF(field)-1) { + char* at = uprv_strchr(fullName, '@'); + while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && + fieldIdx < UPRV_LENGTHOF(field)-1 && + (at == nullptr || separator < at)) { field[fieldIdx] = separator + 1; fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]); fieldIdx++; @@ -704,7 +711,7 @@ const Locale& U_EXPORT2 Locale::getDefault() { { - Mutex lock(&gDefaultLocaleMutex); + Mutex lock(gDefaultLocaleMutex()); if (gDefaultLocale != NULL) { return *gDefaultLocale; } @@ -736,46 +743,10 @@ Locale::addLikelySubtags(UErrorCode& status) { return; } - // The maximized locale ID string is often longer, but there is no good - // heuristic to estimate just how much longer. Leave that to CharString. CharString maximizedLocaleID; - int32_t maximizedLocaleIDCapacity = static_cast(uprv_strlen(fullName)); - - char* buffer; - int32_t reslen; - - for (;;) { - buffer = maximizedLocaleID.getAppendBuffer( - /*minCapacity=*/maximizedLocaleIDCapacity, - /*desiredCapacityHint=*/maximizedLocaleIDCapacity, - maximizedLocaleIDCapacity, - status); - - if (U_FAILURE(status)) { - return; - } - - reslen = uloc_addLikelySubtags( - fullName, - buffer, - maximizedLocaleIDCapacity, - &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - maximizedLocaleIDCapacity = reslen; - status = U_ZERO_ERROR; - } - - if (U_FAILURE(status)) { - return; - } - - maximizedLocaleID.append(buffer, reslen, status); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators provided by CharString. + { + CharStringByteSink sink(&maximizedLocaleID); + ulocimp_addLikelySubtags(fullName, sink, &status); } if (U_FAILURE(status)) { @@ -794,50 +765,10 @@ Locale::minimizeSubtags(UErrorCode& status) { return; } - // Except for a few edge cases (like the empty string, that is minimized to - // "en__POSIX"), minimized locale ID strings will be either the same length - // or shorter than their input. CharString minimizedLocaleID; - int32_t minimizedLocaleIDCapacity = static_cast(uprv_strlen(fullName)); - - char* buffer; - int32_t reslen; - - for (;;) { - buffer = minimizedLocaleID.getAppendBuffer( - /*minCapacity=*/minimizedLocaleIDCapacity, - /*desiredCapacityHint=*/minimizedLocaleIDCapacity, - minimizedLocaleIDCapacity, - status); - - if (U_FAILURE(status)) { - return; - } - - reslen = uloc_minimizeSubtags( - fullName, - buffer, - minimizedLocaleIDCapacity, - &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - // Because of the internal minimal buffer size of CharString, I can't - // think of any input data for which this could possibly ever happen. - // Maybe it would be better replaced with an assertion instead? - minimizedLocaleIDCapacity = reslen; - status = U_ZERO_ERROR; - } - - if (U_FAILURE(status)) { - return; - } - - minimizedLocaleID.append(buffer, reslen, status); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators provided by CharString. + { + CharStringByteSink sink(&minimizedLocaleID); + ulocimp_minimizeSubtags(fullName, sink, &status); } if (U_FAILURE(status)) { @@ -869,43 +800,16 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status) // parsing. Therefore the code here explicitly calls uloc_forLanguageTag() // and then Locale::init(), instead of just calling the normal constructor. - // All simple language tags will have the exact same length as ICU locale - // ID strings as they have as BCP-47 strings (like "en_US" for "en-US"). CharString localeID; - int32_t resultCapacity = tag.size(); - - char* buffer; - int32_t parsedLength, reslen; - - for (;;) { - buffer = localeID.getAppendBuffer( - /*minCapacity=*/resultCapacity, - /*desiredCapacityHint=*/resultCapacity, - resultCapacity, - status); - - if (U_FAILURE(status)) { - return result; - } - - reslen = ulocimp_forLanguageTag( + int32_t parsedLength; + { + CharStringByteSink sink(&localeID); + ulocimp_forLanguageTag( tag.data(), tag.length(), - buffer, - resultCapacity, + sink, &parsedLength, &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - // For all BCP-47 language tags that use extensions, the corresponding - // ICU locale ID will be longer but uloc_forLanguageTag() does compute - // the exact length needed so this memory reallocation will be done at - // most once. - resultCapacity = reslen; - status = U_ZERO_ERROR; } if (U_FAILURE(status)) { @@ -917,15 +821,6 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status) return result; } - localeID.append(buffer, reslen, status); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators provided by CharString. - } - - if (U_FAILURE(status)) { - return result; - } - result.init(localeID.data(), /*canonicalize=*/FALSE); if (result.isBogus()) { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -945,59 +840,7 @@ Locale::toLanguageTag(ByteSink& sink, UErrorCode& status) const return; } - // All simple language tags will have the exact same length as BCP-47 - // strings as they have as ICU locale IDs (like "en-US" for "en_US"). - LocalMemory scratch; - int32_t scratch_capacity = static_cast(uprv_strlen(fullName)); - - if (scratch_capacity == 0) { - scratch_capacity = 3; // "und" - } - - char* buffer; - int32_t result_capacity, reslen; - - for (;;) { - if (scratch.allocateInsteadAndReset(scratch_capacity) == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - - buffer = sink.GetAppendBuffer( - /*min_capacity=*/scratch_capacity, - /*desired_capacity_hint=*/scratch_capacity, - scratch.getAlias(), - scratch_capacity, - &result_capacity); - - reslen = uloc_toLanguageTag( - fullName, - buffer, - result_capacity, - /*strict=*/FALSE, - &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - // For some very few edge cases a language tag will be longer as a - // BCP-47 string than it is as an ICU locale ID. Most notoriously "C" - // expands to the BCP-47 tag "en-US-u-va-posix", 16 times longer, and - // it'll take several calls to uloc_toLanguageTag() to figure that out. - // https://unicode-org.atlassian.net/browse/ICU-20132 - scratch_capacity = reslen; - status = U_ZERO_ERROR; - } - - if (U_FAILURE(status)) { - return; - } - - sink.Append(buffer, reslen); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators not used. - } + ulocimp_toLanguageTag(fullName, sink, /*strict=*/FALSE, &status); } Locale U_EXPORT2 @@ -1536,12 +1379,16 @@ Locale::setUnicodeKeywordValue(StringPiece keywordName, return; } - const char* legacy_value = - uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data()); + const char* legacy_value = nullptr; - if (legacy_value == nullptr) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; + if (!keywordValue_nul.isEmpty()) { + legacy_value = + uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data()); + + if (legacy_value == nullptr) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } } setKeywordValue(legacy_key, legacy_value, status); diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index e5876e2ea22773..50cc2a65de0b2d 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -19,6 +19,7 @@ * that then do not depend on resource bundle code and likely-subtags data. */ +#include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/locid.h" #include "unicode/putil.h" @@ -26,11 +27,20 @@ #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/uscript.h" +#include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" #include "ulocimp.h" #include "ustr_imp.h" +/** + * These are the canonical strings for unknown languages, scripts and regions. + **/ +static const char* const unknownLanguage = "und"; +static const char* const unknownScript = "Zzzz"; +static const char* const unknownRegion = "ZZ"; + /** * This function looks for the localeID in the likelySubtags resource. * @@ -50,9 +60,22 @@ findLikelySubtags(const char* localeID, int32_t resLen = 0; const UChar* s = NULL; UErrorCode tmpErr = U_ZERO_ERROR; - UResourceBundle* subtags = ures_openDirect(NULL, "likelySubtags", &tmpErr); + icu::LocalUResourceBundlePointer subtags(ures_openDirect(NULL, "likelySubtags", &tmpErr)); if (U_SUCCESS(tmpErr)) { - s = ures_getStringByKey(subtags, localeID, &resLen, &tmpErr); + icu::CharString und; + if (localeID != NULL) { + if (*localeID == '\0') { + localeID = unknownLanguage; + } else if (*localeID == '_') { + und.append(unknownLanguage, *err); + und.append(localeID, *err); + if (U_FAILURE(*err)) { + return NULL; + } + localeID = und.data(); + } + } + s = ures_getStringByKey(subtags.getAlias(), localeID, &resLen, &tmpErr); if (U_FAILURE(tmpErr)) { /* @@ -69,10 +92,13 @@ findLikelySubtags(const char* localeID, } else { u_UCharsToChars(s, buffer, resLen + 1); + if (resLen >= 3 && + uprv_strnicmp(buffer, unknownLanguage, 3) == 0 && + (resLen == 3 || buffer[3] == '_')) { + uprv_memmove(buffer, buffer + 3, resLen - 3 + 1); + } result = buffer; } - - ures_close(subtags); } else { *err = tmpErr; } @@ -96,9 +122,10 @@ appendTag( const char* tag, int32_t tagLength, char* buffer, - int32_t* bufferLength) { + int32_t* bufferLength, + UBool withSeparator) { - if (*bufferLength > 0) { + if (withSeparator) { buffer[*bufferLength] = '_'; ++(*bufferLength); } @@ -111,13 +138,6 @@ appendTag( *bufferLength += tagLength; } -/** - * These are the canonical strings for unknown languages, scripts and regions. - **/ -static const char* const unknownLanguage = "und"; -static const char* const unknownScript = "Zzzz"; -static const char* const unknownRegion = "ZZ"; - /** * Create a tag string from the supplied parameters. The lang, script and region * parameters may be NULL pointers. If they are, their corresponding length parameters @@ -147,12 +167,10 @@ static const char* const unknownRegion = "ZZ"; * @param trailing Any trailing data to append to the new tag. * @param trailingLength The length of the trailing data. * @param alternateTags A string containing any alternate tags. - * @param tag The output buffer. - * @param tagCapacity The capacity of the output buffer. + * @param sink The output sink receiving the tag string. * @param err A pointer to a UErrorCode for error reporting. - * @return The length of the tag string, which may be greater than tagCapacity, or -1 on error. **/ -static int32_t U_CALLCONV +static void U_CALLCONV createTagStringWithAlternates( const char* lang, int32_t langLength, @@ -163,16 +181,13 @@ createTagStringWithAlternates( const char* trailing, int32_t trailingLength, const char* alternateTags, - char* tag, - int32_t tagCapacity, + icu::ByteSink& sink, UErrorCode* err) { if (U_FAILURE(*err)) { goto error; } - else if (tag == NULL || - tagCapacity <= 0 || - langLength >= ULOC_LANG_CAPACITY || + else if (langLength >= ULOC_LANG_CAPACITY || scriptLength >= ULOC_SCRIPT_CAPACITY || regionLength >= ULOC_COUNTRY_CAPACITY) { goto error; @@ -186,7 +201,6 @@ createTagStringWithAlternates( **/ char tagBuffer[ULOC_FULLNAME_CAPACITY]; int32_t tagLength = 0; - int32_t capacityRemaining = tagCapacity; UBool regionAppended = FALSE; if (langLength > 0) { @@ -194,18 +208,14 @@ createTagStringWithAlternates( lang, langLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/FALSE); } else if (alternateTags == NULL) { /* - * Append the value for an unknown language, if + * Use the empty string for an unknown language, if * we found no language. */ - appendTag( - unknownLanguage, - (int32_t)uprv_strlen(unknownLanguage), - tagBuffer, - &tagLength); } else { /* @@ -226,21 +236,17 @@ createTagStringWithAlternates( } else if (alternateLangLength == 0) { /* - * Append the value for an unknown language, if + * Use the empty string for an unknown language, if * we found no language. */ - appendTag( - unknownLanguage, - (int32_t)uprv_strlen(unknownLanguage), - tagBuffer, - &tagLength); } else { appendTag( alternateLang, alternateLangLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/FALSE); } } @@ -249,7 +255,8 @@ createTagStringWithAlternates( script, scriptLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); } else if (alternateTags != NULL) { /* @@ -273,7 +280,8 @@ createTagStringWithAlternates( alternateScript, alternateScriptLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); } } @@ -282,7 +290,8 @@ createTagStringWithAlternates( region, regionLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); regionAppended = TRUE; } @@ -307,61 +316,35 @@ createTagStringWithAlternates( alternateRegion, alternateRegionLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); regionAppended = TRUE; } } - { - const int32_t toCopy = - tagLength >= tagCapacity ? tagCapacity : tagLength; - - /** - * Copy the partial tag from our internal buffer to the supplied - * target. - **/ - uprv_memcpy( - tag, - tagBuffer, - toCopy); - - capacityRemaining -= toCopy; - } + /** + * Copy the partial tag from our internal buffer to the supplied + * target. + **/ + sink.Append(tagBuffer, tagLength); if (trailingLength > 0) { - if (*trailing != '@' && capacityRemaining > 0) { - tag[tagLength++] = '_'; - --capacityRemaining; - if (capacityRemaining > 0 && !regionAppended) { + if (*trailing != '@') { + sink.Append("_", 1); + if (!regionAppended) { /* extra separator is required */ - tag[tagLength++] = '_'; - --capacityRemaining; + sink.Append("_", 1); } } - if (capacityRemaining > 0) { - /* - * Copy the trailing data into the supplied buffer. Use uprv_memmove, since we - * don't know if the user-supplied buffers overlap. - */ - const int32_t toCopy = - trailingLength >= capacityRemaining ? capacityRemaining : trailingLength; - - uprv_memmove( - &tag[tagLength], - trailing, - toCopy); - } + /* + * Copy the trailing data into the supplied buffer. + */ + sink.Append(trailing, trailingLength); } - tagLength += trailingLength; - - return u_terminateChars( - tag, - tagCapacity, - tagLength, - err); + return; } error: @@ -375,8 +358,6 @@ createTagStringWithAlternates( U_SUCCESS(*err)) { *err = U_ILLEGAL_ARGUMENT_ERROR; } - - return -1; } /** @@ -400,12 +381,10 @@ createTagStringWithAlternates( * @param regionLength The length of the region tag. * @param trailing Any trailing data to append to the new tag. * @param trailingLength The length of the trailing data. - * @param tag The output buffer. - * @param tagCapacity The capacity of the output buffer. + * @param sink The output sink receiving the tag string. * @param err A pointer to a UErrorCode for error reporting. - * @return The length of the tag string, which may be greater than tagCapacity. **/ -static int32_t U_CALLCONV +static void U_CALLCONV createTagString( const char* lang, int32_t langLength, @@ -415,11 +394,10 @@ createTagString( int32_t regionLength, const char* trailing, int32_t trailingLength, - char* tag, - int32_t tagCapacity, + icu::ByteSink& sink, UErrorCode* err) { - return createTagStringWithAlternates( + createTagStringWithAlternates( lang, langLength, script, @@ -429,8 +407,7 @@ createTagString( trailing, trailingLength, NULL, - tag, - tagCapacity, + sink, err); } @@ -502,15 +479,9 @@ parseTagString( *langLength = subtagLength; /* - * If no language was present, use the value of unknownLanguage - * instead. Otherwise, move past any separator. + * If no language was present, use the empty string instead. + * Otherwise, move past any separator. */ - if (*langLength == 0) { - uprv_strcpy( - lang, - unknownLanguage); - *langLength = (int32_t)uprv_strlen(lang); - } if (_isIDSeparator(*position)) { ++position; } @@ -578,7 +549,7 @@ parseTagString( goto exit; } -static int32_t U_CALLCONV +static UBool U_CALLCONV createLikelySubtagsString( const char* lang, int32_t langLength, @@ -588,17 +559,14 @@ createLikelySubtagsString( int32_t regionLength, const char* variants, int32_t variantsLength, - char* tag, - int32_t tagCapacity, - UErrorCode* err) -{ + icu::ByteSink& sink, + UErrorCode* err) { /** * ULOC_FULLNAME_CAPACITY will provide enough capacity * that we can build a string that contains the language, * script and region code without worrying about overrunning * the user-supplied buffer. **/ - char tagBuffer[ULOC_FULLNAME_CAPACITY]; char likelySubtagsBuffer[ULOC_FULLNAME_CAPACITY]; if(U_FAILURE(*err)) { @@ -612,25 +580,28 @@ createLikelySubtagsString( const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - script, - scriptLength, - region, - regionLength, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + script, + scriptLength, + region, + regionLength, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -642,7 +613,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, NULL, @@ -652,9 +623,9 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } @@ -665,25 +636,28 @@ createLikelySubtagsString( const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - script, - scriptLength, - NULL, - 0, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + script, + scriptLength, + NULL, + 0, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -695,7 +669,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, NULL, @@ -705,9 +679,9 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } @@ -718,25 +692,28 @@ createLikelySubtagsString( const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - NULL, - 0, - region, - regionLength, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + NULL, + 0, + region, + regionLength, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -748,7 +725,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, script, @@ -758,9 +735,9 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } @@ -770,25 +747,28 @@ createLikelySubtagsString( { const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - NULL, - 0, - NULL, - 0, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + NULL, + 0, + NULL, + 0, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -800,7 +780,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, script, @@ -810,17 +790,13 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } - return u_terminateChars( - tag, - tagCapacity, - 0, - err); + return FALSE; error: @@ -828,7 +804,7 @@ createLikelySubtagsString( *err = U_ILLEGAL_ARGUMENT_ERROR; } - return -1; + return FALSE; } #define CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength) \ @@ -850,12 +826,10 @@ createLikelySubtagsString( } \ } -static int32_t -_uloc_addLikelySubtags(const char* localeID, - char* maximizedLocaleID, - int32_t maximizedLocaleIDCapacity, - UErrorCode* err) -{ +static void +_uloc_addLikelySubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err) { char lang[ULOC_LANG_CAPACITY]; int32_t langLength = sizeof(lang); char script[ULOC_SCRIPT_CAPACITY]; @@ -865,14 +839,12 @@ _uloc_addLikelySubtags(const char* localeID, const char* trailing = ""; int32_t trailingLength = 0; int32_t trailingIndex = 0; - int32_t resultLength = 0; + UBool success = FALSE; if(U_FAILURE(*err)) { goto error; } - else if (localeID == NULL || - maximizedLocaleID == NULL || - maximizedLocaleIDCapacity <= 0) { + if (localeID == NULL) { goto error; } @@ -903,7 +875,7 @@ _uloc_addLikelySubtags(const char* localeID, CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - resultLength = + success = createLikelySubtagsString( lang, langLength, @@ -913,55 +885,32 @@ _uloc_addLikelySubtags(const char* localeID, regionLength, trailing, trailingLength, - maximizedLocaleID, - maximizedLocaleIDCapacity, + sink, err); - if (resultLength == 0) { + if (!success) { const int32_t localIDLength = (int32_t)uprv_strlen(localeID); /* * If we get here, we need to return localeID. */ - uprv_memcpy( - maximizedLocaleID, - localeID, - localIDLength <= maximizedLocaleIDCapacity ? - localIDLength : maximizedLocaleIDCapacity); - - resultLength = - u_terminateChars( - maximizedLocaleID, - maximizedLocaleIDCapacity, - localIDLength, - err); + sink.Append(localeID, localIDLength); } - return resultLength; + return; error: if (!U_FAILURE(*err)) { *err = U_ILLEGAL_ARGUMENT_ERROR; } - - return -1; } -static int32_t -_uloc_minimizeSubtags(const char* localeID, - char* minimizedLocaleID, - int32_t minimizedLocaleIDCapacity, - UErrorCode* err) -{ - /** - * ULOC_FULLNAME_CAPACITY will provide enough capacity - * that we can build a string that contains the language, - * script and region code without worrying about overrunning - * the user-supplied buffer. - **/ - char maximizedTagBuffer[ULOC_FULLNAME_CAPACITY]; - int32_t maximizedTagBufferLength = sizeof(maximizedTagBuffer); +static void +_uloc_minimizeSubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err) { + icu::CharString maximizedTagBuffer; char lang[ULOC_LANG_CAPACITY]; int32_t langLength = sizeof(lang); @@ -976,9 +925,7 @@ _uloc_minimizeSubtags(const char* localeID, if(U_FAILURE(*err)) { goto error; } - else if (localeID == NULL || - minimizedLocaleID == NULL || - minimizedLocaleIDCapacity <= 0) { + else if (localeID == NULL) { goto error; } @@ -1011,32 +958,32 @@ _uloc_minimizeSubtags(const char* localeID, CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - createTagString( - lang, - langLength, - script, - scriptLength, - region, - regionLength, - NULL, - 0, - maximizedTagBuffer, - maximizedTagBufferLength, - err); - if(U_FAILURE(*err)) { - goto error; - } + { + icu::CharString base; + { + icu::CharStringByteSink sink(&base); + createTagString( + lang, + langLength, + script, + scriptLength, + region, + regionLength, + NULL, + 0, + sink, + err); + } - /** - * First, we need to first get the maximization - * from AddLikelySubtags. - **/ - maximizedTagBufferLength = - uloc_addLikelySubtags( - maximizedTagBuffer, - maximizedTagBuffer, - maximizedTagBufferLength, - err); + /** + * First, we need to first get the maximization + * from AddLikelySubtags. + **/ + { + icu::CharStringByteSink sink(&maximizedTagBuffer); + ulocimp_addLikelySubtags(base.data(), sink, err); + } + } if(U_FAILURE(*err)) { goto error; @@ -1046,9 +993,9 @@ _uloc_minimizeSubtags(const char* localeID, * Start first with just the language. **/ { - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - - const int32_t tagBufferLength = + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); createLikelySubtagsString( lang, langLength, @@ -1058,19 +1005,19 @@ _uloc_minimizeSubtags(const char* localeID, 0, NULL, 0, - tagBuffer, - sizeof(tagBuffer), + sink, err); + } if(U_FAILURE(*err)) { goto error; } - else if (uprv_strnicmp( - maximizedTagBuffer, - tagBuffer, - tagBufferLength) == 0) { + else if (!tagBuffer.isEmpty() && uprv_strnicmp( + maximizedTagBuffer.data(), + tagBuffer.data(), + tagBuffer.length()) == 0) { - return createTagString( + createTagString( lang, langLength, NULL, @@ -1079,9 +1026,9 @@ _uloc_minimizeSubtags(const char* localeID, 0, trailing, trailingLength, - minimizedLocaleID, - minimizedLocaleIDCapacity, + sink, err); + return; } } @@ -1090,9 +1037,9 @@ _uloc_minimizeSubtags(const char* localeID, **/ if (regionLength > 0) { - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - - const int32_t tagBufferLength = + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); createLikelySubtagsString( lang, langLength, @@ -1102,19 +1049,19 @@ _uloc_minimizeSubtags(const char* localeID, regionLength, NULL, 0, - tagBuffer, - sizeof(tagBuffer), + sink, err); + } if(U_FAILURE(*err)) { goto error; } else if (uprv_strnicmp( - maximizedTagBuffer, - tagBuffer, - tagBufferLength) == 0) { + maximizedTagBuffer.data(), + tagBuffer.data(), + tagBuffer.length()) == 0) { - return createTagString( + createTagString( lang, langLength, NULL, @@ -1123,9 +1070,9 @@ _uloc_minimizeSubtags(const char* localeID, regionLength, trailing, trailingLength, - minimizedLocaleID, - minimizedLocaleIDCapacity, + sink, err); + return; } } @@ -1135,9 +1082,9 @@ _uloc_minimizeSubtags(const char* localeID, * maximal version that we already have. **/ if (scriptLength > 0 && regionLength > 0) { - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - - const int32_t tagBufferLength = + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); createLikelySubtagsString( lang, langLength, @@ -1147,19 +1094,19 @@ _uloc_minimizeSubtags(const char* localeID, 0, NULL, 0, - tagBuffer, - sizeof(tagBuffer), + sink, err); + } if(U_FAILURE(*err)) { goto error; } else if (uprv_strnicmp( - maximizedTagBuffer, - tagBuffer, - tagBufferLength) == 0) { + maximizedTagBuffer.data(), + tagBuffer.data(), + tagBuffer.length()) == 0) { - return createTagString( + createTagString( lang, langLength, script, @@ -1168,9 +1115,9 @@ _uloc_minimizeSubtags(const char* localeID, 0, trailing, trailingLength, - minimizedLocaleID, - minimizedLocaleIDCapacity, + sink, err); + return; } } @@ -1179,18 +1126,8 @@ _uloc_minimizeSubtags(const char* localeID, * If we got here, return the locale ID parameter. **/ const int32_t localeIDLength = (int32_t)uprv_strlen(localeID); - - uprv_memcpy( - minimizedLocaleID, - localeID, - localeIDLength <= minimizedLocaleIDCapacity ? - localeIDLength : minimizedLocaleIDCapacity); - - return u_terminateChars( - minimizedLocaleID, - minimizedLocaleIDCapacity, - localeIDLength, - err); + sink.Append(localeID, localeIDLength); + return; } error: @@ -1198,10 +1135,6 @@ _uloc_minimizeSubtags(const char* localeID, if (!U_FAILURE(*err)) { *err = U_ILLEGAL_ARGUMENT_ERROR; } - - return -1; - - } static UBool @@ -1232,50 +1165,82 @@ do_canonicalize(const char* localeID, } U_CAPI int32_t U_EXPORT2 -uloc_addLikelySubtags(const char* localeID, - char* maximizedLocaleID, - int32_t maximizedLocaleIDCapacity, - UErrorCode* err) -{ - char localeBuffer[ULOC_FULLNAME_CAPACITY]; +uloc_addLikelySubtags(const char* localeID, + char* maximizedLocaleID, + int32_t maximizedLocaleIDCapacity, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return 0; + } - if (!do_canonicalize( - localeID, - localeBuffer, - sizeof(localeBuffer), - err)) { - return -1; + icu::CheckedArrayByteSink sink( + maximizedLocaleID, maximizedLocaleIDCapacity); + + ulocimp_addLikelySubtags(localeID, sink, status); + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return sink.Overflowed() ? reslen : -1; } - else { - return _uloc_addLikelySubtags( - localeBuffer, - maximizedLocaleID, - maximizedLocaleIDCapacity, - err); + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars( + maximizedLocaleID, maximizedLocaleIDCapacity, reslen, status); } + + return reslen; } -U_CAPI int32_t U_EXPORT2 -uloc_minimizeSubtags(const char* localeID, - char* minimizedLocaleID, - int32_t minimizedLocaleIDCapacity, - UErrorCode* err) -{ +U_CAPI void U_EXPORT2 +ulocimp_addLikelySubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* status) { char localeBuffer[ULOC_FULLNAME_CAPACITY]; - if (!do_canonicalize( - localeID, - localeBuffer, - sizeof(localeBuffer), - err)) { - return -1; + if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) { + _uloc_addLikelySubtags(localeBuffer, sink, status); } - else { - return _uloc_minimizeSubtags( - localeBuffer, - minimizedLocaleID, - minimizedLocaleIDCapacity, - err); +} + +U_CAPI int32_t U_EXPORT2 +uloc_minimizeSubtags(const char* localeID, + char* minimizedLocaleID, + int32_t minimizedLocaleIDCapacity, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return 0; + } + + icu::CheckedArrayByteSink sink( + minimizedLocaleID, minimizedLocaleIDCapacity); + + ulocimp_minimizeSubtags(localeID, sink, status); + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return sink.Overflowed() ? reslen : -1; + } + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars( + minimizedLocaleID, minimizedLocaleIDCapacity, reslen, status); + } + + return reslen; +} + +U_CAPI void U_EXPORT2 +ulocimp_minimizeSubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* status) { + char localeBuffer[ULOC_FULLNAME_CAPACITY]; + + if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) { + _uloc_minimizeSubtags(localeBuffer, sink, status); } } @@ -1284,7 +1249,7 @@ uloc_minimizeSubtags(const char* localeID, 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(). +// Implemented here because this calls ulocimp_addLikelySubtags(). U_CAPI UBool U_EXPORT2 uloc_isRightToLeft(const char *locale) { UErrorCode errorCode = U_ZERO_ERROR; @@ -1297,26 +1262,30 @@ uloc_isRightToLeft(const char *locale) { errorCode = U_ZERO_ERROR; char lang[8]; int32_t langLength = uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || - langLength == 0) { + if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { return FALSE; } - const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang); - if (langPtr != NULL) { - switch (langPtr[langLength]) { - case '-': return FALSE; - case '+': return TRUE; - default: break; // partial match of a longer code + if (langLength > 0) { + const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang); + if (langPtr != NULL) { + switch (langPtr[langLength]) { + case '-': return FALSE; + case '+': return TRUE; + default: break; // partial match of a longer code + } } } // Otherwise, find the likely script. errorCode = U_ZERO_ERROR; - char likely[ULOC_FULLNAME_CAPACITY]; - (void)uloc_addLikelySubtags(locale, likely, UPRV_LENGTHOF(likely), &errorCode); + icu::CharString likely; + { + icu::CharStringByteSink sink(&likely); + ulocimp_addLikelySubtags(locale, sink, &errorCode); + } if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { return FALSE; } - scriptLength = uloc_getScript(likely, script, UPRV_LENGTHOF(script), &errorCode); + scriptLength = uloc_getScript(likely.data(), script, UPRV_LENGTHOF(script), &errorCode); if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || scriptLength == 0) { return FALSE; @@ -1367,11 +1336,14 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, rgLen = 0; } else if (rgLen == 0 && inferRegion) { // no unicode_region_subtag but inferRegion TRUE, try likely subtags - char locBuf[ULOC_FULLNAME_CAPACITY]; rgStatus = U_ZERO_ERROR; - (void)uloc_addLikelySubtags(localeID, locBuf, ULOC_FULLNAME_CAPACITY, &rgStatus); + icu::CharString locBuf; + { + icu::CharStringByteSink sink(&locBuf); + ulocimp_addLikelySubtags(localeID, sink, &rgStatus); + } if (U_SUCCESS(rgStatus)) { - rgLen = uloc_getCountry(locBuf, rgBuf, ULOC_RG_BUFLEN, status); + rgLen = uloc_getCountry(locBuf.data(), rgBuf, ULOC_RG_BUFLEN, status); if (U_FAILURE(*status)) { rgLen = 0; } diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index a3cf2d5eb2dbcb..46986399b23e7a 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -32,18 +32,9 @@ #include "cmemory.h" #include "unicode/uloc.h" -#if U_PLATFORM == U_PF_WINDOWS && defined(_MSC_VER) && (_MSC_VER >= 1500) -/* - * TODO: It seems like we should widen this to - * either U_PLATFORM_USES_ONLY_WIN32_API (includes MinGW) - * or U_PLATFORM_HAS_WIN32_API (includes MinGW and Cygwin) - * but those use gcc and won't have defined(_MSC_VER). - * We might need to #include some Windows header and test for some version macro from there. - * Or call some Windows function and see what it returns. - */ -#define USE_WINDOWS_LCID_MAPPING_API +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API #include -#include +#include // LCIDToLocaleName and LocaleNameToLCID #endif /* @@ -973,7 +964,7 @@ idCmp(const char* id1, const char* id2) /** * Searches for a Windows LCID * - * @param posixid the Posix style locale id. + * @param posixID the Posix style locale id. * @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has * no equivalent Windows LCID. * @return the LCID @@ -1035,7 +1026,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) // ///////////////////////////////////// */ -#ifdef USE_WINDOWS_LCID_MAPPING_API +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API /* * Various language tags needs to be changed: * quz -> qu @@ -1053,6 +1044,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) } #endif + U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status) { @@ -1061,8 +1053,10 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr UBool bLookup = TRUE; 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 +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API + static_assert(ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH, "Windows locale names have smaller length than ICU locale names."); + + char locName[LOCALE_NAME_MAX_LENGTH] = {}; // 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 @@ -1070,7 +1064,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr // use the Windows API to resolve locale ID for this specific case. if ((hostid & 0x3FF) != 0x92) { int32_t tmpLen = 0; - UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH + char16_t windowsLocaleName[LOCALE_NAME_MAX_LENGTH] = {}; // 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); @@ -1110,7 +1104,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr pPosixID = locName; } } -#endif // USE_WINDOWS_LCID_MAPPING_API +#endif if (bLookup) { const char *pCandidate = NULL; @@ -1163,20 +1157,15 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr ///////////////////////////////////// */ U_CAPI uint32_t -uprv_convertToLCIDPlatform(const char* localeID) +uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) { - // The purpose of this function is to leverage native platform name->lcid - // conversion functionality when available. -#ifdef USE_WINDOWS_LCID_MAPPING_API - DWORD nameLCIDFlags = 0; - UErrorCode myStatus = U_ZERO_ERROR; - - // First check for a Windows name->LCID match, fall through to catch - // ICU special cases, but Windows may know it already. -#if LOCALE_ALLOW_NEUTRAL_NAMES - nameLCIDFlags = LOCALE_ALLOW_NEUTRAL_NAMES; -#endif /* LOCALE_ALLOW_NEUTRAL_NAMES */ + if (U_FAILURE(*status)) { + return 0; + } + // The purpose of this function is to leverage the Windows platform name->lcid + // conversion functionality when available. +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API int32_t len; char collVal[ULOC_KEYWORDS_CAPACITY] = {}; char baseName[ULOC_FULLNAME_CAPACITY] = {}; @@ -1185,8 +1174,8 @@ uprv_convertToLCIDPlatform(const char* localeID) // Check any for keywords. if (uprv_strchr(localeID, '@')) { - len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, &myStatus); - if (U_SUCCESS(myStatus) && len > 0) + len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, status); + if (U_SUCCESS(*status) && len > 0) { // If it contains the keyword collation, return 0 so that the LCID lookup table will be used. return 0; @@ -1194,9 +1183,9 @@ uprv_convertToLCIDPlatform(const char* localeID) else { // If the locale ID contains keywords other than collation, just use the base name. - len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, &myStatus); + len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, status); - if (U_SUCCESS(myStatus) && len > 0) + if (U_SUCCESS(*status) && len > 0) { baseName[len] = 0; mylocaleID = baseName; @@ -1206,9 +1195,9 @@ 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 - (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); + (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, status); - if (U_SUCCESS(myStatus)) + if (U_SUCCESS(*status)) { // Need it to be UTF-16, not 8-bit wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {}; @@ -1230,7 +1219,7 @@ uprv_convertToLCIDPlatform(const char* localeID) { // Ensure it's null terminated bcp47Tag[i] = L'\0'; - LCID lcid = LocaleNameToLCID(bcp47Tag, nameLCIDFlags); + LCID lcid = LocaleNameToLCID(bcp47Tag, LOCALE_ALLOW_NEUTRAL_NAMES); if (lcid > 0) { // Found LCID from windows, return that one, unless its completely ambiguous @@ -1244,10 +1233,10 @@ uprv_convertToLCIDPlatform(const char* localeID) } } #else - (void)localeID; // Suppress unused variable warning. -#endif /* USE_WINDOWS_LCID_MAPPING_API */ + (void) localeID; // Suppress unused variable warning. +#endif - // No found, or not implemented on platforms without native name->lcid conversion + // Nothing found, or not implemented. return 0; } diff --git a/deps/icu-small/source/common/locmap.h b/deps/icu-small/source/common/locmap.h index 2d7a3d37a04495..492a9413628ffb 100644 --- a/deps/icu-small/source/common/locmap.h +++ b/deps/icu-small/source/common/locmap.h @@ -33,7 +33,7 @@ U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char* posixID, int32_t posixIDCapacity, UErrorCode* status); /* Don't call these functions directly. Use uloc_getLCID instead. */ -U_CAPI uint32_t uprv_convertToLCIDPlatform(const char *localeID); // Leverage platform conversion if possible -U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status); +U_CAPI uint32_t uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status); // Leverage platform conversion if possible +U_CAPI uint32_t uprv_convertToLCID(const char* langID, const char* posixID, UErrorCode* status); #endif /* LOCMAP_H */ diff --git a/deps/icu-small/source/common/locresdata.cpp b/deps/icu-small/source/common/locresdata.cpp index f890411c9affd7..69d744306417d5 100644 --- a/deps/icu-small/source/common/locresdata.cpp +++ b/deps/icu-small/source/common/locresdata.cpp @@ -49,7 +49,6 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, UErrorCode *pErrorCode) { /* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/ - UResourceBundle *rb=NULL, table, subTable; const UChar *item=NULL; UErrorCode errorCode; char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0}; @@ -59,7 +58,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, * this falls back through the locale's chain to root */ errorCode=U_ZERO_ERROR; - rb=ures_open(path, locale, &errorCode); + icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); if(U_FAILURE(errorCode)) { /* total failure, not even root could be opened */ @@ -73,24 +72,24 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, } for(;;){ - ures_initStackObject(&table); - ures_initStackObject(&subTable); - ures_getByKeyWithFallback(rb, tableKey, &table, &errorCode); + icu::StackUResourceBundle table; + icu::StackUResourceBundle subTable; + ures_getByKeyWithFallback(rb.getAlias(), tableKey, table.getAlias(), &errorCode); if (subTableKey != NULL) { /* - ures_getByKeyWithFallback(&table,subTableKey, &subTable, &errorCode); - item = ures_getStringByKeyWithFallback(&subTable, itemKey, pLength, &errorCode); + ures_getByKeyWithFallback(table.getAlias(), subTableKey, subTable.getAlias(), &errorCode); + item = ures_getStringByKeyWithFallback(subTable.getAlias(), itemKey, pLength, &errorCode); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; } break;*/ - ures_getByKeyWithFallback(&table,subTableKey, &table, &errorCode); + ures_getByKeyWithFallback(table.getAlias(), subTableKey, table.getAlias(), &errorCode); } if(U_SUCCESS(errorCode)){ - item = ures_getStringByKeyWithFallback(&table, itemKey, pLength, &errorCode); + item = ures_getStringByKeyWithFallback(table.getAlias(), itemKey, pLength, &errorCode); if(U_FAILURE(errorCode)){ const char* replacement = NULL; *pErrorCode = errorCode; /*save the errorCode*/ @@ -103,7 +102,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, } /*pointer comparison is ok since uloc_getCurrentCountryID & uloc_getCurrentLanguageID return the key itself is replacement is not found*/ if(replacement!=NULL && itemKey != replacement){ - item = ures_getStringByKeyWithFallback(&table, replacement, pLength, &errorCode); + item = ures_getStringByKeyWithFallback(table.getAlias(), replacement, pLength, &errorCode); if(U_SUCCESS(errorCode)){ *pErrorCode = errorCode; break; @@ -122,7 +121,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, *pErrorCode = errorCode; errorCode = U_ZERO_ERROR; - fallbackLocale = ures_getStringByKeyWithFallback(&table, "Fallback", &len, &errorCode); + fallbackLocale = ures_getStringByKeyWithFallback(table.getAlias(), "Fallback", &len, &errorCode); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; break; @@ -135,8 +134,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, *pErrorCode = U_INTERNAL_PROGRAM_ERROR; break; } - ures_close(rb); - rb = ures_open(path, explicitFallbackName, &errorCode); + rb.adoptInstead(ures_open(path, explicitFallbackName, &errorCode)); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; break; @@ -146,10 +144,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, break; } } - /* done with the locale string - ready to close table and rb */ - ures_close(&subTable); - ures_close(&table); - ures_close(rb); + return item; } diff --git a/deps/icu-small/source/common/locutil.cpp b/deps/icu-small/source/common/locutil.cpp index 02d2be50ca25e2..74745a37d6d47c 100644 --- a/deps/icu-small/source/common/locutil.cpp +++ b/deps/icu-small/source/common/locutil.cpp @@ -11,6 +11,7 @@ #if !UCONFIG_NO_SERVICE || !UCONFIG_NO_TRANSLITERATION #include "unicode/resbund.h" +#include "unicode/uenum.h" #include "cmemory.h" #include "ustrfmt.h" #include "locutil.h" @@ -229,15 +230,14 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) CharString cbundleID; cbundleID.appendInvariantChars(bundleID, status); const char* path = cbundleID.isEmpty() ? NULL : cbundleID.data(); - UEnumeration *uenum = ures_openAvailableLocales(path, &status); + icu::LocalUEnumerationPointer uenum(ures_openAvailableLocales(path, &status)); for (;;) { - const UChar* id = uenum_unext(uenum, NULL, &status); + const UChar* id = uenum_unext(uenum.getAlias(), NULL, &status); if (id == NULL) { break; } htp->put(UnicodeString(id), (void*)htp, status); } - uenum_close(uenum); if (U_FAILURE(status)) { delete htp; return NULL; diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 82a68097385285..c04bdac5ead393 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -12,27 +12,27 @@ #ifdef INCLUDED_FROM_NORMALIZER2_CPP static const UVersionInfo norm2_nfc_data_formatVersion={4,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={0xb,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0xc,1,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x50,0x4ab0,0x8708,0x8808,0x8808,0x8808,0x8808,0x8808,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, +0x50,0x4ae0,0x8738,0x8838,0x8838,0x8838,0x8838,0x8838,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, 0x3c24,0x3c56,0x300,0 }; -static const uint16_t norm2_nfc_data_trieIndex[1690]={ +static const uint16_t norm2_nfc_data_trieIndex[1712]={ 0,0x40,0x7b,0xbb,0xfb,0x13a,0x17a,0x1b2,0x1f2,0x226,0x254,0x226,0x294,0x2d4,0x313,0x353, 0x393,0x3d2,0x40f,0x44e,0x226,0x226,0x488,0x4c8,0x4f8,0x530,0x226,0x570,0x59f,0x5de,0x226,0x5f3, 0x631,0x65f,0x226,0x68c,0x6cc,0x709,0x729,0x768,0x7a7,0x7e4,0x803,0x840,0x729,0x879,0x8a7,0x8e6, -0x226,0x920,0x937,0x977,0x98e,0x9cd,0x226,0xa03,0xa23,0xa5e,0xa6a,0xaa4,0xacc,0xb09,0xb49,0xb83, -0xb9e,0x226,0xbd9,0x226,0xc19,0xc38,0xc6e,0xcab,0x226,0x226,0x226,0x226,0x226,0xcce,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xcfa,0x226,0x226,0xd2f, -0x226,0x226,0xd4d,0x226,0xd77,0x226,0x226,0x226,0xdb3,0xdd3,0xe13,0x226,0xe51,0xe91,0xec5,0xef1, -0x808,0x226,0x226,0xf25,0x226,0x226,0x226,0xf65,0xfa5,0xfe5,0x1025,0x1065,0x10a5,0x10e5,0x1125,0x1165, -0x11a5,0x226,0x226,0x11d5,0x1206,0x226,0x1236,0x1269,0x12a6,0x12e5,0x1325,0x135b,0x1389,0x226,0x226,0x226, +0x226,0x920,0x937,0x977,0x98e,0x9cd,0x226,0xa03,0xa23,0xa5e,0xa6a,0xaa5,0xacd,0xb0a,0xb4a,0xb84, +0xb9f,0x226,0xbda,0x226,0xc1a,0xc39,0xc6f,0xcac,0x226,0x226,0x226,0x226,0x226,0xccf,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xcfb,0x226,0x226,0xd30, +0x226,0x226,0xd4e,0x226,0xd78,0x226,0x226,0x226,0xdb4,0xdd4,0xe14,0x226,0xe52,0xe92,0xec6,0xef2, +0x808,0x226,0x226,0xf26,0x226,0x226,0x226,0xf66,0xfa6,0xfe6,0x1026,0x1066,0x10a6,0x10e6,0x1126,0x1166, +0x11a6,0x226,0x226,0x11d6,0x1207,0x226,0x1237,0x126a,0x12a7,0x12e6,0x1326,0x135c,0x138a,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x13b4,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0xcbc,0x226,0x13d1,0x226,0x1411,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x1451,0x148b,0x14c9,0x1509,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x13b5,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0xcbd,0x226,0x13d2,0x226,0x1412,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x1452,0x148c,0x14ca,0x150a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, @@ -61,20 +61,20 @@ static const uint16_t norm2_nfc_data_trieIndex[1690]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1548,0x1586,0x15a6,0x226,0x226,0x226,0x226, -0x15e0,0x226,0x226,0x161c,0x164e,0x167c,0x80c,0x168f,0x226,0x226,0x169f,0x16df,0x226,0x226,0x226,0x13e3, -0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727, -0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737, -0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b, -0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f, -0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f, -0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723, -0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733, -0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727, -0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737, -0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b, -0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x176b,0x226, -0x17ab,0x17e6,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1549,0x1587,0x15a7,0x226,0x226,0x226,0x226, +0x15e1,0x226,0x226,0x161d,0x164f,0x167d,0x80c,0x1690,0x226,0x226,0x16a0,0x16e0,0x226,0x226,0x226,0x13e4, +0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728, +0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738, +0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c, +0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720, +0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730, +0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724, +0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734, +0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728, +0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738, +0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c, +0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x176c,0x226, +0x17ac,0x17e7,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, @@ -82,53 +82,54 @@ static const uint16_t norm2_nfc_data_trieIndex[1690]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1826,0x1866,0x18a6,0x18e6,0x1926,0x1966,0x19a6,0x19e6,0x1a09,0x1a49,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a69,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x61f,0x62e,0x644,0x663,0x678,0x678,0x678,0x67c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x1827,0x1867,0x18a7,0x18e7,0x1927,0x1967,0x19a7,0x19e7,0x1a0a,0x1a4a,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a6a,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x635,0x644,0x65a,0x679,0x68e,0x68e,0x68e,0x692,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbda,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x54f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x40c, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a9c,0x226,0x226,0x1aac,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0xdc5,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1abc,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac6,0x54f, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7eb,0x226,0x226,0x9ba,0x226,0x1ad6, -0x1ae3,0x1aef,0x226,0x226,0x226,0x226,0x414,0x226,0x1afa,0x1b0a,0x226,0x226,0x226,0x7e0,0x226,0x226, -0x226,0x226,0x1b1a,0x226,0x226,0x226,0x1b25,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x1b2c,0x226,0x226,0x226,0x226,0x1b37,0x1b46,0x8f6,0x1b54,0x412,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x1b62,0x798,0x226,0x226,0x226,0x226,0x226,0x1b72,0x1b81,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x8d6,0x1b89,0x1b99,0x226,0x226,0x226,0x9ba, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba3,0x226,0x226,0x226,0x226,0x226,0x226,0x7e6,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba0,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a9d,0x226,0x226,0x1aad,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0xdc6,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1abd,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac7,0x54f, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7eb,0x226,0x226,0x9ba,0x226,0x1ad7, +0x1ae4,0x1af0,0x226,0x226,0x226,0x226,0x414,0x226,0x1afb,0x1b0b,0x226,0x226,0x226,0x7e0,0x226,0x226, +0x226,0x226,0x1b1b,0x226,0x226,0x226,0x1b26,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x1b2d,0x226,0x226,0x226,0x226,0x1b38,0x1b47,0x8f6,0x1b55,0x412,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x1b63,0x798,0x226,0x226,0x226,0x226,0x226,0x1b73,0x1b82,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x8d6,0x1b8a,0x1b9a,0x226,0x226,0x226,0x9ba, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba4,0x226,0x226,0x226,0x226,0x226,0x226,0x7e6,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba1,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ed,0x7ea,0x226,0x226,0x226,0x226,0x7e8, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x84d,0x226,0x226,0x226,0x7ed,0x7ea,0x226,0x226,0x226, +0x226,0x7e8,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x9ba,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd4,0x226,0x226,0x226,0x226,0x7ea,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb4,0x226, +0x226,0x226,0xebf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb9, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x9ba,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd3,0x226,0x226,0x226,0x226,0x7ea,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb3,0x226,0x226,0x226, -0xebe,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb8,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x1bc8,0x1bd8,0x1be6,0x1bf3,0x226,0x1bff,0x1c0d,0x1c1d,0x226,0x226, +0x226,0x226,0xcea,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2d,0x1c35, +0x1c43,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0xebf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x4fc,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x1c53,0x226,0x226,0x226,0x226,0x226,0x226,0x1c5f,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x1c6f,0x1c7f,0x1c8f,0x1c9f,0x1caf,0x1cbf,0x1ccf,0x1cdf,0x1cef,0x1cff,0x1d0f, +0x1d1f,0x1d2f,0x1d3f,0x1d4f,0x1d5f,0x1d6f,0x1d7f,0x1d8f,0x1d9f,0x1daf,0x1dbf,0x1dcf,0x1ddf,0x1def,0x1dff,0x1e0f, +0x1e1f,0x1e2f,0x1e3f,0x1e4f,0x1e5f,0x1e6f,0x1e7f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1bc7,0x1bd7,0x1be5,0x1bf2,0x226,0x1bfe,0x1c0c,0x1c1c,0x226,0x226,0x226,0x226, -0xce9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2c,0x1c34,0x1c42,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c52,0x226,0x226,0x226, -0x226,0x226,0x226,0x1c5e,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c6e, -0x1c7e,0x1c8e,0x1c9e,0x1cae,0x1cbe,0x1cce,0x1cde,0x1cee,0x1cfe,0x1d0e,0x1d1e,0x1d2e,0x1d3e,0x1d4e,0x1d5e,0x1d6e, -0x1d7e,0x1d8e,0x1d9e,0x1dae,0x1dbe,0x1dce,0x1dde,0x1dee,0x1dfe,0x1e0e,0x1e1e,0x1e2e,0x1e3e,0x1e4e,0x1e5e,0x1e6e, -0x1e7e,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x408, -0x428,0xc4,0xc4,0xc4,0x448,0x457,0x46a,0x486,0x4a3,0x4bf,0x4dc,0x4f9,0x516,0x533,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0x54d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0x226,0x226,0x226,0x226,0x226,0x408,0x428,0xc4,0xc4,0xc4,0x448,0x457,0x46a,0x486,0x4a3,0x4bf, +0x4dc,0x4f9,0x518,0x535,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x54f,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, 0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0x564,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x56f,0x58c,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0x5ac,0xc4,0xc4,0xc4,0x5bf,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x566,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0x571,0x58e,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5ae,0x5c2,0xc4,0xc4,0x5d5,0xc4,0xc4, 0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5df,0x5ff +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5f5,0x615 }; -static const uint16_t norm2_nfc_data_trieData[7822]={ +static const uint16_t norm2_nfc_data_trieData[7824]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -299,331 +300,331 @@ static const uint16_t norm2_nfc_data_trieData[7822]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,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,0xfef4,0xfef4,0xfef4,0xfef4, +1,1,0xfeec,0xfeec,0xfe12,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,1,1,1,1,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,1,1, -1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1, +1,1,0xffb8,1,0xffb8,1,0xffb0,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,0xffb8,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,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,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,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,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,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,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,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,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,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,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,1,1,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,1,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,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,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,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,0xffcc,0xffcc,0xffcc,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,1,1,1,0xfe12,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,1,1,1,0xfe12,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,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,1,1,1,1,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,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,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,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,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,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,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,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,1,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,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,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,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,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,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,0xffcc,0xffb8,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,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,1,1,1,1,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,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,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,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, +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,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, -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,1,1,1,1,1,1,1,1,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,1,1,1,1,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, -1,1,1,1,0x2701,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,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,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,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,1,1,1,1,1,1,1,1,1,1,1, -1,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,1,1,1,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, -0x2abf,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,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,1,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,1,1,0x2701,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,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,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,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,1,1,1,1,1,1,1,1,1,1, +1,1,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,1,1,1, +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,0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,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,1,1,1, +1,1,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,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,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,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,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,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,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,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,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,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,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,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,1,1,1,1,1,1,1,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,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,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,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,0xffcc,0xffcc,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,1,1,1,0xffcc,0xffcc,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,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, -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,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,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,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,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,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, +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,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,0xadc, +1,1,1,1,1,1,0xfe12,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,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,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, -0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,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,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,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,0x3c56,1,0x3c56,0x3c56,0x3c56, -0x3c56,0x3c56,0x3c56,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x3c56,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0x3c56,1,1,1,1,0x3c56, -1,1,1,0x3c56,1,0x3c56,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,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,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,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,1,1,1,1,1,1,1, -1,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,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,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,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1,1, -0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,0xffcc, -0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,0xa94, -0x2959,0xa9a,0x2963,1,1,1,1,1,0xaa0,1,1,1,1,1,0x296d,1, -1,1,1,1,1,1,1,1,0xfe12,0xfc0e,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,0xfe12,0xfe0e,1,1,1,1, -1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,1, -1,1,0xfe0e,0xfe0e,1,0xfc00,1,1,1,1,1,1,1,0xab2,1,1, -1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,1,1,1,0xfe12,1,1,1,0xfe0e,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,0xfe12,0xfe0e,1,1,1,1,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,0xfe12,0xfe0e,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,0xfe02,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,1,1,1,1,1,1,1,1, -0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,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,0x32d6,0x32e0,0x32f4,0x330c,0x3324,0x333c,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,1,1,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,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,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 +1,1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,0x3c56,0x3c56, +0x3c56,0x3c56,0x3c56,0x3c56,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x3c56,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,1,1,1, +0x3c56,1,1,1,0x3c56,1,0x3c56,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,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,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, +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,1,1,1,1,1,1, +1,1,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,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,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,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1, +1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, +0xa94,0x2959,0xa9a,0x2963,1,1,1,1,1,0xaa0,1,1,1,1,1,0x296d, +1,1,1,1,1,1,1,1,1,0xfe12,0xfc0e,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,0xfe12,0xfe0e,1,1,1, +1,1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,0xfe0e,0xfe0e,1,0xfc00,1,1,1,1,1,1,1,0xab2,1, +1,1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,0xfe12,1,1,1,0xfe0e,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,0xfe12,0xfe0e,1,1,1,1,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,0xfe12,0xfe0e,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,0xfe02,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,1,1,1,1,1,1,1, +1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,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,0x32d6,0x32e0,0x32f4,0x330c,0x3324,0x333c,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,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,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,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,1 }; static const UCPTrie norm2_nfc_data_trie={ norm2_nfc_data_trieIndex, { norm2_nfc_data_trieData }, - 1690, 7822, + 1712, 7824, 0x2fc00, 0x30, 0, 0, 0, 0, diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index e7ae646c41ae6d..b2dd7ad4b868d1 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -86,8 +86,7 @@ UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) { 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; + UPRV_UNREACHABLE; // Should not occur. } } diff --git a/deps/icu-small/source/common/normalizer2impl.h b/deps/icu-small/source/common/normalizer2impl.h index 2e6aff308819c5..7ecdef6d9c8032 100644 --- a/deps/icu-small/source/common/normalizer2impl.h +++ b/deps/icu-small/source/common/normalizer2impl.h @@ -264,7 +264,9 @@ class U_COMMON_API Normalizer2Impl : public UObject { // The trie stores values for lead surrogate code *units*. // Surrogate code *points* are inert. uint16_t getNorm16(UChar32 c) const { - return U_IS_LEAD(c) ? INERT : UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); + return U_IS_LEAD(c) ? + static_cast(INERT) : + UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); } uint16_t getRawNorm16(UChar32 c) const { return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); } diff --git a/deps/icu-small/source/common/normlzr.cpp b/deps/icu-small/source/common/normlzr.cpp index 3911c90b5bb537..20b9f3df2ffccc 100644 --- a/deps/icu-small/source/common/normlzr.cpp +++ b/deps/icu-small/source/common/normlzr.cpp @@ -23,7 +23,7 @@ #include "normalizer2impl.h" #include "uprops.h" // for uniset_getUnicode32Instance() -#if defined(_ARM64_) && defined(move32) +#if defined(move32) // System can define move32 intrinsics, but the char iters define move32 method // using same undef trick in headers, so undef here to re-enable the method. #undef move32 diff --git a/deps/icu-small/source/common/patternprops.cpp b/deps/icu-small/source/common/patternprops.cpp index 01e33ce109f57a..c38a7e276def15 100644 --- a/deps/icu-small/source/common/patternprops.cpp +++ b/deps/icu-small/source/common/patternprops.cpp @@ -173,6 +173,16 @@ PatternProps::skipWhiteSpace(const UChar *s, int32_t length) { return s; } +int32_t +PatternProps::skipWhiteSpace(const UnicodeString& s, int32_t start) { + int32_t i = start; + int32_t length = s.length(); + while(i # include "unicode/uloc.h" # include "wintz.h" -#if U_PLATFORM_HAS_WINUWP_API -typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef -#include -#include -#include -#include - -using namespace ABI::Windows::Foundation; -using namespace Microsoft::WRL; -using namespace Microsoft::WRL::Wrappers; -#endif #elif U_PLATFORM == U_PF_OS400 # include # include /* error code structure */ @@ -252,7 +241,6 @@ u_signBit(double d) { UDate fakeClock_t0 = 0; /** Time to start the clock from **/ UDate fakeClock_dt = 0; /** Offset (fake time - real time) **/ UBool fakeClock_set = FALSE; /** True if fake clock has spun up **/ -static UMutex fakeClockMutex = U_MUTEX_INTIALIZER; static UDate getUTCtime_real() { struct timeval posixTime; @@ -261,6 +249,7 @@ static UDate getUTCtime_real() { } static UDate getUTCtime_fake() { + static UMutex fakeClockMutex = U_MUTEX_INTIALIZER; umtx_lock(&fakeClockMutex); if(!fakeClock_set) { UDate real = getUTCtime_real(); @@ -997,7 +986,8 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { /* Check each entry in the directory. */ while((dirEntry = readdir(dirp)) != NULL) { const char* dirName = dirEntry->d_name; - if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0) { + if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0 + && uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) { /* Create a newpath with the new entry to test each entry in the directory. */ CharString newpath(curpath, status); newpath.append(dirName, -1, status); @@ -1024,7 +1014,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { */ if (result != NULL) break; - } else if (uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) { + } else { if(compareBinaryFiles(TZDEFAULT, newpath.data(), tzInfo)) { int32_t amountToSkip = sizeof(TZZONEINFO) - 1; if (amountToSkip > newpath.length()) { @@ -1078,7 +1068,7 @@ uprv_tzname(int n) // the other code path returns a pointer to a heap location. // If we don't have a name already, then tzname wouldn't be any // better, so just fall back. - return uprv_strdup("Etc/UTC"); + return uprv_strdup(""); #endif // !U_TZNAME #else @@ -1317,9 +1307,9 @@ uprv_pathIsAbsolute(const char *path) return FALSE; } -/* Temporary backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR - until some client wrapper makefiles are updated */ -#if U_PLATFORM_IS_DARWIN_BASED && TARGET_IPHONE_SIMULATOR +/* Backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR + (needed for some Darwin ICU build environments) */ +#if U_PLATFORM_IS_DARWIN_BASED && TARGET_OS_SIMULATOR # if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR) # define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT" # endif @@ -1430,12 +1420,7 @@ static void U_CALLCONV dataDirectoryInitFn() { if(path==NULL) { /* It looks really bad, set it to something. */ -#if U_PLATFORM_HAS_WIN32_API - // Windows UWP will require icudtl.dat file in same directory as icuuc.dll - path = ".\\"; -#else path = ""; -#endif } u_setDataDirectory(path); @@ -1633,11 +1618,7 @@ The variant cannot have dots in it. The 'rightmost' variant (@xxx) wins. The leftmost codepage (.xxx) wins. */ - char *correctedPOSIXLocale = 0; const char* posixID = uprv_getPOSIXIDForDefaultLocale(); - const char *p; - const char *q; - int32_t len; /* Format: (no spaces) ll [ _CC ] [ . MM ] [ @ VV] @@ -1645,38 +1626,29 @@ The leftmost codepage (.xxx) wins. l = lang, C = ctry, M = charmap, V = variant */ - if (gCorrectedPOSIXLocale != NULL) { + if (gCorrectedPOSIXLocale != nullptr) { return gCorrectedPOSIXLocale; } - if ((p = uprv_strchr(posixID, '.')) != NULL) { - /* assume new locale can't be larger than old one? */ - correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID)+1)); - /* Exit on memory allocation error. */ - if (correctedPOSIXLocale == NULL) { - return NULL; - } - uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); - correctedPOSIXLocale[p-posixID] = 0; + // Copy the ID into owned memory. + // Over-allocate in case we replace "@" with "__". + char *correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID) + 1 + 1)); + if (correctedPOSIXLocale == nullptr) { + return nullptr; + } + uprv_strcpy(correctedPOSIXLocale, posixID); - /* do not copy after the @ */ - if ((p = uprv_strchr(correctedPOSIXLocale, '@')) != NULL) { - correctedPOSIXLocale[p-correctedPOSIXLocale] = 0; + char *limit; + if ((limit = uprv_strchr(correctedPOSIXLocale, '.')) != nullptr) { + *limit = 0; + if ((limit = uprv_strchr(correctedPOSIXLocale, '@')) != nullptr) { + *limit = 0; } } /* Note that we scan the *uncorrected* ID. */ - if ((p = uprv_strrchr(posixID, '@')) != NULL) { - if (correctedPOSIXLocale == NULL) { - /* new locale can be 1 char longer than old one if @ -> __ */ - correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID)+2)); - /* Exit on memory allocation error. */ - if (correctedPOSIXLocale == NULL) { - return NULL; - } - uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); - correctedPOSIXLocale[p-posixID] = 0; - } + const char *p; + if ((p = uprv_strrchr(posixID, '@')) != nullptr) { p++; /* Take care of any special cases here.. */ @@ -1685,16 +1657,17 @@ The leftmost codepage (.xxx) wins. /* Don't worry about no__NY. In practice, it won't appear. */ } - if (uprv_strchr(correctedPOSIXLocale,'_') == NULL) { + if (uprv_strchr(correctedPOSIXLocale,'_') == nullptr) { uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b (note this can make the new locale 1 char longer) */ } else { uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */ } - if ((q = uprv_strchr(p, '.')) != NULL) { + const char *q; + if ((q = uprv_strchr(p, '.')) != nullptr) { /* How big will the resulting string be? */ - len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); + int32_t len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); uprv_strncat(correctedPOSIXLocale, p, q-p); correctedPOSIXLocale[len] = 0; } @@ -1710,28 +1683,15 @@ The leftmost codepage (.xxx) wins. */ } - /* Was a correction made? */ - if (correctedPOSIXLocale != NULL) { - posixID = correctedPOSIXLocale; - } - else { - /* copy it, just in case the original pointer goes away. See j2395 */ - correctedPOSIXLocale = (char *)uprv_malloc(uprv_strlen(posixID) + 1); - /* Exit on memory allocation error. */ - if (correctedPOSIXLocale == NULL) { - return NULL; - } - posixID = uprv_strcpy(correctedPOSIXLocale, posixID); - } - - if (gCorrectedPOSIXLocale == NULL) { + if (gCorrectedPOSIXLocale == nullptr) { gCorrectedPOSIXLocale = correctedPOSIXLocale; gCorrectedPOSIXLocaleHeapAllocated = true; ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); - correctedPOSIXLocale = NULL; + correctedPOSIXLocale = nullptr; } + posixID = gCorrectedPOSIXLocale; - if (correctedPOSIXLocale != NULL) { /* Was already set - clean up. */ + if (correctedPOSIXLocale != nullptr) { /* Was already set - clean up. */ uprv_free(correctedPOSIXLocale); } diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index f744746b1f0feb..f9c13d8e1b27bf 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -204,7 +204,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_STD_ATOMICS - * Defines whether to use the standard C++11 functions + * Defines whether to use the C++11 std::atomic functions. * If false, ICU will fall back to compiler or platform specific alternatives. * Note: support for these fall back options for atomics will be removed in a future version * of ICU, and the use of C++ 11 atomics will be required. @@ -232,6 +232,22 @@ typedef size_t uintptr_t; # define U_HAVE_CLANG_ATOMICS 0 #endif + +/** + * \def U_HAVE_STD_MUTEX + * Defines whether to use the C++11 std::mutex functions. + * If false, ICU will fall back to compiler or platform specific alternatives. + * std::mutex is preferred, and used by default unless this setting is overridden. + * Note: support for other options for mutexes will be removed in a future version + * of ICU, and the use of std::mutex will be required. + * @internal + */ +#ifdef U_HAVE_STD_MUTEX + /* Use the predefined value. */ +#else +# define U_HAVE_STD_MUTEX 1 +#endif + /*===========================================================================*/ /** @{ Programs used by ICU code */ /*===========================================================================*/ diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index cb3766506f4082..3b116ffaf6cba7 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -30,6 +30,7 @@ #include "ucln_cmn.h" #include "cmemory.h" #include "cstring.h" +#include "localsvc.h" #include "rbbidata.h" #include "rbbi_cache.h" #include "rbbirb.h" @@ -37,11 +38,6 @@ #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 -#include "localsvc.h" -#endif - #ifdef RBBI_DEBUG static UBool gTrace = FALSE; #endif @@ -720,7 +716,7 @@ struct LookAheadResults { int32_t fPositions[8]; int16_t fKeys[8]; - LookAheadResults() : fUsedSlotLimit(0), fPositions(), fKeys() {}; + LookAheadResults() : fUsedSlotLimit(0), fPositions(), fKeys() {} int32_t getPosition(int16_t key) { for (int32_t i=0; i= kMaxLookaheads) { - U_ASSERT(FALSE); - i = kMaxLookaheads - 1; + UPRV_UNREACHABLE; } fKeys[i] = key; fPositions[i] = position; diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp index 519c61049894e6..17ee2320802f60 100644 --- a/deps/icu-small/source/common/rbbi_cache.cpp +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -74,9 +74,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_ return TRUE; } } - U_ASSERT(FALSE); - fPositionInCache = -1; - return FALSE; + UPRV_UNREACHABLE; } @@ -116,9 +114,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_ return TRUE; } } - U_ASSERT(FALSE); - fPositionInCache = -1; - return FALSE; + UPRV_UNREACHABLE; } void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPos, int32_t endPos, @@ -388,8 +384,7 @@ UBool RuleBasedBreakIterator::BreakCache::populateNear(int32_t position, UErrorC // Add following position(s) to the cache. while (fBoundaries[fEndBufIdx] < position) { if (!populateFollowing()) { - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } } fBufIdx = fEndBufIdx; // Set iterator position to the end of the buffer. diff --git a/deps/icu-small/source/common/rbbi_cache.h b/deps/icu-small/source/common/rbbi_cache.h index fd6deb4333a97e..864ff811aaaff3 100644 --- a/deps/icu-small/source/common/rbbi_cache.h +++ b/deps/icu-small/source/common/rbbi_cache.h @@ -95,7 +95,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory { fTextIdx = fBI->fPosition = fBoundaries[fBufIdx]; fBI->fRuleStatusIndex = fStatuses[fBufIdx]; } - }; + } void nextOL(); @@ -178,7 +178,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory { void dumpCache(); private: - static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); }; + 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."); diff --git a/deps/icu-small/source/common/rbbiscan.h b/deps/icu-small/source/common/rbbiscan.h index 3d484db0e9be5d..cac60fb18a11b8 100644 --- a/deps/icu-small/source/common/rbbiscan.h +++ b/deps/icu-small/source/common/rbbiscan.h @@ -54,7 +54,7 @@ class RBBIRuleScanner : public UMemory { struct RBBIRuleChar { UChar32 fChar; UBool fEscaped; - RBBIRuleChar() : fChar(0), fEscaped(FALSE) {}; + RBBIRuleChar() : fChar(0), fEscaped(FALSE) {} }; RBBIRuleScanner(RBBIRuleBuilder *rb); diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 29c3463ed59396..00dbf6f8fe2e9c 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -376,8 +376,8 @@ void ResourceBundle::getVersion(UVersionInfo versionInfo) const { ures_getVersion(fResource, versionInfo); } -static UMutex gLocaleLock = U_MUTEX_INITIALIZER; const Locale &ResourceBundle::getLocale(void) const { + static UMutex gLocaleLock = U_MUTEX_INITIALIZER; Mutex lock(&gLocaleLock); if (fLocale != NULL) { return *fLocale; diff --git a/deps/icu-small/source/common/serv.cpp b/deps/icu-small/source/common/serv.cpp index 2fb35bd1a5994f..40940740d02b45 100644 --- a/deps/icu-small/source/common/serv.cpp +++ b/deps/icu-small/source/common/serv.cpp @@ -333,7 +333,10 @@ U_CDECL_END ****************************************************************** */ -static UMutex lock = U_MUTEX_INITIALIZER; +static UMutex *lock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} ICUService::ICUService() : name() @@ -358,7 +361,7 @@ ICUService::ICUService(const UnicodeString& newName) ICUService::~ICUService() { { - Mutex mutex(&lock); + Mutex mutex(lock()); clearCaches(); delete factories; factories = NULL; @@ -449,7 +452,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer // if factory is not null, we're calling from within the mutex, // and since some unix machines don't have reentrant mutexes we // need to make sure not to try to lock it again. - XMutex mutex(&lock, factory != NULL); + XMutex mutex(lock(), factory != NULL); if (serviceCache == NULL) { ncthis->serviceCache = new Hashtable(status); @@ -615,7 +618,7 @@ ICUService::getVisibleIDs(UVector& result, const UnicodeString* matchID, UErrorC } { - Mutex mutex(&lock); + Mutex mutex(lock()); const Hashtable* map = getVisibleIDMap(status); if (map != NULL) { ICUServiceKey* fallbackKey = createKey(matchID, status); @@ -692,7 +695,7 @@ ICUService::getDisplayName(const UnicodeString& id, UnicodeString& result, const { { UErrorCode status = U_ZERO_ERROR; - Mutex mutex(&lock); + Mutex mutex(lock()); const Hashtable* map = getVisibleIDMap(status); if (map != NULL) { ICUServiceFactory* f = (ICUServiceFactory*)map->get(id); @@ -744,7 +747,7 @@ ICUService::getDisplayNames(UVector& result, result.setDeleter(userv_deleteStringPair); if (U_SUCCESS(status)) { ICUService* ncthis = (ICUService*)this; // cast away semantic const - Mutex mutex(&lock); + Mutex mutex(lock()); if (dnCache != NULL && dnCache->locale != locale) { delete dnCache; @@ -849,7 +852,7 @@ URegistryKey ICUService::registerFactory(ICUServiceFactory* factoryToAdopt, UErrorCode& status) { if (U_SUCCESS(status) && factoryToAdopt != NULL) { - Mutex mutex(&lock); + Mutex mutex(lock()); if (factories == NULL) { factories = new UVector(deleteUObject, NULL, status); @@ -880,7 +883,7 @@ ICUService::unregister(URegistryKey rkey, UErrorCode& status) ICUServiceFactory *factory = (ICUServiceFactory*)rkey; UBool result = FALSE; if (factory != NULL && factories != NULL) { - Mutex mutex(&lock); + Mutex mutex(lock()); if (factories->removeElement(factory)) { clearCaches(); @@ -900,7 +903,7 @@ void ICUService::reset() { { - Mutex mutex(&lock); + Mutex mutex(lock()); reInitializeFactories(); clearCaches(); } diff --git a/deps/icu-small/source/common/servls.cpp b/deps/icu-small/source/common/servls.cpp index 907fe7fecfe1fb..0b1b1b947d514e 100644 --- a/deps/icu-small/source/common/servls.cpp +++ b/deps/icu-small/source/common/servls.cpp @@ -26,7 +26,6 @@ U_NAMESPACE_BEGIN -static UMutex llock = U_MUTEX_INITIALIZER; ICULocaleService::ICULocaleService() : fallbackLocale(Locale::getDefault()) { @@ -264,6 +263,7 @@ ICULocaleService::validateFallbackLocale() const { const Locale& loc = Locale::getDefault(); ICULocaleService* ncThis = (ICULocaleService*)this; + static UMutex llock = U_MUTEX_INITIALIZER; { Mutex mutex(&llock); if (loc != fallbackLocale) { diff --git a/deps/icu-small/source/common/servnotf.cpp b/deps/icu-small/source/common/servnotf.cpp index 5159452f0a32da..9b5997bd17f509 100644 --- a/deps/icu-small/source/common/servnotf.cpp +++ b/deps/icu-small/source/common/servnotf.cpp @@ -21,7 +21,10 @@ U_NAMESPACE_BEGIN EventListener::~EventListener() {} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener) -static UMutex notifyLock = U_MUTEX_INITIALIZER; +static UMutex *notifyLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} ICUNotifier::ICUNotifier(void) : listeners(NULL) @@ -30,7 +33,7 @@ ICUNotifier::ICUNotifier(void) ICUNotifier::~ICUNotifier(void) { { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); delete listeners; listeners = NULL; } @@ -47,7 +50,7 @@ ICUNotifier::addListener(const EventListener* l, UErrorCode& status) } if (acceptsListener(*l)) { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); if (listeners == NULL) { listeners = new UVector(5, status); } else { @@ -80,7 +83,7 @@ ICUNotifier::removeListener(const EventListener *l, UErrorCode& status) } { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); if (listeners != NULL) { // identity equality check for (int i = 0, e = listeners->size(); i < e; ++i) { @@ -103,7 +106,7 @@ void ICUNotifier::notifyChanged(void) { if (listeners != NULL) { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); if (listeners != NULL) { for (int i = 0, e = listeners->size(); i < e; ++i) { EventListener* el = (EventListener*)listeners->elementAt(i); diff --git a/deps/icu-small/source/common/simpleformatter.cpp b/deps/icu-small/source/common/simpleformatter.cpp index f866e0a1a120e2..76d8f54efd4aea 100644 --- a/deps/icu-small/source/common/simpleformatter.cpp +++ b/deps/icu-small/source/common/simpleformatter.cpp @@ -246,15 +246,24 @@ UnicodeString &SimpleFormatter::formatAndReplace( } UnicodeString SimpleFormatter::getTextWithNoArguments( - const UChar *compiledPattern, int32_t compiledPatternLength) { + const UChar *compiledPattern, + int32_t compiledPatternLength, + int32_t* offsets, + int32_t offsetsLength) { + for (int32_t i = 0; i < offsetsLength; i++) { + offsets[i] = -1; + } int32_t capacity = compiledPatternLength - 1 - getArgumentLimit(compiledPattern, compiledPatternLength); UnicodeString sb(capacity, 0, 0); // Java: StringBuilder for (int32_t i = 1; i < compiledPatternLength;) { - int32_t segmentLength = compiledPattern[i++] - ARG_NUM_LIMIT; - if (segmentLength > 0) { - sb.append(compiledPattern + i, segmentLength); - i += segmentLength; + int32_t n = compiledPattern[i++]; + if (n > ARG_NUM_LIMIT) { + n -= ARG_NUM_LIMIT; + sb.append(compiledPattern + i, n); + i += n; + } else if (n < offsetsLength) { + offsets[n] = sb.length(); } } return sb; diff --git a/deps/icu-small/source/common/static_unicode_sets.cpp b/deps/icu-small/source/common/static_unicode_sets.cpp index 5d598a0e33b6d4..5dab3931a707fd 100644 --- a/deps/icu-small/source/common/static_unicode_sets.cpp +++ b/deps/icu-small/source/common/static_unicode_sets.cpp @@ -23,7 +23,7 @@ using namespace icu::unisets; namespace { -UnicodeSet* gUnicodeSets[COUNT] = {}; +UnicodeSet* gUnicodeSets[UNISETS_KEY_COUNT] = {}; // Save the empty instance in static memory to have well-defined behavior if a // regular UnicodeSet cannot be allocated. @@ -97,14 +97,28 @@ class ParseDataSink : public ResourceSink { saveSet(isLenient ? COMMA : STRICT_COMMA, str, status); } else if (str.indexOf(u'+') != -1) { saveSet(PLUS_SIGN, str, status); - } else if (str.indexOf(u'‒') != -1) { + } else if (str.indexOf(u'-') != -1) { saveSet(MINUS_SIGN, str, status); } else if (str.indexOf(u'$') != -1) { saveSet(DOLLAR_SIGN, str, status); } else if (str.indexOf(u'£') != -1) { saveSet(POUND_SIGN, str, status); - } else if (str.indexOf(u'₨') != -1) { + } else if (str.indexOf(u'₹') != -1) { saveSet(RUPEE_SIGN, str, status); + } else if (str.indexOf(u'¥') != -1) { + saveSet(YEN_SIGN, str, status); + } else if (str.indexOf(u'₩') != -1) { + saveSet(WON_SIGN, str, status); + } else if (str.indexOf(u'%') != -1) { + saveSet(PERCENT_SIGN, str, status); + } else if (str.indexOf(u'‰') != -1) { + saveSet(PERMILLE_SIGN, str, status); + } else if (str.indexOf(u'’') != -1) { + saveSet(APOSTROPHE_SIGN, str, status); + } else { + // Unknown class of parse lenients + // TODO(ICU-20428): Make ICU automatically accept new classes? + U_ASSERT(FALSE); } if (U_FAILURE(status)) { return; } } @@ -122,7 +136,7 @@ UBool U_CALLCONV cleanupNumberParseUniSets() { reinterpret_cast(gEmptyUnicodeSet)->~UnicodeSet(); gEmptyUnicodeSetInitialized = FALSE; } - for (int32_t i = 0; i < COUNT; i++) { + for (int32_t i = 0; i < UNISETS_KEY_COUNT; i++) { delete gUnicodeSets[i]; gUnicodeSets[i] = nullptr; } @@ -155,27 +169,35 @@ void U_CALLCONV initNumberParseUniSets(UErrorCode& status) { U_ASSERT(gUnicodeSets[STRICT_COMMA] != nullptr); U_ASSERT(gUnicodeSets[PERIOD] != nullptr); U_ASSERT(gUnicodeSets[STRICT_PERIOD] != nullptr); + U_ASSERT(gUnicodeSets[APOSTROPHE_SIGN] != nullptr); - gUnicodeSets[OTHER_GROUPING_SEPARATORS] = new UnicodeSet( - u"['٬‘’'\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]", status); + LocalPointer otherGrouping(new UnicodeSet( + u"[٬‘\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]", + status + ), status); + if (U_FAILURE(status)) { return; } + otherGrouping->addAll(*gUnicodeSets[APOSTROPHE_SIGN]); + gUnicodeSets[OTHER_GROUPING_SEPARATORS] = otherGrouping.orphan(); gUnicodeSets[ALL_SEPARATORS] = computeUnion(COMMA, PERIOD, OTHER_GROUPING_SEPARATORS); gUnicodeSets[STRICT_ALL_SEPARATORS] = computeUnion( STRICT_COMMA, STRICT_PERIOD, OTHER_GROUPING_SEPARATORS); U_ASSERT(gUnicodeSets[MINUS_SIGN] != nullptr); U_ASSERT(gUnicodeSets[PLUS_SIGN] != nullptr); + U_ASSERT(gUnicodeSets[PERCENT_SIGN] != nullptr); + U_ASSERT(gUnicodeSets[PERMILLE_SIGN] != nullptr); - gUnicodeSets[PERCENT_SIGN] = new UnicodeSet(u"[%٪]", status); - gUnicodeSets[PERMILLE_SIGN] = new UnicodeSet(u"[‰؉]", status); - gUnicodeSets[INFINITY_KEY] = new UnicodeSet(u"[∞]", status); + gUnicodeSets[INFINITY_SIGN] = new UnicodeSet(u"[∞]", status); + if (U_FAILURE(status)) { return; } U_ASSERT(gUnicodeSets[DOLLAR_SIGN] != nullptr); U_ASSERT(gUnicodeSets[POUND_SIGN] != nullptr); U_ASSERT(gUnicodeSets[RUPEE_SIGN] != nullptr); - gUnicodeSets[YEN_SIGN] = new UnicodeSet(u"[¥\\uffe5]", status); + U_ASSERT(gUnicodeSets[YEN_SIGN] != nullptr); + U_ASSERT(gUnicodeSets[WON_SIGN] != nullptr); gUnicodeSets[DIGITS] = new UnicodeSet(u"[:digit:]", status); - + if (U_FAILURE(status)) { return; } gUnicodeSets[DIGITS_OR_ALL_SEPARATORS] = computeUnion(DIGITS, ALL_SEPARATORS); gUnicodeSets[DIGITS_OR_STRICT_ALL_SEPARATORS] = computeUnion(DIGITS, STRICT_ALL_SEPARATORS); diff --git a/deps/icu-small/source/common/static_unicode_sets.h b/deps/icu-small/source/common/static_unicode_sets.h index 5f18b3217eae2b..9d8a5fcddc9953 100644 --- a/deps/icu-small/source/common/static_unicode_sets.h +++ b/deps/icu-small/source/common/static_unicode_sets.h @@ -1,7 +1,17 @@ // © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html +// This file contains utilities to deal with static-allocated UnicodeSets. +// +// Common use case: you write a "private static final" UnicodeSet in Java, and +// want something similarly easy in C++. Originally written for number +// parsing, but this header can be used for other applications. +// +// Main entrypoint: `unisets::get(unisets::MY_SET_ID_HERE)` +// // This file is in common instead of i18n because it is needed by ucurr.cpp. +// +// Author: sffc #include "unicode/utypes.h" @@ -35,6 +45,7 @@ enum Key { PERIOD, STRICT_COMMA, STRICT_PERIOD, + APOSTROPHE_SIGN, OTHER_GROUPING_SEPARATORS, ALL_SEPARATORS, STRICT_ALL_SEPARATORS, @@ -44,13 +55,14 @@ enum Key { PLUS_SIGN, PERCENT_SIGN, PERMILLE_SIGN, - INFINITY_KEY, // INFINITY is defined in cmath + INFINITY_SIGN, // Currency Symbols DOLLAR_SIGN, POUND_SIGN, RUPEE_SIGN, - YEN_SIGN, // not in CLDR data, but Currency.java wants it + YEN_SIGN, + WON_SIGN, // Other DIGITS, @@ -60,7 +72,7 @@ enum Key { DIGITS_OR_STRICT_ALL_SEPARATORS, // The number of elements in the enum. - COUNT + UNISETS_KEY_COUNT }; /** @@ -69,6 +81,13 @@ enum Key { * * Exported as U_COMMON_API for ucurr.cpp * + * This method is always safe and OK to chain: in the case of a memory or other + * error, it returns an empty set from static memory. + * + * Example: + * + * UBool hasIgnorables = unisets::get(unisets::DEFAULT_IGNORABLES)->contains(...); + * * @param key The desired UnicodeSet according to the enum in this file. * @return The requested UnicodeSet. Guaranteed to be frozen and non-null, but * may be empty if an error occurred during data loading. @@ -99,6 +118,7 @@ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1); */ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1, Key key2); +// TODO: Load these from data: ICU-20108 // Unused in C++: // Key chooseCurrency(UnicodeString str); // Used instead: @@ -108,8 +128,9 @@ static const struct { } kCurrencyEntries[] = { {DOLLAR_SIGN, u'$'}, {POUND_SIGN, u'£'}, - {RUPEE_SIGN, u'₨'}, + {RUPEE_SIGN, u'₹'}, {YEN_SIGN, u'¥'}, + {WON_SIGN, u'₩'}, }; } // namespace unisets diff --git a/deps/icu-small/source/common/uassert.h b/deps/icu-small/source/common/uassert.h index 2c080eb402f07c..f0f7a92574b4d4 100644 --- a/deps/icu-small/source/common/uassert.h +++ b/deps/icu-small/source/common/uassert.h @@ -10,23 +10,40 @@ * * File uassert.h * -* Contains U_ASSERT macro -* -* By default, U_ASSERT just wraps the C library assert macro. -* By changing the definition here, the assert behavior for ICU can be changed -* without affecting other non-ICU uses of the C library assert(). +* Contains the U_ASSERT and UPRV_UNREACHABLE macros * ****************************************************************************** */ - #ifndef U_ASSERT_H #define U_ASSERT_H + /* utypes.h is included to get the proper define for uint8_t */ #include "unicode/utypes.h" +/* for abort */ +#include + +/** + * \def U_ASSERT + * By default, U_ASSERT just wraps the C library assert macro. + * By changing the definition here, the assert behavior for ICU can be changed + * without affecting other non - ICU uses of the C library assert(). +*/ #if U_DEBUG # include # define U_ASSERT(exp) assert(exp) #else # define U_ASSERT(exp) #endif + +/** + * \def UPRV_UNREACHABLE + * This macro is used to unconditionally abort if unreachable code is ever executed. + * @internal +*/ +#if defined(UPRV_UNREACHABLE) + // Use the predefined value. +#else +# define UPRV_UNREACHABLE abort() +#endif + #endif diff --git a/deps/icu-small/source/common/ubidi.cpp b/deps/icu-small/source/common/ubidi.cpp index 4b65d491859bfa..3ddb45721e25ec 100644 --- a/deps/icu-small/source/common/ubidi.cpp +++ b/deps/icu-small/source/common/ubidi.cpp @@ -2047,8 +2047,7 @@ processPropertySeq(UBiDi *pBiDi, LevState *pLevState, uint8_t _prop, break; default: /* we should never get here */ - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } if((addLevel) || (start < start0)) { @@ -2251,8 +2250,7 @@ resolveImplicitLevels(UBiDi *pBiDi, start2=i; break; default: /* we should never get here */ - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } } @@ -2726,8 +2724,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, break; default: /* we should never get here */ - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } /* * If there are no external levels specified and there diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 55e331b612efcb..70083892048f80 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -11,539 +11,539 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={0xb,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0xc,1,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x647c,0x5e98,0x28,0x620,0x8c0,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6502b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x663c,0x6058,0x28,0x620,0x8c0,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6502b6}; -static const uint16_t ubidi_props_trieIndex[12100]={ -0x36f,0x377,0x37f,0x387,0x39f,0x3a7,0x3af,0x3b7,0x38f,0x397,0x38f,0x397,0x38f,0x397,0x38f,0x397, -0x38f,0x397,0x38f,0x397,0x3bd,0x3c5,0x3cd,0x3d5,0x3dd,0x3e5,0x3e1,0x3e9,0x3f1,0x3f9,0x3f4,0x3fc, -0x38f,0x397,0x38f,0x397,0x404,0x40c,0x38f,0x397,0x38f,0x397,0x38f,0x397,0x412,0x41a,0x422,0x42a, -0x432,0x43a,0x442,0x44a,0x450,0x458,0x460,0x468,0x470,0x478,0x47e,0x486,0x48e,0x496,0x49e,0x4a6, -0x4b2,0x4ae,0x4ba,0x4c2,0x424,0x4d2,0x4da,0x4ca,0x4e2,0x4e4,0x4ec,0x4f4,0x4fc,0x4fd,0x505,0x50d, -0x515,0x4fd,0x51d,0x522,0x515,0x4fd,0x52a,0x532,0x4fc,0x53a,0x542,0x4f4,0x547,0x38f,0x54f,0x553, -0x55b,0x55d,0x565,0x56d,0x4fc,0x575,0x57d,0x4f4,0x406,0x581,0x505,0x4f4,0x38f,0x38f,0x589,0x38f, -0x38f,0x58f,0x597,0x38f,0x38f,0x59b,0x5a3,0x38f,0x5a7,0x5ae,0x38f,0x5b6,0x5be,0x5c5,0x546,0x38f, -0x38f,0x5cd,0x5d5,0x5dd,0x5e5,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x5ed,0x38f,0x5f5,0x38f,0x38f,0x38f, -0x5fd,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x605,0x38f,0x38f,0x38f,0x60d,0x60d,0x509,0x509,0x38f,0x613,0x61b,0x5f5, -0x631,0x623,0x623,0x639,0x640,0x629,0x38f,0x38f,0x38f,0x648,0x650,0x38f,0x38f,0x38f,0x652,0x65a, -0x662,0x38f,0x669,0x671,0x38f,0x679,0x38f,0x38f,0x539,0x681,0x547,0x689,0x406,0x691,0x38f,0x698, -0x38f,0x69d,0x38f,0x38f,0x38f,0x38f,0x6a3,0x6ab,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x3dd,0x6b3, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x6bb,0x6c3,0x6c7, -0x6df,0x6e5,0x6cf,0x6d7,0x6ed,0x6f5,0x6f9,0x5c8,0x701,0x709,0x711,0x38f,0x719,0x65a,0x65a,0x65a, -0x729,0x731,0x739,0x741,0x746,0x74e,0x756,0x721,0x75e,0x766,0x38f,0x76c,0x773,0x65a,0x65a,0x65a, -0x65a,0x573,0x779,0x65a,0x781,0x38f,0x38f,0x657,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x789,0x65a,0x65a,0x65a,0x65a,0x65a,0x78f,0x65a,0x65a,0x797,0x79f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x65a,0x65a,0x65a,0x7af,0x7b7,0x7bf,0x7a7, -0x7cf,0x7d7,0x7df,0x7e6,0x7ed,0x7f5,0x7f9,0x7c7,0x65a,0x65a,0x65a,0x801,0x807,0x65a,0x80d,0x810, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x818,0x38f,0x38f,0x38f,0x820,0x38f,0x38f,0x38f,0x3dd, -0x828,0x830,0x835,0x38f,0x83d,0x65a,0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x844,0x84a, -0x85a,0x852,0x38f,0x38f,0x862,0x5fd,0x38f,0x3b6,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x81f, -0x3c4,0x38f,0x839,0x86a,0x38f,0x872,0x87a,0x38f,0x38f,0x38f,0x38f,0x87e,0x38f,0x38f,0x652,0x3b5, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x65a, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x839,0x65a,0x573,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x885,0x38f,0x38f,0x88a,0x55d,0x38f,0x38f,0x5a9,0x65a,0x651,0x38f,0x38f,0x892,0x38f,0x38f,0x38f, -0x89a,0x8a1,0x623,0x8a9,0x38f,0x38f,0x57f,0x8b1,0x38f,0x8b9,0x8c0,0x38f,0x4e2,0x8c5,0x38f,0x4fb, -0x38f,0x8cd,0x8d5,0x4fd,0x38f,0x8d9,0x4fc,0x8e1,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x8e8, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x8fc,0x8f0,0x8f4,0x48e,0x48e,0x48e,0x48e,0x48e, -0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x904,0x48e,0x48e,0x48e,0x48e,0x90c,0x910, -0x918,0x920,0x924,0x92c,0x48e,0x48e,0x48e,0x930,0x938,0x37f,0x940,0x948,0x38f,0x38f,0x38f,0x950, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0xe3c,0xe3c,0xe7c,0xebc,0xe3c,0xe3c,0xe3c,0xe3c,0xe3c,0xe3c,0xef4,0xf34,0xf74,0xf84,0xfc4,0xfd0, -0xe3c,0xe3c,0x1010,0xe3c,0xe3c,0xe3c,0x1048,0x1088,0x10c8,0x1108,0x1140,0x1180,0x11c0,0x11f8,0x1238,0x1278, -0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb37,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb74,0x1a0,0x1a0,0xba9,0xbe9,0xc29,0xc69,0xca9,0xce9, +static const uint16_t ubidi_props_trieIndex[12324]={ +0x37c,0x384,0x38c,0x394,0x3ac,0x3b4,0x3bc,0x3c4,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4, +0x39c,0x3a4,0x39c,0x3a4,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3ee,0x3f6,0x3fe,0x406,0x401,0x409, +0x39c,0x3a4,0x39c,0x3a4,0x411,0x419,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,0x41f,0x427,0x42f,0x437, +0x43f,0x447,0x44f,0x457,0x45d,0x465,0x46d,0x475,0x47d,0x485,0x48b,0x493,0x49b,0x4a3,0x4ab,0x4b3, +0x4bf,0x4bb,0x4c7,0x4cf,0x431,0x4df,0x4e7,0x4d7,0x4ef,0x4f1,0x4f9,0x501,0x509,0x50a,0x512,0x51a, +0x522,0x50a,0x52a,0x52f,0x522,0x50a,0x537,0x53f,0x509,0x547,0x54f,0x501,0x554,0x39c,0x55c,0x560, +0x568,0x56a,0x572,0x57a,0x509,0x582,0x58a,0x501,0x413,0x58e,0x512,0x501,0x39c,0x39c,0x596,0x39c, +0x39c,0x59c,0x5a4,0x39c,0x39c,0x5a8,0x5b0,0x39c,0x5b4,0x5bb,0x39c,0x5c3,0x5cb,0x5d2,0x553,0x39c, +0x39c,0x5da,0x5e2,0x5ea,0x5f2,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x5fa,0x39c,0x602,0x39c,0x39c,0x39c, +0x60a,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x612,0x39c,0x39c,0x39c,0x61a,0x61a,0x516,0x516,0x39c,0x620,0x628,0x602, +0x63e,0x630,0x630,0x646,0x64d,0x636,0x39c,0x39c,0x39c,0x655,0x65d,0x39c,0x39c,0x39c,0x65f,0x667, +0x66f,0x39c,0x676,0x67e,0x39c,0x686,0x39c,0x39c,0x546,0x68e,0x554,0x696,0x413,0x69e,0x39c,0x6a5, +0x39c,0x6aa,0x39c,0x39c,0x39c,0x39c,0x6b0,0x6b8,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x3ea,0x6c0, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x6c8,0x6d0,0x6d4, +0x6ec,0x6f2,0x6dc,0x6e4,0x6fa,0x702,0x706,0x5d5,0x70e,0x716,0x71e,0x39c,0x726,0x667,0x667,0x667, +0x736,0x73e,0x746,0x74e,0x753,0x75b,0x763,0x72e,0x76b,0x773,0x39c,0x779,0x780,0x667,0x667,0x667, +0x667,0x580,0x786,0x667,0x78e,0x39c,0x39c,0x664,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667, +0x667,0x667,0x667,0x667,0x667,0x796,0x667,0x667,0x667,0x667,0x667,0x79c,0x667,0x667,0x7a4,0x7ac, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0x667,0x667,0x7bc,0x7c4,0x7cc,0x7b4, +0x7dc,0x7e4,0x7ec,0x7f3,0x7fa,0x802,0x806,0x7d4,0x667,0x667,0x667,0x80e,0x814,0x667,0x667,0x81a, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x822,0x39c,0x39c,0x39c,0x82a,0x39c,0x39c,0x39c,0x3ea, +0x832,0x83a,0x66b,0x39c,0x83d,0x667,0x667,0x66a,0x667,0x667,0x667,0x667,0x667,0x667,0x844,0x84a, +0x85a,0x852,0x39c,0x39c,0x862,0x60a,0x39c,0x3c3,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x829, +0x3d1,0x39c,0x86a,0x872,0x39c,0x87a,0x882,0x39c,0x39c,0x39c,0x39c,0x886,0x39c,0x39c,0x65f,0x3c2, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x86a,0x667,0x580,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x88d,0x39c,0x39c,0x892,0x56a,0x39c,0x39c,0x5b6,0x667,0x65e,0x39c,0x39c,0x89a,0x39c,0x39c,0x39c, +0x8a2,0x8a9,0x630,0x8b1,0x39c,0x39c,0x58c,0x8b9,0x39c,0x8c1,0x8c8,0x39c,0x4ef,0x8cd,0x39c,0x508, +0x39c,0x8d5,0x8dd,0x50a,0x39c,0x8e1,0x509,0x8e9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x8f0, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x904,0x8f8,0x8fc,0x49b,0x49b,0x49b,0x49b,0x49b, +0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x90c,0x49b,0x49b,0x49b,0x49b,0x914,0x918, +0x920,0x928,0x92c,0x934,0x49b,0x49b,0x49b,0x938,0x940,0x38c,0x948,0x950,0x39c,0x39c,0x39c,0x958, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xe70,0xe70,0xeb0,0xef0,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xf28,0xf68,0xfa8,0xfb8,0xff8,0x1004, +0xe70,0xe70,0x1044,0xe70,0xe70,0xe70,0x107c,0x10bc,0x10fc,0x113c,0x1174,0x11b4,0x11f4,0x122c,0x126c,0x12ac, +0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0xb3f,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb68,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xba8,0x1a0,0x1a0,0xbdd,0xc1d,0xc5d,0xc9d,0xcdd,0xd1d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, -0xd69,0xd79,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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, +0xd9d,0xdad,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,0xd5d, 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,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 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,0xd29, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x958,0x38f,0x65a,0x65a,0x960,0x5fd,0x38f,0x4f5, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x968,0x38f,0x38f,0x38f,0x96f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x977,0x424,0x424,0x424,0x424,0x424,0x424,0x424, -0x97f,0x983,0x424,0x424,0x424,0x424,0x993,0x98b,0x424,0x99b,0x424,0x424,0x9a3,0x9a9,0x424,0x424, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x9b9,0x9b1,0x424,0x424,0x424,0x424,0x424,0x424, -0x424,0x424,0x424,0x9c1,0x424,0x424,0x424,0x424,0x424,0x9c9,0x9d0,0x9d6,0x424,0x424,0x424,0x424, -0x4fc,0x9de,0x9e5,0x9ec,0x406,0x9ef,0x38f,0x38f,0x4e2,0x9f6,0x38f,0x9fc,0x406,0xa01,0xa09,0x38f, -0x38f,0xa0e,0x38f,0x38f,0x38f,0x38f,0x820,0xa16,0x406,0x581,0x55c,0xa1d,0x38f,0x38f,0x38f,0x38f, -0x38f,0x9de,0xa25,0x38f,0x38f,0xa2d,0xa35,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xa39,0xa41,0x38f, -0x38f,0xa49,0x55c,0xa51,0x38f,0xa57,0x38f,0x38f,0x5ed,0xa5f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0xa64,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xa6c, -0xa70,0xa78,0x38f,0xa7f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0xa86,0x38f,0x38f,0xa94,0xa8e,0x38f,0x38f,0x38f,0xa9c,0xaa4,0x38f,0xaa8,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x583,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xaae,0x38f, -0xab4,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0xaba,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x516,0xac2,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0xac9,0xad1,0xad7,0x38f,0x38f,0x65a,0x65a,0xadf,0x38f,0x38f,0x38f,0x38f, -0x38f,0x65a,0x65a,0x833,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xae1, -0x38f,0xae8,0x38f,0xae4,0x38f,0xaeb,0x38f,0xaf3,0xaf7,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x3dd,0xaff,0x3dd,0xb06,0xb0d,0xb15,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xb1d,0xb25,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x424,0x424,0x424,0x424,0x424,0x424,0xb2d, -0x424,0xb35,0xb35,0xb3c,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x8f4,0x48e,0x48e,0x424, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e, -0xb44,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x65a,0xb4c,0x65a,0x65a,0x65d,0xb51,0xb55, -0x844,0xb5d,0x3b1,0x38f,0xb63,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x76a,0x38f,0x38f,0x38f, -0x38f,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,0xb6b, -0xb73,0x65a,0x65a,0x65a,0x65d,0x65a,0x65a,0xb7b,0x38f,0xb4c,0x65a,0xb83,0x65a,0xb8b,0x846,0x38f, -0x38f,0xb4c,0xb8f,0x65a,0xb97,0x65a,0xb9f,0xba7,0x65a,0x38f,0x38f,0x38f,0x846,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xbaf,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xbaf,0xbbf,0xbb7,0xbb7,0xbb7,0xbc0,0xbc0,0xbc0, -0xbc0,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0xbc8,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0x36e,0x36e,0x36e,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,2,2,6,0xa,0x500a,0xa,0xd00a,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,0x510a,0xa,0xd20a,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,0x510a,0xa,0xd20a,0xa,0x12,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12, -0x12,7,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,6,0xa,4,4, -4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa,4,4,2,2, -0xa,0,0xa,0xa,0xa,2,0,0x900a,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x960,0x39c,0x667,0x667,0x968,0x60a,0x39c,0x502, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x970,0x39c,0x39c,0x39c,0x977,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x97f,0x431,0x431,0x431,0x431,0x431,0x431,0x431, +0x987,0x98b,0x431,0x431,0x431,0x431,0x99b,0x993,0x431,0x9a3,0x431,0x431,0x9ab,0x9b1,0x431,0x431, +0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x9c1,0x9b9,0x431,0x431,0x431,0x431,0x431,0x431, +0x431,0x431,0x431,0x9c9,0x431,0x431,0x431,0x431,0x431,0x9d1,0x9d8,0x9de,0x431,0x431,0x431,0x431, +0x509,0x9e6,0x9ed,0x9f4,0x413,0x9f7,0x39c,0x39c,0x4ef,0x9fe,0x39c,0xa04,0x413,0xa09,0xa11,0x39c, +0x39c,0xa16,0x39c,0x39c,0x39c,0x39c,0x82a,0xa1e,0x413,0x58e,0x569,0xa25,0x39c,0x39c,0x39c,0x39c, +0x39c,0x9e6,0xa2d,0x39c,0x39c,0xa35,0xa3d,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xa41,0xa49,0x39c, +0x39c,0xa51,0x569,0xa59,0x39c,0xa5f,0x39c,0x39c,0x5fa,0xa67,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xa6c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xa73,0x569,0xa7b, +0xa7f,0xa87,0x39c,0xa8e,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xa95,0x39c,0x39c,0xaa3,0xa9d,0x39c,0x39c,0x39c,0xaab,0xab3,0x39c,0xab7,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x590,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xac4,0xabf,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xacc,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xad3, +0x39c,0xad9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0xa05,0x39c,0xadf,0x39c,0x39c,0xae7,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x523,0xaef,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xaf6,0xafe,0xb04,0x39c,0x39c,0x667,0x667,0xb0c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0xb14,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0xb1a,0x39c,0xb21,0x39c,0xb1d,0x39c,0xb24,0x39c,0xb2c,0xb30,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x3ea,0xb38,0x3ea, +0xb3f,0xb46,0xb4e,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xb56,0xb5e,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xad9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0xb63,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x431,0x431,0x431, +0x431,0x431,0x431,0xb6b,0x431,0xb73,0xb73,0xb7a,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431, +0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431, +0x8fc,0x49b,0x49b,0x431,0x431,0x49b,0x49b,0x9de,0x431,0x431,0x431,0x431,0x431,0x49b,0x49b,0x49b, +0x49b,0x49b,0x49b,0x49b,0xb82,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x667,0xb8a,0x667, +0x667,0x66a,0xb8f,0xb93,0x844,0xb9b,0x3be,0x39c,0xba1,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x777,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667, +0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667, +0x667,0x667,0x667,0x844,0xba9,0x667,0x667,0x667,0x66a,0x667,0x667,0xbb1,0x66c,0xb8a,0x667,0xbb9, +0x667,0xbc1,0x846,0x39c,0x39c,0x796,0x667,0x667,0xbc5,0x667,0xbcd,0xbd3,0x667,0x667,0x667,0x66a, +0xbd8,0xbe7,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xbdf,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xbdf,0xbf7,0xbef,0xbef, +0xbef,0xbf8,0xbf8,0xbf8,0xbf8,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0xc00,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0x37b,0x37b,0x37b, +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,2,2,6,0xa,0x500a,0xa,0xd00a,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,0x510a,0xa,0xd20a,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,0x510a,0xa,0xd20a,0xa,0x12, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, -0,0,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0, +0x12,0x12,0x12,0x12,0x12,7,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, +6,0xa,4,4,4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa, +4,4,2,2,0xa,0,0xa,0xa,0xa,2,0,0x900a,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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,0xa,0xa,0,0,0,0,0,0, -0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0, +0,0,0,0,0,0,0xa,0,0,0,0,0,0xa,0xa,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,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,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,0xa,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,0,0, 0,0,0,0,0,0,0,0,0,0,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,0,0xa,0xa,4,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1, +0xb1,0xb1,1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -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,0xa,0xa, -0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d, -0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5,5,5,5,5, -5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d,0xd,0x8d,0x8d,0x8d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5, +5,5,0xa,0xa,0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d, +0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5, +5,5,5,5,5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d, +0xd,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d, 0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, 0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d, -0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,0xa,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0x8d,0x8d, -2,2,2,2,2,2,2,2,2,2,0x4d,0x4d,0x4d,0xd,0xd,0x4d, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xad, -0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d, -0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,5,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1, +0xb1,0xb1,0x8d,0x8d,2,2,2,2,2,2,2,2,2,2,0x4d,0x4d, +0x4d,0xd,0xd,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xad,0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d, +0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d, +0x8d,0x4d,0x4d,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d, +0x8d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1, -1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1, +1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa, -0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1, -1,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,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,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, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +1,1,0xa,0xa,0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1, +1,0xb1,0xb1,0xb1,1,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,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,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,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0xd,0x4d,0x4d, -0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d, +0x4d,0xd,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,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,0,0,0,0, -0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,4, -0,0,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,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0xb1, -0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,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,4,4,0,0,0,0, +0,0,0,4,0,0,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, -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,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, -0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,0xb1,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,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0, +0xb1,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, -0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,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,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0, 0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,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, +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,0xb1,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,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,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, +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,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, +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,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,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, -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,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,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,0x40,0,0,0, -0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +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, -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,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, +0x40,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,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,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +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,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,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,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, +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,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,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,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,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, +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,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,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,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,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,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x900a,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, -0x900a,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,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, +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,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,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,0x900a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x900a,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,0x900a,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,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,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, +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, -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,0x900a,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,0x300a,0xf00a,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,0x900a,0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0x100a,0x900a, -0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,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,0x900a,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, +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,0x900a,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,0x300a,0xf00a,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,0x900a,0x100a,0x100a,0x100a,0x100a, +0x900a,0xa,0x100a,0x900a,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +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,0x900a,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, -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,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +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,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, 0xf00a,0x300a,0xf00a,0x300a,0xf00a,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,0x300a,0xf00a, -0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,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, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,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,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,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,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,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,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,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,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,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, @@ -555,6 +555,8 @@ static const uint16_t ubidi_props_trieIndex[12100]={ 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, @@ -579,7 +581,7 @@ static const uint16_t ubidi_props_trieIndex[12100]={ 0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0, -0xb1,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,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, 0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -683,89 +685,101 @@ static const uint16_t ubidi_props_trieIndex[12100]={ 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,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa0,0xa0,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,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, +0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xa0,0xa0,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,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,0,0,0,0,0xb1,0xb1,0,0, +0,0xb1,0,0xb1,0,0,0,0,0,0,0,0,4,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,4,4,4, 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, +0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,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,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,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, -0xb1,0xb1,0,0,0,0xb1,0,0xb1,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,0xb2,0xb2,0xb2,0xb2, 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,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,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, -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, +0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1, -0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,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,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, +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,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, +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,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, +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,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,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,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, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xa1,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, 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,0xa,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,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,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa, -0xa,0xa,0xa,0,0,0,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,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,0xa,0xa,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,0xa,0xa,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,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,0,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,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,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,0,0, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x12,0x12,0xa,0xa,0xa,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,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, @@ -876,16 +890,16 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_jgArray2, { ubidi_props_trieIndex, - ubidi_props_trieIndex+3516, + ubidi_props_trieIndex+3568, NULL, - 3516, - 8584, + 3568, + 8756, 0x1a0, - 0xe3c, + 0xe70, 0x0, 0x0, 0x110000, - 0x2f40, + 0x3020, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ubidiln.cpp b/deps/icu-small/source/common/ubidiln.cpp index 71c581fe1c713b..3545f4e111ce78 100644 --- a/deps/icu-small/source/common/ubidiln.cpp +++ b/deps/icu-small/source/common/ubidiln.cpp @@ -517,7 +517,7 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { /* compute the runs array --------------------------------------------------- */ -static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) { +static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex) { Run *runs=pBiDi->runs; int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart; @@ -530,9 +530,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UError visualStart+=length; } /* we should never get here */ - U_ASSERT(FALSE); - *pErrorCode = U_INVALID_STATE_ERROR; - return 0; + UPRV_UNREACHABLE; } /* @@ -547,7 +545,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UError * negative number of BiDi control characters within this run. */ U_CFUNC UBool -ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { +ubidi_getRuns(UBiDi *pBiDi, UErrorCode*) { /* * This method returns immediately if the runs are already set. This * includes the case of length==0 (handled in setPara).. @@ -688,7 +686,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { *limit=start+pBiDi->insertPoints.size; int32_t runIndex; for(point=start; pointpos, pErrorCode); + runIndex=getRunFromLogicalIndex(pBiDi, point->pos); pBiDi->runs[runIndex].insertRemove|=point->flag; } } @@ -699,7 +697,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu; for(pu=start; puruns[runIndex].insertRemove--; } } diff --git a/deps/icu-small/source/common/ubidiwrt.cpp b/deps/icu-small/source/common/ubidiwrt.cpp index a89099dad0e700..aa4d6b544c1787 100644 --- a/deps/icu-small/source/common/ubidiwrt.cpp +++ b/deps/icu-small/source/common/ubidiwrt.cpp @@ -40,7 +40,7 @@ * Further assumptions for all UTFs: * - u_charMirror(c) needs the same number of code units as c */ -#if UTF_SIZE==8 +#if defined(UTF_SIZE) && UTF_SIZE==8 # error reimplement ubidi_writeReordered() for UTF-8, see comment above #endif diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index eb7d9ff9099d18..68554b3130c83f 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -11,145 +11,145 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={0xb,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={0xc,1,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6e72,0x5e50,0x67f,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6fea,0x5fb8,0x687,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[12064]={ -0x32c,0x334,0x33c,0x344,0x352,0x35a,0x362,0x36a,0x372,0x37a,0x381,0x389,0x391,0x399,0x3a1,0x3a9, -0x3af,0x3b7,0x3bf,0x3c7,0x3cf,0x3d7,0x3df,0x3e7,0x3ef,0x3f7,0x3ff,0x407,0x40f,0x417,0x41f,0x427, -0x42f,0x437,0x43f,0x447,0x44f,0x457,0x45f,0x467,0x463,0x46b,0x470,0x478,0x47f,0x487,0x48f,0x497, -0x49f,0x4a7,0x4af,0x4b7,0x34b,0x353,0x4bc,0x4c4,0x4c9,0x4d1,0x4d9,0x4e1,0x4e0,0x4e8,0x4ed,0x4f5, -0x4fd,0x504,0x508,0x34b,0x34b,0x32c,0x518,0x510,0x520,0x522,0x52a,0x532,0x536,0x537,0x53f,0x547, -0x54f,0x537,0x557,0x55c,0x54f,0x537,0x564,0x56c,0x536,0x574,0x57c,0x584,0x58c,0x34b,0x594,0x34b, -0x59c,0x4e2,0x5a4,0x584,0x536,0x574,0x5ab,0x584,0x5b3,0x5b5,0x53f,0x584,0x34b,0x34b,0x5bd,0x34b, -0x34b,0x5c3,0x5ca,0x34b,0x34b,0x5ce,0x5d6,0x34b,0x5da,0x5e1,0x34b,0x5e8,0x5f0,0x5f7,0x5ff,0x34b, -0x34b,0x604,0x60c,0x614,0x61c,0x624,0x62b,0x633,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x63b,0x34b,0x34b,0x64b,0x64b,0x643, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x653,0x653,0x543,0x543,0x34b,0x659,0x661,0x34b, -0x669,0x34b,0x671,0x34b,0x678,0x67e,0x34b,0x34b,0x34b,0x686,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x68d,0x34b,0x694,0x69c,0x34b,0x6a4,0x34b,0x34b,0x573,0x6ac,0x6b4,0x6ba,0x5b3,0x6c2,0x34b,0x6c9, -0x34b,0x6ce,0x34b,0x6d4,0x6dc,0x6e0,0x6e8,0x6f0,0x6f8,0x6fd,0x700,0x708,0x718,0x710,0x728,0x720, -0x372,0x730,0x372,0x738,0x73b,0x372,0x743,0x372,0x74b,0x753,0x75b,0x763,0x76b,0x773,0x77b,0x783, -0x78b,0x792,0x34b,0x79a,0x7a2,0x34b,0x7aa,0x7b2,0x7ba,0x7c2,0x7ca,0x7d2,0x7da,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x7dd,0x7e3,0x7e9,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,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,0x34b,0x34b, -0x7f1,0x7f6,0x7fa,0x802,0x372,0x372,0x372,0x80a,0x812,0x819,0x34b,0x81e,0x34b,0x34b,0x34b,0x826, -0x34b,0x66e,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x535,0x82e,0x34b,0x34b,0x835,0x34b,0x34b,0x83d,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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,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,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x845,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,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x6d4,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x84b,0x34b,0x853,0x858,0x860,0x34b,0x34b,0x868,0x870,0x878,0x372,0x87d,0x885,0x88b,0x34b,0x892, -0x89a,0x678,0x34b,0x34b,0x34b,0x34b,0x8a1,0x8a9,0x34b,0x8b1,0x8b8,0x34b,0x520,0x8bd,0x8c5,0x678, -0x34b,0x8cb,0x8d3,0x8d7,0x34b,0x8df,0x8e7,0x8ef,0x34b,0x8f5,0x8f9,0x901,0x911,0x909,0x34b,0x919, -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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x921,0x34b,0x34b,0x34b,0x34b,0x929,0x5b3,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x92e,0x936,0x93a,0x34b,0x34b,0x34b,0x34b,0x32e,0x334,0x942,0x94a,0x951,0x4e2,0x34b,0x34b,0x959, -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,0x34b,0x34b,0x34b,0x34b,0x34b, -0xd30,0xd30,0xd48,0xd88,0xdc8,0xe04,0xe44,0xe84,0xebc,0xefc,0xf3c,0xf7c,0xfbc,0xffc,0x103c,0x107c, -0x10bc,0x10fc,0x113c,0x117c,0x118c,0x11c0,0x11fc,0x123c,0x127c,0x12bc,0xd2c,0x12f0,0x1324,0x1364,0x1380,0x13b4, -0x9e1,0xa11,0xa51,0xa90,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xac8,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xb08,0x188,0x188,0xb3d,0xb7c,0xbbc,0xbf6,0xc2d,0x188, +static const uint16_t ucase_props_trieIndex[12244]={ +0x336,0x33e,0x346,0x34e,0x35c,0x364,0x36c,0x374,0x37c,0x384,0x38b,0x393,0x39b,0x3a3,0x3ab,0x3b3, +0x3b9,0x3c1,0x3c9,0x3d1,0x3d9,0x3e1,0x3e9,0x3f1,0x3f9,0x401,0x409,0x411,0x419,0x421,0x429,0x431, +0x439,0x441,0x449,0x451,0x459,0x461,0x469,0x471,0x46d,0x475,0x47a,0x482,0x489,0x491,0x499,0x4a1, +0x4a9,0x4b1,0x4b9,0x4c1,0x355,0x35d,0x4c6,0x4ce,0x4d3,0x4db,0x4e3,0x4eb,0x4ea,0x4f2,0x4f7,0x4ff, +0x507,0x50e,0x512,0x355,0x355,0x336,0x522,0x51a,0x52a,0x52c,0x534,0x53c,0x540,0x541,0x549,0x551, +0x559,0x541,0x561,0x566,0x559,0x541,0x56e,0x576,0x540,0x57e,0x586,0x58e,0x596,0x355,0x59e,0x355, +0x5a6,0x4ec,0x5ae,0x58e,0x540,0x57e,0x5b5,0x58e,0x5bd,0x5bf,0x549,0x58e,0x355,0x355,0x5c7,0x355, +0x355,0x5cd,0x5d4,0x355,0x355,0x5d8,0x5e0,0x355,0x5e4,0x5eb,0x355,0x5f2,0x5fa,0x601,0x609,0x355, +0x355,0x60e,0x616,0x61e,0x626,0x62e,0x635,0x63d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x645,0x355,0x355,0x655,0x655,0x64d, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x65d,0x65d,0x54d,0x54d,0x355,0x663,0x66b,0x355, +0x673,0x355,0x67b,0x355,0x682,0x688,0x355,0x355,0x355,0x690,0x355,0x355,0x355,0x355,0x355,0x355, +0x697,0x355,0x69e,0x6a6,0x355,0x6ae,0x355,0x355,0x57d,0x6b6,0x6be,0x6c4,0x5bd,0x6cc,0x355,0x6d3, +0x355,0x6d8,0x355,0x6de,0x6e6,0x6ea,0x6f2,0x6fa,0x702,0x707,0x70a,0x712,0x722,0x71a,0x732,0x72a, +0x37c,0x73a,0x37c,0x742,0x745,0x37c,0x74d,0x37c,0x755,0x75d,0x765,0x76d,0x775,0x77d,0x785,0x78d, +0x795,0x79c,0x355,0x7a4,0x7ac,0x355,0x7b4,0x7bc,0x7c4,0x7cc,0x7d4,0x7dc,0x7e4,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x7e7,0x7ed,0x7f3,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x7fb,0x800,0x804,0x80c,0x37c,0x37c,0x37c,0x814,0x81c,0x823,0x355,0x828,0x355,0x355,0x355,0x830, +0x355,0x678,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x53f,0x838,0x355,0x355,0x83f,0x355,0x355,0x847,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x84f,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x6de,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x855,0x355,0x85d,0x862,0x86a,0x355,0x355,0x872,0x87a,0x882,0x37c,0x887,0x88f,0x895,0x89d,0x89f, +0x8a7,0x682,0x355,0x355,0x355,0x355,0x8ae,0x8b6,0x355,0x8be,0x8c5,0x355,0x52a,0x8ca,0x8d2,0x682, +0x355,0x8d8,0x8e0,0x8e4,0x355,0x8ec,0x8f4,0x8fc,0x355,0x902,0x906,0x90e,0x91e,0x916,0x355,0x926, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x92e,0x355,0x355,0x355,0x355,0x936,0x5bd,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x93b,0x943,0x947,0x355,0x355,0x355,0x355,0x338,0x33e,0x94f,0x957,0x95e,0x4ec,0x355,0x355,0x966, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0xd58,0xd58,0xd70,0xdb0,0xdf0,0xe2c,0xe6c,0xeac,0xee4,0xf24,0xf64,0xfa4,0xfe4,0x1024,0x1064,0x10a4, +0x10e4,0x1124,0x1164,0x11a4,0x11b4,0x11e8,0x1224,0x1264,0x12a4,0x12e4,0xd54,0x1318,0x134c,0x138c,0x13a8,0x13dc, +0x9e1,0xa11,0xa51,0xa90,0x188,0x188,0xac8,0x188,0x188,0x188,0x188,0x188,0x188,0xaf1,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xb31,0x188,0x188,0xb66,0xba5,0xbe5,0xc1f,0xc56,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,605 +174,617 @@ static const uint16_t ucase_props_trieIndex[12064]={ 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, -0xc6d,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x960,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x968,0x34b,0x34b,0x34b,0x96b,0x34b,0x34b,0x34b, -0x34b,0x973,0x979,0x97d,0x34b,0x34b,0x981,0x985,0x98b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x993,0x997,0x34b,0x34b,0x34b,0x34b,0x34b,0x99f,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x9a7,0x9ab,0x9b3,0x9b7,0x34b,0x9be,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x9c5,0x34b,0x34b,0x34b,0x34b, -0x34b,0x536,0x9ca,0x9d1,0x5b4,0x5b3,0x9d5,0x533,0x34b,0x9dd,0x9e4,0x34b,0x9ea,0x5b3,0x9ef,0x9f7, -0x34b,0x34b,0x9fc,0x34b,0x34b,0x34b,0x34b,0x32e,0xa04,0x5b3,0x5b5,0xa0c,0xa13,0x34b,0x34b,0x34b, -0x34b,0x34b,0x9ca,0xa1b,0x34b,0x34b,0xa23,0xa2b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xa2f,0xa37, -0x34b,0x34b,0xa3f,0x4a6,0x34b,0x34b,0xa47,0x34b,0x34b,0xa4d,0xa55,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0xa5a,0x34b,0x34b,0x34b,0xa62,0xa6a,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0xa72,0xa76,0xa7e,0x34b,0xa85,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0xa8c,0x34b,0x34b,0x929,0xa94,0x34b,0x34b,0x34b,0xa9a,0xaa2,0x34b,0xaa6,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xaac,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xab2, -0x34b,0xab8,0x573,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xa62,0xa6a,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0xabe,0x34b,0x34b,0x5b3,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,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xac6,0x573,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,0xace,0xad6,0xadc,0x34b,0x34b,0x34b,0x34b,0xae4, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xaec,0xaf4,0xaf9, -0xaff,0xb07,0xb0f,0xb17,0xaf0,0xb1f,0xb27,0xb2f,0xb36,0xaf1,0xaec,0xaf4,0xaef,0xaff,0xaf2,0xaed, -0xb3e,0xaf0,0xb46,0xb4e,0xb56,0xb5d,0xb49,0xb51,0xb59,0xb60,0xb4c,0xb68,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x870,0xb70,0x870,0xb77, -0xb7e,0xb86,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,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xb8e,0xb96,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,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,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xb9a,0x34b,0xba2,0xbaa, -0xbb1,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,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,0xae8,0xbb9,0xbb9,0xbbf,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x9df,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,0x34b,0x34b,0x34b,0x34b,0x34b,0x536,0x870,0x870, -0x870,0x34b,0x34b,0x34b,0x34b,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0xac2,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,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x32b,0x32b,0x32b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,4,0,0,0,0,0, -0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0, -4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0, +0xc96,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x96d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x975,0x355,0x355,0x355,0x978,0x355,0x355,0x355, +0x355,0x980,0x986,0x98a,0x355,0x355,0x98e,0x992,0x998,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x9a0,0x9a4,0x355,0x355,0x355,0x355,0x355,0x9ac,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x9b4,0x9b8,0x9c0,0x9c4,0x355,0x9cb,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x9d2,0x355,0x355,0x355,0x355, +0x355,0x540,0x9d7,0x9de,0x5be,0x5bd,0x9e2,0x53d,0x355,0x9ea,0x9f1,0x355,0x9f7,0x5bd,0x9fc,0xa04, +0x355,0x355,0xa09,0x355,0x355,0x355,0x355,0x338,0xa11,0x5bd,0x5bf,0xa19,0xa20,0x355,0x355,0x355, +0x355,0x355,0x9d7,0xa28,0x355,0x355,0xa30,0xa38,0x355,0x355,0x355,0x355,0x355,0x355,0xa3c,0xa44, +0x355,0x355,0xa4c,0x4b0,0x355,0x355,0xa54,0x355,0x355,0xa5a,0xa62,0x355,0x355,0x355,0x355,0x355, +0x355,0xa67,0x355,0x355,0x355,0xa6f,0xa77,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xa7f,0x975, +0xa87,0xa8b,0xa93,0x355,0xa9a,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0xaa1,0x355,0x355,0x936,0xaa9,0x355,0x355,0x355,0xaaf,0xab7,0x355,0xabb,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xac1,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xac7,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xace,0x355,0xad4,0x57d,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0xa6f,0xa77,0x355,0x355,0x355,0x355,0x355,0x355,0x678,0x355,0xada,0x355,0x355, +0xae2,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0xae3,0x57d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0xaeb,0xaf3,0xaf9,0x355,0x355,0x355,0x355,0xb01,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0xb09,0xb11,0xb16,0xb1c,0xb24,0xb2c,0xb34,0xb0d,0xb3c,0xb44, +0xb4c,0xb53,0xb0e,0xb09,0xb11,0xb0c,0xb1c,0xb0f,0xb0a,0xb5b,0xb0d,0xb63,0xb6b,0xb73,0xb7a,0xb66, +0xb6e,0xb76,0xb7d,0xb69,0xb85,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x87a,0xb8d,0x87a,0xb94,0xb9b,0xba3,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0xbab,0xbb3,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xbb7,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x9c9,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0xbbf,0x355,0xbc7,0xbcf,0xbd6,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xb05, +0xbde,0xbde,0xbe4,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x9ec,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x540,0x87a,0x87a,0x87a,0x355,0x355,0x355,0x355,0x87a,0x87a, +0x87a,0x87a,0x87a,0x87a,0x87a,0xbec,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x335,0x335,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,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,0,0,0,0, +0,0,4,0,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,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,1,0,0,4,0,4,0,0,0,0,4,0x1c9,0,4, -4,0,1,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239,0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0,0,0,0,0,0,0,0,4,0,1,0,0,4,0,4, +0,0,0,0,4,0x1c9,0,4,4,0,1,0,0,0,0,0, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239, +0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1,0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91, -1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1, +0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92, -0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91,0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92, -0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692,0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,1, -0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1, -0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92,0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0, -0x92,0xff91,1,0x1c11,0,0,0,0,0x48a,0x4bb,0x4f9,0x52a,0x55b,0x599,0x5ca,0x5fb, -0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, -0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759,0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91, +0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92,0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692, +0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,1,0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1,0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92, +0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0,0x92,0xff91,1,0x1c11,0,0,0,0, +0x48a,0x4bb,0x4f9,0x52a,0x55b,0x599,0x5ca,0x5fb,0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759, +0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -1,1,1,1,1,1,0x78a,0x92,0xff91,0xae92,0x7aa,0x7c9,0x7c9,0x92,0xff91,0x9e92, -0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x7e9,0x809,0x829,0x9711, -0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91,0x849,1,1,1,0x9991,0x869,1,0x9891, -1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9,0x8e9,1,1,0x9691,1,0x909,0x9591,1, -1,0x9511,1,1,1,1,1,1,1,0x929,1,1,0x9311,1,1,0x9311, -1,1,1,0x949,0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1, -0,1,1,1,1,1,1,1,1,0x969,0x989,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,5,5,0x25,5, -5,5,5,5,5,4,4,4,0x14,4,0x14,4,5,5,4,4, +0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,1,1,1,1,0x78a,0x92, +0xff91,0xae92,0x7aa,0x7c9,0x7c9,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x7e9,0x809,0x829,0x9711,0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91, +0x849,1,1,1,0x9991,0x869,1,0x9891,1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9, +0x8e9,1,1,0x9691,1,0x909,0x9591,1,1,0x9511,1,1,1,1,1,1, +1,0x929,1,1,0x9311,1,0x949,0x9311,1,1,1,0x969,0x9311,0xdd91,0x9391,0x9391, +0xdc91,1,1,1,1,1,0x9291,1,0,1,1,1,1,1,1,1, +1,0x989,0x9a9,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,5,5,0x25,5,5,5,5,5,5,4,4,4, +0x14,4,0x14,4,5,5,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,5,5,5,5,5,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5, -5,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,0x54,0x54,0x44,0x44, -0x44,0x44,0x44,0x9ac,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54, -0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44, -0x44,0x9bd,0x44,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x64,4,0x44,0x44,0x44,0x64, -0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91, -4,4,0x92,0xff91,0,0,5,0x4111,0x4111,0x4111,0,0x3a12,0,0,0,0, -4,4,0x1312,4,0x1292,0x1292,0x1292,0,0x2012,0,0x1f92,0x1f92,0xa09,0x1012,0xada,0x1012, -0x1012,0xb1a,0x1012,0x1012,0xb5a,0xbaa,0xbfa,0x1012,0xc3a,0x1012,0x1012,0x1012,0xc7a,0xcba,0,0xcfa, -0x1012,0x1012,0xd3a,0x1012,0x1012,0xd7a,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91,0xdb9,0xf011,0xe89,0xf011, -0xf011,0xec9,0xf011,0xf011,0xf09,0xf59,0xfa9,0xf011,0xfe9,0xf011,0xf011,0xf011,0x1029,0x1069,0x10a9,0x10d9, -0xf011,0xf011,0x1119,0xf011,0xf011,0x1159,0xf011,0xf011,0xe011,0xe091,0xe091,0x412,0x1199,0x11c9,2,2, -2,0x1219,0x1249,0xfc11,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x1279,0x12a9,0x391,0xc631, -0x12da,0x1329,0,0x92,0xff91,0xfc92,0x92,0xff91,1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812, -0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x135a,0x1012, -0x139a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x13da,0x1012,0x1012,0x141a,0x145a,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14aa,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x14e9,0xf011, -0x1529,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1569,0xf011,0xf011,0x15a9,0x15e9,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1639,0xf011,0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811, -0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x167a,0x16b9, +4,4,4,4,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x9cc,0x54,0x44,0x54,0x44, +0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x9dd,0x44,0x64,0x64,0x64,0x44,0x44, +0x44,0x64,0x64,4,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,4,4,0x92,0xff91,0,0,5,0x4111, +0x4111,0x4111,0,0x3a12,0,0,0,0,4,4,0x1312,4,0x1292,0x1292,0x1292,0, +0x2012,0,0x1f92,0x1f92,0xa29,0x1012,0xafa,0x1012,0x1012,0xb3a,0x1012,0x1012,0xb7a,0xbca,0xc1a,0x1012, +0xc5a,0x1012,0x1012,0x1012,0xc9a,0xcda,0,0xd1a,0x1012,0x1012,0xd5a,0x1012,0x1012,0xd9a,0x1012,0x1012, +0xed11,0xed91,0xed91,0xed91,0xdd9,0xf011,0xea9,0xf011,0xf011,0xee9,0xf011,0xf011,0xf29,0xf79,0xfc9,0xf011, +0x1009,0xf011,0xf011,0xf011,0x1049,0x1089,0x10c9,0x10f9,0xf011,0xf011,0x1139,0xf011,0xf011,0x1179,0xf011,0xf011, +0xe011,0xe091,0xe091,0x412,0x11b9,0x11e9,2,2,2,0x1239,0x1269,0xfc11,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44, -0x44,0x44,0x44,0x44,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x1299,0x12c9,0x391,0xc631,0x12fa,0x1349,0,0x92,0xff91,0xfc92,0x92,0xff91, +1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812, +0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x137a,0x1012,0x13ba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x13fa,0x1012,0x1012,0x143a,0x147a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14ca,0x1012, +0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x1509,0xf011,0x1549,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0x1589,0xf011,0xf011,0x15c9,0x1609,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1659,0xf011, +0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811, +0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x169a,0x16d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,0x44,0x44,0x44,0x44,4,4,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92, -0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0,4,0,0,0,0,0,0, -1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, +0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0, +0,4,0,0,0,0,0,0,1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, 0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, -0xe811,0xe811,0xe811,0x16f9,1,0,0,0,0,0,0,0,0,0x64,0x44,0x44, -0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64, -0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0x64,0,0x64,0x64,0, -0x44,0x64,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, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1719,1,0,0,0, +0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64, +0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0,0x64,0,0x64,0x64,0,0x44,0x64,0,0x64,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,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x64,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,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, -0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,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,4,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,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,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,0,0x44, -0x44,0x44,0x44,0x64,0x44,4,4,0x44,0x44,0,0x64,0x44,0x44,0x64,0,0, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44, +0x64,0x44,0x44,0x64,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,0,0,0,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,4,0,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0x44, +0x44,0,0x64,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,0,0x64,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0x64,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, +0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44, +0x64,0x44,0x64,0x44,0x64,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,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64, -0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x64,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,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,0, -0,0,0,0,0,0,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, +4,4,0,0,0,0,4,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,0,0,0,0,0,0,0,0,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0,0,0,0,4,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,0x44,0x44,0x44,0x44,4,0x44, -0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,0,0, +0,0,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44, +4,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,0,0, -0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0,0,0,0, -0x44,0x44,4,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64, -0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44, +0,0x64,0x64,0x64,0,0,0,0,0x44,0x44,4,0x64,0x44,0x44,0x64,0x44, +0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0,0,0,0,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,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,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -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,4,0,0x64,0,0,0, +0,4,4,4,4,4,4,4,4,0,0,0,0,0x64,0,0, +0,0x44,0x64,0x44,0x44,4,4,4,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,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,0,0x64,0,0,0,0,4,4,4,4,4,4,4, -4,0,0,0,0,0x64,0,0,0,0x44,0x64,0x44,0x44,4,4,4, -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,4,0,0,0,0,0,0, +0x64,0,0,0,0,4,4,4,4,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,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,0x64,0,0,0,0,4,4,4, -4,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,4,4, +0,0,0x44,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,0,0,0x44,0,0,4,4,0, +0,0,0,0,0,4,4,0,0,0,0,4,4,0,0,4, +4,0x64,0,0,0,4,0,0,0,0,0,0,0,0,0,0, +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,0,0,0,0,0,0,0,0,0,0,0,4,4,0, -0,0,0,4,4,0,0,4,4,0x64,0,0,0,4,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, -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,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, +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,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,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,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,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,4,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,4,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,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,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, -4,0,0,0,0,0,0,0,0,0,0,0,0,0x64,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,0x64,0x64,0x64,0, +0,0,0,0,0,0,4,4,0x64,0x64,0x64,0x64,4,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,4,4,4,4,0x64,0x64,0x64,4,4,0,0,0, +0,0,0,0,0,0,4,0,0x64,0x64,0x64,0x64,4,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,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,0x64,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,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,0x64,0x64,0x64,0,0,0,0,0,0,0,4,4, -0x64,0x64,0x64,0x64,4,4,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, -0x64,0x64,0,4,4,0,0,0,0,0,0,0,0,0,4,0, -0x64,0x64,0x64,0x64,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, -0x64,0x64,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,0x64,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0x64,4,0x64,4,4,4,4,4,0x64,0x64,0x64,0x64,4,0, -0x64,4,0x44,0x44,0x64,0,0x44,0x44,0,0,0,0,0,4,4,4, -4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4, +0,0x64,0,0x64,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x64,0x64,4,0x64,4,4,4, +4,4,0x64,0x64,0x64,0x64,4,0,0x64,4,0x44,0x44,0x64,0,0x44,0x44, +0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4, +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,4,4,4,4,4,4,4,4,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,0,0,0,0,4,4,4, -4,0,4,4,4,4,4,0x64,0,0x64,0x64,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,4,4,0,0,0,0,4,4, -4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,0,0,4,4,0,0,0,0,0,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, -0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a, -0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a, -0x177a,0x177a,0,0x177a,0,0,0,0,0,0x177a,0,0,0x1799,0x17c9,0x17f9,0x1829, -0x1859,0x1889,0x18b9,0x18e9,0x1919,0x1949,0x1979,0x19a9,0x19d9,0x1a09,0x1a39,0x1a69,0x1a99,0x1ac9,0x1af9,0x1b29, -0x1b59,0x1b89,0x1bb9,0x1be9,0x1c19,0x1c49,0x1c79,0x1ca9,0x1cd9,0x1d09,0x1d39,0x1d69,0x1d99,0x1dc9,0x1df9,0x1e29, -0x1e59,0x1e89,0x1eb9,0x1ee9,0x1f19,0x1f49,0x1f79,0,4,0x1fa9,0x1fd9,0x2009,0,0,0,0, -0,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,0x203a,0x203a,0x203a,0x203a, -0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x205a,0x205a,0x205a,0x205a, -0x205a,0x205a,0,0,0x2079,0x20a9,0x20d9,0x2109,0x2139,0x2169,0,0,0x203a,0x203a,0x203a,0x203a, -0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a, -0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,4,0,4,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,4,0,0,4,4,4, -4,4,4,4,4,4,0x64,4,0,0,0,4,0,0,0,0, -0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,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,4,0,0,0,0,0,0,0,0, +4,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,0,0,0,0,4,4,4,4,0,4,4,4,4,4,0x64, +0,0x64,0x64,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, +4,4,0,0,0,0,4,4,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,4,4,0, +0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0,0x179a,0,0,0,0, +0,0x179a,0,0,0x17b9,0x17e9,0x1819,0x1849,0x1879,0x18a9,0x18d9,0x1909,0x1939,0x1969,0x1999,0x19c9, +0x19f9,0x1a29,0x1a59,0x1a89,0x1ab9,0x1ae9,0x1b19,0x1b49,0x1b79,0x1ba9,0x1bd9,0x1c09,0x1c39,0x1c69,0x1c99,0x1cc9, +0x1cf9,0x1d29,0x1d59,0x1d89,0x1db9,0x1de9,0x1e19,0x1e49,0x1e79,0x1ea9,0x1ed9,0x1f09,0x1f39,0x1f69,0x1f99,0, +4,0x1fc9,0x1ff9,0x2029,0,0,0,0,0,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,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x207a,0x207a,0x207a,0x207a,0x207a,0x207a,0,0,0x2099,0x20c9,0x20f9,0x2129, +0x2159,0x2189,0,0,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,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, +4,4,0,4,4,4,4,4,4,4,0,0,0,0,0,0, +0,0,4,0,0,4,4,4,4,4,4,4,4,4,0x64,4, +0,0,0,4,0,0,0,0,0,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,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,4, 0,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,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,0,0,0,0,4, -4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, -0,0x64,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,0x44,0x64,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,0,4,4,4,4,4,4,4,0, -0x64,0,4,0,0,4,4,4,4,4,4,4,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, -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,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, -0x2199,0x21c9,0x21f9,0x2229,0x2259,0x22a9,0x22f9,0x2329,0x2359,0,0,0,0,0,0,0, -0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a, -0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0,0,0x238a,0x238a,0x238a, -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,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,0,0,0,0,4,4,0,0,0,0,0,0,0, +0,0,4,0,0,0,0,0,0,0x64,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,0x44,0x64,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,0, +4,4,4,4,4,4,4,0,0x64,0,4,0,0,4,4,4, +4,4,4,4,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,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, +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,0x21b9,0x21e9,0x2219,0x2249,0x2279,0x22c9,0x2319,0x2349, +0x2379,0,0,0,0,0,0,0,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa, +0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa, +0x23aa,0x23aa,0x23aa,0,0,0x23aa,0x23aa,0x23aa,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,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,0x23a9,1,1,1,0x23c9,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,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, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91, +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,0x23c9,1,1,1,0x23e9,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,0x2409,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,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x242a,0x2469,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x23ea,0x2429,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x24a9,0x2529,0x25a9,0x2629,0x26a9,0x2729, +1,1,0x275a,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x2469,0x24e9,0x2569,0x25e9,0x2669,0x26e9,1,1,0x271a,1,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x2769,0x411,0x27e9,0x411, -0x2899,0x411,0x2949,0x411,0,0xfc12,0,0xfc12,0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11, -0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811,0x3f11,0x3f11,0,0,0x29f9,0x2a69,0x2ad9,0x2b49, -0x2bb9,0x2c29,0x2c99,0x2d09,0x2d7b,0x2deb,0x2e5b,0x2ecb,0x2f3b,0x2fab,0x301b,0x308b,0x30f9,0x3169,0x31d9,0x3249, -0x32b9,0x3329,0x3399,0x3409,0x347b,0x34eb,0x355b,0x35cb,0x363b,0x36ab,0x371b,0x378b,0x37f9,0x3869,0x38d9,0x3949, -0x39b9,0x3a29,0x3a99,0x3b09,0x3b7b,0x3beb,0x3c5b,0x3ccb,0x3d3b,0x3dab,0x3e1b,0x3e8b,0x411,0x411,0x3ef9,0x3f79, -0x3fe9,0,0x4069,0x40e9,0xfc12,0xfc12,0xdb12,0xdb12,0x419b,4,0x4209,4,4,4,0x4259,0x42d9, -0x4349,0,0x43c9,0x4449,0xd512,0xd512,0xd512,0xd512,0x44fb,4,4,4,0x411,0x411,0x4569,0x4619, -0,0,0x46e9,0x4769,0xfc12,0xfc12,0xce12,0xce12,0,4,4,4,0x411,0x411,0x4819,0x48c9, -0x4999,0x391,0x4a19,0x4a99,0xfc12,0xfc12,0xc812,0xc812,0xfc92,4,4,4,0,0,0x4b49,0x4bc9, -0x4c39,0,0x4cb9,0x4d39,0xc012,0xc012,0xc112,0xc112,0x4deb,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,0x4e5a,0, -2,0,0x4e9a,0x4eda,2,2,0,1,2,2,0xe12,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,0xf211,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812, -0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811, -0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0,0,0,0x92,0xff91,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12, -0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311, -0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0,0,0x27a9,0x411,0x2829,0x411,0x28d9,0x411,0x2989,0x411,0,0xfc12,0,0xfc12, +0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11,0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811, +0x3f11,0x3f11,0,0,0x2a39,0x2aa9,0x2b19,0x2b89,0x2bf9,0x2c69,0x2cd9,0x2d49,0x2dbb,0x2e2b,0x2e9b,0x2f0b, +0x2f7b,0x2feb,0x305b,0x30cb,0x3139,0x31a9,0x3219,0x3289,0x32f9,0x3369,0x33d9,0x3449,0x34bb,0x352b,0x359b,0x360b, +0x367b,0x36eb,0x375b,0x37cb,0x3839,0x38a9,0x3919,0x3989,0x39f9,0x3a69,0x3ad9,0x3b49,0x3bbb,0x3c2b,0x3c9b,0x3d0b, +0x3d7b,0x3deb,0x3e5b,0x3ecb,0x411,0x411,0x3f39,0x3fb9,0x4029,0,0x40a9,0x4129,0xfc12,0xfc12,0xdb12,0xdb12, +0x41db,4,0x4249,4,4,4,0x4299,0x4319,0x4389,0,0x4409,0x4489,0xd512,0xd512,0xd512,0xd512, +0x453b,4,4,4,0x411,0x411,0x45a9,0x4659,0,0,0x4729,0x47a9,0xfc12,0xfc12,0xce12,0xce12, +0,4,4,4,0x411,0x411,0x4859,0x4909,0x49d9,0x391,0x4a59,0x4ad9,0xfc12,0xfc12,0xc812,0xc812, +0xfc92,4,4,4,0,0,0x4b89,0x4c09,0x4c79,0,0x4cf9,0x4d79,0xc012,0xc012,0xc112,0xc112, +0x4e2b,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,0x4e9a,0,2,0,0x4eda,0x4f1a,2,2,0,1, +2,2,0xe12,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,0xf211,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812, +0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811, +0,0,0,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12, +0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311, +0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1812,0x1812,0x1812,0x1812, 0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0, 0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, -0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0,0x92,0xff91,0x4f1a,0x4f3a,0x4f5a,0x4f79,0x4f99,0x92, -0xff91,0x92,0xff91,0x92,0xff91,0x4fba,0x4fda,0x4ffa,0x501a,1,0x92,0xff91,1,0x92,0xff91,1, -1,1,1,1,0x25,5,0x503a,0x503a,0x92,0xff91,0x92,0xff91,1,0,0,0, -0,0,0,0x92,0xff91,0x92,0xff91,0x44,0x44,0x44,0x92,0xff91,0,0,0,0, -0,0,0,0,0,0,0,0,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059, -0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059, -0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0,0x5059,0,0,0,0, -0,0x5059,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, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0, +0x92,0xff91,0x4f5a,0x4f7a,0x4f9a,0x4fb9,0x4fd9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x4ffa,0x501a,0x503a, +0x505a,1,0x92,0xff91,1,0x92,0xff91,1,1,1,1,1,0x25,5,0x507a,0x507a, +0x92,0xff91,0x92,0xff91,1,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91,0x44, +0x44,0x44,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0,0, +0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099, +0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099, +0x5099,0x5099,0,0x5099,0,0,0,0,0,0x5099,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,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,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,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,0,0,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x507a,0x50b9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44, -4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,4, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,5,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,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, +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,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,0,0,0,0, +0,0,0,0,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x50ba,0x50f9, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,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,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,5,1,1,1,1,1,1,1,1,0x92,0xff91,0x92, -0xff91,0x50fa,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,4,4,4,0x92, -0xff91,0x511a,1,0,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x513a,0x515a,0x517a,0x519a,0x513a,1,0x51ba,0x51da,0x51fa,0x521a, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0,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,4,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,0x5239,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,0x5259,0x5289,0x52b9,0x52e9,0x5319,0x5349,0x5379,0x53a9,0x53d9,0x5409,0x5439,0x5469, -0x5499,0x54c9,0x54f9,0x5529,0x5b59,0x5b89,0x5bb9,0x5be9,0x5c19,0x5c49,0x5c79,0x5ca9,0x5cd9,0x5d09,0x5d39,0x5d69, -0x5d99,0x5dc9,0x5df9,0x5e29,0x5e59,0x5e89,0x5eb9,0x5ee9,0x5f19,0x5f49,0x5f79,0x5fa9,0x5fd9,0x6009,0x6039,0x6069, -0x6099,0x60c9,0x60f9,0x6129,0x5559,0x5589,0x55b9,0x55e9,0x5619,0x5649,0x5679,0x56a9,0x56d9,0x5709,0x5739,0x5769, -0x5799,0x57c9,0x57f9,0x5829,0x5859,0x5889,0x58b9,0x58e9,0x5919,0x5949,0x5979,0x59a9,0x59d9,0x5a09,0x5a39,0x5a69, -0x5a99,0x5ac9,0x5af9,0x5b29,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,0x6159,0x61d9,0x6259,0x62d9,0x6389,0x6439,0x64d9,0,0,0,0,0, -0,0,0,0,0,0,0,0x6579,0x65f9,0x6679,0x66f9,0x6779,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,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +4,4,4,4,4,4,4,4,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,1,1,1, +1,1,1,1,1,0x92,0xff91,0x92,0xff91,0x513a,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,4,4,4,0x92,0xff91,0x515a,1,0,0x92,0xff91,0x92,0xff91, +0x1811,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x517a,0x519a, +0x51ba,0x51da,0x517a,1,0x51fa,0x521a,0x523a,0x525a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0,0,0x92,0xff91,0xe812,0x527a,0x529a,0,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,4,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,4,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,0x52b9,1,1,1,1, +1,1,1,4,5,5,5,5,1,1,1,1,1,1,1,1, +0,0,0,0,0,0,0,0,0x52d9,0x5309,0x5339,0x5369,0x5399,0x53c9,0x53f9,0x5429, +0x5459,0x5489,0x54b9,0x54e9,0x5519,0x5549,0x5579,0x55a9,0x5bd9,0x5c09,0x5c39,0x5c69,0x5c99,0x5cc9,0x5cf9,0x5d29, +0x5d59,0x5d89,0x5db9,0x5de9,0x5e19,0x5e49,0x5e79,0x5ea9,0x5ed9,0x5f09,0x5f39,0x5f69,0x5f99,0x5fc9,0x5ff9,0x6029, +0x6059,0x6089,0x60b9,0x60e9,0x6119,0x6149,0x6179,0x61a9,0x55d9,0x5609,0x5639,0x5669,0x5699,0x56c9,0x56f9,0x5729, +0x5759,0x5789,0x57b9,0x57e9,0x5819,0x5849,0x5879,0x58a9,0x58d9,0x5909,0x5939,0x5969,0x5999,0x59c9,0x59f9,0x5a29, +0x5a59,0x5a89,0x5ab9,0x5ae9,0x5b19,0x5b49,0x5b79,0x5ba9,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,0x61d9,0x6259,0x62d9,0x6359,0x6409,0x64b9,0x6559,0, +0,0,0,0,0,0,0,0,0,0,0,0x65f9,0x6679,0x66f9,0x6779,0x67f9, +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,0x1012,0x1012,0x1012, 0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011, 0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,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, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,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,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0, -0x64,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,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412, +0,0x64,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,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, +0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, 0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, -0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0xec11,0xec11,0xec11,0xec11, 0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11, -0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, -0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0,0xec11,0xec11,0xec11,0xec11, +0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, +0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0, 0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11, -0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,4,4,4, -0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0, +0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,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,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,0x2012,0x2012,0x2012,0x2012, +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, +0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, 0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, -0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe011,0xe011,0xe011,0xe011, +0x2012,0x2012,0x2012,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, -0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,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,0,0,0,0,0,0,0x64,0x64,0x44,0x44,0x44,0x64, -0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, +0xe011,0xe011,0xe011,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,0,0,0,0,0,0,0x64,0x64, +0x44,0x44,0x44,0x64,0x44,0x64,0x64,0x64,0x64,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,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,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,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,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,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,4,4,4,4,4,4,4,4,4,0,0x60,0,0,0, -0,0,0,0,0,4,0x64,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,0,0,4,0x60,0x64,4,0,0,0,0,0,0,4,0, -0,0,0,4,4,4,4,4,4,0x64,0x64,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,4,0x64,4,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,0,0x60,0,0, +0,0,0,4,4,4,0,0,4,0x60,0x64,4,0,0,0,0, +0,0,4,0,0,0,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0x44,0x44,0x44,0x44, -0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,4, -4,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,0x44,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,4,0,0,0,0,4,4,0,0x64,0x64, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0, +0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x64,4,4,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,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,4,4, -4,4,0,0,0,0,0,0,4,4,0,0x64,0x64,0,0,0, +0,0,0,4,4,4,4,4,4,0,4,0,0,0,0,4, +4,0,0x64,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,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,4, -4,4,4,4,4,4,4,0,0,4,0,0x64,0,0,0,0, -0,0,0,0,0,0,0,4,0,4,0,0,4,4,4,4, -4,4,0x60,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,0,0,0,0,0,0,4,4,0,0x64, +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,4,4,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,0,0,4,4,4,4,0,4,4,4,4,0x64, +0,0,0,4,4,4,4,4,4,4,4,0,0,4,0,0x64, +0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0, +4,4,4,4,4,4,0x60,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,0,0,4,4,4,4,4,4,4,4,4, -0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0,0,0,0,0,4,4,4,0,0,4,4,4,4,0,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,4,4,4,4,4, +4,4,4,4,0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012, 0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011, 0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,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,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, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,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,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,4,4,0,0,0,4,0,0x64, -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, +4,4,4,4,0,0,4,4,0,0,0,0,0,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,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,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,4,4,0,0, +0,4,0,0x64,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,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,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, +4,4,4,4,4,4,4,4,4,4,0,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,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,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,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,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, -2,2,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,0,0x21,0x21,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +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,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,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,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,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,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,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,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,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,0,0,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,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, -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, +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,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,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, +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,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,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,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,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0x1112,0x1112,0x1112,0x1112, 0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, -0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, +0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11, 0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, -0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0, +0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44, +0x44,0x44,0x64,4,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,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 +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 }; -static const uint16_t ucase_props_exceptions[1663]={ +static const uint16_t ucase_props_exceptions[1671]={ 0xc850,0x20,2,0x130,0x131,0x4810,0x20,0x841,0x6b,1,0x212a,0x841,0x73,1,0x17f,0x5c50, 0x20,2,0x130,0x131,0x844,0x4b,1,0x212a,0x844,0x53,1,0x17f,0x806,0x3bc,0x39c,0x841, 0xe5,1,0x212b,0x8c0,1,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x1e9e,0x844,0xc5,1, @@ -782,101 +794,102 @@ static const uint16_t ucase_props_exceptions[1663]={ 0x1cc,0x1ca,0x1cb,0x80c,0x1ca,0x1cb,0x880,0x2220,0x6a,0x30c,0x4a,0x30c,0x4a,0x30c,0x809,0x1f3, 0x1f2,0x80d,0x1f3,0x1f1,0x1f2,0x80c,0x1f1,0x1f2,0x810,0x2a2b,0x810,0x2a28,0x810,0x2a3f,0x810,0x2a1f, 0x810,0x2a1c,0x810,0x2a1e,0x810,0xa54f,0x810,0xa54b,0x810,0xa528,0x810,0xa544,0x810,0x29f7,0x810,0xa541, -0x810,0x29fd,0x810,0x29e7,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399,1,0x1fbe, -0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841,0x3b2,1, -0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345,0x1fbe,0x841, -0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1,0x3f1,0x4850, -0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330,0x3c5,0x308, -0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395,1,0x3f5, -0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0,0x844,0x39c, -1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844,0x3a3,1, -0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8,0x398,1, -0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841,0x3b8,2, -0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841,0x43e,1, -0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86,0x844,0x412, -1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83,0x844,0x422, -2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1,0x1c87,0x880, -0x2220,0x565,0x582,0x535,0x552,0x535,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91,0x10d1,0x80c, -0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6,0x80c,0x1c97, -0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c,0x1c9c,0x10dc, -0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1,0x10e1,0x80c, -0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6,0x80c,0x1ca7, -0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c,0x1cac,0x10ec, -0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1,0x10f1,0x80c, -0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6,0x80c,0x1cb7, -0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c,0x1cbe,0x10fe, -0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806,0x13f2,0x13f2, -0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434,0x414,0x806, -0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1,0x1c84,0x806, -0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6,0x841,0x1e61, -1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x880,0x2220, -0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x880,0x2220, -0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,0x806,0x1e61, -0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x880,0x3330, -0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5,0x313,0x301,0x3a5,0x313, -0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x890, -8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0x890,8,0x220, -0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890,8,0x220,0x1f04,0x3b9, -0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220,0x1f06,0x3b9,0x1f0e,0x399, -0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0xc90,8, -0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0xc90,8,0x220,0x1f03, -0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8,0x220,0x1f05,0x3b9,0x1f0d, -0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x890, -8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0x890,8,0x220, -0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890,8,0x220,0x1f24,0x3b9, -0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220,0x1f26,0x3b9,0x1f2e,0x399, -0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0xc90,8, -0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0xc90,8,0x220,0x1f23, -0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8,0x220,0x1f25,0x3b9,0x1f2d, -0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x890, -8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0x890,8,0x220, -0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890,8,0x220,0x1f64,0x3b9, -0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220,0x1f66,0x3b9,0x1f6e,0x399, -0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0xc90,8, -0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0xc90,8,0x220,0x1f63, -0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8,0x220,0x1f65,0x3b9,0x1f6d, -0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x880, -0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9,0x391,0x399,0x880,0x2220, -0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,0x880,0x3330, -0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220,0x3b1,0x3b9,0x391,0x399, -0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x890,9,0x220, -0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x880,0x2220,0x3b7,0x342, -0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0xc90, -9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308, -0x300,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390,0x880,0x2220, -0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308, -0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0x8c0,1,0x3330,0x3c5, -0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x880,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1, -0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5,0x308,0x342,0x3a5,0x308, -0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x890,9,0x220,0x3c9, -0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880,0x2220,0x3c9,0x342,0x3a9, -0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,0xc90,9, -0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1,0x4b,0xc50,0x2046,1, -0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10,0x2a1c,0xc10,0x29fd,0xc10, -0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844,0xa64a,1,0x1c88,0xc10, -0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10,0xa512,0xc10,0xa52a,0xc10, -0xa515,0x810,0x3a0,0xc10,0x3a0,0x806,0x13a0,0x13a0,0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3, -0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806,0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8, -0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab,0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806, -0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0,0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3, -0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806,0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8, -0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb,0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806, -0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0,0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3, -0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806,0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8, -0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb,0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806, -0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0,0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3, -0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806,0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8, -0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db,0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806, -0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0,0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3, -0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806,0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8, -0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb,0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806, -0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66, -0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66, -0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c, -0x46,0x66,0x6c,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb06,0x8c0,1,0x2220, -0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880,0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880, -0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880, -0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d +0x810,0x29fd,0x810,0x29e7,0x810,0xa543,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399, +1,0x1fbe,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841, +0x3b2,1,0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345, +0x1fbe,0x841,0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1, +0x3f1,0x4850,0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330, +0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395, +1,0x3f5,0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0, +0x844,0x39c,1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844, +0x3a3,1,0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8, +0x398,1,0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841, +0x3b8,2,0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841, +0x43e,1,0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86, +0x844,0x412,1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83, +0x844,0x422,2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1, +0x1c87,0x880,0x2220,0x565,0x582,0x535,0x552,0x535,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91, +0x10d1,0x80c,0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6, +0x80c,0x1c97,0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c, +0x1c9c,0x10dc,0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1, +0x10e1,0x80c,0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6, +0x80c,0x1ca7,0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c, +0x1cac,0x10ec,0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1, +0x10f1,0x80c,0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6, +0x80c,0x1cb7,0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c, +0x1cbe,0x10fe,0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806, +0x13f2,0x13f2,0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434, +0x414,0x806,0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1, +0x1c84,0x806,0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6, +0x810,0x8a38,0x841,0x1e61,1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331, +0x48,0x331,0x880,0x2220,0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a, +0x57,0x30a,0x880,0x2220,0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be, +0x41,0x2be,0x806,0x1e61,0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313, +0x3a5,0x313,0x880,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5, +0x313,0x301,0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342, +0x3a5,0x313,0x342,0x890,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09, +0x399,0x890,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890, +8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220, +0x1f06,0x3b9,0x1f0e,0x399,0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9, +0x1f08,0x399,0xc90,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399, +0xc90,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8, +0x220,0x1f05,0x3b9,0x1f0d,0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07, +0x3b9,0x1f0f,0x399,0x890,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29, +0x399,0x890,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890, +8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220, +0x1f26,0x3b9,0x1f2e,0x399,0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9, +0x1f28,0x399,0xc90,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399, +0xc90,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8, +0x220,0x1f25,0x3b9,0x1f2d,0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27, +0x3b9,0x1f2f,0x399,0x890,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69, +0x399,0x890,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890, +8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220, +0x1f66,0x3b9,0x1f6e,0x399,0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9, +0x1f68,0x399,0xc90,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399, +0xc90,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8, +0x220,0x1f65,0x3b9,0x1f6d,0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67, +0x3b9,0x1f6f,0x399,0x880,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9, +0x391,0x399,0x880,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342, +0x391,0x342,0x880,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220, +0x3b1,0x3b9,0x391,0x399,0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca, +0x345,0x890,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345, +0x880,0x2220,0x3b7,0x342,0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399, +0x397,0x342,0x345,0xc90,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399, +0x308,0x300,0x399,0x308,0x300,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308, +0x301,0x390,0x880,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399, +0x308,0x342,0x399,0x308,0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300, +0x8c0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x880,0x2220,0x3c1, +0x313,0x3a1,0x313,0x3a1,0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5, +0x308,0x342,0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345, +0x890,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880, +0x2220,0x3c9,0x342,0x3a9,0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9, +0x342,0x345,0xc90,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1, +0x4b,0xc50,0x2046,1,0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10, +0x2a1c,0xc10,0x29fd,0xc10,0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844, +0xa64a,1,0x1c88,0xc10,0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10, +0xa512,0xc10,0xa52a,0xc10,0xa515,0x810,0x3a0,0xc10,0xa543,0xc10,0x8a38,0xc10,0x3a0,0x806,0x13a0,0x13a0, +0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3,0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806, +0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8,0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab, +0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806,0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0, +0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3,0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806, +0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8,0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb, +0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806,0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0, +0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3,0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806, +0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8,0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb, +0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806,0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0, +0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3,0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806, +0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8,0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db, +0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806,0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0, +0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3,0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806, +0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8,0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb, +0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806,0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66, +0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66, +0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69, +0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0x8c0,1,0x2220,0x73,0x74, +0x53,0x54,0x53,0x74,0xfb06,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880, +0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880, +0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880, +0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d }; static const uint16_t ucase_props_unfold[370]={ @@ -913,16 +926,16 @@ static const UCaseProps ucase_props_singleton={ ucase_props_unfold, { ucase_props_trieIndex, - ucase_props_trieIndex+3248, + ucase_props_trieIndex+3288, NULL, - 3248, - 8816, + 3288, + 8956, 0x188, - 0xd2c, + 0xd54, 0x0, 0x0, 0xe0800, - 0x2f1c, + 0x2fd0, NULL, 0, FALSE, FALSE, 0, NULL }, { 4,0,0,0 } diff --git a/deps/icu-small/source/common/uchar.cpp b/deps/icu-small/source/common/uchar.cpp index 996c3fdc40227b..60fe75c78dec03 100644 --- a/deps/icu-small/source/common/uchar.cpp +++ b/deps/icu-small/source/common/uchar.cpp @@ -453,12 +453,18 @@ u_getNumericValue(UChar32 c) { } return numValue; - } else if(ntv>2); return (double)numerator/denominator; + } else if(ntv>2); + return (double)numerator/denominator; } else { /* reserved */ return U_NO_NUMERIC_VALUE; diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index e9c231908e8288..10c25b3048ee3f 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -11,9 +11,9 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={0xb,0,0,0}; +static const UVersionInfo dataVersion={0xc,1,0,0}; -static const uint16_t propsTrie_index[21452]={ +static const uint16_t propsTrie_index[21968]={ 0x45d,0x465,0x46d,0x475,0x48d,0x495,0x49d,0x4a5,0x4ad,0x4b5,0x4bb,0x4c3,0x4cb,0x4d3,0x4db,0x4e3, 0x4e9,0x4f1,0x4f9,0x501,0x504,0x50c,0x514,0x51c,0x524,0x52c,0x528,0x530,0x538,0x540,0x545,0x54d, 0x555,0x55d,0x561,0x569,0x571,0x579,0x581,0x589,0x585,0x58d,0x592,0x59a,0x5a0,0x5a8,0x5b0,0x5b8, @@ -21,29 +21,29 @@ static const uint16_t propsTrie_index[21452]={ 0x635,0x62d,0x63d,0x645,0x47d,0x655,0x65d,0x64d,0x66d,0x66f,0x677,0x665,0x687,0x68d,0x695,0x67f, 0x6a5,0x6ab,0x6b3,0x69d,0x6c3,0x6c9,0x6d1,0x6bb,0x6e1,0x6e7,0x6ef,0x6d9,0x6ff,0x707,0x70f,0x6f7, 0x71f,0x725,0x72d,0x717,0x73d,0x743,0x74b,0x735,0x75b,0x760,0x768,0x753,0x778,0x77f,0x787,0x770, -0x609,0x78f,0x797,0x47d,0x79f,0x7a7,0x7af,0x47d,0x7b7,0x7bf,0x7c7,0x7cc,0x7d4,0x7db,0x7e3,0x47d, -0x5c8,0x7eb,0x7f3,0x7fb,0x803,0x555,0x813,0x80b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x81b,0x5c8,0x823,0x827,0x82f,0x5c8,0x835,0x5c8,0x83b,0x843,0x84b,0x555,0x555,0x853, -0x85b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x860,0x868,0x5c8,0x5c8,0x870,0x878,0x880,0x888,0x890,0x5c8,0x898,0x8a0,0x8a8, -0x8b8,0x5c8,0x8c0,0x8c2,0x8ca,0x8b0,0x5c8,0x8cd,0x8e1,0x8d5,0x8dd,0x8e9,0x5c8,0x8f1,0x8f7,0x8ff, -0x907,0x5c8,0x917,0x91f,0x927,0x90f,0x47d,0x47d,0x937,0x93a,0x942,0x92f,0x952,0x94a,0x5c8,0x959, -0x5c8,0x968,0x961,0x970,0x978,0x97c,0x984,0x98c,0x4fd,0x994,0x997,0x99d,0x9a4,0x997,0x524,0x9ac, -0x4ad,0x4ad,0x4ad,0x4ad,0x9b4,0x4ad,0x4ad,0x4ad,0x9c4,0x9cc,0x9d4,0x9dc,0x9e4,0x9e8,0x9f0,0x9bc, -0xa08,0xa10,0x9f8,0xa00,0xa18,0xa20,0xa28,0xa30,0xa48,0xa38,0xa40,0xa50,0xa58,0xa67,0xa6c,0xa5f, -0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa7c,0xa84,0x8ff,0xa87,0xa8f,0xa96,0xa9b,0xaa3, -0x8ff,0xaaa,0xaa9,0xaba,0xabd,0x8ff,0x8ff,0xab2,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xacc,0xad4,0xac4, -0x8ff,0x8ff,0x8ff,0xad9,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xadf,0xae7,0x8ff,0xaef,0xaf6, -0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xa74,0xa74,0xa74,0xa74,0xafe,0xa74,0xb05,0xb0c, -0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x8ff,0xb14,0xb1b,0xb1f,0xb25,0x8ff,0xb2b,0xaa4, -0x555,0xb3b,0xb33,0xb43,0x4ad,0x4ad,0x4ad,0xb4b,0x4fd,0xb53,0x5c8,0xb59,0xb69,0xb61,0xb61,0x524, -0xb71,0xb79,0xb81,0x47d,0xb89,0x8ff,0x8ff,0xb90,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xb98,0xb9e, -0xbae,0xba6,0x609,0x5c8,0xbb6,0x85b,0x5c8,0xbbe,0xbc6,0xbca,0x5c8,0x5c8,0xbcf,0xbd7,0x8ff,0xbdf, -0xaa4,0xbe7,0xbed,0x8ff,0xbe7,0xbf5,0x8ff,0xaa4,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0xbfd,0x5c8,0x5c8,0x5c8,0xc05,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x609,0x78f,0x797,0x47d,0x79f,0x7a6,0x7ae,0x47d,0x7b6,0x7be,0x7c6,0x7cb,0x7d3,0x7da,0x7e2,0x47d, +0x5c8,0x7ea,0x7f2,0x7fa,0x802,0x555,0x812,0x80a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x81a,0x5c8,0x822,0x826,0x82e,0x5c8,0x834,0x5c8,0x83a,0x842,0x84a,0x555,0x555,0x852, +0x85a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x85f,0x867,0x5c8,0x5c8,0x86f,0x877,0x87f,0x887,0x88f,0x5c8,0x897,0x89f,0x8a7, +0x8b7,0x5c8,0x8bf,0x8c1,0x8c9,0x8af,0x5c8,0x8cc,0x8e0,0x8d4,0x8dc,0x8e8,0x5c8,0x8f0,0x8f6,0x8fe, +0x906,0x5c8,0x916,0x91e,0x926,0x90e,0x47d,0x47d,0x936,0x939,0x941,0x92e,0x951,0x949,0x5c8,0x958, +0x5c8,0x967,0x960,0x96f,0x977,0x97b,0x983,0x98b,0x4fd,0x993,0x996,0x99c,0x9a3,0x996,0x524,0x9ab, +0x4ad,0x4ad,0x4ad,0x4ad,0x9b3,0x4ad,0x4ad,0x4ad,0x9c3,0x9cb,0x9d3,0x9db,0x9e3,0x9e7,0x9ef,0x9bb, +0xa07,0xa0f,0x9f7,0x9ff,0xa17,0xa1f,0xa27,0xa2f,0xa47,0xa37,0xa3f,0xa4f,0xa57,0xa66,0xa6b,0xa5e, +0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa7b,0xa83,0x8fe,0xa86,0xa8e,0xa95,0xa9a,0xaa2, +0x8fe,0xaa9,0xaa8,0xab9,0xabc,0x8fe,0x8fe,0xab1,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xacb,0xad3,0xac3, +0x8fe,0x8fe,0x8fe,0xad8,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xade,0xae6,0x8fe,0xaee,0xaf5, +0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xa73,0xa73,0xa73,0xa73,0xafd,0xa73,0xb04,0xb0b, +0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0x8fe,0xb13,0xb1a,0xb1e,0xb24,0x8fe,0x8fe,0x8fe, +0x555,0xb34,0xb2c,0xb3c,0x4ad,0x4ad,0x4ad,0xb44,0x4fd,0xb4c,0x5c8,0xb52,0xb62,0xb5a,0xb5a,0x524, +0xb6a,0xb72,0xb7a,0x47d,0xb82,0x8fe,0x8fe,0xb89,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0xb97, +0xba7,0xb9f,0x609,0x5c8,0xbaf,0x85a,0x5c8,0xbb7,0xbbf,0xbc3,0x5c8,0x5c8,0xbc8,0xbd0,0x8fe,0xbd8, +0xaa3,0xbe0,0xbe6,0x8fe,0xbe0,0xbee,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0xbf6,0x5c8,0x5c8,0x5c8,0xbfe,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0xc0b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc10,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0xc04,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc09,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, @@ -52,54 +52,54 @@ static const uint16_t propsTrie_index[21452]={ 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cd,0x8ff,0x8ff, -0xc18,0x5c8,0xc1b,0x5c8,0xc23,0xc29,0xc31,0xc39,0xc3e,0x5c8,0x5c8,0xc42,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc49,0x5c8,0xc50,0xc56,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc5e,0x5c8,0x5c8,0x5c8,0xc66,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cc,0x8fe,0x8fe, +0xc11,0x5c8,0xc14,0x5c8,0xc1c,0xc22,0xc2a,0xc32,0xc37,0x5c8,0x5c8,0xc3b,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc42,0x5c8,0xc49,0xc4f,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc57,0x5c8,0x5c8,0x5c8,0xc5f,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc68,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc6f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc61,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc68,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0xc76,0x5c8,0x5c8,0x5c8,0xc7d,0xc85,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0xc6f,0x5c8,0x5c8,0x5c8,0xc76,0xc7e,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc8a,0x5c8,0x5c8,0xc92,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc83,0x5c8,0x5c8,0xc8b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc96,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc8f,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc99,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc92,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc9c,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc95,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0xca2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0xc9b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0xcaa,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0xca3,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0xcaf,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0xca8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb4,0x5c8,0x5c8,0x5c8,0xcb9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcad,0x5c8,0x5c8,0x5c8,0xcb2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0xcc1,0xcc8,0xccc,0x5c8,0x5c8,0x5c8,0xcd3,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0xcba,0xcc1,0xcc5,0x5c8,0x5c8,0x5c8,0xccc,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcd9, -0xce9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcd2, +0xce2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0xce1,0x8ff,0xcf1,0x970,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0xcf6,0xcfe,0x4ad,0xd0e,0xd06,0x5c8,0x5c8,0xd16,0xd1e,0xd2e,0x4ad,0xd33,0xd3b,0xd41,0x47d,0xd26, -0xd49,0xd51,0x5c8,0xd59,0xd69,0xd6c,0xd61,0xd74,0x61d,0xd7c,0xd83,0x8c1,0x66d,0xd93,0xd8b,0xd9b, -0x5c8,0xda3,0xdab,0xdb3,0x5c8,0xdbb,0xdc3,0xdcb,0xdd3,0xddb,0xddf,0xde7,0x4fd,0x4fd,0x5c8,0xdef, +0x5c8,0x5c8,0x5c8,0x5c8,0xcda,0x8fe,0xcea,0x96f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0xcef,0xcf7,0x4ad,0xd07,0xcff,0x5c8,0x5c8,0xd0f,0xd17,0xd27,0x4ad,0xd2c,0xd34,0xd3a,0xd42,0xd1f, +0xd4a,0xd52,0x5c8,0xd5a,0xd6a,0xd6d,0xd62,0xd75,0x61d,0xd7d,0xd84,0x8c0,0x66d,0xd94,0xd8c,0xd9c, +0x5c8,0xda4,0xdac,0xdb4,0x5c8,0xdbc,0xdc4,0xdcc,0xdd4,0xddc,0xde0,0xde8,0x4fd,0x4fd,0x5c8,0xdf0, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, @@ -121,29 +121,29 @@ static const uint16_t propsTrie_index[21452]={ 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdf7,0xe03,0xdfb, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdf8,0xe04,0xdfc, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0x5c8,0x5c8,0x5c8,0xe1b,0x5c8,0xcd4,0xe22,0xe27, -0x5c8,0x5c8,0x5c8,0xe2f,0x5c8,0x5c8,0x8cc,0x47d,0xe45,0xe35,0xe3d,0x5c8,0x5c8,0xe4d,0xe55,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xe5a,0xe62,0x5c8,0xe66,0x5c8,0xe6c,0xe70, -0xe78,0xe80,0xe87,0xe8f,0x5c8,0x5c8,0x5c8,0xe95,0xead,0x46d,0xeb5,0xebd,0xec2,0x8e1,0xe9d,0xea5, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0x5c8,0x5c8,0x5c8,0xe1c,0x5c8,0xccd,0xe23,0xe28, +0x5c8,0x5c8,0x5c8,0xe30,0x5c8,0x5c8,0x8cb,0x47d,0xe46,0xe36,0xe3e,0x5c8,0x5c8,0xe4e,0xe56,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xe5b,0xe63,0x5c8,0xe67,0x5c8,0xe6d,0xe71, +0xe79,0xe81,0xe88,0xe90,0x5c8,0x5c8,0x5c8,0xe96,0xeae,0x46d,0xeb6,0xebe,0xec3,0x8e0,0xe9e,0xea6, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, 0x11f4,0x11f4,0x1234,0x1274,0x12b4,0x12ec,0x132c,0x136c,0x13a4,0x13e4,0x1410,0x1450,0x1490,0x14a0,0x14e0,0x1514, 0x1554,0x1584,0x15c4,0x1604,0x1614,0x1648,0x1680,0x16c0,0x1700,0x1740,0x1774,0x17a0,0x17e0,0x1818,0x1834,0x1874, 0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xbc0,0xa40,0xbe2,0xa40,0xa40,0xa40,0xa40,0xc22,0x1db,0x1db, @@ -182,118 +182,118 @@ static const uint16_t propsTrie_index[21452]={ 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0xeca,0xed1,0xed9,0x47d,0x5c8,0x5c8,0x5c8,0xbd7,0xee9,0xee1,0xf00,0xef1,0xef8,0xf08,0xb85,0xf10, -0x47d,0x47d,0x47d,0x47d,0x8c1,0x5c8,0xf18,0xf20,0x5c8,0xf28,0xf30,0xf34,0xf3c,0x5c8,0xf44,0x47d, -0x555,0x55f,0xf4c,0x5c8,0xf50,0xf58,0xf68,0xf60,0x5c8,0xf70,0x5c8,0xf77,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xb69,0x8cd,0xe6c,0x47d,0x47d,0x47d,0x47d, -0xf87,0xf7f,0xf8a,0xf92,0x8e1,0xf9a,0x47d,0xfa2,0xfaa,0xfb2,0x47d,0x47d,0x5c8,0xfc2,0xfca,0xfba, -0xfda,0xfe1,0xfd2,0xfe9,0xff1,0x47d,0x1001,0xff9,0x5c8,0x1004,0x100c,0x1014,0x101c,0x1024,0x47d,0x47d, -0x5c8,0x5c8,0x102c,0x47d,0x555,0x1034,0x4fd,0x103c,0x5c8,0x1044,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x104c,0x47d,0x47d,0x47d,0x47d,0x1054,0x105c,0x1063,0x47d,0x47d,0x47d,0x47d,0x47d, -0x1073,0x5fe,0x107b,0x106b,0x952,0x1083,0x108b,0x1091,0x10a9,0x1099,0x10a1,0x10ad,0x952,0x10bd,0x10b5,0x10c5, -0x10d5,0x10cd,0x47d,0x47d,0x10dc,0x10e4,0x620,0x10ec,0x10fc,0x1102,0x110a,0x10f4,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x1112,0x111a,0x47d,0x5c8,0x1122,0x112a,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x1132,0x113a,0x47d, -0x5c8,0x1142,0x114a,0x1152,0x5c8,0x1162,0x115a,0x47d,0x83b,0x116a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x1172,0x47d,0x47d,0x47d,0x555,0x4fd,0x117a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x1192,0x1182,0x118a,0x5c8,0x11a2,0x119a,0x5c8,0x8c2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x11b8,0x11bd,0x11aa,0x11b2,0x11cd,0x11c5,0x47d,0x47d,0x11dc,0x11e0,0x11d4,0x11f0,0x11e8,0x115a,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x11f4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cc,0x47d,0x47d,0x47d, -0x1204,0x120c,0x1214,0x11fc,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x121c,0x47d,0x47d,0x47d,0x47d,0x47d, +0xecb,0xed2,0xeda,0x47d,0x5c8,0x5c8,0x5c8,0xbd0,0xeea,0xee2,0xf01,0xef2,0xef9,0xf09,0xb7e,0xf11, +0x47d,0x47d,0x47d,0x47d,0x8c0,0x5c8,0xf19,0xf21,0x5c8,0xf29,0xf31,0xf35,0xf3d,0x5c8,0xf45,0x47d, +0x555,0x55f,0xf4d,0x5c8,0xf51,0xf59,0xf69,0xf61,0x5c8,0xf71,0x5c8,0xf78,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xb62,0x8cc,0xe6d,0x47d,0x47d,0x47d,0x47d, +0xf88,0xf80,0xf8b,0xf93,0x8e0,0xf9b,0x47d,0xfa3,0xfab,0xfb3,0x47d,0x47d,0x5c8,0xfc3,0xfcb,0xfbb, +0xfdb,0xfe2,0xfd3,0xfea,0xff2,0x47d,0x1002,0xffa,0x5c8,0x1005,0x100d,0x1015,0x101d,0x1025,0x47d,0x47d, +0x5c8,0x5c8,0x102d,0x47d,0x555,0x1035,0x4fd,0x103d,0x5c8,0x1045,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x104d,0x47d,0x47d,0x47d,0x47d,0x1055,0x105d,0x1064,0x47d,0x47d,0x47d,0x47d,0xb62, +0x1074,0x5fe,0x107c,0x106c,0x951,0x1084,0x108c,0x1092,0x10aa,0x109a,0x10a2,0x10ae,0x951,0x10be,0x10b6,0x10c6, +0x10d6,0x10ce,0x47d,0x47d,0x10dd,0x10e5,0x620,0x10ed,0x10fd,0x1103,0x110b,0x10f5,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x1113,0x111b,0x47d,0x5c8,0x1123,0x112b,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x1133,0x113b,0x47d, +0x5c8,0x1143,0x114b,0x1153,0x5c8,0x1163,0x115b,0x47d,0x83a,0x116b,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x1173,0x47d,0x47d,0x47d,0x555,0x4fd,0x117b,0x47d,0x47d,0x47d,0x47d,0x47d,0x118b,0x118f,0x1183, +0x11a7,0x1197,0x119f,0x5c8,0x11b7,0x11af,0x5c8,0x8c1,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x11cd,0x11d2,0x11bf,0x11c7,0x11e2,0x11da,0x47d,0x47d,0x11f1,0x11f5,0x11e9,0x1205,0x11fd,0x115b,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x1209,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x1219,0x1211, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cb,0x47d,0x47d,0x47d, +0x1229,0x1231,0x1239,0x1221,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1241,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x1224,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x1249,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x1226,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x5c8,0x5c8,0x5c8,0x1251,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x8c2,0x8e1,0x122e,0x47d,0x47d,0xe62,0x1236,0x5c8,0x123e,0x1246,0x124e,0xcd9,0x47d, +0x5c8,0x5c8,0x5c8,0x8c1,0x8e0,0x1259,0x47d,0x47d,0xe63,0x1261,0x5c8,0x1269,0x1271,0x1279,0xcd2,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x555,0x4fd,0x1256,0x47d,0x47d,0x47d,0x5c8,0x5c8,0x125e,0x1263,0x126b,0x47d, -0x47d,0x1273,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x47d,0x47d,0x47d,0x47d,0x555,0x4fd,0x1281,0x47d,0x47d,0x47d,0x5c8,0x5c8,0x1289,0x128e,0x1294,0x47d, +0x47d,0x129c,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x127b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1283,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x12a4,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x12ac,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8e1,0x47d,0x47d,0xe62,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdfb,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8e0,0x47d,0x12b1,0x12b8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdfc,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x128b,0x1290,0x1298,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x12be,0x12c3,0x12cb,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xb98,0x8ff,0x12a0,0x8ff,0x12a7,0x12af,0x12b5, -0x8ff,0x12bb,0x8ff,0x8ff,0x12c3,0x47d,0x47d,0x47d,0x47d,0x12cb,0x8ff,0x8ff,0xaa6,0x12d3,0x47d,0x47d, -0x47d,0x47d,0x12e3,0x12ea,0x12ef,0x12f5,0x12fd,0x1305,0x130d,0x12e7,0x1315,0x131d,0x1325,0x132a,0x12fc,0x12e3, -0x12ea,0x12e6,0x12f5,0x1332,0x12e4,0x1335,0x12e7,0x133d,0x1345,0x134d,0x1354,0x1340,0x1348,0x1350,0x1357,0x1343, -0x135f,0x12db,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0x8ff,0x8ff,0x524,0x136f,0x524,0x1376,0x137d,0x1367,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0x8fe,0x12d3,0x8fe,0x12da,0x12e2,0x12e8, +0x8fe,0x12ee,0x8fe,0x8fe,0x12f6,0x47d,0x47d,0x47d,0x47d,0x12fe,0x8fe,0x8fe,0xaa5,0x1306,0x47d,0x47d, +0x47d,0x47d,0x1316,0x131d,0x1322,0x1328,0x1330,0x1338,0x1340,0x131a,0x1348,0x1350,0x1358,0x135d,0x132f,0x1316, +0x131d,0x1319,0x1328,0x1365,0x1317,0x1368,0x131a,0x1370,0x1378,0x1380,0x1387,0x1373,0x137b,0x1383,0x138a,0x1376, +0x1392,0x130e,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0x8fe,0x8fe,0x524,0x13a2,0x524,0x13a9,0x13b0,0x139a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x1384,0x138c,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x13b7,0x13bf,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x13cf,0x13c7,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x13d7,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x13df,0x47d,0x555,0x13ef,0x13e7,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1394,0x47d,0x555,0x13a4,0x139c,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x13f7,0x1407,0x13ff,0x47d,0x47d,0x1417,0x140f,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x1427,0x142f,0x1437,0x143f,0x1447,0x144f,0x47d,0x141f,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x8fe,0x1457,0x8fe,0x8fe,0xb89,0x145c,0x1460,0xb91,0x1468,0x8fe,0x8fe,0x146d,0x8fe,0x12ed, +0x47d,0x1475,0x147d,0x1481,0x1489,0x1491,0x47d,0x47d,0x47d,0x47d,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0x8fe,0x1499,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0x14a1,0x8fe,0x8fe,0x8fe,0xb89,0x8fe,0x8fe, +0x14a9,0x14b1,0x1457,0x8fe,0x14b9,0x8fe,0x14c1,0xb93,0x47d,0x47d,0x14c6,0x8fe,0x8fe,0x14ca,0x8fe,0x14d2, +0x14d8,0x8fe,0x8fe,0x8fe,0xb89,0x14dd,0x14e3,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x13ac,0x13bc,0x13b4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x13cc,0x13d4,0x13dc,0x13e4,0x13ec,0x13f4,0x47d,0x13c4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x8ff,0x13fc,0x8ff,0x8ff,0xb90,0x1401,0x1405,0xb98,0x140d,0x8ff,0x8ff,0x13fc,0x8ff,0x12ba, -0x47d,0x1415,0x141d,0x1421,0x1429,0x1431,0x47d,0x47d,0x47d,0x47d,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0x8ff,0x1439,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x1441,0x1449,0x8ff,0x8ff,0x8ff,0xb90,0x8ff,0x8ff, -0x1451,0x47d,0x13fc,0x8ff,0x1459,0x8ff,0x1461,0xb9a,0x47d,0x47d,0x13fc,0xaa4,0x8ff,0x1465,0x8ff,0x146d, -0x141d,0x8ff,0x47d,0x47d,0x47d,0xb9a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x1475,0x5c8,0x5c8,0x147c,0x5c8,0x5c8,0x5c8,0x1484,0x5c8,0x148c,0x5c8,0x5c8,0x5c8,0x5c8, +0x47d,0x47d,0x14eb,0x5c8,0x5c8,0x14f2,0x5c8,0x5c8,0x5c8,0x14fa,0x5c8,0x1502,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0xc7a,0x5c8,0x5c8,0x1494,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x149c,0x14a4,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0xc73,0x5c8,0x5c8,0x150a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x1512,0x151a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14ab,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1521,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x14b2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x1528,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14b9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x152f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0xb69,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0xb62,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14bd,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0xf50,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1533,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0xf51,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x127f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x153b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x14c2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x5c8,0x1543,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x14ca,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0xf50,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x154b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0xf51,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x14da,0x14d2,0x14d2,0x14d2,0x47d,0x47d,0x47d,0x47d,0x524,0x524,0x524,0x524,0x524, -0x524,0x524,0x14e2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x155b,0x1553,0x1553,0x1553,0x47d,0x47d,0x47d,0x47d,0x524,0x524,0x524,0x524,0x524, +0x524,0x524,0x1563,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0x14ea,0x45c,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x47d,0x47d,0x47d,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0x156b,0x45c,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,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, @@ -469,7 +469,7 @@ static const uint16_t propsTrie_index[21452]={ 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,0,0,0x17,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8, 6,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, @@ -502,803 +502,827 @@ static const uint16_t propsTrie_index[21452]={ 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, +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,5,5,5,0,5,0,5, +5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6, +6,6,6,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,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,2,2,2,2, +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,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,0x17,4,2,2,2,1,1,1,1, -1,1,0,1,0,0,0,0,0,1,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,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,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,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,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,0,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, +2,2,2,0x17,4,2,2,2,1,1,1,1,1,1,0,1, +0,0,0,0,0,1,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,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,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,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,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,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,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,0x1b,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,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, +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, -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,5,5,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,0,0,0,0,0,0,0,5,5,5,5,5,6,6,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,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,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,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, +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,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, +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,1,1,1,1, 1,1,1,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,1,1,1, -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, +1,1,1,1,1,1,1,0,0,1,1,1,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,5,5, +6,5,5,8,6,6,5,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,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, +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,2,2,2,2,4,4,4,4,4, +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,6,6,6,6,0,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,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, +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, -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, +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, -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, +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,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,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,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,0x18,0x18,0x18,0x18,0x18,0x18,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,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,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,2,2,2,2, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 2,2,2,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,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,0x17,0x17, -0x17,0x17,0x17,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,5,5,5,5, +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, +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,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,0x17,4,4,4,5,0,0,0,0,0,5,5,5, +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,0x17,0x17,0x17,0x17,0x17,0x17,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, 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,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,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,0,0,0,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,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,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, 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,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +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, -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, +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, -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,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,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,0x685,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,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,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,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,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,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,0x7a85,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,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,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,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,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,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,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,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,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,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,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,0x785,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,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,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,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,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,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,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,0x6c5,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,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,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,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, +5,5,5,5,5,5,0x545,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,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,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,2,1,1,1,1,1,2,1,2,1,2,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,5,6, -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,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, +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,2,1,1,1,1,1,2,1,2, +1,2,1,2,1,2,1,2,0,0,1,2,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,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, +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,5,6,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, +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,6,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,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, +2,2,2,2,2,2,2,2,2,2,2,0x1a,4,4,4,4, +2,2,2,2,2,2,2,2,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,5,5,5,5,5,5,5,5,5,0,0,0,0, +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, -5,5,5,5,5,5,5,5,0,0,0,0,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,0x11,0x11,0x11,0x11, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,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, -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, +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,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,6,0,0, +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,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,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,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,0,0,0,0, +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,6,6,6,6,6,0,0,0,0,0, +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,5,5,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, +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,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,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,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, -0x344b,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, +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,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,5,5,5,5,5,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,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,0x58b,0x11cb,0x17,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,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,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,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +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,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +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,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +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,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, -5,5,5,5,6,6,6,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, -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, +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,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,5,0,0,0,0,0,0,0,0, +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,6,6,6,6,6,6,6,6,6,6,6,0x58b,0x7cb,0xa4b, -0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,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,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,0x344b,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,5,5,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,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,0x10,0,0,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,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,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,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,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,5,5,5,5,6,6,6,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,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,5,8,8,0,0,0,0,0, +0,0,0,0,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,5,5,5,5,5,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,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,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,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,6,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, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,0x58b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,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,0x10,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,5,8,8,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,6,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, -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,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,5,0,5,5,5,5,5,5,5,0,5,5, +0,5,5,5,5,5,0,6,6,5,8,8,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, -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, -5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5, -5,5,0,6,6,5,8,8,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,6,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, +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,6,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,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, -5,5,5,5,6,6,0,0,5,5,5,5,5,5,5,5, +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,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,5,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,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,8,8,8,6,6,6,6,6,6,6,6,6, -8,6,6,0x17,0,0,0,0,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,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,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,0x17,0x17,0x17,0,0,0,0,0, +6,6,6,6,8,6,6,0x17,0,0,0,0,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,6,5,0x17,5, +8,0,0,0,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,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,8,8,8, +6,6,6,6,0,0,6,6,8,8,8,8,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,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,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,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,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,5,0x17,0x17,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, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,6,6,8,6,6,0x17,0x17,0x17,5,0x17,0x17,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,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, -5,5,5,5,5,5,5,5,5,5,8,8,8,8,8,0, -6,6,0,8,8,6,8,6,5,0,0,0,0,0,0,0, -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, -5,5,5,6,6,8,8,0x17,0x17,0,0,0,0,0,0,0, -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, +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,5,5,5,5,5,5,5,5,5,5,8,8, +8,8,8,0,6,6,0,8,8,6,8,6,5,0,0,0, +0,0,0,0,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,5,5,5,6,6,8,8,0x17,0x17,0,0,0, +0,0,0,0,0x19,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,0x17,0xcd0b,0xcc0b,0xcb0b,0xd00b,0xca0b,0xcf0b,0xcb4b,0xd04b,0xc90b,0x37cb,0x37cb,0x364b, +0x35cb,0xc94b,0x3fcb,0x350b,0x34cb,0x344b,0x344b,0x3ccb,0xcd0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x19,0x19,0x19,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,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0,0, +0,0,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,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,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,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17, -0x17,0x17,0x17,0,0,0,0,0,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,8,8,8,8,8,8,8, +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,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,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17,0x17,0x17,0x17,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,6,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,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, +8,8,8,8,8,8,8,8,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,0x17,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,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,0,0,0,0,0,0,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, +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,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,5,5,5,0,0,0,0,0,0,0,0,0, +0,0,0,0,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, +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, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,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,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,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,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,0x54b,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b, -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,0x58b,0x5cb, -0x60b,0x64b,0x68b,0x58b,0x68b,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, +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,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,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,0x58b,0x5cb,0x60b,0x64b,0x68b,0x58b, +0x68b,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,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,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,1,1,1,1,2,2,2,2,2,2,2,2,2,2, +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,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, -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, +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, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1, -1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1, -1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, +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,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,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,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,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,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,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,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,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,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,5,0x1b,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,6,6,6,6, +6,6,6,4,4,4,4,4,4,4,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,6,6,6,6,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0x19,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,4,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, -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, -0x78cb,0x794b,0x814b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb, -0x19,0x58b,0x5cb,0x788b,0x78cb,0,0,0,0,0,0,0,0,0,0,0, -0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b, -0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb, -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,2,2,2,2,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,0x78cb,0x794b,0x814b,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb,0x19,0x58b,0x5cb,0x788b, +0x78cb,0,0,0,0,0,0,0,0,0,0,0,0x16cb,0x194b,0x1bcb,0x1e4b, +0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b, +0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x984b,0xa04b,0xa84b,0xb04b, +0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x1b,0x5cb,0x60b,0x64b,0x68b,0x6cb, +0x70b,0x74b,0x78b,0x7cb,0x900b,0xa00b,0x804b,0x788b,0x344b,0x354b,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,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,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,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,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,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, @@ -1311,50 +1335,58 @@ static const uint16_t propsTrie_index[21452]={ 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,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0,0,0, +0,0,0,0,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,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,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0, -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,0,0, -0,0,0,0,5,0x705,5,5,5,5,5,5,5,5,5,5, +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,0x1b,0x1b,0x1b,0x1b,0, +0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,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,0,0,0,0,0x1b,0x1b,0x1b,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,5,0x705,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,0x645,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,0x645,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,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, -5,5,5,0xcc5,5,5,5,5,5,5,5,5,0xf45,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0xf45,5,5,5, -5,5,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,0x605,5,5, +5,5,5,5,5,5,5,5,5,5,5,0xcc5,5,5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,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,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,5,5,5,5,5,0x605,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,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,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,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,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, +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,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, +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,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0,0,0,0,0, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +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,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0 +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0 }; static const UTrie2 propsTrie={ @@ -1362,1911 +1394,1947 @@ static const UTrie2 propsTrie={ propsTrie_index+4468, NULL, 4468, - 16984, + 17500, 0xa40, 0x11f4, 0x0, 0x0, 0x110000, - 0x53c8, + 0x55cc, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[30012]={ -0x4d5,0x4dd,0x4e5,0x4ed,0x505,0x50d,0x515,0x51d,0x525,0x52d,0x535,0x53d,0x545,0x54d,0x555,0x55d, -0x564,0x56c,0x574,0x57c,0x57f,0x587,0x58f,0x597,0x59f,0x5a7,0x5af,0x5b7,0x5bf,0x5c7,0x5cf,0x5d7, -0x5df,0x5e7,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e,0x626,0x62b,0x633,0x63a,0x642,0x64a,0x652, -0x65a,0x662,0x66a,0x672,0x679,0x681,0x689,0x691,0x699,0x6a1,0x6a9,0x6b1,0x6b9,0x6c1,0x6c9,0x6d1, -0x19a7,0xd68,0xe47,0x6d9,0x4f5,0xeae,0xeb6,0x1b46,0x1276,0x128e,0x127e,0x1286,0x7ae,0x7b4,0x7bc,0x7c4, -0x7cc,0x7d2,0x7da,0x7e2,0x7ea,0x7f0,0x7f8,0x800,0x808,0x80e,0x816,0x81e,0x826,0x82e,0x836,0x83d, -0x845,0x84b,0x853,0x85b,0x863,0x869,0x871,0x879,0x881,0x1296,0x889,0x891,0x899,0x8a0,0x8a8,0x8b0, -0x8b8,0x8bc,0x8c4,0x8cb,0x8d3,0x8db,0x8e3,0x8eb,0x15a6,0x15ae,0x8f3,0x8fb,0x903,0x90b,0x913,0x91a, -0x160c,0x15fc,0x1604,0x18e2,0x18ea,0x12a6,0x922,0x129e,0x14f0,0x14f0,0x14f2,0x12ba,0x12bb,0x12ae,0x12b0,0x12b2, -0x1614,0x1616,0x92a,0x1616,0x932,0x937,0x93f,0x161b,0x945,0x1616,0x94b,0x953,0xc3d,0x1623,0x1623,0x95b, -0x1633,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634, -0x1634,0x1634,0x1634,0x162b,0x963,0x163c,0x163c,0x96b,0xb52,0xb5a,0xb62,0xb6a,0x164c,0x1644,0x973,0x97b, -0x983,0x1656,0x165e,0x98b,0x1654,0x993,0x19af,0xd70,0xb72,0xb7a,0xb82,0xb87,0x1850,0xc70,0xc77,0x17b8, -0xc0d,0x19b7,0xd78,0xd80,0xd88,0xd90,0xf66,0xf66,0x18a8,0x18ad,0xcab,0xcb3,0x191e,0x1926,0x1a68,0xe4f, -0x192e,0xcfc,0xd04,0x1936,0x112a,0x11ca,0xf46,0xd98,0x17d8,0x17c0,0x17d0,0x17c8,0x1868,0x1860,0x1828,0xc1d, -0x12c3,0x12c3,0x12c3,0x12c3,0x12c6,0x12c3,0x12c3,0x12ce,0x99b,0x12d6,0x99f,0x9a7,0x12d6,0x9af,0x9b7,0x9bf, -0x12e6,0x12de,0x12ee,0x9c7,0x9cf,0x12f6,0x9d7,0x9df,0x12fe,0x1306,0x130e,0x1316,0x9e7,0x131e,0x1325,0x132d, -0x1335,0x133d,0x1345,0x134d,0x1355,0x135c,0x1364,0x136c,0x1374,0x137c,0x137f,0x1381,0x1666,0x174b,0x1751,0x1898, -0x1389,0x9ef,0x9f7,0x14a3,0x14a8,0x14ab,0x14b3,0x1391,0x14bb,0x14bb,0x13a1,0x1399,0x13a9,0x13b1,0x13b9,0x13c1, -0x13c9,0x13d1,0x13d9,0x13e1,0x1759,0x17b0,0x18f2,0x1a48,0x13f1,0x13f8,0x1400,0x1408,0x13e9,0x1410,0x1761,0x1768, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x1770,0x1773,0x1770,0x1770,0x177b,0x1782,0x1784,0x178b, -0x1793,0x1797,0x1797,0x179a,0x1797,0x1797,0x17a0,0x1797,0x17e0,0x18a0,0x18fa,0xb8f,0xb95,0x1b7a,0xb9b,0xba0, -0x1840,0xc4d,0xc51,0x18b5,0x1830,0x1830,0x1830,0xc25,0x1838,0xc45,0x1880,0xc9b,0xc2d,0xc35,0xc35,0x193e, -0x1870,0x1902,0xc87,0xc8b,0x9ff,0x1676,0x1676,0xa07,0x167e,0x167e,0x167e,0x167e,0x167e,0x167e,0xa0f,0x6dd, -0x14d8,0x14fa,0xa17,0x1502,0xa1f,0x150a,0x1512,0x151a,0xa27,0xa2c,0x1522,0x1529,0xa31,0xa39,0x1890,0xc15, -0xa41,0x1580,0x1587,0x1531,0x158f,0x1596,0x1539,0xa49,0x1552,0x1552,0x1554,0x1541,0x1549,0x1549,0x154a,0x159e, -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, -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, -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, -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, -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, -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, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x122b,0x17e8,0x17e8, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x1563,0x199f,0x1233, -0x168e,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694, -0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694, -0x1694,0x1694,0x1694,0x1694,0xa51,0x169c,0xa59,0x19bf,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a, -0x1946,0xd0c,0x195a,0x1952,0x195c,0x19c7,0x19c7,0xda0,0x1848,0x18bd,0x1912,0x1916,0x190a,0xcbb,0xcc2,0xcc5, -0x1878,0xc93,0x18c5,0xccd,0x1964,0x1967,0xd14,0x19cf,0x1977,0x196f,0xd1c,0xda8,0x19d7,0x19db,0xdb0,0x100d, -0x197f,0xd24,0xd2c,0x19e3,0x19f3,0x19eb,0xdb8,0xf09,0xe57,0xe5f,0x1bc1,0xfc5,0x1c66,0x1c66,0x19fb,0xdc0, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef, -0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1, -0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3, -0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee, -0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0, -0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2, -0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef, -0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1, -0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3, -0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee, -0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0, -0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2, -0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef, -0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1, -0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3, -0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee, -0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0, -0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2, -0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0xa61,0xdc8,0xdcb, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -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,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b, -0x1570,0x1578,0x17a8,0x123b,0x1888,0x1888,0x123f,0x1246,0xa69,0xa71,0xa79,0x1430,0x1437,0x143f,0xa81,0x1447, -0x1478,0x1478,0x1420,0x1428,0x144f,0x146f,0x1470,0x1480,0x1457,0x1418,0xa89,0x145f,0xa91,0x1467,0xa99,0xa9d, -0xca3,0x1488,0xaa5,0xaad,0x1490,0x1496,0x149b,0xab5,0xac5,0x14e0,0x14e8,0x14cb,0x14d0,0xacd,0xad5,0xabd, -0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6, -0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15be,0x15be,0x15be,0x15be, -0x13d4,0x13d4,0x1414,0x1454,0x1494,0x14d4,0x1514,0x1554,0x1590,0x15d0,0x15fc,0x163c,0x167c,0x16bc,0x16fc,0x173c, -0x177c,0x17b8,0x17f8,0x1838,0x1878,0x18ac,0x18e8,0x1928,0x1968,0x19a8,0x19e4,0x1a24,0x1a64,0x1aa4,0x1ae4,0x1b24, -0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xbc0,0xa40,0xea8,0xa40,0xa40,0xa40,0xa40,0xc00,0x12d3,0x12d3, -0xee8,0xf28,0xa40,0xa40,0xa40,0xa40,0xc40,0xc60,0xa40,0xa40,0xca0,0xce0,0xd20,0xd60,0xe68,0xdd8, -0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213, -0x1213,0x1213,0x1213,0x1213,0xf68,0x1253,0x1088,0x10c8,0x1293,0x10d3,0x1313,0x1313,0x1313,0xfa8,0xfc8,0x1008, -0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8, -0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0x1048, +static const uint16_t propsVectorsTrie_index[30588]={ +0x4d6,0x4de,0x4e6,0x4ee,0x506,0x50e,0x516,0x51e,0x526,0x52e,0x536,0x53e,0x546,0x54e,0x556,0x55e, +0x565,0x56d,0x575,0x57d,0x580,0x588,0x590,0x598,0x5a0,0x5a8,0x5b0,0x5b8,0x5c0,0x5c8,0x5d0,0x5d8, +0x5e0,0x5e8,0x5ef,0x5f7,0x5ff,0x607,0x60f,0x617,0x61f,0x627,0x62c,0x634,0x63b,0x643,0x64b,0x653, +0x65b,0x663,0x66b,0x673,0x67a,0x682,0x68a,0x692,0x69a,0x6a2,0x6aa,0x6b2,0x6ba,0x6c2,0x6ca,0x6d2, +0x19e4,0xd43,0xe2a,0x6da,0x4f6,0xe91,0xe99,0x1b8e,0x12b7,0x12c7,0x12af,0x12bf,0x7a3,0x7a9,0x7b1,0x7b9, +0x7c1,0x7c7,0x7cf,0x7d7,0x7df,0x7e5,0x7ed,0x7f5,0x7fd,0x803,0x80b,0x813,0x81b,0x823,0x82b,0x832, +0x83a,0x840,0x848,0x850,0x858,0x85e,0x866,0x86e,0x876,0x12cf,0x87e,0x886,0x88e,0x895,0x89d,0x8a5, +0x8ad,0x8b1,0x8b9,0x8c0,0x8c8,0x8d0,0x8d8,0x8e0,0x15e3,0x15eb,0x8e8,0x8f0,0x8f8,0x900,0x908,0x90f, +0x1649,0x1639,0x1641,0x191f,0x1927,0x12df,0x917,0x12d7,0x1529,0x1529,0x152b,0x12f3,0x12f4,0x12e7,0x12e9,0x12eb, +0x1651,0x1653,0x91f,0x1653,0x927,0x92c,0x934,0x1658,0x93a,0x1653,0x940,0x948,0xc1f,0x1660,0x1660,0x950, +0x1670,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1668,0x958,0x1679,0x1679,0x960,0xb3f,0xb47,0xb4f,0xb57,0x1689,0x1681,0x968,0x970, +0x978,0x1693,0x169b,0x980,0x1691,0x988,0x19ec,0xd4b,0xb5f,0xb67,0xb6f,0xb74,0x188d,0xc52,0xc59,0x17f5, +0xbef,0x19f4,0xd53,0xd5b,0xd63,0xd6b,0xf44,0xf44,0x18e5,0x18ea,0xc8d,0xc95,0x195b,0x1963,0x1aad,0xe32, +0x196b,0xcd7,0xcdf,0x1973,0x1101,0x11a9,0xf24,0xd73,0x1815,0x17fd,0x180d,0x1805,0x18a5,0x189d,0x1865,0xbff, +0x12fc,0x12fc,0x12fc,0x12fc,0x12ff,0x12fc,0x12fc,0x1307,0x990,0x130f,0x994,0x99c,0x130f,0x9a4,0x9ac,0x9b4, +0x131f,0x1317,0x1327,0x9bc,0x9c4,0x132f,0x9cc,0x9d4,0x1337,0x133f,0x1347,0x134f,0x9dc,0x1357,0x135e,0x1366, +0x136e,0x1376,0x137e,0x1386,0x138e,0x1395,0x139d,0x13a5,0x13ad,0x13b5,0x13b8,0x13ba,0x16a3,0x1788,0x178e,0x18d5, +0x13c2,0x9e4,0x9ec,0x14dc,0x14e1,0x14e4,0x14ec,0x13ca,0x14f4,0x14f4,0x13da,0x13d2,0x13e2,0x13ea,0x13f2,0x13fa, +0x1402,0x140a,0x1412,0x141a,0x1796,0x17ed,0x192f,0x1a85,0x142a,0x1431,0x1439,0x1441,0x1422,0x1449,0x179e,0x17a5, +0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x17ad,0x17b0,0x17ad,0x17ad,0x17b8,0x17bf,0x17c1,0x17c8, +0x17d0,0x17d4,0x17d4,0x17d7,0x17d4,0x17d4,0x17dd,0x17d4,0x181d,0x18dd,0x1937,0xb7c,0xb82,0x1bca,0x1bd2,0x1ca9, +0x187d,0xc2f,0xc33,0x18f2,0x186d,0x186d,0x186d,0xc07,0x1875,0xc27,0x18bd,0xc7d,0xc0f,0xc17,0xc17,0x197b, +0x18ad,0x193f,0xc69,0xc6d,0x9f4,0x16b3,0x16b3,0x9fc,0x16bb,0x16bb,0x16bb,0x16bb,0x16bb,0x16bb,0xa04,0x6de, +0x1511,0x1533,0xa0c,0x153b,0xa14,0x1543,0x154b,0x1553,0xa1c,0xa21,0x155b,0x1562,0xa26,0xa2e,0x18cd,0xbf7, +0xa36,0x15bd,0x15c4,0x156a,0x15cc,0x15d3,0x1572,0x1576,0x158f,0x158f,0x1591,0x157e,0x1586,0x1586,0x1587,0x15db, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x1264,0x1825,0x1825, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x15a0,0x19dc,0x126c, +0x16cb,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0xa3e,0x16d9,0xa46,0x19fc,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987, +0x1983,0xce7,0x1997,0x198f,0x1999,0x1a04,0x1a04,0xd7b,0x1885,0x18fa,0x194f,0x1953,0x1947,0x1aa5,0xc9d,0xca0, +0x18b5,0xc75,0x1902,0xca8,0x19a1,0x19a4,0xcef,0x1a0c,0x19b4,0x19ac,0xcf7,0xd83,0x1a14,0x1a18,0xd8b,0xfec, +0x19bc,0xcff,0xd07,0x1a20,0x1a30,0x1a28,0xd93,0xeec,0xe3a,0xe42,0x1c19,0xfa4,0x1cc6,0x1cc6,0x1a38,0xd9b, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c, +0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e, +0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630, +0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b, +0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d, +0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f, +0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c, +0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e, +0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630, +0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b, +0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d, +0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f, +0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c, +0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e, +0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630, +0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b, +0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d, +0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f, +0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0xa4e,0xda3,0xda6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603, +0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15ad,0x15b5,0x17e5,0x1274,0x18c5,0x18c5,0x1278,0x127f,0xa56,0xa5e,0xa66,0x1469,0x1470,0x1478,0xa6e,0x1480, +0x14b1,0x14b1,0x1459,0x1461,0x1488,0x14a8,0x14a9,0x14b9,0x1490,0x1451,0xa76,0x1498,0xa7e,0x14a0,0xa86,0xa8a, +0xc85,0x14c1,0xa92,0xa9a,0x14c9,0x14cf,0x14d4,0xaa2,0xab2,0x1519,0x1521,0x1504,0x1509,0xaba,0xac2,0xaaa, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15fb,0x15fb,0x15fb,0x15fb, +0x13d8,0x13d8,0x1418,0x1458,0x1498,0x14d8,0x1518,0x1558,0x1594,0x15d4,0x1600,0x1640,0x1680,0x16c0,0x1700,0x1740, +0x1780,0x17bc,0x17fc,0x183c,0x187c,0x18b0,0x18ec,0x192c,0x196c,0x19ac,0x19e8,0x1a28,0x1a68,0x1aa8,0x1ae8,0x1b28, +0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xe48,0xa40,0xe6a,0xa40,0xa40,0xa40,0xa40,0xbc0,0x12d5,0x12d5, +0xeaa,0xeea,0xa40,0xa40,0xa40,0xa40,0xf2a,0xc00,0xa40,0xa40,0xc40,0xc80,0xcc0,0xd00,0xe08,0xd78, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0xf6a,0x1255,0x108a,0x10ca,0x1295,0x10d5,0x1315,0x1315,0x1315,0xfaa,0xfca,0x100a, +0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca, +0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0x104a, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 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,0xd98, -0xe18,0xe28,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,0xd98, -0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193, -0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1113, -0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3, -0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x1153, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0xba8,0xbaf,0xbb7,0xbbf,0x17f0,0x17f0,0x17f0,0xbc7,0xbcf,0xbd2,0x1820,0x1818,0xc05,0xd34,0xd38,0xd3c, -0x4f5,0x4f5,0x4f5,0x4f5,0xd44,0x1987,0xd4c,0xf5e,0x16a4,0xadd,0xae3,0x101d,0xbda,0x1858,0xc7f,0x4f5, -0x16b9,0x16ac,0x16b1,0x17f8,0xbe2,0xbea,0x1168,0x116e,0x1ba9,0xf7b,0x1b99,0x6e5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0xfcd,0xfd5,0xfdd,0x4f5,0x4f5,0x4f5,0x4f5, -0xbf2,0xbf5,0xdd3,0x1c11,0x1015,0x6ed,0x4f5,0x10ae,0xcd5,0xd54,0x4f5,0x4f5,0x1b56,0xf11,0xf19,0x1c51, -0xc59,0xc60,0xc68,0x1a03,0x1bf1,0x4f5,0x1bd1,0xfed,0x1a0b,0xddb,0xde3,0xdeb,0x103d,0x6f5,0x4f5,0x4f5, -0x1a13,0x1a13,0x6fd,0x4f5,0x1c7e,0x10c6,0x1c76,0x10ce,0x1d26,0x11e0,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0xdf3,0x4f5,0x4f5,0x4f5,0x4f5,0x1d46,0x1208,0x120f,0x705,0x4f5,0x4f5,0x4f5,0x4f5, -0x1a70,0x1a72,0xe67,0xe6e,0x1a1b,0x1a23,0xdfb,0xf3e,0x1b4e,0xef9,0xf01,0xfe5,0x1b66,0x1b6a,0xf36,0x105d, -0xfb0,0xfb5,0x70d,0x4f5,0x10b6,0x10be,0x1bb9,0xfbd,0xf92,0xf98,0xfa0,0xfa8,0x4f5,0x4f5,0x4f5,0x4f5, -0x1cc6,0x1cbe,0x1158,0x1160,0x1c39,0x1c31,0x1084,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1c21,0x1045,0x104d,0x1055, -0x1be9,0x1be1,0xffd,0x1150,0x1b72,0xf4e,0x715,0x4f5,0x1094,0x109c,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1d1e,0x11c2,0x71d,0x4f5,0x4f5,0x1c49,0x1c41,0x108c,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1cf6,0x1cee,0x11b2,0x1ce6,0x11aa,0x725,0x1c19,0x1035,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x110e,0x1113,0x111b,0x1122,0x1142,0x1148,0x4f5,0x4f5,0x118e,0x1192,0x119a,0x11d2,0x11d8,0x72d,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x11f0,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd, -0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18d2,0xcdd,0xce4,0xce4,0xce4, -0x18da,0x18da,0x18da,0xcec,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x735,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b, -0x1a2b,0x1a2b,0x1a2d,0x1a2b,0x1a35,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a38,0x1a2b,0x1a2b,0x1a2b,0x1a2b, -0x1a2b,0x73d,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a, -0x1a7a,0xe76,0x1005,0x745,0x4f5,0x4f5,0x749,0xf56,0x1c09,0x1c01,0x1025,0x102d,0x751,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x1d3e,0x1d36,0x1200,0x4f5,0x4f5,0x4f5,0x1b5e,0x1b5e,0xf21,0xf26,0xf2e,0x4f5,0x4f5,0x113a, -0x1a8a,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1186,0x759,0x4f5,0x75d,0x1d16,0x1d16,0x1d16,0x1d16, -0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x11a2,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1ba1,0x1ba1,0x1ba1,0xf6e,0xf73,0x765,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0xaeb,0x16d1,0xaf3,0x16d2,0x16c9,0x16da,0x16e0,0x16e8,0xafb, -0x1810,0x1810,0x76d,0x4f5,0x4f5,0x4f5,0x4f5,0x11f8,0x1800,0x1800,0xbfd,0xcf4,0x4f5,0x4f5,0x4f5,0x4f5, -0x1719,0x1720,0xb03,0x1723,0xb0b,0xb13,0xb1b,0x171d,0xb23,0xb2b,0xb33,0x1722,0x172a,0x1719,0x1720,0x171c, -0x1723,0x172b,0x171a,0x1721,0x171d,0xb3a,0x16f0,0x16f8,0x16ff,0x1706,0x16f3,0x16fb,0x1702,0x1709,0xb42,0x1711, -0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96, -0x1c86,0x1c89,0x1c86,0x1c90,0x10fe,0x775,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1132,0x77d,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1bd9,0x1bd9,0x1bd9,0x1bd9,0x1bd9,0x1bd9,0xff5,0x4f5,0x1cb6,0x1cae,0x1106,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x781,0x1d2e,0x11e8,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0xebe,0xec6,0xece,0xed6,0xede,0xee6,0xeed,0xef1,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x789,0x1065,0x1c29,0x106b,0x1c29,0x1073,0x1078,0x107c,0x107c, -0x10d6,0x10de,0x1cce,0x10e6,0x1ca6,0x10ee,0x10f6,0x1d06,0x11ba,0x11ba,0x11ba,0x791,0x795,0x795,0x795,0x795, -0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, -0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, -0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x796,0xb4a,0x1733,0x1733,0x1733,0x79e,0x79e,0x79e,0x79e, -0x1808,0x1808,0x1808,0x1808,0x1808,0x1808,0x1808,0x7a6,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x198f,0xd5c,0x1997,0x1997,0xd60,0xe7e,0xe86,0xe8e, -0xe03,0x1a40,0x1a58,0xe0b,0x1a50,0xe13,0xe17,0xe1e,0xe26,0xe2d,0xe35,0xe3d,0xe3f,0xe3f,0xe3f,0xe3f, -0x1ab1,0x1ab9,0x1ab1,0x1abf,0x1ac7,0x1a92,0x1acf,0x1ad7,0x1ab1,0x1adf,0x1ae7,0x1aee,0x1af6,0x1a9a,0x1ab1,0x1af8, -0x1aa2,0x1aa9,0x1b00,0x1b06,0x1b8a,0x1b91,0x1b82,0x1b0e,0x1b16,0x1b1e,0x1b26,0x1bf9,0x1b2e,0x1b36,0xe96,0xe9e, -0x1a82,0x1a82,0x1a82,0xea6,0x1bb1,0x1bb1,0xf83,0xf8a,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c5e,0x1c59,0x1c59,0x1c59,0x10a4,0x10a6,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1176,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde, -0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x117e, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x124e,0x1217, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x121f,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1256,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1223,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1223,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x125e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1266,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x126e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15ce,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15d6,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x4d4,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a3,0x2ac,0x2a6, -0x2a6,0x2a9,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, -0x2a0,0x2a0,0x2a0,0x2a0,0x7d4,0x7ce,0x7b3,0x7aa,0x7a1,0x79e,0x795,0x7b0,0x79b,0x7a7,0x7aa,0x7c5, -0x7bc,0x7ad,0x7d1,0x7a4,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x7b9,0x7b6, -0x7bf,0x7bf,0x7bf,0x7ce,0x795,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7da,0x7da,0x7da,0x7da,0x7da, -0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x79b, -0x7a1,0x7a7,0x7cb,0x78f,0x7c8,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7, -0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x79b, -0x7c2,0x798,0x7bf,0x2a0,0,0,0,0,0,0,0,0,0,0,0,0, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, +0xdb8,0xdc8,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,0xd38, +0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195, +0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1115, +0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5, +0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x1155, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0xb8a,0xb91,0xb99,0xba1,0x182d,0x182d,0x182d,0xba9,0xbb1,0xbb4,0x185d,0x1855,0xbe7,0xd0f,0xd13,0xd17, +0x4f6,0x4f6,0x4f6,0x4f6,0xd1f,0x19c4,0xd27,0xf3c,0x16e1,0xaca,0xad0,0xffc,0xbbc,0x1895,0xc61,0x4f6, +0x16f6,0x16e9,0x16ee,0x1835,0xbc4,0xbcc,0x113f,0x1145,0x1c01,0xf59,0x1bf1,0x6e6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0xfac,0xfb4,0xfbc,0x4f6,0x4f6,0x4f6,0x4f6, +0xbd4,0xbd7,0xdae,0x1c69,0xff4,0x6ee,0x4f6,0x108d,0xcb0,0xd2f,0x4f6,0x4f6,0x1b9e,0xef4,0xefc,0x1cb1, +0xc3b,0xc42,0xc4a,0x1a40,0x1c49,0x4f6,0x1c29,0xfcc,0x1a48,0xdb6,0xdbe,0xdc6,0x101c,0x6f6,0x4f6,0x4f6, +0x1a50,0x1a50,0x6fe,0x4f6,0x1cde,0x10a5,0x1cd6,0x10ad,0x1d96,0x11bf,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0xdce,0x4f6,0x4f6,0x4f6,0x4f6,0x1db6,0x11e7,0x11ee,0x706,0x4f6,0x4f6,0x4f6,0x11f6, +0x1ab5,0x1ab7,0xe4a,0xe51,0x1a58,0x1a60,0xdd6,0xf1c,0x1b96,0xedc,0xee4,0xfc4,0x1bb6,0x1bba,0xf14,0x103c, +0xf8f,0xf94,0x70e,0x4f6,0x1095,0x109d,0x1c11,0xf9c,0xf71,0xf77,0xf7f,0xf87,0x4f6,0x4f6,0x4f6,0x4f6, +0x1d26,0x1d1e,0x112f,0x1137,0x1c91,0x1c89,0x1063,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1c79,0x1024,0x102c,0x1034, +0x1c41,0x1c39,0xfdc,0x1127,0x1bc2,0xf2c,0x716,0x4f6,0x1073,0x107b,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1d8e,0x11a1,0x71e,0x4f6,0x4f6,0x1ca1,0x1c99,0x106b,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x11fe,0x1202,0x120a, +0x1d66,0x1d5e,0x1189,0x1d56,0x1d4e,0x726,0x1c71,0x1014,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x10e5,0x10ea,0x10f2,0x10f9,0x1119,0x111f,0x4f6,0x4f6,0x116d,0x1171,0x1179,0x11b1,0x11b7,0x72e,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x11cf,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dce,0x1240, +0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a, +0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190f,0xcb8,0xcbf,0xcbf,0xcbf, +0x1917,0x1917,0x1917,0xcc7,0x1cce,0x1cce,0x1cce,0x1cce,0x1cce,0x1cce,0x736,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf, +0x1abf,0xe59,0xfe4,0x73e,0x4f6,0x4f6,0x742,0xf34,0x1c61,0x1c59,0x1004,0x100c,0x74a,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x1dae,0x1da6,0x11df,0x4f6,0x4f6,0x4f6,0x1bae,0x1bae,0xf04,0x1ba6,0xf0c,0x4f6,0x4f6,0x1111, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1bf9,0x1bf9,0x1bf9,0xf4c,0xf51,0x752,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0xad8,0x170e,0xae0,0x170f,0x1706,0x1717,0x171d,0x1725,0xae8, +0x184d,0x184d,0x75a,0x4f6,0x4f6,0x4f6,0x4f6,0x11d7,0x183d,0x183d,0xbdf,0xccf,0x4f6,0x4f6,0x4f6,0x4f6, +0x1756,0x175d,0xaf0,0x1760,0xaf8,0xb00,0xb08,0x175a,0xb10,0xb18,0xb20,0x175f,0x1767,0x1756,0x175d,0x1759, +0x1760,0x1768,0x1757,0x175e,0x175a,0xb27,0x172d,0x1735,0x173c,0x1743,0x1730,0x1738,0x173f,0x1746,0xb2f,0x174e, +0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6, +0x1ce6,0x1ce9,0x1ce6,0x1cf0,0x10d5,0x762,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1109,0x76a,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dc6,0x1212,0x772,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dd6,0x1248,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1c31,0x1c31,0x1c31,0x1c31,0x1c31,0x1c31,0xfd4,0x4f6,0x1d16,0x1d0e,0x10dd,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x776,0x1d9e,0x11c7,0x4f6,0x4f6,0x121a,0x121b,0x77e,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0xea1,0xea9,0xeb1,0xeb9,0xec1,0xec9,0xed0,0xed4,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x782,0x1044,0x1c81,0x104a,0x1c81,0x1052,0x1057,0x105b,0x105b, +0x10b5,0x1d2e,0x1d36,0x10bd,0x1d06,0x10c5,0x10cd,0x1d76,0x1dbe,0x1dbe,0x1191,0x1199,0x1232,0x1238,0x1238,0x1238, +0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a, +0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a, +0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78b,0xb37,0x1770,0x1770,0x1770,0x793,0x793,0x793,0x793, +0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x79b,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x19cc,0xd37,0x19d4,0x19d4,0xd3b,0xe61,0xe69,0xe71, +0xde6,0x1a7d,0x1a95,0xdee,0x1a8d,0xdf6,0xdfa,0xe01,0xe09,0xe10,0xe18,0xe20,0xe22,0xe22,0xe22,0xe22, +0x1af6,0x1afe,0x1af6,0x1b04,0x1b0c,0x1ad7,0x1b14,0x1b1c,0x1af6,0x1b24,0x1b2c,0x1b33,0x1b3b,0x1adf,0x1af6,0x1b40, +0x1ae7,0x1aee,0x1b48,0x1b4e,0x1be2,0x1be9,0x1bda,0x1b56,0x1b5e,0x1b66,0x1b6e,0x1c51,0x1b76,0x1b7e,0xe79,0xe81, +0x1ac7,0x1ac7,0x1ac7,0xe89,0x1c09,0x1c09,0xf61,0xf69,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68, +0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a6a,0x1a68,0x1a72,0x1a68,0x1a68,0x1a68, +0x1a68,0x1a68,0x1a68,0x1a75,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0xdde,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9, +0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cbe,0x1cb9,0x1cb9,0x1cb9,0x1083,0x1085,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x114d,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1155,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1acf,0x1d6e,0x1d6e,0x1d6e,0x1d6e,0x1d6e, +0x1d6e,0x1d6e,0x115d,0x1165,0x1223,0x122a,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86, +0x1d86,0x1181,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1287,0x1250,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1258,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780, +0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x128f,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x125c,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x125c,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1297,0x1b86,0x1b86,0x1b86,0x1b86,0x1b86,0x1b86,0x129f,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x12a7,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x160b,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1613,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x4d5,0x4d5,0x4d5,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2be,0x2c7,0x2c1,0x2c1,0x2c4,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x7ef,0x7e9,0x7ce,0x7c5,0x7bc,0x7b9,0x7b0,0x7cb, +0x7b6,0x7c2,0x7c5,0x7e0,0x7d7,0x7c8,0x7ec,0x7bf,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad, +0x7ad,0x7ad,0x7d4,0x7d1,0x7da,0x7da,0x7da,0x7e9,0x7b0,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7f5, +0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5, +0x7f5,0x7f5,0x7f5,0x7b6,0x7bc,0x7c2,0x7e6,0x7aa,0x7e3,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f2, +0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2, +0x7f2,0x7f2,0x7f2,0x7b6,0x7dd,0x7b3,0x7da,0x2bb,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x2af,0x2af,0x2af,0x2af,0x2af,0x2be,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, -0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, -0x2af,0x2af,0x2af,0x2af,0x2b2,0x62a,0x7e9,0x7ec,0x630,0x7ec,0x7e6,0x627,0x61e,0x2b8,0x63c,0x2bb, -0x7ef,0x615,0x633,0x7e3,0x62d,0x639,0x61b,0x61b,0x621,0x2b5,0x627,0x624,0x61e,0x61b,0x63c,0x2bb, -0x618,0x618,0x618,0x62a,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x2c4,0x2c4,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x636,0x645,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x645,0x63f,0x642,0x642,0x2c1,0x2c1,0x2c1,0x2c1,0x63f,0x2c1,0x642,0x642,0x642,0x2c1, -0x642,0x642,0x2c1,0x2c1,0x63f,0x2c1,0x642,0x642,0x2c1,0x2c1,0x2c1,0x636,0x63f,0x642,0x642,0x2c1, -0x642,0x2c1,0x63f,0x2c1,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7, -0x2d0,0x2c7,0x2d0,0x2c7,0x2cd,0x648,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x64b, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x64b, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x648,0x654,0x64e,0x2d0,0x2c7,0x2d0,0x2c7,0x648,0x2d0,0x2c7,0x2d0, -0x2c7,0x2d0,0x2c7,0x654,0x64e,0x651,0x648,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x64b,0x657,0x651,0x648, -0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x64b, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2d0,0x2c7,0x2d0, -0x2c7,0x2d0,0x2c7,0x2ca,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2df, -0x2d3,0x2d3,0x2df,0x2df,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2df,0x2d3,0x2d3,0x2d3, -0x2df,0x2df,0x2d3,0x2df,0x2e2,0x2d6,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2d3, -0x2df,0x2d3,0x2df,0x2e2,0x2d6,0x2df,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2d3,0x2dc, -0x2df,0x2d3,0x2d3,0x2d3,0x2dc,0x2dc,0x2dc,0x2dc,0x2e5,0x2e5,0x2d9,0x2e5,0x2e5,0x2d9,0x2e5,0x2e5, -0x2d9,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2, -0x65a,0x2d3,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2df,0x2d3,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6, -0x2e2,0x2d6,0x2e2,0x2d6,0x2d6,0x2e5,0x2e5,0x2d9,0x2e2,0x2d6,0x9c3,0x9c3,0x9c6,0x9c0,0x2e2,0x2d6, -0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6, -0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x9c6,0x9c0,0x9c6,0x9c0,0x9c3,0x9bd,0x9c6,0x9c0, -0xb88,0xc90,0x9c3,0x9bd,0x9c3,0x9bd,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0, -0x9c6,0x9c0,0x9c6,0x9c0,0xc90,0xc90,0xc90,0xd8f,0xd8f,0xd8f,0xd92,0xd92,0xd8f,0xd92,0xd92,0xd8f, -0xd8f,0xd92,0xed3,0xed6,0xed6,0xed6,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3, -0x2e8,0x65d,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x65d,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2eb,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0xc93,0xc93,0x303,0x303,0x303,0x303, -0x303,0x303,0x303,0x303,0x303,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f4,0x2f4, -0x663,0x2f4,0x2fa,0x666,0x2fd,0x666,0x666,0x666,0x2fd,0x666,0x2fa,0x2fa,0x669,0x300,0x2f4,0x2f4, -0x2f4,0x2f4,0x2f4,0x2f4,0x660,0x660,0x660,0x660,0x2f1,0x660,0x2f4,0xb01,0x303,0x303,0x303,0x303, -0x303,0x2ee,0x2ee,0x2ee,0x2ee,0x2ee,0x9d2,0x9d2,0x9cf,0x9cc,0x9cf,0xc96,0xc96,0xc96,0xc96,0xc96, -0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66f,0x66f,0x927,0x66f, -0x66f,0x92a,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xc45,0xd5c,0xd5c,0xd5c,0xd5c, -0xd5c,0xd5c,0xd5c,0xd5c,0xe9a,0xe9a,0xe9a,0xe9a,0xe9d,0xd5f,0xd5f,0xd5f,0x672,0x672,0xb07,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xf81,0xf7e,0xf81,0xf7e, -0x30f,0x318,0xf81,0xf7e,9,9,0x31e,0xed9,0xed9,0xed9,0x306,0x14d6,9,9,9,9, -0x31b,0x309,0x32d,0x30c,0x32d,0x32d,0x32d,9,0x32d,9,0x32d,0x32d,0x324,0x678,0x678,0x678, -0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,9,0x678, -0x678,0x678,0x678,0x678,0x678,0x678,0x32d,0x32d,0x324,0x324,0x324,0x324,0x324,0x675,0x675,0x675, -0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x321,0x675, -0x675,0x675,0x675,0x675,0x675,0x675,0x324,0x324,0x324,0x324,0x324,0xf81,0x330,0x330,0x333,0x32d, -0x32d,0x330,0x327,0x9d5,0xb91,0xb8e,0x32a,0x9d5,0x32a,0x9d5,0x32a,0x9d5,0x32a,0x9d5,0x315,0x312, -0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x330,0x330,0x327,0x321, -0xb40,0xb3d,0xb8b,0xc9c,0xc99,0xc9f,0xc9c,0xc99,0xd95,0xd98,0xd98,0xd98,0x9e4,0x684,0x33f,0x342, -0x33f,0x33f,0x33f,0x342,0x33f,0x33f,0x33f,0x33f,0x342,0x9e4,0x342,0x33f,0x681,0x681,0x681,0x681, -0x681,0x681,0x681,0x681,0x681,0x684,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681, -0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x67b,0x67b,0x67b,0x67b, -0x67b,0x67b,0x67b,0x67b,0x67b,0x67e,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b, -0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x9de,0x67e,0x339,0x33c,0x339,0x339,0x339,0x33c, -0x339,0x339,0x339,0x339,0x33c,0x9de,0x33c,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x342,0x33c, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x336,0x933,0x936,0x918,0x918,0x112b, -0x9d8,0x9d8,0xb97,0xb94,0x9e1,0x9db,0x9e1,0x9db,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x342,0x33c,0x33f,0x339,0xb97,0xb94,0x33f, -0x339,0xb97,0xb94,0x33f,0x339,0xb97,0xb94,0xedc,0x342,0x33c,0x342,0x33c,0x33f,0x339,0x342,0x33c, -0x33f,0x339,0x342,0x33c,0x342,0x33c,0x342,0x33c,0x33f,0x339,0x342,0x33c,0x342,0x33c,0x342,0x33c, -0x33f,0x339,0x342,0x33c,0x9e4,0x9de,0x342,0x33c,0x342,0x33c,0x342,0x33c,0x342,0x33c,0xd9e,0xd9b, -0x342,0x33c,0xedf,0xedc,0xedf,0xedc,0xedf,0xedc,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03, -0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xf0c,0xf09,0xf0c,0xf09,0xfff,0xffc,0xfff,0xffc, -0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0x1164,0x1161,0x134a,0x1347, -0x150f,0x150c,0x150f,0x150c,0x150f,0x150c,0x150f,0x150c,0xc,0x354,0x354,0x354,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0xc,0xc,0x357,0x345,0x348,0x348,0x34b,0x348,0x345,0x1917,0x34e,0x34e,0x34e, -0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e, -0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x351, -0x1917,0x89d,0x9e7,0xc,0xc,0x14d9,0x14d9,0x13f5,0xf,0x957,0x957,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0xda1,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x35a,0x35a,0xee2,0x35a,0x35a,0x35a,0x366,0x35a,0x35d,0x35a,0x35a,0x369,0x95a,0xda4,0xda7,0xda4, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c, -0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c, -0x36c,0x36c,0x36c,0xf,0xf,0xf,0xf,0x191a,0x36c,0x36c,0x36c,0x363,0x360,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcb4,0xcb4,0xcb4,0xcb4,0x13f8,0x14dc,0xf8a,0xf8a, -0xf8a,0xf87,0xf87,0xdad,0x8a3,0xcae,0xcab,0xcab,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xf84,0xf84, -0xf84,0xf84,0xf84,0x8a0,0x14d3,0x12,0xdb0,0x8a6,0x1311,0x387,0x38a,0x38a,0x38a,0x38a,0x38a,0x387, -0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x8a9,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0xb37,0xb37,0xb37,0xca2,0xca8, -0xca5,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0x130e,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x381,0x37e,0x37b,0x378,0xb9a,0xb9a,0x91b,0x387,0x387,0x393,0x387,0x38d,0x38d,0x38d, -0x38d,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,0x387,0x387,0x387,0x387, +0,0,0,0,0,0,0,0,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2d9,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,0x645,0x804,0x807,0x64b,0x807,0x801,0x642, +0x639,0x2d3,0x657,0x2d6,0x80a,0x630,0x64e,0x7fe,0x648,0x654,0x636,0x636,0x63c,0x2d0,0x642,0x63f, +0x639,0x636,0x657,0x2d6,0x633,0x633,0x633,0x645,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x2df, +0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x651, +0x660,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x65a,0x65d,0x65d,0x2dc,0x2dc,0x2dc,0x2dc,0x65a,0x2dc, +0x65d,0x65d,0x65d,0x2dc,0x65d,0x65d,0x2dc,0x2dc,0x65a,0x2dc,0x65d,0x65d,0x2dc,0x2dc,0x2dc,0x651, +0x65a,0x65d,0x65d,0x2dc,0x65d,0x2dc,0x65a,0x2dc,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2e8,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663, +0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x663,0x66f,0x669,0x2eb,0x2e2,0x2eb,0x2e2, +0x663,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66f,0x669,0x66c,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb, +0x666,0x672,0x66c,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663, +0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2e5,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,0x2fa, +0x2ee,0x2fa,0x2fa,0x2fa,0x2ee,0x2ee,0x2fa,0x2fa,0x2fa,0x2fa,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2fa, +0x2fa,0x2ee,0x2ee,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2fd,0x2f1,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,0x2fa, +0x2ee,0x2fa,0x2ee,0x2ee,0x2fa,0x2ee,0x2fa,0x2fd,0x2f1,0x2fa,0x2fa,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa, +0x2fa,0x2ee,0x2ee,0x2f7,0x2fa,0x2ee,0x2ee,0x2ee,0x2f7,0x2f7,0x2f7,0x2f7,0x300,0x300,0x2f4,0x300, +0x300,0x2f4,0x300,0x300,0x2f4,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd, +0x675,0x2fd,0x675,0x2fd,0x675,0x2ee,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fa,0x2ee,0x2fd,0x2f1, +0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2f1,0x300,0x300,0x2f4,0x2fd,0x2f1,0x9e1,0x9e1, +0x9e4,0x9de,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1, +0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x9e4,0x9de,0x9e4,0x9de, +0x9e1,0x9db,0x9e4,0x9de,0xba6,0xcae,0x9e1,0x9db,0x9e1,0x9db,0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de, +0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,0xcae,0xcae,0xcae,0xdad,0xdad,0xdad,0xdb0,0xdb0, +0xdad,0xdb0,0xdb0,0xdad,0xdad,0xdb0,0xeee,0xef1,0xef1,0xef1,0xef1,0xeee,0xef1,0xeee,0xef1,0xeee, +0xef1,0xeee,0xef1,0xeee,0x303,0x678,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x303,0x678,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x306,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0xcb1,0xcb1, +0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x315,0x315,0x315,0x315,0x315,0x315,0x315, +0x312,0x312,0x30f,0x30f,0x67e,0x30f,0x315,0x681,0x318,0x681,0x681,0x681,0x318,0x681,0x315,0x315, +0x684,0x31b,0x30f,0x30f,0x30f,0x30f,0x30f,0x30f,0x67b,0x67b,0x67b,0x67b,0x30c,0x67b,0x30f,0xb1c, +0x31e,0x31e,0x31e,0x31e,0x31e,0x309,0x309,0x309,0x309,0x309,0x9f0,0x9f0,0x9ed,0x9ea,0x9ed,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x68a,0x68a,0x942,0x68a,0x68a,0x945,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xc63, +0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xeb5,0xeb5,0xeb5,0xeb5,0xeb8,0xd7d,0xd7d,0xd7d, +0x68d,0x68d,0xb22,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xf9c,0xf99,0xf9c,0xf99,0x32a,0x333,0xf9c,0xf99,9,9,0x339,0xef4,0xef4,0xef4,0x321,0x14f1, +9,9,9,9,0x336,0x324,0x348,0x327,0x348,0x348,0x348,9,0x348,9,0x348,0x348, +0x33f,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693, +0x693,0x693,9,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x348,0x348,0x33f,0x33f,0x33f,0x33f, +0x33f,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690, +0x690,0x690,0x33c,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x33f,0x33f,0x33f,0x33f,0x33f,0xf9c, +0x34b,0x34b,0x34e,0x348,0x348,0x34b,0x342,0x9f3,0xbaf,0xbac,0x345,0x9f3,0x345,0x9f3,0x345,0x9f3, +0x345,0x9f3,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d, +0x34b,0x34b,0x342,0x33c,0xb5e,0xb5b,0xba9,0xcba,0xcb7,0xcbd,0xcba,0xcb7,0xdb3,0xdb6,0xdb6,0xdb6, +0xa02,0x69f,0x35a,0x35d,0x35a,0x35a,0x35a,0x35d,0x35a,0x35a,0x35a,0x35a,0x35d,0xa02,0x35d,0x35a, +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,0x69c,0x69c,0x69c,0x69c, +0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x699,0x696,0x696,0x696,0x696,0x696,0x696, +0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x9fc,0x699,0x354,0x357, +0x354,0x354,0x354,0x357,0x354,0x354,0x354,0x354,0x357,0x9fc,0x357,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35d,0x357,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x351,0x94e, +0x951,0x933,0x933,0x1143,0x9f6,0x9f6,0xbb5,0xbb2,0x9ff,0x9f9,0x9ff,0x9f9,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x35d,0x357,0x35a, +0x354,0xbb5,0xbb2,0x35a,0x354,0xbb5,0xbb2,0x35a,0x354,0xbb5,0xbb2,0xef7,0x35d,0x357,0x35d,0x357, +0x35a,0x354,0x35d,0x357,0x35a,0x354,0x35d,0x357,0x35d,0x357,0x35d,0x357,0x35a,0x354,0x35d,0x357, +0x35d,0x357,0x35d,0x357,0x35a,0x354,0x35d,0x357,0xa02,0x9fc,0x35d,0x357,0x35d,0x357,0x35d,0x357, +0x35d,0x357,0xdbc,0xdb9,0x35d,0x357,0xefa,0xef7,0xefa,0xef7,0xefa,0xef7,0xc24,0xc21,0xc24,0xc21, +0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xf27,0xf24,0xf27,0xf24, +0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014, +0x117c,0x1179,0x1365,0x1362,0x152a,0x1527,0x152a,0x1527,0x152a,0x1527,0x152a,0x1527,0xc,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,0xc,0xc,0x372,0x360,0x363,0x363,0x366,0x363,0x360, +0x1932,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369, +0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369, +0x369,0x369,0x369,0x36c,0x1932,0x8b8,0xa05,0xc,0xc,0x14f4,0x14f4,0x1410,0xf,0x975,0x975,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0xdbf,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0xefd,0x375,0x375,0x375,0x381,0x375,0x378,0x375,0x375,0x384, +0x978,0xdc2,0xdc5,0xdc2,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,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,0x387,0x387,0x387,0x387,0x387,0x9ed,0x9ed,0x387,0x387, -0x387,0x387,0x387,0x9ed,0x38a,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x9ed,0x387,0x387,0x387,0x38a,0x93c,0x387,0x372,0x372,0x372,0x372,0x372,0x372, -0x372,0x36f,0x378,0x375,0x375,0x372,0x372,0x372,0x372,0x390,0x390,0x372,0x372,0x378,0x375,0x375, -0x375,0x372,0xcb1,0xcb1,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x9ed,0x9ed, -0x9ed,0x9ea,0x9ea,0xcb1,0xa02,0xa02,0xa02,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9f9, -0x9fc,0x9f9,0x15,0xa05,0x9ff,0x9f0,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff, -0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff, -0x9ff,0xcb7,0xcb7,0xcb7,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6, -0x9f6,0x9f6,0x9f6,0x9f6,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x15, -0x15,0xcb7,0xcb7,0xcb7,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,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011, -0x1011,0x1011,0x1011,0x1011,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa08,0xa08,0xa08,0xa08,0xb9d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf27,0xf27, -0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27, -0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf1b, -0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf2a,0xf2a,0xf1e,0xf1e,0xf21,0xf30,0xf2d,0x10e, -0x10e,0x193e,0x1941,0x1941,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x25b, -0x25b,0x25b,0x25b,0x25b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb13,0xb13,0xb16,0xb16,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0x72,0x72,0x72,0x72,0x1593,0x1593,0x1593,0x1593,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1590,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x177,0x177,0x177, -0x177,0x177,0x177,0x177,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, -0x27f,0x27f,0x27f,0x27f,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7, -0x1d7,0x1d7,0x1d7,0x1d7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x1bc,0x1bc, -0x1bc,0x1bc,0x1bc,0x1bc,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x264,0x264,0x264,0x264,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,0x18c0,0x18c3,0x18c3,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x258,0x258,0x258,0x258,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1782,0x1782,0x1782,0x1782,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, -0x21c,0x21c,0x21c,0x21c,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x180,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1ef,0x1ef, -0x1ef,0x1ef,0x163e,0x163e,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, -0x158a,0x158a,0x158a,0x158a,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x16ec,0x16ec,0x16ec,0x16ec,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204, -0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xe07,0xe07,0xe04,0xe04,0xe04,0xe07,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,0x22b,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x181b,0x181b,0x237,0x181b,0x181b,0x237,0x181b,0x181b,0x181b,0x181b,0x181b,0x237, -0x237,0x237,0x237,0x237,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x270,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0,0,0,0,0,0,0,0,0,0,0,0, +0x387,0x387,0x387,0x387,0x387,0x387,0x387,0xf,0xf,0xf,0xf,0x1935,0x387,0x387,0x387,0x37e, +0x37b,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcd2,0xcd2,0xcd2,0xcd2, +0x1413,0x14f7,0xfa5,0xfa5,0xfa5,0xfa2,0xfa2,0xdcb,0x8be,0xccc,0xcc9,0xcc9,0xcc0,0xcc0,0xcc0,0xcc0, +0xcc0,0xcc0,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0x8bb,0x14ee,0x12,0xdce,0x8c1,0x132c,0x3a2,0x3a5,0x3a5, +0x3a5,0x3a5,0x3a5,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xfa8,0xfa8,0xfa8,0xfa8,0xfa8,0x8c4,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0xb55, +0xb55,0xb55,0xcc0,0xcc6,0xcc3,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0x1329,0x954,0x954,0x954,0x954, +0x954,0x954,0x954,0x954,0x954,0x954,0x39c,0x399,0x396,0x393,0xbb8,0xbb8,0x936,0x3a2,0x3a2,0x3ae, +0x3a2,0x3a8,0x3a8,0x3a8,0x3a8,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0xa0b,0xa0b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xa0b,0x3a5,0x3a2,0x3a5,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xa0b,0x3a2,0x3a2,0x3a2,0x3a5,0x957,0x3a2,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38a,0x393,0x390,0x390,0x38d,0x38d,0x38d,0x38d,0x3ab,0x3ab,0x38d, +0x38d,0x393,0x390,0x390,0x390,0x38d,0xccf,0xccf,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f, +0x39f,0x39f,0xa0b,0xa0b,0xa0b,0xa08,0xa08,0xccf,0xa20,0xa20,0xa20,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a, +0xa1a,0xa1a,0xa1a,0xa17,0xa1a,0xa17,0x15,0xa23,0xa1d,0xa0e,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xcd5,0xcd5,0xcd5,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14, +0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11, +0xa11,0xa11,0xa11,0x15,0x15,0xcd5,0xcd5,0xcd5,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029, +0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa26,0xa26, +0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xbbb,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f, +0xf3f,0xf3f,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,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf45,0xf45,0xf39,0xf39, +0xf3c,0xf4b,0xf48,0x10e,0x10e,0x1959,0x195c,0x195c,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, +0x18ed,0x18ed,0x18ed,0x25b,0x25b,0x25b,0x25b,0x25b,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,0x72,0x72,0x72,0x72,0x15ae,0x15ae,0x15ae,0x15ae,0x1c2,0x1c2,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x15ab,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1668, +0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, +0x201,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x126f,0x177,0x177,0x177,0x177,0x177,0x177,0x177,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, +0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca, +0x14ca,0x14ca,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x264,0x264,0x264,0x264,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,0x18db,0x18de,0x18de,0x258,0x258,0x258,0x258,0x258, +0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x179d,0x179d,0x179d,0x179d,0x21c,0x21c,0x21c,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1ef,0x1ef,0x1ef,0x1ef,0x1659,0x1659,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1707,0x1707,0x1707,0x1707,0x204,0x204,0x204,0x204, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe25,0xe25,0xe22,0xe22,0xe22,0xe25,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,0x22b,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, +0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1836,0x1836,0x237,0x1836,0x1836,0x237,0x1836,0x1836, +0x1836,0x1836,0x1836,0x237,0x237,0x237,0x237,0x237,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e, +0x1a5e,0x1a5e,0x28b,0x28b,0x28b,0x28b,0x1a61,0x1a5b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x270,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, +0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, +0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x954,0x954,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x261,0x261,3,3,3,3,3,3,3,3,3,3,3,3, +0,0,0,0,0,0,0x972,0x972,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,0x954,0x954,6,6,6,6,6,6,6,6, +3,3,3,3,3,3,3,3,3,3,0x972,0x972,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,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0x14e2,0x3ab,0x3ba,0x3ba,0x1b,0x3c0,0x3c0,0x3c0, -0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x1b,0x3c0,0x3c0,0x1b,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0, -0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0, -0x3c0,0x1b,0x3c0,0x1b,0x1b,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x1b,0x3ae,0xcbd,0x3ab,0x3ba, -0x3ba,0x3ab,0x3ab,0x3ab,0x3ab,0x1b,0x1b,0x3ba,0x3ba,0x1b,0x1b,0x3bd,0x3bd,0x3b1,0xdb6,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3ab,0x1b,0x1b,0x1b,0x1b,0x3c3,0x3c3,0x1b,0x3c3, -0x3c0,0x3c0,0x3ab,0x3ab,0x1b,0x1b,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, -0x3c0,0x3c0,0x3b7,0x3b7,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b7,0x3b4,0x113a,0x187b,0x1878,0x191d,0x1b, -0x1e,0xcc0,0x3c6,0xcc3,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x1e,0x1e,0x1e,0x1e,0x3d2, -0x3d2,0x1e,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2, -0x3d2,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x1e,0x3d2,0x3d5,0x1e,0x3d2,0x3d5,0x1e, -0x3d2,0x3d2,0x1e,0x1e,0x3c9,0x1e,0x3cf,0x3cf,0x3cf,0x3c6,0x3c6,0x1e,0x1e,0x1e,0x1e,0x3c6, -0x3c6,0x1e,0x1e,0x3c6,0x3c6,0x3cc,0x1e,0x1e,0x1e,0xf96,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x3d5,0x3d5,0x3d5,0x3d2,0x1e,0x3d5,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x945,0x945, -0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x3c6,0x3c6,0x3d2,0x3d2,0x3d2,0xf96,0x1920,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x3d8,0x3d8,0x3e1,0x21,0x3e4,0x3e4,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0xccc,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4, -0x3e4,0x21,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x21,0x21,0x3db,0x3e4,0x3e1,0x3e1, -0x3e1,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x21,0x3d8,0x3d8,0x3e1,0x21,0x3e1,0x3e1,0x3de,0x21,0x21, -0x3e4,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x3e4,0xccc,0xcc6,0xcc6,0x21,0x21,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948, -0x13fb,0xcc9,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x16fe,0x187e,0x187e,0x187e,0x1881,0x1881,0x1881, -0x24,0x3e7,0x3f6,0x3f6,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x24,0x24,0x3fc, -0x3fc,0x24,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc, -0x3fc,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x24,0x3fc,0x3fc,0x24,0xccf,0x3fc,0x3fc, -0x3fc,0x3fc,0x24,0x24,0x3ea,0x3fc,0x3e7,0x3e7,0x3f6,0x3e7,0x3e7,0x3e7,0xf99,0x24,0x24,0x3f6, -0x3f9,0x24,0x24,0x3f9,0x3f9,0x3ed,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3e7,0x3e7, -0x24,0x24,0x24,0x24,0x3ff,0x3ff,0x24,0x3fc,0x3fc,0x3fc,0xf99,0xf99,0x24,0x24,0x3f3,0x3f3, -0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f0,0xccf,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x27,0x402,0x40e,0x27,0x40e,0x40e,0x40e, -0x40e,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x40e,0x27,0x40e,0x40e,0x411,0x40e,0x27,0x27, -0x27,0x40e,0x40e,0x27,0x40e,0x27,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x27,0x27,0x27, -0x40e,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0xdb9,0x40e, -0x40e,0x40e,0x27,0x27,0x27,0x27,0x402,0x408,0x402,0x408,0x408,0x27,0x27,0x27,0x408,0x408, -0x408,0x27,0x40b,0x40b,0x40b,0x405,0x27,0x27,0xf9c,0x27,0x27,0x27,0x27,0x27,0x27,0x402, -0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xed0,0x94e,0x94e,0x94e,0x94e,0x94e, -0x94e,0x94e,0x94e,0x94e,0x94b,0x94b,0x94b,0xd89,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd5,0xcd2,0x27, -0x27,0x27,0x27,0x27,0x14e5,0x420,0x420,0x420,0x1923,0x423,0x423,0x423,0x423,0x423,0x423,0x423, -0x423,0x2a,0x423,0x423,0x423,0x2a,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423, -0x423,0x423,0x423,0x423,0x423,0x2a,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423, -0x14e8,0x423,0x423,0x423,0x423,0x423,0x2a,0x2a,0x2a,0xfa5,0x414,0x414,0x414,0x420,0x420,0x420, -0x420,0x2a,0x414,0x414,0x417,0x2a,0x414,0x414,0x414,0x41a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, -0x2a,0x414,0x414,0x2a,0xfa5,0xfa5,0x1701,0x2a,0x2a,0x2a,0x2a,0x2a,0x423,0x423,0xf9f,0xf9f, -0x2a,0x2a,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x2a,0x2a,0x2a,0x2a, -0x2a,0x2a,0x2a,0x2a,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0x17be,0x14eb,0x42f,0x42f, -0x1926,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,0x435,0x2d,0x435,0x435, -0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435, -0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,0x435,0x435,0x435,0x2d,0x2d, -0xcd8,0xcdb,0x42f,0x426,0x432,0x42f,0x426,0x42f,0x42f,0x2d,0x426,0x432,0x432,0x2d,0x432,0x432, -0x426,0x429,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x426,0x426,0x2d,0x2d,0x2d,0x2d,0x2d, -0x2d,0x2d,0x435,0x2d,0x435,0x435,0xee8,0xee8,0x2d,0x2d,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, -0x42c,0x42c,0x42c,0x42c,0x2d,0xeeb,0xeeb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0x2d,0x2d,0x2d,0x2d,0x1884,0x14ee,0x441,0x441,0x30,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x30,0x447,0x447,0x447,0x30,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x441,0x438,0x438,0x438,0xfa8,0x30,0x441,0x441,0x441,0x30,0x444,0x444, -0x444,0x43b,0x1323,0x17c1,0x30,0x30,0x30,0x30,0x17c4,0x17c4,0x17c4,0x438,0x17c1,0x17c1,0x17c1,0x17c1, -0x17c1,0x17c1,0x17c1,0x1704,0x447,0x447,0xfa8,0xfa8,0x30,0x30,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0x17c1,0x17c1,0x17c1,0xfae,0xfb1,0xfb1, -0xfb1,0xfb1,0xfb1,0xfb1,0x33,0x33,0xa17,0xa17,0x33,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0x33,0x33,0xa1d,0xa1d, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, -0xa1d,0xa1d,0x33,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0xa1d,0x33,0x33, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0x33,0x33,0xa11,0x33,0x33,0x33,0x33,0xa0e, -0xa17,0xa17,0xa0e,0xa0e,0xa0e,0x33,0xa0e,0x33,0xa17,0xa17,0xa1a,0xa17,0xa1a,0xa1a,0xa1a,0xa0e, -0x33,0x33,0x33,0x33,0x33,0x33,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1, -0x33,0x33,0xa17,0xa17,0xa14,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x36,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, -0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, -0x462,0x44d,0x462,0x45f,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x453,0x36,0x36,0x36,0x36,0x44a, -0x468,0x468,0x468,0x468,0x468,0x462,0x465,0x450,0x450,0x450,0x450,0x450,0x450,0x44d,0x450,0x456, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x459,0x459,0x36,0x36,0x36,0x36, +6,6,6,6,6,6,6,6,6,6,6,6,0xd83,0xd83,0xd83,0xd83, +0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x14fd,0x3c9,0x3d8,0x3d8, +0x1b,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x1b,0x3de,0x3de,0x1b,0x1b,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x3de,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x3de,0x1b,0x1b,0x1b,0x3de,0x3de,0x3de,0x3de,0x1b,0x1b, +0x3cc,0xcdb,0x3c9,0x3d8,0x3d8,0x3c9,0x3c9,0x3c9,0x3c9,0x1b,0x1b,0x3d8,0x3d8,0x1b,0x1b,0x3db, +0x3db,0x3cf,0xdd4,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3c9,0x1b,0x1b,0x1b,0x1b, +0x3e1,0x3e1,0x1b,0x3e1,0x3de,0x3de,0x3c9,0x3c9,0x1b,0x1b,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x3de,0x3de,0x3d5,0x3d5,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d5,0x3d2,0x1152, +0x1896,0x1893,0x1938,0x1b,0x1e,0xcde,0x3e4,0xce1,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e, +0x1e,0x1e,0x1e,0x3f0,0x3f0,0x1e,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0, +0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,0x3f0,0x3f3, +0x1e,0x3f0,0x3f3,0x1e,0x3f0,0x3f0,0x1e,0x1e,0x3e7,0x1e,0x3ed,0x3ed,0x3ed,0x3e4,0x3e4,0x1e, +0x1e,0x1e,0x1e,0x3e4,0x3e4,0x1e,0x1e,0x3e4,0x3e4,0x3ea,0x1e,0x1e,0x1e,0xfb1,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x3f3,0x3f3,0x3f3,0x3f0,0x1e,0x3f3,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x3e4,0x3e4,0x3f0,0x3f0, +0x3f0,0xfb1,0x193b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x3f6,0x3f6,0x3ff, +0x21,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0xcea,0x402,0x21,0x402,0x402,0x402,0x21,0x402, +0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x21,0x402,0x402, +0x402,0x402,0x402,0x402,0x402,0x21,0x402,0x402,0x21,0x402,0x402,0x402,0x402,0x402,0x21,0x21, +0x3f9,0x402,0x3ff,0x3ff,0x3ff,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x21,0x3f6,0x3f6,0x3ff,0x21,0x3ff, +0x3ff,0x3fc,0x21,0x21,0x402,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x402,0xcea,0xce4,0xce4,0x21,0x21,0x963,0x963,0x963,0x963,0x963,0x963, +0x963,0x963,0x963,0x963,0x1416,0xce7,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1719,0x1899,0x1899, +0x1899,0x189c,0x189c,0x189c,0x24,0x405,0x414,0x414,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a, +0x41a,0x24,0x24,0x41a,0x41a,0x24,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a, +0x41a,0x41a,0x41a,0x41a,0x41a,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x24,0x41a,0x41a, +0x24,0xced,0x41a,0x41a,0x41a,0x41a,0x24,0x24,0x408,0x41a,0x405,0x405,0x414,0x405,0x405,0x405, +0xfb4,0x24,0x24,0x414,0x417,0x24,0x24,0x417,0x417,0x40b,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x405,0x405,0x24,0x24,0x24,0x24,0x41d,0x41d,0x24,0x41a,0x41a,0x41a,0xfb4,0xfb4, +0x24,0x24,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x40e,0xced,0x1338,0x1338, +0x1338,0x1338,0x1338,0x1338,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x27,0x420,0x42c, +0x27,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x27,0x42c,0x42c, +0x42f,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x27,0x42c,0x27,0x42c,0x42c,0x27,0x27,0x27,0x42c, +0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, +0x42c,0x42c,0xdd7,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x27,0x420,0x426,0x420,0x426,0x426,0x27, +0x27,0x27,0x426,0x426,0x426,0x27,0x429,0x429,0x429,0x423,0x27,0x27,0xfb7,0x27,0x27,0x27, +0x27,0x27,0x27,0x420,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xeeb,0x969, +0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x966,0x966,0x966,0xda7,0xcf0,0xcf0,0xcf0,0xcf0, +0xcf0,0xcf3,0xcf0,0x27,0x27,0x27,0x27,0x27,0x1500,0x43e,0x43e,0x43e,0x193e,0x441,0x441,0x441, +0x441,0x441,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x441,0x441,0x441, +0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x441,0x441,0x441, +0x441,0x441,0x441,0x441,0x1503,0x441,0x441,0x441,0x441,0x441,0x2a,0x2a,0x2a,0xfc0,0x432,0x432, +0x432,0x43e,0x43e,0x43e,0x43e,0x2a,0x432,0x432,0x435,0x2a,0x432,0x432,0x432,0x438,0x2a,0x2a, +0x2a,0x2a,0x2a,0x2a,0x2a,0x432,0x432,0x2a,0xfc0,0xfc0,0x171c,0x2a,0x2a,0x2a,0x2a,0x2a, +0x441,0x441,0xfba,0xfba,0x2a,0x2a,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b, +0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1a0a,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd, +0x17d9,0x1506,0x44a,0x44a,0x1941,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x2d,0x450,0x450, +0x450,0x2d,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450, +0x450,0x2d,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x2d,0x450,0x450,0x450, +0x450,0x450,0x2d,0x2d,0xcf6,0xcf9,0x44a,0x444,0x44d,0x44a,0x444,0x44a,0x44a,0x2d,0x444,0x44d, +0x44d,0x2d,0x44d,0x44d,0x444,0x447,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x444,0x444,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x450,0x2d,0x450,0x450,0xf03,0xf03,0x2d,0x2d,0x96c,0x96c, +0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x2d,0xf06,0xf06,0x2d,0x2d,0x2d,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x189f,0x1509,0x45c,0x45c,0x30,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x30,0x462,0x462,0x462,0x30,0x462,0x462,0x462,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x45c,0x453,0x453,0x453,0xfc3,0x30,0x45c,0x45c, +0x45c,0x30,0x45f,0x45f,0x45f,0x456,0x133e,0x17dc,0x30,0x30,0x30,0x30,0x17df,0x17df,0x17df,0x453, +0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x171f,0x462,0x462,0xfc3,0xfc3,0x30,0x30,0x459,0x459, +0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0x17dc,0x17dc, +0x17dc,0xfc9,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0x33,0x33,0xa35,0xa35,0x33,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33, +0x33,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0x33,0xa3b,0x33,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,0x33,0x33,0xa2f,0x33, +0x33,0x33,0x33,0xa2c,0xa35,0xa35,0xa2c,0xa2c,0xa2c,0x33,0xa2c,0x33,0xa35,0xa35,0xa38,0xa35, +0xa38,0xa38,0xa38,0xa2c,0x33,0x33,0x33,0x33,0x33,0x33,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0x33,0x33,0xa35,0xa35,0xa32,0x33,0x33,0x33,0x33,0x33,0x33,0x33, +0x33,0x33,0x33,0x33,0x36,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x468,0x47d,0x47a,0x468,0x468,0x468,0x468,0x468,0x468,0x46e,0x36, +0x36,0x36,0x36,0x465,0x483,0x483,0x483,0x483,0x483,0x47d,0x480,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x468,0x46b,0x471,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x474,0x474, 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,0x477,0x477,0x39, -0x477,0x39,0x39,0x477,0x477,0x39,0x477,0x39,0x39,0x477,0x39,0x39,0x39,0x39,0x39,0x39, -0x477,0x477,0x477,0x477,0x39,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x39,0x477,0x477,0x477, -0x39,0x477,0x39,0x477,0x39,0x39,0x477,0x477,0x39,0x477,0x477,0x477,0x477,0x46b,0x477,0x474, -0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x39,0x46b,0x46b,0x477,0x39,0x39,0x480,0x480,0x480,0x480, -0x480,0x39,0x47d,0x39,0x46e,0x46e,0x46e,0x46e,0x46e,0x46b,0x39,0x39,0x471,0x471,0x471,0x471, -0x471,0x471,0x471,0x471,0x471,0x471,0x39,0x39,0x47a,0x47a,0x13fe,0x13fe,0x39,0x39,0x39,0x39, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x39,0x492,0x492,0x39,0x492,0x39,0x1a10,0x492,0x492,0x1a10,0x492,0x39,0x1a10,0x492,0x1a10,0x1a10, +0x1a10,0x1a10,0x1a10,0x1a10,0x492,0x492,0x492,0x492,0x1a10,0x492,0x492,0x492,0x492,0x492,0x492,0x492, +0x1a10,0x492,0x492,0x492,0x39,0x492,0x39,0x492,0x1a10,0x1a10,0x492,0x492,0x1a10,0x492,0x492,0x492, +0x492,0x486,0x492,0x48f,0x486,0x486,0x486,0x486,0x486,0x486,0x1a0d,0x486,0x486,0x492,0x39,0x39, +0x49b,0x49b,0x49b,0x49b,0x49b,0x39,0x498,0x39,0x489,0x489,0x489,0x489,0x489,0x486,0x39,0x39, +0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x39,0x39,0x495,0x495,0x1419,0x1419, +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, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x990,0x990,0x990,0x993, -0x990,0x990,0x990,0x990,0x3c,0x990,0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x993,0x990, -0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x990,0x990,0x990, -0x990,0x990,0x990,0x990,0x990,0x993,0xa2c,0xfbd,0xfbd,0x3c,0x3c,0x3c,0x3c,0x95d,0x95d,0x960, -0x95d,0x960,0x960,0x969,0x960,0x969,0x95d,0x95d,0x95d,0x95d,0x95d,0x98a,0x95d,0x960,0x963,0x963, -0x966,0x96f,0x963,0x963,0x990,0x990,0x990,0x990,0x132c,0x1326,0x1326,0x1326,0x95d,0x95d,0x95d,0x960, -0x95d,0x95d,0xa20,0x95d,0x3c,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d, -0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0xa20,0xa20,0xa20,0x95d,0x95d,0x95d, -0x95d,0x95d,0x95d,0x95d,0xa20,0x960,0xa20,0xa20,0xa20,0x3c,0xa29,0xa29,0xa26,0xa26,0xa26,0xa26, -0xa26,0xa26,0xa23,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0x3c,0xfb4,0xa26,0xdbc,0xdbc,0xfb7,0xfba, -0xfb4,0x113d,0x113d,0x113d,0x113d,0x1329,0x1329,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x3c,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae, +0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae, +0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0xa4a,0xfd8,0xfd8,0x3c,0x3c,0x3c, +0x3c,0x97b,0x97b,0x97e,0x97b,0x97e,0x97e,0x987,0x97e,0x987,0x97b,0x97b,0x97b,0x97b,0x97b,0x9a8, +0x97b,0x97e,0x981,0x981,0x984,0x98d,0x981,0x981,0x9ae,0x9ae,0x9ae,0x9ae,0x1347,0x1341,0x1341,0x1341, +0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,0xa3e,0x97b,0x3c,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0x97b, +0x97b,0x97b,0x97e,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0xa3e,0xa3e, +0xa3e,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0xa3e,0x97e,0xa3e,0xa3e,0xa3e,0x3c,0xa47,0xa47, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa41,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0x3c,0xfcf,0xa44, +0xdda,0xdda,0xfd2,0xfd5,0xfcf,0x1155,0x1155,0x1155,0x1155,0x1344,0x1344,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,0x486,0x486,0x486,0x486,0x486,0x486,0x3f,0x1404, -0x3f,0x3f,0x3f,0x3f,0x3f,0x1404,0x3f,0x3f,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483, -0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb, -0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42, -0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb, -0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0x42,0xa56,0xa56, -0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,0xa56,0x42,0xa56,0xa56, -0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xdcb,0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0x132f,0x132f,0xdc5,0xdc8,0xa50,0xa59,0xa4d, -0xa4d,0xa4d,0xa4d,0xa59,0xa59,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa4a,0xa4a, -0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0x42,0x42,0x42,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0x170a,0x45,0x45,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x45,0x45,0xa6e,0xa71,0xa71,0xa71, -0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, -0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa6b,0xa68,0x48,0x48,0x48,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa74,0xa74,0xa74,0xa77,0xa77,0xa77,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa7a,0xa98,0xa98,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa80,0xa7d, -0xa8f,0xa8f,0xa92,0xa9b,0xa89,0xa86,0xa8f,0xa8c,0xa9b,0xcde,0x4e,0x4e,0xa95,0xa95,0xa95,0xa95, -0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xce1,0xce1,0xce1,0xce1, -0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xaaa,0xaaa,0xb2e,0xb31, -0xab0,0xb2b,0xaad,0xaaa,0xab3,0xac2,0xab6,0xac5,0xac5,0xac5,0xaa1,0x51,0xab9,0xab9,0xab9,0xab9, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0x51,0x51,0x51,0x51,0x51,0x51,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0x1929,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xaa4,0xfde,0x51,0x51,0x51,0x51,0x51,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x54,0x54,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x54,0x54,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x54,0x4a7,0x54,0x4a7,0x54,0x4a7,0x54,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x54,0x54,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49e,0x4a4,0x49e,0x49e,0x49b,0x4a4,0x4a4, -0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49b,0x49b,0x49b,0x4a4,0x4a4,0x4a4,0x4a4, -0x54,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x54,0x49b,0x49b,0x49b,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49b,0x49b,0x49b,0x54,0x54,0x4a4,0x4a4, -0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a1,0x49e,0x54,0xba3,0xba6,0xba6,0xba6, -0xfe7,0x57,0x14d0,0x14d0,0x14d0,0x14d0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4fb,0xbb8,0x5a,0x5a, -0x6ba,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x501,0x513,0x501,0x50d,0x507,0x6bd,0x4f8,0x6b7,0x6b7,0x6b7, -0x6b7,0x4f8,0x4f8,0x4f8,0x4f8,0x4f8,0x4fe,0x510,0x4fe,0x50a,0x504,0x5a,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x5a,0x5a,0x5a,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x522,0x522,0x522,0x522, -0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x51f,0x51f,0x51f,0x51f,0x522,0xad7,0xada, -0xbbe,0xbc4,0xbc4,0xbc1,0xbc1,0xbc1,0xbc1,0xdda,0xeee,0xeee,0xeee,0xeee,0x1128,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x552,0x552,0x552,0xae3, -0xef7,0xfed,0xfed,0xfed,0xfed,0x1287,0x1710,0x1710,0x63,0x63,0x63,0x63,0x6e4,0x6e4,0x6e4,0x6e4, -0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x55e,0x55e,0x55b,0x55b,0x55b,0x55b,0x585,0x585,0x585,0x585, -0x585,0xaef,0xaef,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,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0x6c,0xb0a,0xb0a,0xb0a,0xb0a,0xb0d,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0d, -0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x81c,0x816,0x81c, -0x816,0x81c,0x816,0x81c,0x816,0x81c,0x816,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816, -0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x816,0x816,0x816,0x81c, -0x816,0x81c,0x816,0x81c,0x816,0x816,0x816,0x816,0x816,0x816,0x81c,0x816,0x816,0x816,0x816,0x816, -0x819,0xc6c,0xc6c,0x75,0x75,0x930,0x930,0x8fa,0x8fa,0x81f,0x822,0xc69,0x78,0x78,0x78,0x78, -0x78,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834, -0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x1116,0x18f3,0x19d7, -0x7b,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x7b,0x903,0x903,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906, -0x906,0x906,0x906,0x906,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0x13c5,0x13c5,0x13c5,0x7e, -0x7e,0x7e,0x7e,0x7e,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, -0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, -0x840,0xd71,0xd71,0x81,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x81,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0x84,0x84,0x84,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xc75,0xb28,0xb28,0xb28,0xc75,0xb28,0x87,0x87,0x87,0x87,0x87, -0x87,0x87,0x87,0x87,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x9b4,0x9b4,0x9b4,0x9b4,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, -0x8a,0x8a,0x8a,0x8a,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230, -0x1230,0x1230,0x1230,0x1230,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x8d,0x8d,0x8d,0x8d, -0x8d,0xafb,0x5d6,0x5dc,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5d9,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x5dc,0x5dc, -0x5dc,0x8d,0x5dc,0x8d,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5df,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x1344,0x1344,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7, -0x5f1,0x5f7,0x5f7,0x5f1,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x5f4,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1, -0x5f4,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f4,0x5f4,0x5f1, -0x5f4,0x5f4,0x5f4,0x5f4,0x90,0x90,0x5f4,0x5f4,0x5f4,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f1,0x5f1,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0x5f7,0x5f7,0x951,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5ee,0x5ee, -0xbfd,0xd8c,0x90,0x90,0x858,0x86a,0x867,0x86a,0x867,0xc8a,0xc8a,0xd7d,0xd7a,0x85b,0x85b,0x85b, -0x85b,0x86d,0x86d,0x86d,0x885,0x888,0x897,0x93,0x88b,0x88e,0x89a,0x89a,0x882,0x879,0x873,0x879, -0x873,0x879,0x873,0x876,0x876,0x891,0x891,0x894,0x891,0x891,0x891,0x93,0x891,0x87f,0x87c,0x876, -0x93,0x93,0x93,0x93,0x603,0x60f,0x603,0xc00,0x603,0x96,0x603,0x60f,0x603,0x60f,0x603,0x60f, -0x603,0x60f,0x603,0x60f,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c, -0x606,0x96,0x96,0x600,0x756,0x759,0x76e,0x771,0x750,0x759,0x759,0x9c,0x738,0x73b,0x73b,0x73b, -0x73b,0x738,0x738,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xafe,0xafe,0xafe, -0x9b7,0x732,0x612,0x612,0x9c,0x780,0x75f,0x750,0x759,0x756,0x750,0x762,0x753,0x74d,0x750,0x76e, -0x765,0x75c,0x77d,0x750,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x76b,0x768, -0x76e,0x76e,0x76e,0x780,0x741,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x9c,0x9c,0x9c,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e, -0x73e,0x9c,0x9c,0x9c,0xb46,0xb46,0xb46,0xb46,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, -0x9f,0x1890,0x1890,0x1890,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xa2,0xa2,0xa2,0xa2,0xa2,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xa8,0xa8,0xff9,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1716,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, -0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xab,0xb79,0xb79,0xab,0xab,0xb79,0xab, -0xab,0xb79,0xb79,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,0xab,0xb76,0xab,0xb76,0xb76,0xb76,0xb76,0xd02,0xb76,0xb76, -0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb76, -0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79, -0xb79,0xab,0xb79,0xab,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xab,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xdef,0xdef,0xab,0xab, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb70,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xf06,0xf03,0xab,0xab,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xae,0xb7f,0xae,0xae,0xae,0xae,0xae,0xae, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x4a1,0x4a1,0x4a1,0x4a1, +0x4a1,0x4a1,0x3f,0x141f,0x3f,0x3f,0x3f,0x3f,0x3f,0x141f,0x3f,0x3f,0x49e,0x49e,0x49e,0x49e, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0x42,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9, +0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42, +0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0x134a,0x134a,0xde3, +0xde6,0xa6e,0xa77,0xa6b,0xa6b,0xa6b,0xa6b,0xa77,0xa77,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, +0xa71,0xa71,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0x42,0x42,0x42, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0x1725,0x45,0x45,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x45,0x45, +0xa8c,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f, +0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa89,0xa86,0x48,0x48,0x48, +0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa92,0xa92,0xa92,0xa95,0xa95, +0xa95,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, +0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xa98,0xab6,0xab6,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9e,0xa9b,0xaad,0xaad,0xab0,0xab9,0xaa7,0xaa4,0xaad,0xaaa,0xab9,0xcfc,0x4e,0x4e, +0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0xac8,0xac8,0xb49,0xb4c,0xace,0xb46,0xacb,0xac8,0xad1,0xae0,0xad4,0xae3,0xae3,0xae3,0xabf,0x51, +0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0x51,0x51,0x51,0x51,0x51,0x51, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x1944,0x51,0x51,0x51,0x51,0x51,0x51,0x51, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xac2,0xff6,0x51,0x51,0x51,0x51,0x51, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x54,0x54, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x4c2,0x54,0x4c2,0x54,0x4c2,0x54,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b9,0x4bf,0x4b9, +0x4b9,0x4b6,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b6,0x4b6,0x4b6, +0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x54,0x4b6,0x4b6,0x4b6, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b6,0x4b6,0x4b6, +0x54,0x54,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bc,0x4b9,0x54, +0xbc1,0xbc4,0xbc4,0xbc4,0xfff,0x57,0x14eb,0x14eb,0x14eb,0x14eb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x516,0xbd6,0x5a,0x5a,0x6d5,0x516,0x516,0x516,0x516,0x516,0x51c,0x52e,0x51c,0x528,0x522,0x6d8, +0x513,0x6d2,0x6d2,0x6d2,0x6d2,0x513,0x513,0x513,0x513,0x513,0x519,0x52b,0x519,0x525,0x51f,0x5a, +0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x5a,0x5a,0x5a, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x53a,0x53a, +0x53a,0x53d,0xaf2,0xaf5,0xbdc,0xbe2,0xbe2,0xbdf,0xbdf,0xbdf,0xbdf,0xdf8,0xf09,0xf09,0xf09,0xf09, +0x1140,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x56d,0x56d,0x56d,0xafe,0xf12,0x1005,0x1005,0x1005,0x1005,0x129f,0x172b,0x172b,0x63,0x63,0x63,0x63, +0x6ff,0x6ff,0x6ff,0x6ff,0x702,0x702,0x702,0x702,0x702,0x702,0x579,0x579,0x576,0x576,0x576,0x576, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0xb0a,0xb0a,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, +0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +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,0x6c,0xb25,0xb25,0xb25,0xb25,0xb28, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb28,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f, +0x75,0x837,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x831,0x834,0x831,0x834,0x831, +0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831, +0x831,0x831,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x831,0x831,0x831,0x831,0x831,0x837,0x831, +0x831,0x831,0x831,0x831,0x834,0xc8a,0xc8a,0x75,0x75,0x94b,0x94b,0x915,0x915,0x83a,0x83d,0xc87, +0x78,0x78,0x78,0x78,0x78,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, +0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, +0x84f,0x112e,0x190e,0x19f2,0x7b,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x7b,0x91e,0x91e,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, +0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, +0x13e0,0x13e0,0x13e0,0x7e,0x7e,0x7e,0x7e,0x7e,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b, +0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b, +0x85b,0x85b,0x85b,0x85b,0x85b,0xd8f,0xd8f,0x81,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0x84,0x84,0x84,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc93,0xb43,0xb43,0xb43,0xc93,0xb43,0x87, +0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x9d2,0x9d2,0x9d2,0x9d2,0x8a,0x8a,0x8a,0x8a, +0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x8d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x5ee,0x5ee,0x5ee,0x5ee,0x5ee, +0x8d,0x8d,0x8d,0x8d,0x8d,0xb16,0x5f1,0x5f7,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd, +0x5fd,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x8d, +0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x8d,0x5f7,0x8d,0x5f7,0x5f7,0x8d,0x5f7,0x5f7,0x8d,0x5f7,0x5f7, +0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5fa,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x135f,0x135f,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x612,0x60c,0x60f,0x615,0x612, +0x60c,0x612,0x60c,0x612,0x60c,0x612,0x612,0x60c,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60f,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x60c,0x60f,0x60c,0x60c,0x60f,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c, +0x60f,0x60f,0x60f,0x60c,0x60f,0x60f,0x60f,0x60f,0x90,0x90,0x60f,0x60f,0x60f,0x60f,0x60c,0x60c, +0x60f,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60c,0x60c, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, +0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x612,0x612,0x96f,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x609,0x609,0xc1b,0xdaa,0x90,0x90,0x873,0x885,0x882,0x885,0x882,0xca8,0xca8,0xd9b, +0xd98,0x876,0x876,0x876,0x876,0x888,0x888,0x888,0x8a0,0x8a3,0x8b2,0x93,0x8a6,0x8a9,0x8b5,0x8b5, +0x89d,0x894,0x88e,0x894,0x88e,0x894,0x88e,0x891,0x891,0x8ac,0x8ac,0x8af,0x8ac,0x8ac,0x8ac,0x93, +0x8ac,0x89a,0x897,0x891,0x93,0x93,0x93,0x93,0x61e,0x62a,0x61e,0xc1e,0x61e,0x96,0x61e,0x62a, +0x61e,0x62a,0x61e,0x62a,0x61e,0x62a,0x61e,0x62a,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x627, +0x621,0x627,0x621,0x627,0x621,0x96,0x96,0x61b,0x771,0x774,0x789,0x78c,0x76b,0x774,0x774,0x9c, +0x753,0x756,0x756,0x756,0x756,0x753,0x753,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, +0x99,0xb19,0xb19,0xb19,0x9d5,0x74d,0x62d,0x62d,0x9c,0x79b,0x77a,0x76b,0x774,0x771,0x76b,0x77d, +0x76e,0x768,0x76b,0x789,0x780,0x777,0x798,0x76b,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, +0x795,0x795,0x786,0x783,0x789,0x789,0x789,0x79b,0x75c,0x759,0x759,0x759,0x759,0x759,0x759,0x759, +0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759, +0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x9c,0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759, +0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759,0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759, +0x9c,0x9c,0x759,0x759,0x759,0x9c,0x9c,0x9c,0xb64,0xb64,0xb64,0xb64,0x9f,0x9f,0x9f,0x9f, +0x9f,0x9f,0x9f,0x9f,0x9f,0x18ab,0x18ab,0x18ab,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, +0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xa2,0xa2,0xa2,0xa2,0xa2, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa8,0xa8,0x1011,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb97,0xb97,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,0xb97,0xab,0xb97,0xb97, +0xab,0xab,0xb97,0xab,0xab,0xb97,0xb97,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xab,0xb94,0xab,0xb94,0xb94,0xb94, +0xb94,0xd20,0xb94,0xb94,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xab,0xab,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xab,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,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xab, +0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xab,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xe0d,0xe0d,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94,0xb8e, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xf21,0xf1e,0xab,0xab,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xae,0xb9d,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,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xb1,0xc0f,0xc0f,0xc0f,0xc0f,0xc09,0xc09,0xc0c,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18, -0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc12,0xc12,0xc15,0xc7e,0xc7e,0xb4, -0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, -0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1b,0xc1b,0xb7,0xb7,0xb7,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24, -0xc24,0xc24,0xc24,0xc24,0xc24,0xba,0xc24,0xc24,0xc24,0xba,0xc21,0xc21,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,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,0x1512,0x1512,0xbd,0xd05,0xd05,0xd05,0xd11,0xd11,0xd11,0xd11,0xd05, -0xd05,0xd11,0xd11,0xd11,0xbd,0xbd,0xbd,0xbd,0xd11,0xd11,0xd05,0xd11,0xd11,0xd11,0xd11,0xd11, -0xd11,0xd08,0xd08,0xd08,0xbd,0xbd,0xbd,0xbd,0xd0b,0xbd,0xbd,0xbd,0xd17,0xd17,0xd0e,0xd0e, -0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, -0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xc0,0xc0,0xd1a,0xd1a,0xd1a,0xd1a, -0xd1a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0xc3,0xc3,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0xc3,0xc3,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0xc3,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1893,0x192c, -0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1719,0x1719,0x1719,0x1719, -0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0xc3, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xc6,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc2d,0xc2d,0xc2d,0xc2d, +0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xb1,0xc2d,0xc2d,0xc2d,0xc2d,0xc27,0xc27, +0xc2a,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xc36,0xc36,0xc36,0xc36, +0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc30,0xc30, +0xc33,0xc9c,0xc9c,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xc3c,0xc3c,0xc3c,0xc3c, +0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc39,0xc39, +0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xc42,0xc42,0xc42,0xc42, +0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xba,0xc42,0xc42,0xc42,0xba,0xc3f,0xc3f, +0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xd32,0xd32,0xd32,0xd32, +0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, +0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0x152d,0x152d,0xbd,0xd23,0xd23,0xd23,0xd2f, +0xd2f,0xd2f,0xd2f,0xd23,0xd23,0xd2f,0xd2f,0xd2f,0xbd,0xbd,0xbd,0xbd,0xd2f,0xd2f,0xd23,0xd2f, +0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd26,0xd26,0xd26,0xbd,0xbd,0xbd,0xbd,0xd29,0xbd,0xbd,0xbd, +0xd35,0xd35,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd38,0xd38,0xd38,0xd38, +0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xc0,0xc0, +0xd38,0xd38,0xd38,0xd38,0xd38,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0xc3,0xc3,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0xc3,0xc3, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xc6, +0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xc6,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,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,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xc9,0xc9,0xc9,0xc9,0xc9,0xd86,0xd86,0xd86,0xcc, -0xcc,0xcc,0xcc,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80, -0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xcc,0xcc,0xcc,0xd83, -0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xcf,0xd47,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd2,0xd2,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, -0xd50,0xd50,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5,0xd5, -0xd56,0xd5,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5,0xd56,0xd56,0xd5,0xd5,0xd5, -0xd56,0xd5,0xd5,0xd56,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59, -0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd8,0xd8,0xd8,0xd8,0xd8, -0xd8,0xd8,0xd8,0xd8,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0x1518, -0x1518,0x17ca,0x17ca,0xde,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5, -0x135,0x135,0x135,0x135,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe13,0xe13,0xe19,0xe19,0xe13, -0xe1,0xe1,0xe16,0xe16,0x1125,0x1125,0x1125,0x1125,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe4,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b, -0xc7b,0xc7b,0xc7b,0xc7b,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151e,0x1896,0x1896,0x1896,0x1896,0xe7,0x17cd, -0x1350,0x1167,0xf15,0xf15,0xe2e,0xe2b,0xe2e,0xe2b,0xe2b,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1170, -0x116d,0x1170,0x116d,0x116a,0x116a,0x116a,0x140d,0x140a,0xea,0xea,0xea,0xea,0xea,0xe28,0xe25,0xe25, -0xe25,0xe22,0xe28,0xe25,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xed,0xed,0xed,0xed, -0xed,0xed,0xed,0xed,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xed,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37, -0xe37,0xe37,0xe37,0xe37,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xf3,0x1410,0xf3,0xf3,0xf3,0xf3, -0xf3,0x1410,0xf3,0xf3,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0xe94,0xe94,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, -0xe40,0xe40,0xe40,0xf6,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d, -0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d, -0xe3d,0xe3d,0xe3d,0xf6,0xe52,0xe46,0xe46,0xe46,0xf9,0xe46,0xe46,0xf9,0xf9,0xf9,0xf9,0xf9, -0xe46,0xe46,0xe46,0xe46,0xe52,0xe52,0xe52,0xe52,0xf9,0xe52,0xe52,0xe52,0xf9,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0x1932,0x1932,0xf9,0xf9,0xe43,0xe43,0xe43,0xf9,0xf9,0xf9,0xf9,0xe49, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x192f,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe55,0xe55,0xe4c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0x1176,0x1176,0xfc,0xfc,0xfc,0xfc, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe64,0xe64,0xe64,0xe61,0xe61,0xe64,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe5e,0xe5e,0xe5e,0xe5e, -0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x1173,0xfc,0xfc,0xfc,0xe5b,0xe5b,0xe6a,0xe6a,0xe6a,0xe6a, -0xff,0xff,0xff,0xff,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe67,0xe6a,0xe6a,0xe6a, -0xe6a,0xe6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1527,0x152d,0x152a,0x1875, -0x17d0,0x1899,0x1899,0x1899,0x1899,0x1899,0x1938,0x1935,0x193b,0x1935,0x193b,0x102,0x102,0x102,0x102,0x102, +0xc6,0xc6,0xc6,0xc6,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xc9, +0xc9,0xc9,0xc9,0xc9,0xda4,0xda4,0xda4,0xcc,0xcc,0xcc,0xcc,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9e,0xd9e,0xd9e,0xd9e,0xcc,0xcc,0xcc,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, +0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68, +0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xcf,0xd65, +0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71, +0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd2,0xd2, +0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, +0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c, +0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd5,0xd5,0xd74,0xd5,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74, +0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74, +0xd74,0xd74,0xd5,0xd74,0xd74,0xd5,0xd5,0xd5,0xd74,0xd5,0xd5,0xd74,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0x1533,0x1533,0x17e5,0x17e5,0xde,0x110d,0x110d,0x110d,0x110d, +0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x135,0x135,0x135,0x135,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe31,0xe31,0xe37,0xe37,0xe31,0xe1,0xe1,0xe34,0xe34,0x113d,0x113d,0x113d,0x113d, +0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xc99,0xc99,0xc99,0xc99, +0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0x102c,0x102c,0x102c,0x102c, +0x102c,0x102c,0x102c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x1539,0x18b1,0x18b1,0x18b1,0x18b1,0xe7,0x17e8,0x136b,0x117f,0xf30,0xf30,0xe4c,0xe49,0xe4c,0xe49, +0xe49,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0x1188,0x1185,0x1188,0x1185,0x1182,0x1182,0x1182,0x1428,0x1425, +0xea,0xea,0xea,0xea,0xea,0xe46,0xe43,0xe43,0xe43,0xe40,0xe46,0xe43,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xe55,0xe55,0xe55,0xe55, +0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xe58,0xe58,0xe58,0xe58, +0xe58,0xe58,0xf3,0x142b,0xf3,0xf3,0xf3,0xf3,0xf3,0x142b,0xf3,0xf3,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xf6,0xe5b,0xe5b,0xe5b,0xe5b, +0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b, +0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xf6,0xe70,0xe64,0xe64,0xe64, +0xf9,0xe64,0xe64,0xf9,0xf9,0xf9,0xf9,0xf9,0xe64,0xe64,0xe64,0xe64,0xe70,0xe70,0xe70,0xe70, +0xf9,0xe70,0xe70,0xe70,0xf9,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70, +0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0x194d,0x194d,0xf9,0xf9, +0xe61,0xe61,0xe61,0xf9,0xf9,0xf9,0xf9,0xe67,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, +0x194a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe73,0xe73, +0xe6a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe7f,0xe7f,0x118e,0x118e,0xfc,0xfc,0xfc,0xfc,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe82,0xe82,0xe82, +0xe7f,0xe7f,0xe82,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x118b,0xfc, +0xfc,0xfc,0xe79,0xe79,0xe88,0xe88,0xe88,0xe88,0xff,0xff,0xff,0xff,0xe88,0xe88,0xe88,0xe88, +0xe88,0xe88,0xe88,0xe88,0xe85,0xe88,0xe88,0xe88,0xe88,0xe88,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x1542,0x1548,0x1545,0x1890,0x17eb,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x1953,0x1950, +0x1956,0x1950,0x1956,0x1a16,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,0x102,0x102,0x102,0x102,0x102,0x102,0xe91,0xe91,0xe91,0xe8e, -0xe8e,0xe85,0xe85,0xe8e,0xe8b,0xe8b,0xe8b,0xe8b,0x105,0x105,0x105,0x105,0x12ed,0x12ed,0x12ed,0x12f0, -0x12f0,0x12f0,0x12e7,0x12e7,0x12ea,0x12e7,0x159,0x159,0x159,0x159,0x159,0x159,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0x141c,0x141c,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0xe97,0x1356,0x108,0x108,0x108, -0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x1353,0xc4b,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4e,0xec4,0xeb5,0xeaf,0xec1, -0xebe,0xeb8,0xeb8,0xec7,0xeb2,0xebb,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0xf48,0xf48,0xf33,0xf48, -0xf4b,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0x111,0x111,0x111,0x111,0xf42,0xf42,0xf42,0xf42, -0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf54,0xf54,0xf39,0xf3f,0xf54,0xf54,0xf3c,0xf39,0xf39,0xf39, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0x111,0x111,0x111,0x135c,0x1359,0x135c,0x1359, -0x135c,0x1359,0x135c,0x1359,0x135c,0x1359,0x1422,0x1539,0x1539,0x1539,0x17d3,0x1944,0x1539,0x1539,0x1722,0x1722, -0x1722,0x171c,0x1722,0x171c,0x1947,0x1944,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x102,0x102,0x102,0x102,0xeac,0xeac,0xeac,0xea9,0xea9,0xea0,0xea0,0xea9,0xea6,0xea6,0xea6,0xea6, +0x105,0x105,0x105,0x105,0x1308,0x1308,0x1308,0x130b,0x130b,0x130b,0x1302,0x1302,0x1305,0x1302,0x159,0x159, +0x159,0x159,0x159,0x159,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0x1437,0x1437,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0xeb2,0x1371,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0x136e,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69, +0xc69,0xc69,0xc69,0xc6c,0xedf,0xed0,0xeca,0xedc,0xed9,0xed3,0xed3,0xee2,0xecd,0xed6,0x10b,0x10b, +0x10b,0x10b,0x10b,0x10b,0xf63,0xf63,0xf4e,0xf63,0xf66,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69, +0x111,0x111,0x111,0x111,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf6f,0xf6f, +0xf54,0xf5a,0xf6f,0xf6f,0xf57,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf51, +0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54, +0xf54,0x111,0x111,0x111,0x114,0x114,0x1a1c,0x1a19,0x1a1c,0x1a1c,0x1a1c,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,0x1536,0x1425,0x1425,0x1359,0x1050, -0x1050,0x1050,0x1050,0x1050,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf60,0xf60,0xf66,0xf66,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f, -0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf69,0xf69,0xf69,0xf69,0x117f,0x117f, -0x11a,0x11a,0x11a,0xf6c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, -0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1725,0x11d,0x11d, -0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1551,0x1440,0x1440,0x1374,0x1068,0x1068,0x1068,0x1068,0x1068, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7b,0xf7b,0xf81,0xf81,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf84,0xf84,0xf84,0xf84,0x1197,0x1197,0x11a,0x11a,0x11a,0xf87, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1740,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, 0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, -0xf78,0xf78,0xf78,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x120, -0xf75,0xf75,0xf75,0xf75,0x153f,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b, -0xf7b,0xf7b,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x123,0x123,0x123,0x123,0x123,0x123,0x123, -0x1077,0x1077,0x1077,0x1077,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x1065,0x1065,0x1074,0x1074,0x106b,0x1068,0x126,0x126,0x126,0x107a,0x107a,0x106e,0x106e,0x106e, -0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x126,0x126,0x126,0x1077,0x1077,0x1077, -0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1095,0x1095,0x129,0x129,0x129,0x129, -0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, -0x10bc,0x10bc,0x10bc,0x10bc,0x10b6,0x17d6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10c2,0x10c2, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4, -0x10d4,0x10d4,0x10da,0x10dd,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10d7, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10ec, -0x10ec,0x10e3,0x10e3,0x10ec,0x10ec,0x10e3,0x10e3,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x10ef,0x10ef,0x10ef,0x10e3,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10e3,0x10ec,0x132,0x132, -0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x132,0x132,0x10e6,0x10f2,0x10f2,0x10f2, -0x154e,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0xf93,0xf93,0xf93,0x155d, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x120,0xf90,0xf90,0xf90,0xf90, +0x155a,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0xf96,0xf96,0xf96,0xf96, +0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0x1965,0x1965, +0x1965,0x1965,0x1965,0x1965,0x1965,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x108f,0x108f,0x108f,0x108f, +0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d, +0x108c,0x108c,0x1083,0x1080,0x126,0x126,0x126,0x1092,0x1092,0x1086,0x1086,0x1086,0x1089,0x1089,0x1089,0x1089, +0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x126,0x126,0x126,0x108f,0x108f,0x108f,0x1095,0x1095,0x1095,0x1095, +0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x10aa,0x10aa,0x10aa,0x10aa, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10ad,0x10ad,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x10d4,0x10d4,0x10d4,0x10d4, +0x10ce,0x17f1,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10da,0x10da,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10f8,0x10f8,0x10f8,0x10f8, +0x10f8,0x10f8,0x10f8,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10f2,0x10f5, +0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10ef,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x1107,0x1107,0x1107,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x1104,0x1104,0x10fb,0x10fb,0x1104, +0x1104,0x10fb,0x10fb,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x1107,0x1107,0x1107,0x10fb, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x10fb,0x1104,0x132,0x132,0x1101,0x1101,0x1101,0x1101, +0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x132,0x132,0x10fe,0x110a,0x110a,0x110a,0x1569,0x135,0x135,0x135, 0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10fb,0x138,0x138, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x13b,0x13b,0x13b, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, -0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, -0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x141,0x141,0x141,0x141,0x141,0x1104, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x144,0x144,0x144,0x144, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d, -0x110d,0x110d,0x110d,0x110d,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, -0x1185,0x1185,0x1185,0x1185,0x118e,0x1185,0x1185,0x1185,0x118e,0x1185,0x1185,0x1185,0x1185,0x1182,0x14a,0x14a, -0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x1191,0x118b,0x1191,0x118b,0x118b,0x118b,0x1191,0x1191,0x14a, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11ac,0x1197,0x11ac,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x150, -0x11a0,0x11a9,0x1197,0x11a9,0x11a9,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x1197,0x1197,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x150,0x150,0x119a, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x150,0x150,0x150,0x150,0x150,0x150, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x150,0x150,0x150,0x150,0x150,0x150, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11b2,0x11b5,0x11b5,0x11b5,0x11b5,0x11a3,0x11a3,0x150,0x150, -0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1596,0x1c8, -0x1302,0x12e1,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12d8,0x12e4,0x12d8,0x12d8,0x12ff,0x12d8,0x12d8, -0x12d8,0x12d8,0x12de,0x14c4,0x14ca,0x14c7,0x14c7,0x1914,0x16ef,0x16ef,0x153,0x153,0x153,0x153,0x153,0x153, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11c1,0x11c1,0x11c4,0x11cd,0x11c7,0x11c7,0x11c7,0x11cd,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156, -0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6, -0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x15c,0x15c,0x15c, -0x11eb,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11e2,0x11f1,0x11f1,0x11df,0x11df,0x11df,0x11df,0x15f,0x12f3, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x15f,0x15f,0x15f,0x15f,0x11df,0x11df, -0x120f,0x1203,0x120f,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162, -0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x120c,0x120c,0x1212,0x1206,0x1209, -0x1227,0x1227,0x1227,0x1221,0x1221,0x1218,0x1221,0x1221,0x1218,0x1221,0x1221,0x122a,0x1224,0x121b,0x165,0x165, -0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x165,0x165,0x165,0x165,0x165,0x165, -0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x168,0x168,0x168,0x168,0x122d,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x168,0x168,0x168,0x168,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x16b,0x1236,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x16e,0x16e,0x16e,0x1242,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124e,0x171,0x171,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x1254,0x1254,0x1254,0x1254, -0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x174, -0x174,0x174,0x174,0x174,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x125a,0x125a,0x125a,0x125a, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x17a,0x1275,0x1275,0x17d,0x17d, -0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x1953,0x17d,0x17d,0x14a3,0x14a3,0x14a3,0x14a3, -0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x12a2,0x12a2,0x12a2,0x12a2, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x155a,0x155a,0x183,0x183,0x183,0x12a2,0x12a2,0x12a2,0x12a2, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x13ad,0x13ad,0x13ad,0x13ad, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x1434,0x1434,0x183,0x183,0x183,0x183,0x13b3,0x13b3,0x13ad,0x13ad, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,0x13ad,0x12ab,0x12ab,0x13ad,0x13b3,0x12b1,0x1854,0x1854,0x1854,0x1854, -0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x183,0x183,0x183,0x183,0x183,0x183,0x183, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,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,0x1113,0x138,0x138,0x1116,0x1116,0x1116,0x1116, +0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116, +0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x13b,0x13b,0x13b,0x1119,0x1119,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x13e,0x13e,0x13e, +0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,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,0x141,0x141,0x141,0x141,0x141,0x111c,0x1122,0x1122,0x1122,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x144,0x144,0x144,0x144,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x119d,0x119d,0x119d,0x119d, +0x11a6,0x119d,0x119d,0x119d,0x11a6,0x119d,0x119d,0x119d,0x119d,0x119a,0x14a,0x14a,0x11a3,0x11a3,0x11a3,0x11a3, +0x11a3,0x11a3,0x11a3,0x11a9,0x11a3,0x11a9,0x11a3,0x11a3,0x11a3,0x11a9,0x11a9,0x14a,0x11ac,0x11ac,0x11ac,0x11ac, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x11ac,0x11ac,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c4,0x11af,0x11c4,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x150,0x11b8,0x11c1,0x11af,0x11c1, +0x11c1,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11af, +0x11af,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x150,0x150,0x11b2,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x150,0x150,0x150,0x150,0x150,0x150,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x150,0x150,0x150,0x150,0x150,0x150,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11ca,0x11cd,0x11cd,0x11cd,0x11cd,0x11bb,0x11bb,0x150,0x150,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b1,0x1c8,0x131d,0x12f6,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x12fc,0x12f9,0x12f0,0x12f0,0x131a,0x12f0,0x12f0,0x12f0,0x12f0,0x12ff,0x14df, +0x14e5,0x14e2,0x14e2,0x192f,0x170a,0x170a,0x1a9d,0x153,0x153,0x153,0x153,0x153,0x11e2,0x11e2,0x11e2,0x11e2, +0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11d9,0x11d9,0x11dc,0x11e5, +0x11df,0x11df,0x11df,0x11e5,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x12de,0x12de,0x12de,0x12de, +0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de, +0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x15c,0x15c,0x15c,0x1203,0x11f7,0x11f7,0x11f7, +0x11f7,0x11f7,0x11f7,0x11fa,0x1209,0x1209,0x11f7,0x11f7,0x11f7,0x11f7,0x15f,0x130e,0x11fd,0x11fd,0x11fd,0x11fd, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x15f,0x15f,0x15f,0x15f,0x11f7,0x11f7,0x1227,0x121b,0x1227,0x162, +0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162, +0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x1224,0x1224,0x122a,0x121e,0x1221,0x123f,0x123f,0x123f,0x1239, +0x1239,0x1230,0x1239,0x1239,0x1230,0x1239,0x1239,0x1242,0x123c,0x1233,0x165,0x165,0x1236,0x1236,0x1236,0x1236, +0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x165,0x165,0x165,0x165,0x165,0x165,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x168,0x168,0x168,0x168,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245, +0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245, +0x1245,0x1245,0x1245,0x1245,0x168,0x168,0x168,0x168,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251, +0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x16b,0x124e, +0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x16e,0x16e, +0x16e,0x125a,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x171,0x171, +0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c, +0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x174,0x174,0x174,0x174,0x174, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272, +0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272, +0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x17a,0x128d,0x128d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d, +0x17d,0x17d,0x17d,0x17d,0x17d,0x196e,0x17d,0x17d,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be, +0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x180,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a43, +0x1a3d,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba, +0x12ba,0x12ba,0x12ba,0x1575,0x1575,0x183,0x183,0x183,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba, +0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8, +0x13c8,0x13c8,0x144f,0x144f,0x1a1f,0x183,0x183,0x183,0x13ce,0x13ce,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8, +0x13c8,0x12c3,0x13c8,0x12c3,0x12c3,0x13c8,0x13ce,0x12c9,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, +0x186f,0x186f,0x186f,0x186f,0x186f,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, 0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, -0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x12d2,0x13ce,0x13cb,0x186,0x186,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0x12cc,0x12cc,0x12cf,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0x12cc,0x12cc,0x12cc,0x12cf,0x12cc,0x12cc,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13cb,0x13ce,0x13ce,0x13ce,0x1857, -0x186,0x186,0x186,0x186,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x13f2,0x13f2,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x186,0x186,0x186,0x186,0x186,0x186, +0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x1380,0x1380,0x1380,0x1380,0x12ea,0x13e9,0x13e6,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e7,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e7, +0x12e4,0x12e4,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e6,0x13e9,0x13e9,0x13e9,0x1872,0x186,0x186,0x186,0x186, +0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x140d,0x140d,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,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,0x186,0x136e,0x136e,0x136e,0x136e, -0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e, -0x136e,0x136e,0x136e,0x136e,0x136e,0x1368,0x1368,0x1368,0x189,0x189,0x136b,0x189,0x1380,0x1380,0x1380,0x1380, -0x1380,0x1380,0x1371,0x137a,0x1374,0x1374,0x137a,0x137a,0x137a,0x1374,0x137a,0x1374,0x1374,0x1374,0x137d,0x137d, -0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x1377,0x1377,0x1377,0x1377,0x18f,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x18f,0x18f,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x18f,0x18f,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x1383,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x18f,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x18f,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1389,0x139b,0x139b,0x138f,0x138f,0x138f,0x138f,0x138f,0x192,0x192,0x192,0x192,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1392,0x1392, -0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, -0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x155d,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,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x198,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1560,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13d7,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560, -0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x198,0x198, -0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x13ec,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x1575,0x1575, -0x1575,0x1575,0x1575,0x1578,0x16e6,0x1578,0x1578,0x1578,0x17b2,0x1860,0x1860,0x189c,0x189c,0x19b,0x19b,0x19b, -0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1575,0x1575, -0x1575,0x1578,0x1575,0x16e3,0x16e3,0x19b,0x19b,0x19b,0x1578,0x1575,0x1575,0x1578,0x1860,0x1860,0x1860,0x18ff, -0x18ff,0x19dd,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x19e,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x1440,0x157e,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440, -0x1440,0x1440,0x1440,0x1440,0x1440,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1737,0x1737,0x1a1,0x17e2,0x17e2, -0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, -0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1959,0x17df,0x17df,0x17df,0x17df, -0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446, -0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446, -0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1446, -0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446, -0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446, -0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446, -0x1a4,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1383,0x1383,0x1383,0x189,0x189,0x1386,0x189,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x138c,0x1395, +0x138f,0x138f,0x1395,0x1395,0x1395,0x138f,0x1395,0x138f,0x138f,0x138f,0x1398,0x1398,0x18c,0x18c,0x18c,0x18c, +0x18c,0x18c,0x18c,0x18c,0x1392,0x1392,0x1392,0x1392,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f, +0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f, +0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611, +0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13b6, +0x13b6,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x192,0x192,0x192,0x192,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x13ad,0x13ad,0x13ad,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, +0x192,0x192,0x192,0x1578,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9, +0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x195,0x195,0x195, +0x195,0x195,0x195,0x195,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x198,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x157b,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13f2,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x198,0x198,0x198,0x198,0x198,0x198, +0x198,0x198,0x198,0x198,0x1407,0x1404,0x1404,0x1404,0x1404,0x1404,0x1590,0x1590,0x1590,0x1590,0x1590,0x1593, +0x1701,0x1593,0x1593,0x1593,0x17cd,0x187b,0x187b,0x18b7,0x18b7,0x1a7f,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, +0x19b,0x19b,0x19b,0x19b,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1590,0x1590,0x1590,0x1593,0x1590,0x16fe, +0x16fe,0x19b,0x19b,0x19b,0x1593,0x1590,0x1590,0x1593,0x187b,0x187b,0x187b,0x191a,0x191a,0x19f8,0x1a7f,0x19b, +0x19b,0x19b,0x19b,0x19b,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, +0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x145b,0x1599,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, +0x145b,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1752,0x1752,0x1a1,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, +0x17fd,0x17fd,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, +0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1974,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1461, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461, +0x1a4,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461, +0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461, +0x1461,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, 0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1443,0x1443,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1449,0x1449,0x1449,0x1449,0x1449, -0x1458,0x1449,0x144c,0x144c,0x1449,0x1449,0x1449,0x144f,0x144f,0x1a7,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1452,0x145e,0x145e,0x145e,0x195f,0x195c,0x195c,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1467, -0x1461,0x1461,0x1467,0x1467,0x1470,0x1470,0x146a,0x146d,0x146d,0x1467,0x1464,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1aa,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473, -0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1ad,0x1ad,0x1ad,0x1ad, -0x173a,0x173a,0x1473,0x1473,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x1ad,0x1ad,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x147f,0x147f,0x147f,0x147f,0x147f,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1b0,0x1b0,0x1b0,0x147f,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c, -0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c, -0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1479,0x1479,0x1479,0x1479,0x1482,0x1482,0x1482,0x1482,0x1482, -0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1494,0x1497,0x149a,0x149a,0x1497,0x149d,0x149d,0x1488, -0x148b,0x173d,0x1740,0x1740,0x1740,0x1584,0x1b3,0x1b3,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x1581,0x1746,0x1749,0x1743,0x174c,0x174c,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3, -0x14a3,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, -0x14a0,0x14a0,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, -0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x12fc,0x12f9,0x12fc,0x12db,0x12f9,0x12ff,0x12ff,0x1302, -0x12ff,0x1302,0x1305,0x12f9,0x1302,0x1302,0x12f9,0x12f9,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14a9,0x14b2,0x14a9,0x14b2,0x14b2,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14b5,0x14ac, -0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, -0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x1bf,0x1bf,0x1587,0x1587,0x1587,0x1587,0x1587,0x158d,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x16f2,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,0x1c5,0x1c5,0x1c5,0x1c5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x145e,0x145e,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1464,0x1464,0x1464,0x1464,0x1464,0x1473,0x1464,0x1467,0x1467, +0x1464,0x1464,0x1464,0x146a,0x146a,0x1a7,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x146d,0x1479,0x1479,0x1479,0x197a,0x1977,0x1977,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1482,0x147c,0x147c,0x1482,0x1482, +0x148b,0x148b,0x1485,0x1488,0x1488,0x1482,0x147f,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1ad,0x1ad,0x1ad,0x1ad,0x1755,0x1755,0x148e,0x148e, +0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x1ad,0x1ad,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x149a,0x149a,0x149a,0x149a,0x149a,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1b0,0x1b0,0x1b0,0x1b0,0x1a22, +0x149a,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497, +0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1494, +0x1494,0x1494,0x1494,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d, +0x14af,0x14b2,0x14b5,0x14b5,0x14b2,0x14b8,0x14b8,0x14a3,0x14a6,0x1758,0x175b,0x175b,0x175b,0x159f,0x1b3,0x1b3, +0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x159c,0x1761,0x1764,0x175e,0x1767,0x1767, +0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, +0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, +0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, +0x1317,0x1314,0x1317,0x12f3,0x1314,0x131a,0x131a,0x131d,0x131a,0x131d,0x1320,0x1314,0x131d,0x131d,0x1314,0x1314, +0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14c4,0x14cd,0x14c4,0x14cd,0x14cd, +0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14d0,0x14c7,0x1a2b,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1bf,0x1bf, +0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x15a8,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0x170d,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704, +0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1c5,0x1c5,0x1c5,0x1c5, 0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x15a2,0x159c,0x159f,0x15a8,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1593,0x1593,0x1593,0x1593, -0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x15ae,0x15ae,0x15ae,0x15ae, -0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, -0x15ae,0x1962,0x1962,0x1962,0x1962,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, +0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb, +0x15bd,0x15b7,0x15ba,0x15c3,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x1ce,0x1ce,0x1ce,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, +0x15ae,0x15ae,0x15ae,0x15ae,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, +0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x197d,0x197d,0x197d,0x197d,0x1d1,0x1d1,0x1d1, +0x1d1,0x1d1,0x1d1,0x1d1,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82, 0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x174f,0x16f5,0x15b7,0x16fb,0x1d4,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x1d4,0x15c0,0x15c0,0x1d4,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x1d4,0x15c0,0x15c0,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x19ec,0x16f8,0x15c0,0x15b1,0x15b7, -0x15b1,0x15b7,0x15b7,0x15b7,0x15b7,0x1d4,0x1d4,0x15b7,0x15b7,0x1d4,0x1d4,0x15ba,0x15ba,0x15bd,0x1d4,0x1d4, -0x1752,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15b1,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15c3,0x15c0,0x15c0, -0x15c0,0x15c0,0x15b7,0x15b7,0x1d4,0x1d4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x1d4,0x1d4,0x1d4, -0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d8,0x15d8,0x1d7,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d2,0x15d2,0x15d2,0x15c6,0x15c6,0x15c6,0x15d2,0x15d2,0x15c6,0x15d5,0x15c9,0x15c6,0x15db,0x15db,0x15cf,0x15db, -0x15db,0x15cc,0x17e5,0x1d7,0x15ea,0x15ea,0x15ea,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15e1,0x15e4,0x1da, -0x1da,0x1da,0x1da,0x1da,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1755,0x1755,0x1755,0x1755,0x15f6,0x15f3,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd, -0x1dd,0x1dd,0x1dd,0x1dd,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0, +0x1d1,0x1d1,0x1d1,0x1d1,0x176a,0x1710,0x15d2,0x1716,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db, +0x15db,0x1d4,0x1d4,0x15db,0x15db,0x1d4,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db, +0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x15db,0x15db, +0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x1a07,0x1713,0x15db,0x15cc,0x15d2,0x15cc,0x15d2,0x15d2,0x15d2, +0x15d2,0x1d4,0x1d4,0x15d2,0x15d2,0x1d4,0x1d4,0x15d5,0x15d5,0x15d8,0x1d4,0x1d4,0x176d,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x15cc,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15de,0x15db,0x15db,0x15db,0x15db,0x15d2,0x15d2, +0x1d4,0x1d4,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x1d4,0x1d4,0x1d4,0x15cf,0x15cf,0x15cf,0x15cf, +0x15cf,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x1d7,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15ed,0x15ed,0x15ed,0x15e1, +0x15e1,0x15e1,0x15ed,0x15ed,0x15e1,0x15f0,0x15e4,0x15e1,0x15f6,0x15f6,0x15ea,0x15f6,0x15f6,0x15e7,0x1800,0x1d7, +0x1605,0x1605,0x1605,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15fc,0x15ff,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1770,0x1770,0x1770,0x1770,0x1611,0x160e,0x1a2e,0x1a2e,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, 0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x15ff,0x1602,0x1605,0x1608,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, -0x1e3,0x1e3,0x1e3,0x1e3,0x1617,0x1617,0x1617,0x1617,0x1617,0x160b,0x160b,0x1e6,0x1e6,0x1e6,0x1e6,0x160e, -0x160e,0x160e,0x160e,0x160e,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1611,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6, -0x1e6,0x1e6,0x1e6,0x1e6,0x1620,0x1620,0x1620,0x1620,0x1620,0x1e9,0x1e9,0x161d,0x161d,0x161d,0x161d,0x161d, -0x161d,0x161d,0x161d,0x161d,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1623,0x1635,0x1635,0x1629,0x1632,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, -0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, -0x163b,0x163b,0x163b,0x1ef,0x1647,0x1647,0x1647,0x1647,0x1647,0x1641,0x164a,0x1647,0x1647,0x1647,0x1647,0x1647, -0x1647,0x1647,0x1647,0x1647,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1647,0x1647, -0x1647,0x1647,0x1647,0x1f2,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, -0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, -0x1650,0x1650,0x1650,0x1f5,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x1659,0x1659,0x1659,0x1659,0x1659,0x1f8, -0x1f8,0x1f8,0x1f8,0x1f8,0x1674,0x1674,0x1677,0x1677,0x167a,0x166b,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb, -0x1fb,0x1fb,0x1fb,0x1fb,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1fb,0x166b, -0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x1fb,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1fb,0x1fb,0x1fb,0x1fb, -0x1fb,0x1674,0x1674,0x1674,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1fe,0x1fe,0x1fe, -0x1fe,0x1fe,0x1fe,0x1fe,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, -0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1689,0x1689,0x1689, -0x1689,0x201,0x201,0x201,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x16a7,0x16a7,0x16a7,0x168f,0x16a1,0x16a1,0x168f,0x168f,0x168f,0x168f,0x207,0x207,0x16a1,0x16a1,0x16a4,0x16a4, -0x168f,0x168f,0x16a1,0x1695,0x1692,0x1698,0x16aa,0x16aa,0x169b,0x169b,0x169e,0x169e,0x169e,0x16aa,0x175e,0x175e, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175b,0x175b,0x175b,0x175b, -0x1758,0x1758,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x161a,0x161d,0x1620,0x1623,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, +0x1632,0x1632,0x1632,0x1632,0x1632,0x1626,0x1626,0x1e6,0x1e6,0x1e6,0x1e6,0x1629,0x1629,0x1629,0x1629,0x1629, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162c,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6, +0x163b,0x163b,0x163b,0x163b,0x163b,0x1e9,0x1e9,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, +0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, +0x163e,0x1650,0x1650,0x1644,0x164d,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, +0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1ef, +0x1662,0x1662,0x1662,0x1662,0x1662,0x165c,0x1665,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, +0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1662,0x1662,0x1662,0x1662,0x1662,0x1f2, +0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b, +0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x1f5, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1674,0x1674,0x1674,0x1674,0x1674,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, +0x168f,0x168f,0x1692,0x1692,0x1695,0x1686,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb, +0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x1fb,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1686,0x1686,0x1fb,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x168f,0x168f,0x168f, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x16a4,0x16a4,0x16a4,0x16a4,0x201,0x201,0x201, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16aa, +0x16bc,0x16bc,0x16aa,0x16aa,0x16aa,0x16aa,0x207,0x207,0x16bc,0x16bc,0x16bf,0x16bf,0x16aa,0x16aa,0x16bc,0x16b0, +0x16ad,0x16b3,0x16c5,0x16c5,0x16b6,0x16b6,0x16b9,0x16b9,0x16b9,0x16c5,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, +0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1776,0x1776,0x1776,0x1776,0x1773,0x1773,0x207,0x207, 0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, -0x207,0x207,0x207,0x207,0x20a,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad, -0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, -0x20a,0x20a,0x20a,0x20a,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d, -0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, +0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0x20a,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, +0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, 0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, -0x16b3,0x16c2,0x16b9,0x16b6,0x16c8,0x16c8,0x16bc,0x16c8,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x210,0x210,0x210,0x210,0x210,0x210, -0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, -0x16cb,0x16cb,0x16cb,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x16d4, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1965,0x216,0x216,0x1761,0x1761,0x1761, -0x176d,0x176d,0x1761,0x1761,0x1761,0x1761,0x176d,0x1761,0x1761,0x1761,0x1761,0x1764,0x216,0x216,0x216,0x216, -0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x1767,0x1767,0x1773,0x1773,0x1773,0x1767, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16ce,0x16dd,0x16d4,0x16d1, +0x16e3,0x16e3,0x16d7,0x16e3,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x210,0x210,0x210,0x210,0x210,0x210,0x16e9,0x16e9,0x16e9,0x16e9, +0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x213, +0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x16ef,0x178b,0x178b,0x178b,0x178b, +0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, +0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x1980,0x216,0x216,0x177c,0x177c,0x177c,0x1788,0x1788,0x177c,0x177c, +0x177c,0x177c,0x1788,0x177c,0x177c,0x177c,0x177c,0x177f,0x216,0x216,0x216,0x216,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1782,0x1782,0x178e,0x178e,0x178e,0x1782,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,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,0x219,0x219,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, -0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x21f,0x1788,0x1788,0x21f,0x21f, -0x21f,0x21f,0x21f,0x1785,0x1785,0x1785,0x1785,0x1785,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x222, -0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, -0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, -0x178b,0x178e,0x222,0x222,0x222,0x222,0x222,0x222,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed, -0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x225,0x225,0x225,0x225,0x225, -0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x225,0x225,0x225,0x225,0x225, -0x225,0x225,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f, -0x189f,0x189f,0x189f,0x189f,0x228,0x228,0x228,0x228,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, -0x17bb,0x1869,0x1869,0x1869,0x1869,0x1866,0x1869,0x1905,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1869,0x1866, -0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1869,0x1905,0x1905,0x1869,0x1869,0x1869,0x1869,0x1869, -0x1869,0x1869,0x1866,0x1863,0x1866,0x1869,0x1869,0x228,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902, -0x1902,0x1902,0x1902,0x1902,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x228,0x228,0x19e0,0x19e0,0x19e0,0x19e0,0x228, -0x228,0x228,0x19e0,0x228,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x19e3,0x19e3,0x19e3,0x19e3,0x19e0,0x19e6,0x19e6,0x19e0, -0x19e6,0x19e6,0x228,0x228,0x228,0x228,0x228,0x228,0x17b8,0x19e0,0x19e0,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1902,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905, -0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1902,0x1902,0x179d,0x179d,0x179d,0x179d,0x179a,0x179d,0x179d,0x17a0, -0x17a3,0x17a0,0x17a0,0x179d,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, -0x22b,0x22b,0x22b,0x179a,0x179a,0x179a,0x179a,0x179a,0x17f7,0x17f7,0x17f7,0x17f7,0x17ee,0x17ee,0x17ee,0x17e8, -0x17eb,0x17eb,0x17eb,0x22e,0x22e,0x22e,0x22e,0x22e,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, -0x17f4,0x17f4,0x22e,0x22e,0x22e,0x22e,0x17f1,0x17f1,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x231,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x180f,0x17fd,0x17fd,0x17fd,0x17fd, -0x17fd,0x17fd,0x17fd,0x231,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x180f,0x1800,0x1812,0x1815,0x1815,0x1809, -0x1806,0x1806,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x231,0x231,0x231,0x1821,0x1824,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, -0x1818,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x237, -0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, -0x181b,0x237,0x237,0x181b,0x181b,0x181b,0x181b,0x181b,0x186c,0x1908,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, +0x219,0x219,0x219,0x219,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, +0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x21f,0x17a3,0x17a3,0x21f,0x21f,0x21f,0x21f,0x21f,0x17a0, +0x17a0,0x17a0,0x17a0,0x17a0,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x222,0x17a6,0x222,0x17a6,0x17a6, +0x17a6,0x17a6,0x222,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, +0x17a6,0x17a6,0x222,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a9,0x222,0x222, +0x222,0x222,0x222,0x222,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x1608,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, +0x225,0x225,0x225,0x225,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x17ac,0x17ac, +0x17ac,0x17ac,0x17ac,0x17ac,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x228,0x1a85,0x1a85,0x1a88,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d6,0x1884,0x1884,0x1884, +0x1884,0x1884,0x1884,0x1920,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1a85,0x228,0x19fb,0x19fb,0x19fb,0x19fb,0x228,0x228,0x228,0x19fb,0x1a85, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x228,0x228,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x228, +0x228,0x228,0x1a85,0x1a85,0x19fe,0x19fe,0x19fe,0x19fe,0x19fb,0x1a01,0x1a01,0x19fb,0x1a01,0x1a01,0x1a85,0x1a88, +0x1a85,0x1a85,0x1a85,0x1a85,0x17d3,0x19fb,0x19fb,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x228, +0x228,0x1a88,0x1a88,0x1a88,0x191d,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920, +0x1920,0x1920,0x191d,0x191d,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,0x17b8,0x17b8,0x17bb,0x17be,0x17bb,0x17bb,0x17b8, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x17b5, +0x17b5,0x17b5,0x17b5,0x17b5,0x1812,0x1812,0x1812,0x1812,0x1809,0x1809,0x1809,0x1803,0x1806,0x1806,0x1806,0x1a31, +0x22e,0x22e,0x22e,0x22e,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x22e,0x22e, +0x22e,0x22e,0x180c,0x180c,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x231,0x182d,0x182d, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182a,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x231, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x182a,0x181b,0x182d,0x1830,0x1830,0x1824,0x1821,0x1821,0x231,0x231, +0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x231,0x231,0x231,0x183c,0x183f,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x234,0x234,0x234, +0x234,0x234,0x234,0x234,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e, +0x199e,0x199e,0x199e,0x199e,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x237,0x1836,0x1836,0x1836,0x1836, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x237,0x237,0x1836, +0x1836,0x1836,0x1836,0x1836,0x1887,0x1923,0x1a8b,0x1a8e,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, 0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, -0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x23d,0x23d,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, -0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x23d,0x1827,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, -0x181e,0x1827,0x181e,0x181e,0x1827,0x181e,0x181e,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x240,0x240,0x240, -0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, -0x1845,0x1845,0x1836,0x1830,0x1830,0x1845,0x1833,0x1848,0x1848,0x1848,0x1848,0x184b,0x184b,0x183f,0x183c,0x1839, -0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x243,0x183f,0x243,0x1839,0x1968,0x243, +0x23a,0x23a,0x23a,0x23a,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x23d,0x23d,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, +0x1839,0x1839,0x1839,0x1839,0x23d,0x1842,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1842,0x1839,0x1839, +0x1842,0x1839,0x1839,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x1848,0x1848,0x1848,0x1848, +0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x240,0x240,0x240,0x240,0x240,0x240,0x240, +0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x1860,0x1860,0x1851,0x184b, +0x184b,0x1860,0x184e,0x1863,0x1863,0x1863,0x1863,0x1866,0x1866,0x185a,0x1857,0x1854,0x185d,0x185d,0x185d,0x185d, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x243,0x185a,0x243,0x1854,0x1983,0x1a34,0x243,0x243,0x243,0x243, 0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x246,0x246,0x246,0x246,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x246,0x246,0x246,0x246,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, -0x186f,0x186f,0x186f,0x186f,0x186f,0x19e9,0x19e9,0x19e9,0x19e9,0x19e9,0x249,0x249,0x249,0x249,0x249,0x249, -0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, -0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x24c,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x24f,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x252, -0x18ae,0x18ae,0x252,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae, -0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x252, -0x252,0x252,0x18a2,0x252,0x18a2,0x18a2,0x252,0x18a2,0x18a2,0x18a2,0x18a5,0x18a2,0x18a8,0x18a8,0x18b1,0x18a2, -0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab, -0x18ab,0x18ab,0x252,0x252,0x252,0x252,0x252,0x252,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x255,0x255,0x255,0x255,0x18c9,0x18c9,0x18c9,0x18c9,0x258,0x258,0x18cc,0x18cc, -0x18cc,0x18cc,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18c6, -0x18b7,0x18ba,0x18bd,0x18cf,0x18cf,0x196b,0x18c0,0x18c0,0x18de,0x18e1,0x18f0,0x18f0,0x18e1,0x18e4,0x18de,0x18db, -0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x18c9,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18c6, -0x18c6,0x18b4,0x18b4,0x18b4,0x18c9,0x18c9,0x18c9,0x18c9,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,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, -0x1980,0x1980,0x1980,0x1980,0x197d,0x197d,0x197d,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971, -0x197d,0x1977,0x1974,0x197a,0x264,0x264,0x264,0x264,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x267,0x267,0x1983,0x1983,0x1983,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x26a,0x1992, -0x1992,0x26a,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992, -0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x198f,0x198f,0x198f,0x198f,0x198f,0x26a, -0x1986,0x1986,0x26a,0x198f,0x198f,0x1986,0x198f,0x1989,0x1992,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, -0x199b,0x199b,0x199e,0x199e,0x1995,0x1995,0x1995,0x1995,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, -0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a4,0x19a1,0x19a1,0x19a1, -0x19a4,0x19a1,0x19a1,0x19a1,0x19a1,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, +0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x186c,0x186c,0x186c,0x186c, +0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c, +0x246,0x246,0x246,0x246,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869, +0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869, +0x246,0x246,0x246,0x246,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x1a04,0x1a04,0x1a04,0x1a04,0x1a04,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x249,0x249,0x249,0x249, +0x249,0x249,0x249,0x249,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929, +0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929, +0x1929,0x1929,0x1929,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x252,0x18c9,0x18c9,0x252,0x18c9, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x252,0x252,0x252,0x18bd,0x252, +0x18bd,0x18bd,0x252,0x18bd,0x18bd,0x18bd,0x18c0,0x18bd,0x18c3,0x18c3,0x18cc,0x18bd,0x252,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x252,0x252, +0x252,0x252,0x252,0x252,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x255,0x255,0x255,0x255,0x18f9,0x18fc,0x190b,0x190b,0x18fc,0x18ff,0x18f9,0x18f6,0x25e,0x25e,0x25e,0x25e, +0x25e,0x25e,0x25e,0x25e,0x18e4,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18e1,0x18e1,0x18cf,0x18cf,0x18cf, +0x18e4,0x18e4,0x18e4,0x18e4,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, +0x261,0x261,0x261,0x261,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989, +0x1989,0x1989,0x261,0x261,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,0x294,0x294,0x1a9a,0x1a9a,0x1a9a,0x294, +0x294,0x294,0x294,0x294,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, +0x1998,0x1998,0x1998,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x1998,0x1992,0x198f,0x1995, +0x264,0x264,0x264,0x264,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e, +0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x267, +0x267,0x199e,0x199e,0x199e,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x26a,0x19ad,0x19ad,0x26a,0x19ad,0x19ad, 0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad, -0x19ad,0x19ad,0x19ad,0x19a7,0x19a7,0x19aa,0x19aa,0x19b0,0x19b0,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3, -0x19b3,0x19b3,0x19b3,0x19b3,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b9,0x19c2,0x19b6,0x19b6,0x279,0x279,0x279,0x279,0x279, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c8,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c, +0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x26a,0x19a1,0x19a1,0x26a,0x19aa, +0x19aa,0x19a1,0x19aa,0x19a4,0x19ad,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x19b6,0x19b6,0x19b9,0x19b9, +0x19b0,0x19b0,0x19b0,0x19b0,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x19b3,0x19b3,0x19b3,0x19b3, +0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x19bc,0x19bc,0x19bc,0x19bc, +0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bf,0x19bc,0x19bc,0x19bc,0x19bf,0x19bc,0x19bc,0x19bc, +0x19bc,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x19c8,0x19c8,0x19c8,0x19c8, +0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c2, +0x19c2,0x19c5,0x19c5,0x19cb,0x19cb,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce, +0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x19d1,0x19d1,0x19d1,0x19d1, 0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1, -0x19d1,0x19d1,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19ce,0x19ce,0x19ce, -0x19ce,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x190b,0x29d,0x29d,0x29d, -0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x954,0x954,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x18f6,0x18f6,0x18f6,0x18f6, -0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x19da,0x19da,0x19da,0x19da,0x19da,0x288,0x288,0x288,0x288, -0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0xc78,0xc78,0xc78,0xc78, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0x12c0,0x12c0,0x12c0,0x28b,0x28b,0xeac,0xeac,0xeac,0xeac, -0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, -0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,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,0x28b,0x28b,0x28b,0x28b,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0x28e, -0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0x291,0x291,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x294,0x294,0x294, -0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x297,0x297,0x17b5,0x17b5,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, -0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b, -0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x1131,0x396,0x396,0x3a2,0xcba,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a2,0x396,0x396,0x396,0x396,0x396,0x396,0x396, -0x396,0x3a2,0x3a2,0x3a2,0x3a2,0x39c,0x1134,0x1317,0x3a5,0x921,0x924,0x399,0x399,0x1131,0x1314,0x1314, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a5,0x3a5,0x396,0x396,0x8ac,0x8af,0x93f,0x93f, -0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x39f,0xf93,0xf90,0x131a,0x131a,0x131a,0x131a,0x131a, -0x14df,0x1137,0x1137,0xee5,0xee5,0xdb3,0xee5,0xee5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a8,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x1314,0x1317,0x399,0x3a5,0x3a2,0x3a2,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x1320,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x1320,0x1887,0x1887,0xfb1,0x438,0x441,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483, -0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0xba0, -0xba0,0xdbf,0xdbf,0x8b2,0xdc2,0x1401,0x1401,0x1401,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,0x48c,0x48c,0x48c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x48f,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c, -0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c, -0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x498,0x492,0x498,0x492, -0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492, -0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x492,0x492, -0x492,0x492,0x495,0x996,0xfe1,0xfe1,0xfe4,0xfe1,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492, -0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492, -0x498,0x492,0xfe4,0xfe1,0xfe4,0xfe1,0xfe4,0xfe1,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x687,0x687,0x68a,0x4c2,0x696,0x693,0x693,0x690, -0x4ec,0x4ec,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0xac8,0x699,0x4ce,0x6b1,0x6b4,0x4e3,0x699,0x4d1,0x4d1, -0x4c2,0x4dd,0x4dd,0x687,0x4e9,0x4e6,0x68d,0x4bc,0x4b3,0x4b3,0x4b6,0x4b6,0x4b6,0x4b6,0x4b6,0x4b9, -0x4b6,0x4b6,0x4b6,0x4ad,0x4f5,0x4f2,0x4ef,0x4ef,0x6a5,0x4d7,0x4d4,0x6a2,0x69f,0x69c,0x6ae,0x4c5, -0x6ab,0x6ab,0x4da,0x4dd,0x6a8,0x6a8,0x4da,0x4dd,0x4bf,0x4c2,0x4c2,0x4c2,0x4e0,0x4cb,0x4c8,0xbb5, -0xace,0xad1,0xacb,0xacb,0xacb,0xacb,0xbac,0xbac,0xbac,0xbac,0xbb2,0xce7,0xce4,0xdce,0xdd1,0xbaf, -0xdd1,0xdd1,0xdd1,0xdd1,0xdce,0xdd1,0xdd1,0xba9,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x516, -0x51c,0x735,0x519,0x999,0x9ba,0xad4,0xad4,0xad4,0xbbb,0xbbb,0xdd7,0xdd7,0xdd7,0xdd7,0x1155,0x1158, -0x1158,0x1335,0x14cd,0x14f7,0x14fa,0x14fa,0x170d,0x188a,0x528,0x528,0x540,0x6c3,0x525,0x6c0,0x528,0x53d, -0x525,0x6c3,0x537,0x540,0x540,0x540,0x537,0x537,0x540,0x540,0x540,0x6cc,0x525,0x540,0x6c6,0x525, -0x534,0x540,0x540,0x540,0x540,0x540,0x525,0x525,0x52b,0x6c0,0x6c9,0x525,0x540,0x525,0x6cf,0x525, -0x540,0x52e,0x546,0x6d2,0x540,0x540,0x531,0x537,0x540,0x540,0x543,0x540,0x537,0x53a,0x53a,0x53a, -0x53a,0xae0,0xadd,0xcea,0xde0,0xbd0,0xbd3,0xbd3,0xbcd,0xbca,0xbca,0xbca,0xbca,0xbd3,0xbd0,0xbd0, -0xbd0,0xbd0,0xbc7,0xbca,0xddd,0xef1,0xef4,0xfea,0x115b,0x115b,0x115b,0x6d8,0x6d5,0x549,0x54c,0x54c, -0x54c,0x54c,0x54c,0x6d5,0x6d8,0x6d8,0x6d5,0x54c,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de, -0x6de,0x6de,0x6de,0x6de,0x555,0x555,0x555,0x555,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db, -0x6db,0x6db,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b, -0x558,0x561,0x561,0x55b,0x55b,0x55b,0x55e,0x558,0x55b,0x55b,0x558,0x558,0x558,0x558,0x55b,0x55b, -0x6e1,0x6e1,0x558,0x558,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b, -0x55b,0x55e,0x55e,0x55e,0x55b,0x55b,0x6e4,0x55b,0x6e4,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b, -0x558,0x55b,0x558,0x558,0x558,0x558,0x558,0x558,0x55b,0x55b,0x558,0x6e1,0x558,0x558,0x558,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, -0xbd6,0xbd6,0xbd6,0xbd6,0x6ea,0x564,0x6ea,0x6ea,0x567,0x564,0x564,0x6ea,0x6ea,0x567,0x564,0x6ea, -0x567,0x564,0x564,0x6ea,0x564,0x6ea,0x573,0x570,0x564,0x6ea,0x564,0x564,0x564,0x564,0x6ea,0x564, -0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x6ea,0x567,0x6ea,0x567,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea, -0x6f0,0x56a,0x6ea,0x56a,0x56a,0x564,0x564,0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x564,0x564, -0x6ea,0x6ea,0x564,0x564,0x564,0x567,0x564,0x564,0x567,0x564,0x564,0x567,0x6ea,0x567,0x564,0x564, -0x6ea,0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x564,0x564,0x564,0x564,0x6ed,0x6ea,0x567,0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x6ea,0x6ea, -0x564,0x567,0x6ed,0x6ed,0x567,0x567,0x564,0x564,0x567,0x567,0x564,0x564,0x567,0x567,0x564,0x564, -0x564,0x564,0x564,0x564,0x567,0x567,0x6ea,0x6ea,0x567,0x567,0x6ea,0x6ea,0x567,0x567,0x564,0x564, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x6ea,0x564,0x564, -0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x564,0x564,0x564,0x567,0x567,0x567,0x567, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x6ea, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x567,0x567,0x567,0x567,0x564,0x564,0x564,0x564,0x564,0x564,0x567,0x567,0x567,0x567,0x564,0x56d, -0x564,0x564,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, -0x576,0xae9,0x576,0x576,0x576,0x576,0x576,0x576,0x582,0x57f,0x582,0x57f,0x576,0x576,0x576,0x576, -0x576,0x576,0x6f3,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x7f8,0x7f8,0x576,0x576,0x576,0x576, -0x57c,0x57c,0x576,0x576,0x576,0x576,0x576,0x576,0x579,0x7fe,0x7fb,0x576,0x576,0x576,0x576,0x576, -0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576, -0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0xae9, -0xbdf,0xae9,0xae9,0xae9,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x585,0x585,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x58b,0xc48, -0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48, -0xc48,0xc48,0xc48,0xd62,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x58e,0x591,0x591,0x591,0x591,0x591,0x591,0x591, -0x591,0x591,0x591,0x591,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x591,0x591,0x591,0x591,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708, -0x708,0x708,0x708,0x708,0x594,0x594,0x708,0x708,0x708,0x708,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0xbe2,0xbe2,0x70e,0x70e,0x597,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x59a,0x59a, -0x597,0x597,0x59d,0x59d,0x59d,0x59d,0x70e,0x70e,0x59d,0x59d,0x711,0x70e,0x597,0x597,0x597,0x597, -0x70e,0x70e,0x59d,0x59d,0x711,0x70e,0x597,0x597,0x597,0x597,0x70e,0x70e,0x70b,0x597,0x59d,0x70e, -0x597,0x597,0x70b,0x70e,0x70e,0x70e,0x59d,0x59d,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, -0x597,0x597,0x597,0x597,0x597,0x597,0x70e,0x70b,0x70e,0x70b,0x597,0x59d,0x59d,0x59d,0x59d,0x59d, -0x59d,0x597,0x597,0x70b,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xbe5,0xbe5,0xbe5,0xbe8, -0xbe8,0xc63,0xc63,0xbe5,0x5ac,0x5ac,0x5ac,0x5ac,0x5a9,0x723,0x720,0x5a3,0x5a3,0x714,0x5a3,0x5a3, -0x5a3,0x5a3,0x71a,0x714,0x5a3,0x5a9,0x5a3,0x5a0,0xd6b,0xd6b,0xbee,0xbee,0xdec,0xaf5,0x5a6,0x5a6, -0x717,0x5af,0x717,0x5a6,0x5a9,0x5a3,0x5a9,0x5a9,0x5a3,0x5a3,0x5a9,0x5a3,0x5a3,0x5a3,0x5a9,0x5a3, -0x5a3,0x5a3,0x5a9,0x5a9,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a9,0x5ac,0x5ac,0x5a6, -0x5a3,0x5a3,0x5a3,0x5a3,0x726,0x5a3,0x726,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x801,0x801,0x801,0x801, -0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a9,0x726,0x723,0x5b2,0x726,0x714,0x71a,0x5a9,0x714,0x71d,0x714,0x714,0x5a3, -0x714,0x723,0x5b2,0x723,0xaf5,0xaf5,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4, -0xbf1,0xbf1,0xde9,0xea3,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0x13bf,0x13bf,0x13bf,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x1503,0x5c4,0x5cd,0x5c4,0x5c4,0x13bf,0x5b8,0x5b8,0x5cd,0x5cd,0x13c2,0x13c2, -0x5d0,0x5d0,0x5c1,0x5c7,0x5c1,0x5c1,0x5c7,0x5b8,0x5c7,0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5c7,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x72c,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5c7,0x5b8,0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,0x5b8,0x13bf,0x5b8, -0x5b8,0x5b8,0x5b8,0x13bf,0x13bf,0x13bf,0x5b8,0x12ba,0x5b8,0x5b8,0x5b8,0x5be,0x5be,0x5be,0x5be,0x1341, -0x1341,0x5b8,0x5bb,0x5ca,0x5cd,0x5c1,0x5c1,0x5c1,0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7, -0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729, -0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4, -0x5f4,0x5f4,0x5f4,0x5f4,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5f1,0x5f7,0x5e8,0x5eb, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5ee,0x5ee, -0x5ee,0x5ee,0x5ee,0x5ee,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa, -0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x1344,0x1344, -0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x5f7,0x5f1,0x5f7,0x5f1, -0x5f7,0x5f1,0x5f4,0x5fa,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1, -0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5f7,0x5f1,0x5f4,0x5f7,0x5f1,0x5f4,0x5fa,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f1,0x5f4, -0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f4, -0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f4,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4, -0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4, -0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5fa, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, -0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5fd,0x5fd,0x5fd,0x5fd,0xff6,0xff6,0xff6,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1713,0x1713, -0x85e,0x864,0x864,0x870,0x870,0x861,0x858,0x861,0x858,0x861,0x858,0x861,0x858,0x861,0x858,0x861, -0x60c,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x60c, -0x606,0x609,0x60f,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x6f9,0x6f9,0x6f9,0x6f9, -0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9, -0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6, -0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6, -0x6f6,0x6f6,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x702,0x6ff, -0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6fc,0x6fc,0x6fc,0x6fc, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x72f,0x72f,0x72f,0x72f, -0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f, -0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0xc51,0x8c4,0x8be,0x8bb, -0x8c1,0x8b8,0x744,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x8ca,0x744,0x744,0x744, -0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744, -0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x8c7,0x8c7, -0x74a,0x8d9,0x8dc,0x8e2,0x804,0x810,0x8f7,0x80d,0x8d0,0x8cd,0x8d0,0x8cd,0x8d6,0x8d3,0x8d6,0x8d3, -0x8d0,0x8cd,0x80a,0x8e2,0x8d0,0x8cd,0x8d0,0x8cd,0x8d0,0x8cd,0x8d0,0x8cd,0x8e5,0x8ee,0x8eb,0x8eb, -0x750,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786, -0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x753,0x76e,0x74d,0x774,0x777, -0x771,0x789,0x789,0x789,0x789,0x789,0x789,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, -0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x753,0x76e,0x74d,0x76e,0xc54, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x7f5,0x80a,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, -0x80d,0x80d,0x92d,0x92d,0x92d,0x92d,0x813,0x813,0x8e8,0x8f4,0x8f4,0x8f4,0x8f4,0x8f1,0x807,0x8df, -0xb19,0xb19,0xb19,0xc66,0xc84,0xc81,0xb34,0x8b5,0x819,0x816,0x819,0x81c,0x816,0x819,0x816,0x819, -0x816,0x819,0x816,0x816,0x816,0x816,0x816,0x816,0x819,0x819,0x816,0x819,0x819,0x816,0x819,0x819, -0x816,0x819,0x819,0x816,0x819,0x819,0x816,0x816,0xc87,0x82b,0x825,0x82b,0x825,0x82b,0x825,0x82b, -0x825,0x82b,0x825,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825, -0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x82b,0x825,0x828,0x825,0x828, -0x825,0x828,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x828,0x825,0x828,0x828,0x825,0x828,0x828, -0x825,0x828,0x828,0x825,0x828,0x828,0x825,0x825,0x825,0x825,0x825,0x82b,0x825,0x82b,0x825,0x82b, -0x825,0x825,0x825,0x825,0x825,0x825,0x82b,0x825,0x825,0x825,0x825,0x825,0x828,0x82b,0x82b,0x828, -0x828,0x828,0x828,0x8fd,0x900,0x82e,0x831,0xc6f,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x83a,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843, -0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843, -0xd74,0xd74,0xea6,0x83d,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909, -0xd6e,0xd6e,0xd6e,0xd6e,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x849,0x849,0x849,0x849,0x849,0x849,0xd77,0xd77,0xd77,0xd77,0x915, -0x915,0x915,0x915,0x915,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0x849,0x849,0x849,0x849,0x849,0x849,0xd77,0xd77,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9, -0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0x1119,0x1119,0x1119,0x1119,0x852,0x852,0x852,0x852, +0x19d1,0x19d1,0x19d1,0x19d4,0x19dd,0x19d1,0x19d1,0x279,0x279,0x279,0x279,0x279,0x19e0,0x19e0,0x19e0,0x19e0, +0x19e0,0x19e0,0x19e0,0x19e3,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x19ec,0x19ec,0x19ec,0x19ec, +0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19e6,0x19e6, +0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e9,0x19e9,0x19e9,0x19e9,0x19ef,0x19ef,0x19ef, +0x19ef,0x19ef,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x285, +0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55, +0x288,0x288,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55, +0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a52,0x1a52,0x1a52,0x1a49,0x1a49,0x1a49,0x1a49, +0x288,0x288,0x1a49,0x1a49,0x1a52,0x1a52,0x1a52,0x1a52,0x1a4c,0x1a55,0x1a4f,0x1a55,0x1a52,0x288,0x288,0x288, +0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288, +0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x28b,0x28b,0x28b,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a64,0x1a64,0x28b,0x28b,0x28e,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67, +0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67, +0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x28e,0x28e,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1a94,0x1a94,0x1a94,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1a97,0x1a97,0x1a97,0x1a97, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,0x294,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, +0x1a70,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1a6d, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a73,0x1a73,0x1a73,0x1a73, +0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x29a,0x29a,0x29a,0x29a,0x29a,0x1a76, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x1926,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x972,0x972, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x19f5,0x19f5,0x19f5,0x19f5,0x19f5, +0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x12d8,0x12d8,0x12d8,0x2a6,0x2a6, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,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,0x2a6,0x2a6,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0x2ac,0x2ac,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,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,0x2b2,0x2b2,0x17d0,0x17d0,0x2b5,0x2b5, +0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1926,0x1926,0x1926,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x3c0,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3c0,0x3c0,0x3c0,0x3c0,0x3ba,0x114c,0x1332,0x3c3,0x93c,0x93f,0x3b1, +0x3b1,0x1149,0x132f,0x132f,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x1149,0x3b4,0x3b4,0x3c0, +0xcd8,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3, +0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3b4,0x3b4, +0x8c7,0x8ca,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x3bd,0xfae,0xfab,0x1335, +0x1335,0x1335,0x1335,0x1335,0x14fa,0x114f,0x114f,0xf00,0xf00,0xdd1,0xf00,0xf00,0x3c3,0x3c3,0x3c3,0x3c3, +0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c6,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c6,0x3c3,0x3c3, +0x3c6,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x132f,0x1332,0x3b7,0x3c3,0x3c0,0x3c0,0x462,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x133b,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x462,0x133b,0x18a2,0x18a2,0xfcc,0x453,0x45c,0x49e,0x49e,0x49e,0x49e, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e, +0x49e,0x49e,0x49e,0xbbe,0xbbe,0xddd,0xddd,0x8cd,0xde0,0x141c,0x141c,0x141c,0x4a1,0x4a1,0x4a1,0x4a1, +0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1, +0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a7,0x4a7,0x4a7,0x1164, +0x1164,0x1164,0x1164,0x1164,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, +0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, +0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x4aa,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4b0,0x9b4,0xff9,0xff9,0xffc,0xff9,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0xffc,0xff9,0xffc,0xff9,0xffc,0xff9,0x4bf,0x4bf,0x4bf,0x4bf, +0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bf,0x4bf,0x4bf,0x4bf, +0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x6a2,0x6a2,0x6a5,0x4dd, +0x6b1,0x6ae,0x6ae,0x6ab,0x507,0x507,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xb4f,0x6b4,0x4e9,0x6cc,0x6cf, +0x4fe,0x6b4,0x4ec,0x4ec,0x4dd,0x4f8,0x4f8,0x6a2,0x504,0x501,0x6a8,0x4d7,0x4ce,0x4ce,0x4d1,0x4d1, +0x4d1,0x4d1,0x4d1,0x4d4,0x4d1,0x4d1,0x4d1,0x4c8,0x510,0x50d,0x50a,0x50a,0x6c0,0x4f2,0x4ef,0x6bd, +0x6ba,0x6b7,0x6c9,0x4e0,0x6c6,0x6c6,0x4f5,0x4f8,0x6c3,0x6c3,0x4f5,0x4f8,0x4da,0x4dd,0x4dd,0x4dd, +0x4fb,0x4e6,0x4e3,0xbd3,0xae9,0xaec,0xae6,0xae6,0xae6,0xae6,0xbca,0xbca,0xbca,0xbca,0xbd0,0xd05, +0xd02,0xdec,0xdef,0xbcd,0xdef,0xdef,0xdef,0xdef,0xdec,0xdef,0xdef,0xbc7,0x534,0x534,0x534,0x534, +0x534,0x534,0x534,0x531,0x537,0x750,0x534,0x9b7,0x9d8,0xaef,0xaef,0xaef,0xbd9,0xbd9,0xdf5,0xdf5, +0xdf5,0xdf5,0x116d,0x1170,0x1170,0x1350,0x14e8,0x1512,0x1515,0x1515,0x1728,0x18a5,0x543,0x543,0x55b,0x6de, +0x540,0x6db,0x543,0x558,0x540,0x6de,0x552,0x55b,0x55b,0x55b,0x552,0x552,0x55b,0x55b,0x55b,0x6e7, +0x540,0x55b,0x6e1,0x540,0x54f,0x55b,0x55b,0x55b,0x55b,0x55b,0x540,0x540,0x546,0x6db,0x6e4,0x540, +0x55b,0x540,0x6ea,0x540,0x55b,0x549,0x561,0x6ed,0x55b,0x55b,0x54c,0x552,0x55b,0x55b,0x55e,0x55b, +0x552,0x555,0x555,0x555,0x555,0xafb,0xaf8,0xd08,0xdfe,0xbee,0xbf1,0xbf1,0xbeb,0xbe8,0xbe8,0xbe8, +0xbe8,0xbf1,0xbee,0xbee,0xbee,0xbee,0xbe5,0xbe8,0xdfb,0xf0c,0xf0f,0x1002,0x1173,0x1173,0x1173,0x6f3, +0x6f0,0x564,0x567,0x567,0x567,0x567,0x567,0x6f0,0x6f3,0x6f3,0x6f0,0x567,0x6f9,0x6f9,0x6f9,0x6f9, +0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x570,0x570,0x570,0x570,0x6f6,0x6f6,0x6f6,0x6f6, +0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x576,0x576,0x576,0x576, +0x576,0x576,0x576,0x576,0x573,0x57c,0x57c,0x576,0x576,0x576,0x579,0x573,0x576,0x576,0x573,0x573, +0x573,0x573,0x576,0x576,0x6fc,0x6fc,0x573,0x573,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576, +0x576,0x576,0x576,0x576,0x576,0x579,0x579,0x579,0x576,0x576,0x6ff,0x576,0x6ff,0x576,0x576,0x576, +0x576,0x576,0x576,0x576,0x573,0x576,0x573,0x573,0x573,0x573,0x573,0x573,0x576,0x576,0x573,0x6fc, +0x573,0x573,0x573,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x705,0x57f,0x705,0x705,0x582,0x57f,0x57f,0x705, +0x705,0x582,0x57f,0x705,0x582,0x57f,0x57f,0x705,0x57f,0x705,0x58e,0x58b,0x57f,0x705,0x57f,0x57f, +0x57f,0x57f,0x705,0x57f,0x57f,0x705,0x705,0x705,0x705,0x57f,0x57f,0x705,0x582,0x705,0x582,0x705, +0x705,0x705,0x705,0x705,0x70b,0x585,0x705,0x585,0x585,0x57f,0x57f,0x57f,0x705,0x705,0x705,0x705, +0x57f,0x57f,0x57f,0x57f,0x705,0x705,0x57f,0x57f,0x57f,0x582,0x57f,0x57f,0x582,0x57f,0x57f,0x582, +0x705,0x582,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x708,0x705,0x582,0x57f,0x705,0x705,0x705,0x705, +0x57f,0x57f,0x705,0x705,0x57f,0x582,0x708,0x708,0x582,0x582,0x57f,0x57f,0x582,0x582,0x57f,0x57f, +0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x705,0x705,0x582,0x582,0x705,0x705, +0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f, +0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x582,0x582,0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582, +0x582,0x582,0x57f,0x588,0x57f,0x57f,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0x591,0xb04,0x591,0x591,0x591,0x591,0x591,0x591,0x59d,0x59a,0x59d,0x59a, +0x591,0x591,0x591,0x591,0x591,0x591,0x70e,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x813,0x813, +0x591,0x591,0x591,0x591,0x597,0x597,0x591,0x591,0x591,0x591,0x591,0x591,0x594,0x819,0x816,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0xb04,0xbfd,0xb04,0xb04,0xb04,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, +0x717,0x717,0x5a6,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66, +0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xd80,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x5a9,0x5ac,0x5ac,0x5ac, +0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x5ac,0x5ac,0x5ac,0x5ac,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x5af,0x5af,0x723,0x723,0x723,0x723,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0x729,0x729,0x5b2,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x5b5,0x5b5,0x5b2,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x729,0x729,0x5b8,0x5b8,0x72c,0x729, +0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x729,0x5b8,0x5b8,0x72c,0x729,0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x729, +0x726,0x5b2,0x5b8,0x729,0x5b2,0x5b2,0x726,0x729,0x729,0x729,0x5b8,0x5b8,0x5b2,0x5b2,0x5b2,0x5b2, +0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x726,0x729,0x726,0x5b2,0x5b8, +0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b2,0x5b2,0x726,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, +0xc03,0xc03,0xc03,0xc06,0xc06,0xc81,0xc81,0xc03,0x5c7,0x5c7,0x5c7,0x5c7,0x5c4,0x73e,0x73b,0x5be, +0x5be,0x72f,0x5be,0x5be,0x5be,0x5be,0x735,0x72f,0x5be,0x5c4,0x5be,0x5bb,0xd89,0xd89,0xc0c,0xc0c, +0xe0a,0xb10,0x5c1,0x5c1,0x732,0x5ca,0x732,0x5c1,0x5c4,0x5be,0x5c4,0x5c4,0x5be,0x5be,0x5c4,0x5be, +0x5be,0x5be,0x5c4,0x5be,0x5be,0x5be,0x5c4,0x5c4,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, +0x5c4,0x5c7,0x5c7,0x5c1,0x5be,0x5be,0x5be,0x5be,0x741,0x5be,0x741,0x5be,0x5be,0x5be,0x5be,0x5be, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x5be,0x5be,0x5be,0x5be, +0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5c4,0x741,0x73e,0x5cd,0x741,0x72f,0x735,0x5c4,0x72f, +0x738,0x72f,0x72f,0x5be,0x72f,0x73e,0x5cd,0x73e,0xb10,0xb10,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, +0xc0f,0xc0f,0xc0f,0xc12,0xc0f,0xc0f,0xe07,0xebe,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x13da,0x13da,0x13da, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x151e,0x5df,0x5e8,0x5df,0x5df,0x13da,0x5d3,0x5d3, +0x5e8,0x5e8,0x13dd,0x13dd,0x5eb,0x5eb,0x5dc,0x5e2,0x5dc,0x5dc,0x5e2,0x5d3,0x5e2,0x5d3,0x5e2,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x747,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3, +0x13da,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x13da,0x13da,0x5d3,0x12d2,0x5d3,0x5d3,0x5d3,0x5d9, +0x5d9,0x5d9,0x5d9,0x135c,0x135c,0x5d3,0x5d6,0x5e5,0x5e8,0x5dc,0x5dc,0x5dc,0xc18,0xc15,0xc18,0xc15, +0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0x744,0x744,0x744,0x744,0x744,0x744, +0x744,0x744,0x744,0x744,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x13da,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, +0x60c,0x612,0x603,0x606,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, +0x612,0x612,0x609,0x609,0x609,0x609,0x609,0x609,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x612,0x60c,0x60f,0x615,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x612,0x60c,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, +0x612,0x60c,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x60f,0x615,0x612,0x60c,0x612,0x60c,0x612,0x60c, +0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x60f,0x612,0x60c,0x60f,0x612,0x60c,0x60f,0x615, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60f,0x60f,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c, +0x60f,0x60c,0x60f,0x60f,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60c,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x60f,0x60f,0x60f,0x615,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, +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,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x618,0x618,0x618,0x618,0x100e,0x100e,0x100e,0x1521,0x1521,0x1521,0x1521,0x1521, +0x1521,0x1521,0x172e,0x172e,0x879,0x87f,0x87f,0x88b,0x88b,0x87c,0x873,0x87c,0x873,0x87c,0x873,0x87c, +0x873,0x87c,0x873,0x87c,0x627,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x624, +0x62a,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714, +0x714,0x714,0x714,0x714,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, +0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, +0x711,0x711,0x711,0x711,0x711,0x711,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, +0x71a,0x71a,0x71d,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, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a, +0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a, +0xc6f,0x8df,0x8d9,0x8d6,0x8dc,0x8d3,0x75f,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762, +0x8e5,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x8e2,0x8e2,0x765,0x8f4,0x8f7,0x8fd,0x81f,0x82b,0x912,0x828,0x8eb,0x8e8,0x8eb,0x8e8, +0x8f1,0x8ee,0x8f1,0x8ee,0x8eb,0x8e8,0x825,0x8fd,0x8eb,0x8e8,0x8eb,0x8e8,0x8eb,0x8e8,0x8eb,0x8e8, +0x900,0x909,0x906,0x906,0x76b,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x76e, +0x789,0x768,0x78f,0x792,0x78c,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x79e,0x79e,0x79e,0x79e,0x79e, +0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x76e, +0x789,0x768,0x789,0xc72,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x810,0x825,0x828,0x828,0x828, +0x828,0x828,0x828,0x828,0x828,0x828,0x948,0x948,0x948,0x948,0x82e,0x82e,0x903,0x90f,0x90f,0x90f, +0x90f,0x90c,0x822,0x8fa,0xb34,0xb34,0xb34,0xc84,0xca2,0xc9f,0xb52,0x8d0,0x834,0x831,0x834,0x837, +0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x831,0x831,0x831,0x831,0x831,0x834,0x834,0x831,0x834, +0x834,0x831,0x834,0x834,0x831,0x834,0x834,0x831,0x834,0x834,0x831,0x831,0xca5,0x846,0x840,0x846, +0x840,0x846,0x840,0x846,0x840,0x846,0x840,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840, +0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x846, +0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x840,0x840,0x840,0x840,0x840,0x843,0x843,0x840,0x843, +0x843,0x840,0x843,0x843,0x840,0x843,0x843,0x840,0x843,0x843,0x840,0x840,0x840,0x840,0x840,0x846, +0x840,0x846,0x840,0x846,0x840,0x840,0x840,0x840,0x840,0x840,0x846,0x840,0x840,0x840,0x840,0x840, +0x843,0x846,0x846,0x843,0x843,0x843,0x843,0x918,0x91b,0x849,0x84c,0xc8d,0x852,0x852,0x852,0x852, 0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, -0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,0x855, -0x852,0x855,0x852,0x855,0x855,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855, -0x852,0x855,0x852,0x855,0x855,0x852,0x852,0x855,0x855,0x855,0x852,0x852,0x852,0x852,0x14be,0x14be, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78, -0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909, -0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909, -0x12f6,0x12f6,0x12f6,0x12f6,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0xd6e,0xc72,0xc72,0xc72, -0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90f,0x90c,0x90f,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72, -0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0xd77,0x990,0x972,0x972,0x972,0x972,0x96c,0x972,0x972, -0x984,0x972,0x972,0x96f,0x97b,0x981,0x981,0x981,0x981,0x981,0x984,0x96c,0x978,0x96c,0x96c,0x96c, -0x963,0x963,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987, -0x987,0x987,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96f,0x963,0x96c,0x963, -0x96c,0x963,0x97e,0x975,0x97e,0x975,0x98d,0x98d,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, -0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, -0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2, -0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2, -0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9a5,0x9a5,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9a8,0x9a8,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x9b4,0x9b4,0x9b4,0x9b1,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0xa41,0xa41,0xfdb,0xa41,0xa41,0xa41,0xa44,0xa41,0xfdb,0xa41,0xa41,0xfd2,0xa3b,0xa2f,0xa2f,0xa2f, -0xa2f,0xa3e,0xa2f,0xfc0,0xfc0,0xfc0,0xa2f,0xa32,0xa3b,0xa35,0xfc6,0xfd5,0xfd5,0xfc0,0xfc0,0xfdb, -0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa47,0xa47,0xa38,0xa38,0xa38,0xa38, -0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa3e,0xa3e,0xa2f,0xa2f,0xfdb,0xfdb,0xfdb,0xfdb,0xfc0,0xfc0, -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,0xdcb,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,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa5f,0xa65,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x114f,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,0xa62,0xa62,0xa62, -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, -0xa9b,0xa9b,0xa9b,0xa9e,0xa9e,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, -0xa9b,0xa9b,0xa9b,0xa9b,0xa83,0xa83,0xa98,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa98,0xa98, -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, -0xabc,0xabc,0xabc,0xabc,0xabc,0xaa7,0xaa7,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,0xabc,0xabc,0xabc,0xabc,0xabf,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,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xaec,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,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,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb25,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb28,0xb28,0xc75,0xc75,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xc75,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x1509, -0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xcff,0xcff,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,0xcfc,0xcfc,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d, -0xd4d,0xd4d,0xd4d,0xd4d,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,0xb52,0xb52, -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,0xb64,0xb64,0xb64,0xb64,0xb64,0xb5b,0xb67,0xb6d,0xb6d,0xb6d,0xb61,0xb61, -0xb61,0xb6a,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb64,0xb64,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb6d,0xb6d,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x1716,0x1716, -0xb79,0xb70,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb70,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb70,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb70,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb70,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,0x852,0x852,0x852, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e, +0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e, +0x85e,0x85e,0x85e,0x85e,0xd92,0xd92,0xec1,0x858,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0xd8c,0xd8c,0xd8c,0xd8c,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x1aa3,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x864,0x864,0x864,0x864,0x864,0x864,0xd95, +0xd95,0xd95,0xd95,0x930,0x930,0x930,0x930,0x930,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,0x864,0x864,0x864,0x864,0x864,0x864,0xd95,0xd95,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,0x867,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,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,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4, +0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0x1131,0x1131,0x1131,0x1131, +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, +0x86d,0x86d,0x870,0x870,0x86d,0x870,0x86d,0x870,0x870,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, +0x86d,0x86d,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x870,0x86d,0x86d,0x870,0x870,0x870,0x86d,0x86d, +0x86d,0x86d,0x14d9,0x14d9,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x1311,0x1311,0x1311,0x1311,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, +0xd8c,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x92a,0x927,0x92a,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xc90,0xc90,0xc90, +0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0xd95,0x9ae,0x990,0x990,0x990, +0x990,0x98a,0x990,0x990,0x9a2,0x990,0x990,0x98d,0x999,0x99f,0x99f,0x99f,0x99f,0x99f,0x9a2,0x98a, +0x996,0x98a,0x98a,0x98a,0x981,0x981,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x9a5,0x9a5,0x9a5,0x9a5, +0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98d,0x981,0x98a,0x981,0x98a,0x981,0x99c,0x993,0x99c,0x993,0x9ab,0x9ab,0x9ba,0x9ba,0x9ba,0x9ba, +0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, +0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,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,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,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,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,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,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9cf,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0xa5f,0xa5f,0xff3,0xa5f,0xa5f,0xa5f,0xa62,0xa5f,0xff3,0xa5f,0xa5f,0xfea, +0xa59,0xa4d,0xa4d,0xa4d,0xa4d,0xa5c,0xa4d,0xfdb,0xfdb,0xfdb,0xa4d,0xa50,0xa59,0xa53,0xfe1,0xfed, +0xfed,0xfdb,0xfdb,0xff3,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xa65,0xa65, +0xa56,0xa56,0xa56,0xa56,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5c,0xa5c,0xa4d,0xa4d,0xff3,0xff3, +0xff3,0xff3,0xfdb,0xfdb,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, +0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, +0xa5f,0xa5f,0xa5f,0xa5f,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +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, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7d,0xa83,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a, +0x1167,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95, +0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95, +0xa95,0xa95,0xa95,0xa95,0xab9,0xab9,0xab9,0xabc,0xabc,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xaa1,0xaa1,0xab6,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0xab6,0xab6,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xada,0xada,0xada,0xada,0xada,0xac5,0xac5,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xadd, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb07,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,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,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,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,0xc93,0xc93,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc93,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, +0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, +0xb67,0xb67,0xb67,0x1524,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xd1d,0xd1d,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,0xd1a,0xd1a,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,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,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, 0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,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,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdc,0xbdf,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc, -0xbdc,0xbdc,0xbdc,0xced,0xcf0,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3, -0xefd,0xefd,0xefd,0xefd,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbeb,0xbeb,0xbeb,0xbeb,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf6,0xcf6,0xde9,0xea0,0xde9,0xde9,0xde9,0xde9,0xde6,0xde9,0xde6,0xde9, -0xde9,0xff0,0x128a,0x128a,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf8,0xdf5,0xf0f,0xf0f,0xf0f,0xf0f,0x1407, -0x1002,0x1407,0x134d,0x134d,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27, -0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc5a,0xc57,0xc5a,0xc57,0xc5a,0xc57,0x1113,0x1110,0x1008,0x1005, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc30,0xc30,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc33,0xc33,0xc39, -0xc36,0xc60,0xc5d,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39, -0xc36,0xc39,0xc36,0xc39,0xc36,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc39,0xc36,0xc39,0xc36,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc39,0xc36,0xc33,0xc33,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc42,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc42,0xc42,0xc42,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3f,0xc3c,0xc3c,0xc3c, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78, -0xcf9,0xd68,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xea0,0xea0,0xde6,0xde6,0xde6,0xde6, -0xde9,0xde9,0xf00,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0x12b7,0x12b7,0x128d, -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, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd23,0xd23,0xd23,0xd23,0xd23,0xd20,0xd35,0xd35,0xd35,0xd2f, -0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd2f,0xd35,0xd35,0xd35,0xd35, -0xd29,0xd29,0xd32,0xd32,0xd32,0xd32,0xd26,0xd26,0xd26,0xd26,0xd26,0xd2c,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfb,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd2f,0xd35, -0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd29,0xd29,0xd29, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd38,0xd38,0xd38,0xd38,0xd38,0xd3b,0xd3b,0xd3b,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xe01,0xe01, -0xe01,0xe01,0xe01,0xe01,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0x111c,0x111c,0x100b,0x100b,0x100b, -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, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d, -0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d, -0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59, -0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,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,0xd65,0xd65, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, -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,0xe0d, -0xecd,0xecd,0xe1f,0xe1f,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0x1017,0x1017,0x1017,0x1017,0x1017, -0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014, -0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b, -0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b, -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, -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,0xe40,0xe40,0xe40,0xe40,0xe40, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb82,0xb82,0xb82,0xb82,0xb82,0xb79,0xb85,0xb8b, +0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb88,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb76,0xb76,0xb76,0xb76,0xb76, +0xb76,0xb76,0xb76,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb82,0xb82,0xb8b,0xb8b,0xb8b,0xb7f, +0xb7f,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb8b,0xb8b, +0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb82, +0xb82,0xb82,0xb82,0xb82,0xb82,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0x1731,0x1731,0xb97,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,0xb8e, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb8e, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb8e,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,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,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,0xb97,0xb97,0xb97,0xb97, +0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a, +0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a, +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, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xd0b,0xd0e,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01, +0xe01,0xe01,0xe01,0xe01,0xf18,0xf18,0xf18,0xf18,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc09,0xc09, +0xc09,0xc09,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd14,0xd14,0xe07,0xebb,0xe07,0xe07,0xe07,0xe07, +0xe04,0xe07,0xe04,0xe07,0xe07,0x1008,0x12a2,0x12a2,0xe10,0xe10,0xe10,0xe10,0xe10,0xe16,0xe13,0xf2a, +0xf2a,0xf2a,0xf2a,0x1422,0x101a,0x1422,0x1368,0x1368,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc78,0xc75,0xc78,0xc75,0xc78,0xc75, +0x112b,0x1128,0x1020,0x101d,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48, +0xc48,0xc48,0xc48,0xc48,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,0xc4e,0xc4e,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc51,0xc51,0xc51,0xc57,0xc54,0xc7e,0xc7b,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57, +0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc57,0xc54,0xc57,0xc54, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc57,0xc54,0xc51,0xc51, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc60,0xc5a,0xc5a,0xc5a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc60,0xc60,0xc60,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc5d,0xc5a,0xc5a,0xc5a,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0xd17,0xd86,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xebb,0xebb, +0xe04,0xe04,0xe04,0xe04,0xe07,0xe07,0xf1b,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008, +0x1008,0x12cf,0x12cf,0x12a5,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, +0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, +0xd3b,0xd3b,0xd3b,0xd3b,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd41,0xd41,0xd41,0xd41,0xd41,0xd3e, +0xd53,0xd53,0xd53,0xd4d,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd4d, +0xd53,0xd53,0xd53,0xd53,0xd47,0xd47,0xd50,0xd50,0xd50,0xd50,0xd44,0xd44,0xd44,0xd44,0xd44,0xd4a, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe19,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd4d,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd47,0xd47,0xd47,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, +0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, +0xd4a,0xd4a,0xd4a,0xd4a,0xd56,0xd56,0xd56,0xd56,0xd56,0xd59,0xd59,0xd59,0xd56,0xd56,0xd56,0xd56, +0xd56,0xd56,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0x1134, +0x1134,0x1023,0x1023,0x1023,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,0xd5c,0xd5c,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,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,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83, +0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83, +0xd83,0xd83,0xd83,0xd83,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, +0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, +0xe25,0xe25,0xe25,0xe25,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, +0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, +0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, +0xe2b,0xe2b,0xe2b,0xe2b,0xee8,0xee8,0xe3d,0xe3d,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0x102f, +0x102f,0x102f,0x102f,0x102f,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c, +0x102c,0x102c,0x102c,0x102c,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49, +0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49, +0xe4c,0xe49,0xe4c,0xe49,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, 0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xf18,0xf18,0xf18,0xf18,0x101a,0x101a,0x101a,0x101a,0x101a, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, -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,0xe6d, -0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70, -0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe79,0xe79, -0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe76,0xe7f,0x1026,0x1020,0x102f,0x101d,0xe7c,0xe7c,0x101d,0x101d, -0xe91,0xe91,0xe82,0xe91,0xe91,0xe91,0xe88,0xe91,0xe91,0xe91,0xe91,0xe82,0xe91,0xe91,0xe91,0xe91, +0xe58,0xe58,0xe58,0xe58,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xe5e,0xe5e,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76, +0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xf33,0xf33,0xf33,0xf33,0x1032, +0x1032,0x1032,0x1032,0x1032,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe7f,0xe7f,0xe7f,0xe7f,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88, +0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88, +0xe88,0xe88,0xe88,0xe88,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91, 0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91, -0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, +0xe91,0xe91,0xe91,0xe8b,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e, +0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe91, +0xe91,0xe91,0xe91,0xe91,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a, +0xe9a,0xe9a,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe94,0xe9d,0x103e,0x1038,0x1047,0x1035, +0xe9a,0xe9a,0x1035,0x1035,0xeac,0xeac,0xea0,0xeac,0xeac,0xeac,0xea3,0xeac,0xeac,0xeac,0xeac,0xea0, 0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, -0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca, +0xeac,0xeac,0xeac,0xeac,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5, +0xee5,0xee5,0xee5,0xee5,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d, +0x113d,0x113d,0x113d,0x113d,0xf18,0xf18,0xf18,0xf15,0xf15,0xf15,0xf15,0xf15,0x1176,0x13d1,0x13d1,0x13d1, +0x13d1,0x1353,0x1353,0x1353,0x13d4,0x1356,0x1356,0x13d4,0x1518,0x1518,0x1518,0x1518,0x151b,0x151b,0x151b,0x17e2, +0x17e2,0x17e2,0x17e2,0x18a8,0xf2d,0xf2d,0xf2d,0xf2d,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023, +0x1023,0x1023,0x1023,0x1023,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026, +0x1026,0x1026,0x1026,0x1026,0xf4e,0xf4e,0xf4e,0xf4e,0xf60,0xf69,0xf6c,0xf69,0xf6c,0xf69,0xf6c,0xf69, +0xf6c,0xf69,0xf6c,0xf69,0xf69,0xf69,0xf6c,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69, +0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf51,0xf4e,0xf4e,0xf4e, +0xf4e,0xf4e,0xf4e,0xf63,0xf4e,0xf63,0xf60,0xf60,0xf75,0xf72,0xf75,0xf75,0xf75,0xf72,0xf72,0xf75, +0xf72,0xf75,0xf72,0xf75,0xf72,0x1059,0x1059,0x1059,0x1194,0x1050,0x1059,0x1050,0xf72,0xf75,0xf72,0xf72, +0x1050,0x1050,0x1050,0x1050,0x1053,0x1056,0x1194,0x1194,0xf78,0xf78,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x1062,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d, +0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d, +0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x1557,0x1557,0x1557,0x1557,0x1557, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0xf93,0xf93,0xf93,0xf93, +0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93, +0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xfdb,0xff3,0xfea,0xff0, +0xff0,0xff3,0xff3,0xfea,0xfea,0xff0,0xff0,0xff0,0xff0,0xff0,0xff3,0xff3,0xff3,0xfdb,0xfdb,0xfdb, +0xfdb,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xfdb,0xfea, +0xfed,0xfdb,0xfdb,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xfde,0xff3,0xff0,0xfe7,0xfe7,0xfe7,0xfe7, +0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0x115e,0x115e,0x115b,0x1158,0xfe4,0xfe4,0x100b,0x100b,0x100b,0x100b, +0x12cf,0x12cf,0x12a5,0x12a5,0x12ab,0x12a2,0x12a2,0x12a2,0x12a2,0x12a5,0x13d7,0x12ab,0x12a5,0x12ab,0x12a2,0x12ab, +0x12cf,0x12a2,0x12a2,0x12a2,0x12a5,0x12a5,0x12a2,0x12a2,0x12a5,0x12a2,0x12a2,0x12a5,0x1026,0x1026,0x1026,0x1026, +0x1026,0x1023,0x1023,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1530,0x1530,0x1530,0x1134,0x1023,0x1023,0x1023, +0x1023,0x12db,0x12b4,0x12b4,0x12b4,0x12b4,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1044,0x1044,0x1041,0x103b, +0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1038,0x1038,0x1038,0x1038,0x104d,0x104a,0x1038,0x1191,0x142e,0x1431, +0x1431,0x142e,0x142e,0x142e,0x142e,0x142e,0x1434,0x1434,0x154b,0x153f,0x153f,0x153c,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x105f,0x105c,0x105c,0x106b,0x1062,0x1377,0x1374,0x173a,0x1377,0x1374,0x143d,0x143a, +0x154e,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x1065,0x1062,0x1062,0x1062, +0x1062,0x1062,0x1062,0x1062,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x106b,0x1062,0x106e,0x106e,0x1074,0x107a, +0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, +0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1074,0x106e,0x106e, +0x106e,0x106e,0x1074,0x1074,0x106e,0x106e,0x1077,0x1446,0x1443,0x1443,0x107a,0x107a,0x1071,0x1071,0x1071,0x1071, +0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,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,0x108f,0x108f,0x1098,0x1098,0x1098,0x1098, +0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098, +0x1098,0x1098,0x1098,0x1098,0x109b,0x109b,0x109b,0x109e,0x109b,0x109b,0x10a1,0x10a1,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10ad,0x10ad,0x10ad,0x10ad, +0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10b0,0x10a7,0x10b6,0x10b3,0x10ad,0x10ad,0x10ad,0x10ad, +0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad, +0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x137d,0x137a,0x10c8,0x10c2, +0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c5,0x1146,0x10b9,0x10b9,0x10b9,0x10bf, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x10bc,0x10bc,0x10bf,0x10cb,0x10c8,0x10c2,0x10c8,0x10c2, +0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2, +0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x1563,0x1560,0x1563,0x1560, +0x1566,0x1566,0x1743,0x144c,0x10d4,0x10d4,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, +0x10d7,0x10d7,0x10d7,0x10d7,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4, +0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e0,0x10e0,0x10e0,0x113a,0x10e9, +0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8, +0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6, +0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +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,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119, +0x1122,0x1122,0x1122,0x1122,0x1137,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, 0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0xefd,0xefd,0xefd,0xefa,0xefa,0xefa,0xefa,0xefa,0x115e,0x13b6,0x13b6,0x13b6,0x13b6,0x1338,0x1338,0x1338, -0x13b9,0x133b,0x133b,0x13b9,0x14fd,0x14fd,0x14fd,0x14fd,0x1500,0x1500,0x1500,0x17c7,0x17c7,0x17c7,0x17c7,0x188d, -0xf12,0xf12,0xf12,0xf12,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b, -0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e, -0xf33,0xf33,0xf33,0xf33,0xf45,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e, -0xf4e,0xf4e,0xf51,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e, -0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf36,0xf45,0xf33,0xf33,0xf33,0xf33,0xf33,0xf48, -0xf33,0xf48,0xf45,0xf45,0xf5a,0xf57,0xf5a,0xf5a,0xf5a,0xf57,0xf57,0xf5a,0xf57,0xf5a,0xf57,0xf5a, -0xf57,0x1041,0x1041,0x1041,0x117c,0x1038,0x1041,0x1038,0xf57,0xf5a,0xf57,0xf57,0x1038,0x1038,0x1038,0x1038, -0x103b,0x103e,0x117c,0x117c,0xf5d,0xf5d,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0x104a,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72, -0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72, -0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, -0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78, -0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78, -0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xfc0,0xfdb,0xfd2,0xfcf,0xfcf,0xfdb,0xfdb,0xfd2, -0xfd2,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfdb,0xfdb,0xfdb,0xfc0,0xfc0,0xfc0,0xfc0,0xfdb,0xfdb,0xfdb, -0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfc0,0xfd2,0xfd5,0xfc0,0xfc0,0xfd8, -0xfd8,0xfd8,0xfd8,0xfd8,0xfd8,0xfc3,0xfdb,0xfd8,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, -0xfcc,0xfcc,0x1146,0x1146,0x1143,0x1140,0xfc9,0xfc9,0xff3,0xff3,0xff3,0xff3,0x12b7,0x12b7,0x128d,0x128d, -0x1293,0x128a,0x128a,0x128a,0x128a,0x128d,0x13bc,0x1293,0x128d,0x1293,0x128a,0x1293,0x12b7,0x128a,0x128a,0x128a, -0x128d,0x128d,0x128a,0x128a,0x128d,0x128a,0x128a,0x128d,0x100e,0x100e,0x100e,0x100e,0x100e,0x100b,0x100b,0x100e, -0x100e,0x100e,0x100e,0x100e,0x100e,0x1515,0x1515,0x1515,0x111c,0x100b,0x100b,0x100b,0x100b,0x12c3,0x129c,0x129c, -0x129c,0x129c,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x102c,0x102c,0x1029,0x1023,0x1029,0x1023,0x1029,0x1023, -0x1029,0x1023,0x1020,0x1020,0x1020,0x1020,0x1035,0x1032,0x1020,0x1179,0x1413,0x1416,0x1416,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1419,0x1419,0x1530,0x1524,0x1524,0x1521,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1047,0x1044,0x1044,0x1053,0x104a,0x135c,0x1359,0x171f,0x135c,0x1359,0x1422,0x141f,0x1533,0x1533,0x1539,0x1533, -0x1539,0x1533,0x1539,0x1533,0x1539,0x1533,0x1539,0x1533,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x104d,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a, -0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x1053,0x104a,0x1056,0x1056,0x105c,0x1062,0x1062,0x1062,0x1062,0x1062, -0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062, -0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x105c,0x1056,0x1056,0x1056,0x1056,0x105c,0x105c, -0x1056,0x1056,0x105f,0x142b,0x1428,0x1428,0x1062,0x1062,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059, -0x1059,0x1059,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, -0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, -0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1083,0x1083,0x1083,0x1086,0x1083,0x1083,0x1089,0x1089,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c, -0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c, -0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095, -0x1095,0x1095,0x1095,0x1095,0x1098,0x108f,0x109e,0x109b,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095, -0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095, -0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1362,0x135f,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa, -0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10ad,0x112e,0x10a1,0x10a1,0x10a1,0x10a7,0x1431,0x1431,0x1431,0x1431, -0x1431,0x1431,0x1431,0x1431,0x10a4,0x10a4,0x10a7,0x10b3,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa, -0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa, -0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x1548,0x1545,0x1548,0x1545,0x154b,0x154b,0x1728,0x1431, -0x10bc,0x10bc,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, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c8,0x10c8,0x10c8,0x1122,0x10d1,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10cb,0x10cb,0x10cb,0x10cb, -0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,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,0x110a,0x110a,0x110a,0x110a, -0x111f,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,0x110d,0x110d,0x110d, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x1119,0x1119,0x1119,0x1119, -0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x14bb,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x1185,0x1185,0x1188,0x1188,0x118e,0x1185,0x1185,0x1185,0x1185,0x1185,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x11af,0x11af,0x11af,0x11af, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,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,0x11b8,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,0x11ca,0x11ca,0x11d0,0x11d0,0x11d0,0x11d0, -0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x1308,0x11d6,0x130b, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d3,0x11d3,0x11d3,0x11d6,0x172b,0x172e,0x1950,0x194d,0x11d9,0x11d9,0x11d9,0x11e8, -0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee, -0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11dc, -0x11e8,0x11e8,0x11d9,0x11d9,0x11d9,0x11d9,0x11e8,0x11e8,0x11d9,0x11e8,0x11e8,0x11e8,0x11fa,0x11fa,0x11fa,0x11fa, -0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fd,0x11fa,0x11fa,0x11fa, -0x11fa,0x11fa,0x11fa,0x11f4,0x11f4,0x11f4,0x11fa,0x11f7,0x1551,0x1554,0x1557,0x1557,0x120c,0x120c,0x120c,0x120c, -0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x1200,0x120c,0x1200,0x1200, -0x1200,0x1215,0x1215,0x1200,0x1200,0x1215,0x120c,0x1215,0x1215,0x120c,0x1200,0x1203,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,0x120c,0x120c,0x120c,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,0x1227,0x123f,0x123f,0x123f,0x123f, +0x1131,0x1131,0x1131,0x1131,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x14d6,0x17c1,0x17c1,0x17c1, +0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x119d,0x119d,0x11a0,0x11a0,0x11a6,0x119d,0x119d,0x119d,0x119d,0x119d, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d0,0x11d6, +0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2, +0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2, +0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8, +0x11e8,0x1323,0x11ee,0x1326,0x11ee,0x11ee,0x11ee,0x11ee,0x11eb,0x11eb,0x11eb,0x11ee,0x1746,0x1749,0x196b,0x1968, +0x11f1,0x11f1,0x11f1,0x1200,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x11f4,0x1200,0x1200,0x11f1,0x11f1,0x11f1,0x11f1,0x1200,0x1200,0x11f1,0x11f1,0x1200,0x1200, +0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x1215,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x120c,0x120c,0x120c,0x1212,0x120f,0x156c,0x156f,0x1572,0x1572, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1218,0x1224,0x1218,0x1218,0x1218,0x122d,0x122d,0x1218,0x1218,0x122d,0x1224,0x122d,0x122d,0x1224,0x1218,0x121b, +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, +0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, 0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123c,0x123c,0x123c,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,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,0x125d,0x125d,0x126c,0x126f, +0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1254,0x1254,0x1254, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260, 0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, -0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x1272,0x126f,0x1272,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, -0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x1272,0x126f,0x126f,0x126f,0x126f,0x126c,0x126c,0x126c,0x1260, -0x1260,0x1260,0x1260,0x126c,0x126c,0x1266,0x1263,0x1269,0x1269,0x1278,0x1275,0x1275,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x1281,0x1281,0x1281,0x127e, -0x127e,0x127e,0x127b,0x127b,0x127b,0x127b,0x127e,0x127b,0x127b,0x127b,0x1281,0x127e,0x1281,0x127e,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x1281,0x127e,0x127e,0x127b,0x127b,0x127b,0x127b, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a5,0x12a5,0x12a5,0x1284,0x1956, -0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x12ae,0x13b0,0x12ae, -0x128d,0x128d,0x133e,0x128a,0x133e,0x133e,0x133e,0x133e,0x128a,0x1290,0x12b7,0x128a,0x128a,0x128a,0x128a,0x128a, -0x1290,0x1293,0x12b7,0x12b7,0x1293,0x12b7,0x128a,0x1293,0x1293,0x1296,0x12b7,0x128a,0x128a,0x12b7,0x128d,0x128d, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x129f,0x129f,0x129f,0x129f,0x13c8,0x13a7, -0x12a8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x1854,0x1854,0x1854,0x1854,0x1854, -0x13b0,0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x13aa, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab, -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,0x12d5,0x12d5,0x12d5, -0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, -0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, -0x1395,0x1386,0x1395,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,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,0x139e,0x139e,0x139e,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,0x13d4,0x13d1,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13da,0x13dd,0x13da,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13da,0x13da,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da, -0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da, -0x13da,0x13da,0x1563,0x1563,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x1569,0x1569,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f, -0x156f,0x17a9,0x17a9,0x17a9,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x17a9,0x17a9,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x1569,0x1569,0x156f,0x156f,0x1569,0x156f,0x156f,0x156f,0x1566,0x1566,0x156f,0x156f,0x13dd,0x13dd,0x13e0,0x13e0, -0x13e0,0x16da,0x13dd,0x13e0,0x13dd,0x13dd,0x13e0,0x1572,0x1572,0x156f,0x156f,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x1569,0x1569,0x156f, -0x16da,0x156f,0x1569,0x156f,0x17a9,0x17a9,0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x13dd,0x156f,0x13e0,0x13e0, -0x13dd,0x13dd,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13e0, -0x13e0,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13dd,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0, -0x13e0,0x13dd,0x13dd,0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13e0,0x13e0,0x13dd,0x13e0,0x13e0,0x13e0, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x16da,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x1569,0x17a9, -0x1437,0x1437,0x1437,0x1437,0x1563,0x1563,0x1566,0x1566,0x1566,0x156c,0x156f,0x17a9,0x17a9,0x17a9,0x17a9,0x1731, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x1569,0x1569,0x156f,0x1572,0x1572,0x156f,0x156f, -0x156f,0x156f,0x185d,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x1569,0x156f,0x1569,0x1569,0x1569,0x1569, -0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x1569,0x1569,0x1569,0x156f,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x14c1, -0x13e3,0x14c1,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x14c1, -0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x14c1,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x16e0,0x16e0,0x17af,0x17af,0x13e6,0x13e6,0x13e6, -0x13e3,0x13e3,0x13e3,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f, -0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ec,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ec,0x13ec,0x13ec,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x17dc,0x17dc,0x17d9,0x1734,0x143d,0x143d,0x143d,0x143d, -0x143d,0x143d,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x157b,0x1449,0x1449,0x1449,0x145b,0x145b,0x145b,0x145b,0x145b, -0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, -0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x1275,0x1275,0x1284,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287, +0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x128a,0x1287,0x128a,0x1287,0x1287,0x1287, +0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x128a,0x1287,0x1287,0x1287,0x1287, +0x1284,0x1284,0x1284,0x1278,0x1278,0x1278,0x1278,0x1284,0x1284,0x127e,0x127b,0x1281,0x1281,0x1290,0x128d,0x128d, +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,0x1293,0x1293,0x1293, +0x1299,0x1299,0x1299,0x1296,0x1296,0x1296,0x1293,0x1293,0x1293,0x1293,0x1296,0x1293,0x1293,0x1293,0x1299,0x1296, +0x1299,0x1296,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,0x1299,0x1296,0x1296, +0x1293,0x1293,0x1293,0x1293,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12bd, +0x12bd,0x12bd,0x129c,0x1971,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb, +0x13cb,0x12c6,0x13cb,0x12c6,0x12a5,0x12a5,0x1359,0x12a2,0x1359,0x1359,0x1359,0x1359,0x12a2,0x12a8,0x12cf,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a8,0x12ab,0x12cf,0x12cf,0x12ab,0x12cf,0x12a2,0x12ab,0x12ab,0x12ae,0x12cf,0x12a2, +0x12a2,0x12cf,0x12a5,0x12a5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x12b7,0x12b7, +0x12b7,0x12b7,0x13e3,0x13c2,0x12c0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x186f, +0x186f,0x186f,0x186f,0x186f,0x13cb,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x12c0,0x12c0, +0x12c0,0x12c0,0x12c0,0x13c5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x12c3,0x13c8,0x13c8,0x13c8,0x13c8, +0x13c8,0x13c8,0x13c8,0x12c3,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x143d,0x1554, +0x1554,0x1554,0x17ee,0x195f,0x1554,0x1554,0x173d,0x173d,0x173d,0x1737,0x173d,0x1737,0x1962,0x195f,0x1a1c,0x1a19, +0x1a1c,0x1a19,0x1a1c,0x1a19,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x13b0,0x13a1,0x13b0,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13b9,0x13b9,0x13b9,0x13b9, +0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9, +0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13bf,0x13bf,0x13bf,0x13bf, +0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, +0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13ef,0x13ec,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f5,0x13f8, +0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f5,0x13f5,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x157e,0x157e,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x1584,0x1584,0x158a,0x158a,0x158a,0x158a, +0x158a,0x158a,0x158a,0x158a,0x158a,0x17c4,0x17c4,0x17c4,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x17c4,0x17c4, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x1584,0x1584,0x158a,0x158a,0x1584,0x158a,0x158a,0x158a,0x1581,0x1581,0x158a,0x158a, +0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x16f5,0x13f8,0x13fb,0x13f8,0x13f8,0x13fb,0x158d,0x158d,0x158a,0x158a,0x17c4, +0x17c4,0x17c4,0x17c4,0x17c4,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x1584,0x1584,0x158a,0x16f5,0x158a,0x1584,0x158a,0x17c4,0x17c4,0x17c4,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a, +0x13f8,0x158a,0x13fb,0x13fb,0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb, +0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb, +0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13fb,0x13fb, +0x13f8,0x13fb,0x13fb,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13fb,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x16f5,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x1584,0x17c4, +0x1452,0x1452,0x1452,0x1452,0x157e,0x157e,0x1581,0x1581,0x1581,0x1587,0x158a,0x17c4,0x17c4,0x17c4,0x17c4,0x174c, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x1584,0x1584,0x158a,0x158d,0x158d,0x158a,0x158a, +0x158a,0x158a,0x1878,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x1584,0x158a,0x1584,0x1584,0x1584,0x1584, +0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x1584,0x1584,0x1584,0x158a,0x1581,0x1581,0x1581,0x1581, +0x1581,0x1581,0x158a,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x14dc, +0x13fe,0x14dc,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x14dc, +0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x14dc,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x16fb,0x16fb,0x17ca,0x17ca,0x1401,0x1401,0x1401, +0x13fe,0x13fe,0x13fe,0x1401,0x1401,0x1401,0x1401,0x1401,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1407,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1407,0x1407,0x1407,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,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,0x17f7,0x17f7,0x17f4,0x174f,0x1458,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1596,0x1464,0x1464,0x1464,0x1476,0x1476,0x1476,0x1476,0x1476, 0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476, -0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f, -0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f, -0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x1485,0x1485,0x1491,0x1497,0x1497,0x1497,0x1497,0x1497, +0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497, 0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497, -0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1491,0x1491,0x1491,0x1485,0x1485, -0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1491,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x192c,0x192c,0x192c,0x1515,0x1515,0x1515,0x1569,0x1569,0x156f,0x156f,0x156f,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x156f,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x156f,0x156f,0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f, -0x1569,0x1569,0x156f,0x156f,0x156f,0x156f,0x1569,0x1569,0x1572,0x1569,0x1569,0x1569,0x1569,0x16dd,0x16dd,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x185a,0x156f,0x1569,0x1569,0x156f,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x156f,0x1569,0x1569,0x1569,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593, -0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593, -0x1593,0x1593,0x1593,0x1593,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,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, +0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1a25,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, +0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, +0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x14a0,0x14a0,0x14ac,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, +0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, +0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14ac,0x14ac,0x14ac,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14ac,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3, +0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3, +0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1947,0x1947,0x1947,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1a13,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x18ae,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1584,0x1584,0x158a,0x158a,0x158a,0x1584,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x158a,0x1581,0x1581,0x1581,0x1581, +0x1581,0x1581,0x1581,0x1581,0x158a,0x158a,0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a, +0x1584,0x1584,0x158a,0x158a,0x158a,0x158a,0x1584,0x1584,0x158d,0x1584,0x1584,0x1584,0x1584,0x16f8,0x16f8,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1875,0x158a,0x1584,0x1584,0x158a,0x1584,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584, +0x158a,0x1584,0x1584,0x1584,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, 0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, -0x15ae,0x15ae,0x15ae,0x15ae,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed, -0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed, -0x15ed,0x15ed,0x15ed,0x15de,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f0, -0x15f9,0x15f9,0x15f9,0x15f9,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x160e,0x1617,0x1617,0x1617, +0x15ae,0x15ae,0x15ae,0x15ae,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,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,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, +0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, +0x15c9,0x15c9,0x15c9,0x15c9,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,0x1608, +0x1608,0x1608,0x1608,0x15f9,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611, +0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x160b, +0x1614,0x1614,0x1614,0x1614,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, 0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, -0x1617,0x1617,0x1617,0x1617,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,0x1620,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x162f,0x162f,0x162f,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x162f, -0x162f,0x1623,0x162f,0x1626,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0x1617,0x1617,0x1617,0x1617,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1629,0x1632,0x1632,0x1632, 0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, -0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, -0x1656,0x1653,0x1653,0x1653,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f, -0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1665,0x1665,0x1665,0x1662,0x1662,0x1662, -0x165f,0x165f,0x165f,0x165f,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x167a,0x167a,0x166e,0x166b,0x166b, -0x166b,0x166b,0x166b,0x166b,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, -0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x167d,0x167d,0x167d,0x167d,0x167d, -0x167d,0x167d,0x167d,0x167d,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,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,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, -0x16c8,0x16c8,0x16c8,0x16c8,0x16b3,0x16c2,0x16c2,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16c2,0x16b3,0x16c5, -0x16c5,0x16b3,0x16c5,0x16b3,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, -0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, -0x16c8,0x16c8,0x16c8,0x16c8,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7, -0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7, -0x16d7,0x16d7,0x16d7,0x16d7,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x177c,0x1779,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,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,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782, -0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782, -0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x1632,0x1632,0x1632,0x1632,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, +0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, +0x163b,0x163b,0x163b,0x163b,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, +0x164d,0x164d,0x164d,0x164d,0x164a,0x164a,0x164a,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x164a, +0x164a,0x163e,0x164a,0x1641,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,0x164d,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x166e,0x166e,0x166e,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1680,0x1680,0x1680,0x167d,0x167d,0x167d, +0x167a,0x167a,0x167a,0x167a,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1695,0x1695,0x1689,0x1686,0x1686, +0x1686,0x1686,0x1686,0x1686,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b, +0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x1698,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,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,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16ce,0x16dd,0x16dd,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16dd,0x16ce,0x16e0, +0x16e0,0x16ce,0x16e0,0x16ce,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,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2, +0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2, +0x16f2,0x16f2,0x16f2,0x16f2,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1734,0x1734,0x1734,0x1734,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1947,0x1947,0x1947,0x1a13,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x1755,0x1755,0x1755,0x1755,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,0x1791,0x1791,0x1797,0x1794,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, 0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,0x179d,0x179a, -0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d, -0x179d,0x179d,0x179d,0x179d,0x179d,0x179a,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, 0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, -0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, +0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, 0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, -0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x1866,0x1866,0x1866, -0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902, -0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x17fa,0x17fa,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7, -0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7, -0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, -0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, -0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1845,0x1845,0x1845, -0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1863,0x1866, -0x1866,0x1866,0x1866,0x1866,0x1902,0x19e0,0x19e0,0x19e0,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866, -0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1902,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, -0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, -0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, -0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, -0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18d5,0x18db,0x18d8,0x18d8,0x18d8, -0x18d8,0x18e7,0x18ed,0x18d8,0x18d8,0x18d8,0x18d8,0x18e4,0x18ea,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8, -0x18d8,0x18d8,0x18d8,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x19e0, -0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0, -0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b, -0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b, -0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, -0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, -0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, +0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5, +0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0, +0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0, +0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1815,0x1815,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1860,0x1860,0x1860, +0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1884,0x1881, +0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x1884,0x1920,0x1920,0x1884,0x1884,0x1884,0x1884,0x1884, +0x1884,0x1884,0x1881,0x187e,0x1884,0x1884,0x1884,0x1a85,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x187e,0x1881, +0x1881,0x1881,0x1881,0x1881,0x191d,0x19fb,0x19fb,0x19fb,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x191d,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x18e4,0x18e4,0x18e4,0x18e4,0x1a37,0x1a37,0x18e7,0x18e7, +0x18e7,0x18e7,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18e1, +0x18d2,0x18d5,0x18d8,0x18ea,0x18ea,0x1986,0x18db,0x18db,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4, +0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4, +0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905, +0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x18f0,0x18f6,0x18f3,0x18f3,0x18f3, +0x18f3,0x1902,0x1908,0x18f3,0x18f3,0x18f3,0x18f3,0x18ff,0x1905,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3, +0x18f3,0x18f3,0x18f3,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905, +0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x19fb, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, 0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, +0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, +0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, +0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, 0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, -0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf, -0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf, -0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8, -0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8, -0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c5,0x19c5,0x19c5,0,0,0,0 +0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7, +0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7, +0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3, +0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3, +0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e0,0x19e0,0x19e0,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1aa0,0x1aa0,0x1a6a,0x1aa0,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a70,0x1a70,0x1a70,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4948, + propsVectorsTrie_index+4952, NULL, - 4948, - 25064, + 4952, + 25636, 0xa40, - 0x13d4, + 0x13d8, 0x0, 0x0, 0x110000, - 0x7538, + 0x7778, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[6639]={ +static const uint32_t propsVectors[6822]={ 0x67,0,0,0x67,0,0x4e00000,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, @@ -3307,401 +3375,414 @@ static const uint32_t propsVectors[6639]={ 0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0,0,0x11867,0, 0,0x11967,0,0x4e00000,0x11a67,0,0,0x11b67,0,0,0x11c67,0,0,0x11d67,0,0, 0x11e67,0,0,0x11f67,0,0,0x12067,0,0,0x12167,0,0,0x12267,0,0,0x12367, -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,0x14200000,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,0x200400,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,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,0x220400,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,0x445801,0x11002800,0x4000001,0x445802,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,0x15248002,0x11002800,0x40000001,0x63b020,0x11002800, -0x40080000,0x918820,0x11002801,0x80000,0xaa65620,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,0x14200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000, -0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x14200000,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,0x14200000,0x11003600,0x24000020,0x200000, -0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x14200000,0x11003700,0x24000000,0x14e00000,0x11003700, -0x24000000,0x96800000,0x11003700,0x24000020,0x4200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, -0x1710000,0x11003800,0x24000000,0x4200000,0x11003800,0x24000000,0x4e00000,0x11003800,0x24000000,0x14200000,0x11003800,0x24000000,0x14b00000,0x11003800,0x24000000,0x14e00000, -0x11003800,0x24000000,0x96800000,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,0x14200000,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,0x1410000f,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,0x14100000,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,0x14150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020, -0x100000,0x11023600,0x24000020,0x14100000,0x11023700,0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000000,0x14100000,0x11023700,0x24000000,0x14e00000, -0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x4100000,0x11023700,0x24000020,0x14100000,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,0x445811,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,0x1a45800,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,0x34e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000, -0x1410001,0x110a3700,0x24000000,0x34200000,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,0x11400c17,0x7c00900,0x230400,0x11400f42,0xc000010,0x448000,0x11400f54, -0xc000010,0x448000,0x11401d83,0x4000000,0x200000,0x11403dab,0x4000000,0xe00000,0x114457a0,0x4000004,0x120000a,0x114457a0,0x4000008,0x81000a,0x114457a0,0x4000008, -0x141000a,0x114457a0,0x4000010,0x87000a,0x114457a0,0xc000010,0x84800a,0x114457a9,0x3802500,0x126246a,0x114457a9,0x7c00d00,0x2530c0a,0x114a3da0,0x24000000,0x810000, -0x114a3da0,0x24000000,0x1410000,0x114a3da0,0x24000008,0x810000,0x114a3da0,0x24000008,0x1410000,0x114a3da0,0x24000010,0x870000,0x114a3da0,0x2c000010,0x848000,0x114a3da6, -0x4000000,0xe00000,0x114a3da6,0x24000000,0xe00000,0x114a3da6,0x24000002,0x1200000,0x114a3da6,0x24000002,0x14e00000,0x114a3da6,0x24000008,0x810000,0x114a3da6,0x24000008, -0x1410000,0x114a3da9,0x7c00900,0x930c00,0x114a3da9,0x7c00900,0xe30c00,0x114a3dab,0x7c00300,0xe30000,0x114a3ea9,0x7000400,0x1200c02,0x114a3fa0,0x4000004,0x1200000, -0x114a3fa9,0x7c00d00,0x2530c00,0x114a42ab,0x4000000,0xe00000,0x114a42ab,0x4000000,0xe0000f,0x114a44ab,0x4000000,0xe00002,0x114a44ab,0x4000000,0xe00003,0x114a44ab, -0x4000000,0x14e00003,0x114a45ab,0x4000000,0xe00002,0x114a45ab,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c1f,0x2802100,0x962460,0x11800c1f,0x2802500, -0x962460,0x11800f29,0x2802400,0x962460,0x11800f36,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3dac,0x2802400,0x962460, -0x118a3ea9,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c23,0x6800000,0x1329800,0x11c00c27,0xc000010,0xb48000,0x11c00f6b, -0x6800000,0x1329800,0x11c01070,0x6800000,0x1329800,0x11c01174,0x6800000,0x1329800,0x11c01278,0x6800000,0x1329800,0x11c0147c,0x4000000,0x200000,0x11c0147c,0x6800000, -0x1329800,0x11c05123,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, -0x445800,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,0x15248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002b01,0x2000,0x8962460,0x30002c00,0x4000000,0x200000, -0x30002c00,0x7c00100,0x14220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003000,0x24000000,0x4200000,0x30003100, -0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x4200000,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,0x30402589,0x4000010,0x400000,0x30402589,0x4000010, -0xb70000,0x30402589,0xc000010,0xb48000,0x304a3dab,0x4000000,0xe00000,0x30800c1f,0x2802100,0x962460,0x30c01c81,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,0x8962460,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,0x220400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x445802,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,0x14200000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000, -0x4100000,0x32003700,0x24000000,0x4200000,0x32003700,0x24000000,0x14200000,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,0x14200000,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,0x32026c01,0x12882000, -0x8962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000, -0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x34200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16, -0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406385,0xc000010, -0x448000,0x324a3dae,0x4000000,0x14e00000,0x324a3dae,0x7c00100,0x1230400,0x324a3fa9,0x4000002,0x1200c00,0x324a53a6,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,0x14200000, -0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x4200000,0x40003700,0x24000000,0x14200000,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,0x14200000,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,0x34200000,0x400a3700,0x24000000,0x34e00000,0x400a4400,0x4000000, -0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010, -0x404077e0,0x4000000,0x200000,0x404077e3,0x4000000,0x200000,0x404077e3,0x4000000,0x400000,0x40c0147c,0x4000000,0x200000,0x40c05123,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,0x1500000, -0x41000c02,0xc000010,0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c, -0x7c00100,0x220400,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,0x4200000,0x41003700,0x24000000,0x14200000,0x41003700,0x24000000,0x14e00000,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,0x34200000,0x410a3700,0x24000000,0x34e00000,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,0x414a82ab,0x4000000,0xe00000,0x41808300,0x2802000,0x962460, -0x41c0147c,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,0x4200000,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,0x50409aab,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,0x4200000,0x51003700,0x24000000,0x4e00000,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,0x4e00000,0x5100ab00,0x4000000,0x4e00000, -0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x34200000,0x510aaa00, -0x4000000,0x34e00000,0x5140a2db,0x4000400,0x400000,0x514a82ab,0x4000000,0xe00000,0x51802b9d,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,0x5200ac7e,0xc000010,0x248000,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,0x4100000,0x52023700,0x24000000,0x4e00000, -0x52023700,0x24000000,0x14100000,0x52023700,0x24000000,0x14e00000,0x52023700,0x24000000,0x96800000,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,0x14150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x34e00000,0x520a3800,0x24000000,0x34100000,0x520a4711,0x7c40300,0xe30000, -0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x34100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400, -0x4000000,0x34e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af8b,0x7c00100,0x230400,0x5240af90,0x4000400,0x200000,0x5240af90,0x6800100, -0x962540,0x5240af92,0x6800400,0x962540,0x5240af92,0x7c00100,0x230400,0x5240b2b1,0x4000000,0x200000,0x5240b2b1,0x4000000,0x1500000,0x5240b2bc,0x4000000,0x200000, -0x5240b2c9,0x4000000,0x200000,0x5240b5de,0x7c00900,0x230400,0x524a44ab,0x4000000,0xe00003,0x5280af8b,0x2802400,0x962460,0x5280af8c,0x2802400,0x962460,0x5280af92, -0x2802400,0x962460,0x5280af94,0x2802400,0x962460,0x5280af96,0x2802400,0x962460,0x52c0b3d5,0x2802400,0x962460,0x52c0b3d9,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,0x14200000,0x60003000,0x24000000,0x14e00000,0x60003700,0x24000000, -0x4200000,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,0x4e00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400, -0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x14150400,0x600a3000,0x24000000,0x34200000,0x600a3000,0x24000000,0x34e00000,0x600a3700,0x24000000,0x34200000,0x600a3800, -0x24000000,0x34200000,0x600a3800,0x24000000,0xb6800000,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x34100000,0x600ac400,0x4000000,0x14e0000d,0x600ac400,0x4000000, -0x34e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x34e00000,0x600acd00,0x4000000,0x34200000,0x600acd00,0x4000000,0x34e00000, -0x600acd00,0x4000000,0xb6800000,0x600ace00,0x4000000,0x34e00000,0x600ace00,0x4000000,0xb6800000,0x600acf00,0x4000000,0x34e00000,0x600acf00,0x4000000,0xb6800000,0x600ad111, -0x7c40300,0xe30000,0x604ac4ab,0x4000000,0x34e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100, -0x1830000,0x61001d0c,0x7c00100,0x220400,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,0x34e00000,0x6140af90,0x6800100,0x962540,0x6140af92,0x7c00100,0x230400,0x6180af8d,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000, -0x63002800,0x80000,0x918820,0x63c00c15,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,0x14200000,0x70003800,0x24000000,0x4e00000,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,0x4e00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x14200000,0x7000cd00, -0x4000000,0x14e00000,0x7000cd00,0x4000000,0x96800000,0x7000cf00,0x4000000,0x4e00000,0x7000cf00,0x4000000,0x14e00000,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,0x34e00000,0x700acd00,0x4000000,0xb6800000, -0x700ace00,0x4000000,0x34e00000,0x700acf00,0x4000000,0x34e00000,0x700acf00,0x4000000,0xb6800000,0x7040dfe5,0x4000000,0x200000,0x7040f7e9,0x80000,0x918820,0x7080af90, -0x2802400,0x962460,0x7080dfe5,0x2802400,0x962460,0x70c0e4e7,0x2802100,0x962460,0x70c0e4e7,0x2802400,0x962460,0x70c0e4e7,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,0x4e00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460, -0x8000d997,0x2802400,0x962460,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,0x34e00000,0x800acd00,0x4000000,0x7a902460,0x800ace00, -0x4000000,0x34e00000,0x800acf00,0x4000000,0x34e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x34e00000,0x800b0500,0x4000000,0xb6800000,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,0x34e00000,0x900acd00,0x4000000,0xb6800000, -0x900acf00,0x4000000,0x34e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x34e00000,0x900b0500,0x4000000,0xb6800000,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,0x4e00000,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,0x4e00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00, -0x4000000,0x34e00000,0xa00b0500,0x4000000,0x34e00000,0xa00b0500,0x4000000,0xb6800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100, -0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af9c,0x6800400,0x962540,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004,0x2802000,0x962460, -0xb0001110,0x4000000,0x200000,0xb0001524,0x2802000,0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000,0x200000,0xb0008939, -0x4000000,0x200000,0xb0008939,0x7c00100,0x230400,0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000,0xb0009257,0x2802000, -0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519,0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a,0x2802000,0x962460, -0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000,0x218960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100,0x962540,0xb000d476, -0x7c00100,0x230400,0xb000e300,0x4000000,0x4e00000,0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400,0xb0011900,0x4000000, -0x4e00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2,0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2,0x6800100,0x962540, -0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100,0x250400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000,0x1329800,0xb0011cb3, -0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400,0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400,0xb0011db6,0x7c00500, -0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00,0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4,0x7c00100,0x230400, -0xb0011fb4,0xc000010,0x248000,0xb0012000,0x4000000,0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010,0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5, -0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000,0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400,0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000, -0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7,0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711,0x7c40300,0xe30000,0xb00acf00,0x4000000,0x34e00000, -0xb00b0500,0x4000000,0x34e00000,0xb00b0500,0x4000000,0x3ce00000,0xb00b0500,0x4000000,0xb6800000,0xb00b109a,0x7c00300,0xe30000,0xb080e47a,0x2802000,0x962460}; +0,0,0x12467,0,0,0x12567,0,0,0x12667,0,0,0x12767,0,0,0x12867,0, +0,0x12967,0,0,0x12a67,0,0x4e00000,0x12b67,0,0,0x12c67,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,0x14200000,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,0x200400,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,0x11000f01,0x2802400,0x962460,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,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, +0x445801,0x11002800,0x4000001,0x445802,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,0x15248002,0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0xaa65620, +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,0x14200000,0x11002f00, +0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022, +0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x14200000,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,0x14200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000, +0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x14200000,0x11003700,0x24000000,0x14e00000,0x11003700,0x24000000,0x96800000,0x11003700,0x24000020,0x4200000, +0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x4200000,0x11003800, +0x24000000,0x4e00000,0x11003800,0x24000000,0x14200000,0x11003800,0x24000000,0x14b00000,0x11003800,0x24000000,0x14e00000,0x11003800,0x24000000,0x96800000,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, +0x14200000,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,0x1410000f,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,0x14100000,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,0x14150403, +0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000,0x11023600,0x24000020,0x14100000,0x11023700, +0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000000,0x14100000,0x11023700,0x24000000,0x14e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020, +0x4100000,0x11023700,0x24000020,0x14100000,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,0x445811,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,0xe29811,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,0x1a45800,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,0x34e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x34200000,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,0x11400c17,0x7c00900,0x230400,0x11400f42,0xc000010,0x448000,0x11400f56,0xc000010,0x448000,0x11401d8b,0x4000000,0x200000, +0x11403dbf,0x4000000,0xe00000,0x114457b4,0x4000004,0x120000a,0x114457b4,0x4000008,0x81000a,0x114457b4,0x4000008,0x141000a,0x114457b4,0x4000010,0x87000a,0x114457b4, +0xc000010,0x84800a,0x114457bd,0x3802500,0x126246a,0x114457bd,0x7c00d00,0x2530c0a,0x114a3db4,0x24000000,0x810000,0x114a3db4,0x24000000,0x1410000,0x114a3db4,0x24000008, +0x810000,0x114a3db4,0x24000008,0x1410000,0x114a3db4,0x24000010,0x870000,0x114a3db4,0x2c000010,0x848000,0x114a3dba,0x4000000,0xe00000,0x114a3dba,0x24000000,0xe00000, +0x114a3dba,0x24000002,0x1200000,0x114a3dba,0x24000002,0x14e00000,0x114a3dba,0x24000008,0x810000,0x114a3dba,0x24000008,0x1410000,0x114a3dbd,0x7c00900,0x930c00,0x114a3dbd, +0x7c00900,0xe30c00,0x114a3dbf,0x7c00300,0xe30000,0x114a3ebd,0x7000400,0x1200c02,0x114a3fb4,0x4000004,0x1200000,0x114a3fbd,0x7c00d00,0x2530c00,0x114a42bf,0x4000000, +0xe00000,0x114a42bf,0x4000000,0xe0000f,0x114a44bf,0x4000000,0xe00002,0x114a44bf,0x4000000,0xe00003,0x114a44bf,0x4000000,0x14e00003,0x114a45bf,0x4000000,0xe00002, +0x114a45bf,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c1f,0x2802100,0x962460,0x11800c1f,0x2802500,0x962460,0x11800f29,0x2802400,0x962460,0x11800f36, +0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3dc0,0x2802400,0x962460,0x118a3ebd,0x2802400,0x962460,0x11c00904,0x2802400, +0x962460,0x11c00908,0x2802400,0x962460,0x11c00c23,0x6800000,0x1329800,0x11c00c27,0xc000010,0xb48000,0x11c00f6f,0x6800000,0x1329800,0x11c01074,0x6800000,0x1329800, +0x11c01178,0x6800000,0x1329800,0x11c0127c,0x6800000,0x1329800,0x11c01480,0x4000000,0x200000,0x11c01480,0x6800000,0x1329800,0x11c01684,0x6800000,0x1329800,0x11c05123, +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,0x1900000,0x20004c67,0,0x1900000, +0x20004d67,0,0x1900000,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,0x4000000,0x200000, +0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x445800,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,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002800,0x2c000010,0x15248002,0x30002a00, +0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002b01,0x2000,0x8962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x14220405,0x30002d19,0x7c00100, +0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003000,0x24000000,0x4200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000, +0x30003700,0x24000000,0x4200000,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,0x30402591,0x4000010,0x400000,0x30402591,0x4000010,0xb70000,0x30402591,0xc000010,0xb48000,0x304028af, +0x4000001,0xc41c0b,0x304a3dbf,0x4000000,0xe00000,0x30800c1f,0x2802100,0x962460,0x30c01c89,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,0x8962460,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,0x445802,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,0x14200000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x4100000,0x32003700, +0x24000000,0x4200000,0x32003700,0x24000000,0x14200000,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, +0x14200000,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,0x32026c01,0x12882000,0x8962460,0x32065700, +0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020, +0x1410000,0x320a3600,0x24000020,0x34200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10, +0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x3240638d,0xc000010,0x448000,0x324a3dc2, +0x4000000,0x14e00000,0x324a3dc2,0x7c00100,0x1230400,0x324a3fbd,0x4000002,0x1200c00,0x324a53ba,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,0x14200000,0x40003000,0x24000020, +0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x4200000,0x40003700,0x24000000,0x14200000,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,0x14200000,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,0x34200000,0x400a3700,0x24000000,0x34e00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, +0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x404077f6,0x4000000, +0x200000,0x404077f9,0x4000000,0x200000,0x404077f9,0x4000000,0x400000,0x40c01480,0x4000000,0x200000,0x40c05123,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,0x1500000,0x41000c02,0xc000010, +0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400, +0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802400,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,0x4200000,0x41003700,0x24000000,0x14200000,0x41003700,0x24000000,0x14e00000,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,0x4000400,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,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,0x34200000,0x410a3700,0x24000000, +0x34e00000,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,0x414a82bf,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01480,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,0x4200000,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,0x50409abf,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,0x2802500, +0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540, +0x51001c1c,0x6800500,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800, +0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x4200000,0x51003700,0x24000000,0x4e00000,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,0x4000400,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,0x2802d00,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,0x4e00000,0x5100ab00,0x4000000,0x4e00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100, +0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x34200000,0x510aaa00,0x4000000,0x34e00000,0x5140a2f1,0x4000400,0x400000,0x514a82bf,0x4000000,0xe00000, +0x51802bb1,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,0x6800500, +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,0x5200ac7e,0xc000010,0x248000,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, +0x6800500,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,0x4100000,0x52023700,0x24000000,0x4e00000,0x52023700,0x24000000,0x14100000,0x52023700,0x24000000,0x14e00000,0x52023700,0x24000000, +0x96800000,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,0x14150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700, +0x24000000,0x34e00000,0x520a3800,0x24000000,0x34100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x34100000,0x520ab412,0x7c00100, +0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x34e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000, +0x5240af93,0x7c00100,0x230400,0x5240af98,0x4000400,0x200000,0x5240af9a,0x6800400,0x962540,0x5240af9a,0x7c00100,0x230400,0x5240afa4,0x7c00100,0x230400,0x5240afa6, +0x7c00100,0x230400,0x5240b2c5,0x4000000,0x200000,0x5240b2c5,0x4000000,0x1500000,0x5240b2d0,0x4000000,0x200000,0x5240b2de,0x4000000,0x200000,0x5240b5f4,0x7c00900, +0x230400,0x524a44bf,0x4000000,0xe00003,0x5280af93,0x2802400,0x962460,0x5280af94,0x2802400,0x962460,0x5280af9a,0x2802400,0x962460,0x5280af9c,0x2802400,0x962460, +0x5280af9e,0x2802400,0x962460,0x52c0b3eb,0x2802400,0x962460,0x52c0b3ef,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,0x2802400,0x962460,0x60002919,0x7c00100,0x22040e, +0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x14200000,0x60003000,0x24000000,0x14e00000,0x60003700,0x24000000,0x4200000,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,0x4e00000,0x6000d000, +0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100, +0x14150400,0x600a3000,0x24000000,0x34200000,0x600a3000,0x24000000,0x34e00000,0x600a3700,0x24000000,0x34200000,0x600a3800,0x24000000,0x34200000,0x600a3800,0x24000000,0xb6800000, +0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x34100000,0x600ac400,0x4000000,0x14e0000d,0x600ac400,0x4000000,0x34e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16, +0x7c00100,0xe30c00,0x600acc00,0x4000000,0x34e00000,0x600acd00,0x4000000,0x34200000,0x600acd00,0x4000000,0x34e00000,0x600acd00,0x4000000,0xb6800000,0x600ace00,0x4000000, +0x34e00000,0x600ace00,0x4000000,0xb6800000,0x600acf00,0x4000000,0x34e00000,0x600acf00,0x4000000,0xb6800000,0x600ad111,0x7c40300,0xe30000,0x604ac4bf,0x4000000,0x34e00003, +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,0x2802500,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,0x34e00000,0x6140af98, +0x7c00100,0x230400,0x6140af9a,0x7c00100,0x230400,0x6180af95,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63002800,0x80000,0x918820,0x63c00c15,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,0x14200000,0x70003800,0x24000000, +0x4e00000,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,0x2802500,0x1862460,0x7000b61c, +0x6800500,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460,0x7000cc00,0x4000000,0x4e00000,0x7000cd00,0x4000000, +0x200000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x14200000,0x7000cd00,0x4000000,0x14e00000,0x7000cd00,0x4000000,0x96800000, +0x7000cf00,0x4000000,0x4e00000,0x7000cf00,0x4000000,0x14e00000,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,0x2802500,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,0x2802400,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,0x34e00000,0x700acd00,0x4000000,0xb6800000,0x700ace00,0x4000000,0x34e00000,0x700acf00,0x4000000, +0x34e00000,0x700acf00,0x4000000,0xb6800000,0x7040dffb,0x4000000,0x200000,0x7040f7ff,0x80000,0x918820,0x7080af98,0x2802400,0x962460,0x7080dffb,0x2802400,0x962460, +0x70c0e4fd,0x2802100,0x962460,0x70c0e4fd,0x2802400,0x962460,0x70c0e4fd,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,0x4e00000,0x8000d202, +0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460,0x8000d997,0x2802400,0x962460,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,0x34e00000,0x800acd00,0x4000000,0x7a902460,0x800ace00,0x4000000,0x34e00000,0x800acf00,0x4000000,0x34e00000, +0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x34e00000,0x800b0500,0x4000000,0xb6800000,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,0x34e00000,0x900acd00,0x4000000,0xb6800000,0x900acf00,0x4000000,0x34e00000,0x900b0500,0x4000000, +0xe00000,0x900b0500,0x4000000,0x34e00000,0x900b0500,0x4000000,0xb6800000,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,0x4e00000,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,0x4e00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,0x4000000,0x34e00000,0xa00b0500,0x4000000,0x34e00000, +0xa00b0500,0x4000000,0xb6800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040afae, +0x6800400,0x962540,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004,0x2802000,0x962460,0xb0001110,0x4000000,0x200000,0xb0001524,0x2802000, +0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000,0x200000,0xb0008939,0x4000000,0x200000,0xb0008939,0x7c00100,0x230400, +0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000,0xb0009257,0x2802000,0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519, +0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a,0x2802100,0x962460,0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000, +0x218960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100,0x962540,0xb000d476,0x7c00100,0x230400,0xb000e300,0x4000000,0x4e00000, +0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400,0xb0011900,0x4000000,0x4e00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2, +0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2,0x6800100,0x962540,0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100, +0x230400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000,0x1329800,0xb0011cb3,0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400, +0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400,0xb0011db6,0x7c00500,0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00, +0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4,0x7c00100,0x230400,0xb0011fb4,0xc000010,0x248000,0xb0012000,0x4000000, +0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010,0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5,0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000, +0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400,0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000,0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7, +0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711,0x7c40300,0xe30000,0xb00acf00,0x4000000,0x34e00000,0xb00b0500,0x4000000,0x34e00000,0xb00b0500,0x4000000, +0x3ce00000,0xb00b0500,0x4000000,0xb6800000,0xb00b109a,0x7c00300,0xe30000,0xb080e47e,0x2802000,0x962460,0xc0001524,0x4000000,0x500000,0xc0001a18,0x2806400,0x1862460, +0xc0001a18,0x7c00100,0x1830000,0xc0007300,0x24000000,0x200000,0xc0008e00,0x24000010,0x400000,0xc0009519,0x7c00100,0x220400,0xc0009519,0x7c00100,0x250400,0xc000c300, +0x4000000,0x420000f,0xc000d85c,0x2802100,0x962460,0xc000d85c,0x6800100,0x962540,0xc000d85c,0x7c00100,0x230400,0xc000dc99,0x7c00100,0x230400,0xc000e719,0x7c00100, +0x220400,0xc00107a7,0x7c00100,0x230400,0xc0010eaa,0x7c00100,0x230400,0xc00116b0,0x7c00100,0x230560,0xc0011900,0x4000000,0x4200000,0xc0012447,0,0x818820, +0xc0012447,0,0xc18820,0xc0012447,0,0x1418820,0xc00125b9,0x7c00100,0x230400,0xc00126bb,0x2802100,0x962460,0xc00126bb,0x2806400,0x962460,0xc00126bb, +0x4000000,0x500000,0xc00126bb,0x6800100,0x962540,0xc00126bb,0x7c00100,0x230400,0xc00127ba,0x2802400,0x962460,0xc00127ba,0x4000000,0x200000,0xc00127ba,0x6800000, +0x1329800,0xc00127ba,0x7c00100,0x230400,0xc00127ba,0x7c00900,0x230400,0xc0012800,0x4000000,0x200000,0xc0012b23,0x4000000,0x200000,0xc0012b23,0x4000000,0x400000, +0xc0012b23,0x4000000,0x1500000,0xc0012cbc,0x2802400,0x962460,0xc0012cbc,0x4000000,0x1600000,0xc0012cbc,0x6800000,0x1329800,0xc0012cbc,0x7c00100,0x230400,0xc00acf00, +0x4000000,0x34e00000,0xc00ae300,0x4000000,0x34e00000,0xc00b0500,0x4000000,0x34e00000,0xc00b0500,0x4000000,0xb6800000,0xc00b0b00,0x4000000,0x1200000,0xc00b0b00,0x7c00900, +0x1230400,0xc00b109a,0x7c00300,0xe30000,0xc00b2914,0x7c00100,0x2530000,0xc00b2916,0x7c00100,0x2530c00,0xc00b2a00,0x4000000,0x34e00000,0xc040af55,0x7c00100,0x230400, +0xc0c12b80,0x4000000,0x200000,0xc14a44bf,0x4000000,0xe0000d}; -static const int32_t countPropsVectors=6639; +static const int32_t countPropsVectors=6822; static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[234]={ +static const uint16_t scriptExtensions[256]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, 0x25,0x80b6,2,0x22,0x8025,2,0x12,2,0x22,0x54,0x79,0x7b,0xa7,0xb6,0x80b7,2, 0x8022,2,0x8025,2,0x21,2,0x80b6,2,0x25,4,0xa,0xf,0x10,0x15,0x19,0x1a, 0x1f,0x23,0x24,0x89,0x97,0x809e,4,0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24, 0x89,0x809e,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89,0x91,0x99, -0x9e,0xa0,0xb2,0x80b3,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a, -0x89,0x91,0x99,0x9e,0xa0,0xb2,0x80b3,0xa,0x78,0xa0,0x80b2,0xa,0x67,4,0x3a,0x8076, -4,0x6d,0x10,0x80a4,0x10,0x72,0xf,0x809d,0xf,0x76,0x23,0x8089,0x23,0x7a,0x1c,0x34, -0x8076,0x1c,0x7e,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089, -0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15,0x1a,0x1f,0x23,0x8024,0x8004,0xa,0x19,0x8089, -5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11,0x14, -0x8016,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x15, -0x1a,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x15,0x78,0x91,0x99, -0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0x92,0xa,0x8023,0xa,0xd7,0x19,0x1c,0x804f,0x37,0x804e, -0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89,0x7a,0x8087}; +0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x30,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,0xa,0x78,0xa0,0x80b2,0xa, +0x6b,4,0x3a,0x8076,4,0x71,0x10,0x80a4,0x10,0x76,0xf,0x809d,0xf,0x7a,0x23,0x8089, +0x23,0x7e,0x15,0x80bb,0x15,0x82,0x1c,0x34,0x8076,0x1c,0x86,0xc,0x8019,0x2a,0x2b,0x2c, +0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089,0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15, +0x1a,0x1f,0x23,0x8024,0xa,0x80bb,4,0xa,0x15,0x1f,0x24,0x89,0x9e,0x80bb,0x8004,0x19, +0x801b,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011, +5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2, +0xa,0xf,0x10,0x15,0x1a,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0x80bb,0xa,0xf, +0x10,0x15,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0x80bb,0xa,0x9a,0xa,0x8023,0xa, +0xed,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89,0x7e,0x8087}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x29fa,0x29fa,0x29fa,0x29fa,0x649c,3,0x7e8b,0x7f00,0x7f00,0x7f00,0xb23b8,0x2a75a31,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2afc,0x2afc,0x2afc,0x2afc,0x66be,3,0x8164,0x81e4,0x81e4,0x81e4,0xb2cbc,0x2a75a31,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucln_cmn.cpp b/deps/icu-small/source/common/ucln_cmn.cpp index 7e541a1a5f0f3b..d78491df419fb0 100644 --- a/deps/icu-small/source/common/ucln_cmn.cpp +++ b/deps/icu-small/source/common/ucln_cmn.cpp @@ -40,8 +40,8 @@ U_CAPI void U_EXPORT2 u_cleanup(void) { UTRACE_ENTRY_OC(UTRACE_U_CLEANUP); - umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ - umtx_unlock(NULL); /* all state left around by any other threads. */ + icu::umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ + icu::umtx_unlock(NULL); /* all state left around by any other threads. */ ucln_lib_cleanup(); diff --git a/deps/icu-small/source/common/ucnv_bld.cpp b/deps/icu-small/source/common/ucnv_bld.cpp index 1a1625d69c8c79..e6ef833f4e4317 100644 --- a/deps/icu-small/source/common/ucnv_bld.cpp +++ b/deps/icu-small/source/common/ucnv_bld.cpp @@ -194,9 +194,12 @@ static struct { /*initializes some global variables */ static UHashtable *SHARED_DATA_HASHTABLE = NULL; -static UMutex cnvCacheMutex = U_MUTEX_INITIALIZER; /* Mutex for synchronizing cnv cache access. */ - /* Note: the global mutex is used for */ - /* reference count updates. */ +static icu::UMutex *cnvCacheMutex() { /* Mutex for synchronizing cnv cache access. */ + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} +/* Note: the global mutex is used for */ +/* reference count updates. */ static const char **gAvailableConverters = NULL; static uint16_t gAvailableConverterCount = 0; @@ -599,9 +602,9 @@ U_CFUNC void ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData) { if(sharedData != NULL && sharedData->isReferenceCounted) { - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); ucnv_unload(sharedData); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); } } @@ -609,9 +612,9 @@ U_CFUNC void ucnv_incrementRefCount(UConverterSharedData *sharedData) { if(sharedData != NULL && sharedData->isReferenceCounted) { - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); sharedData->referenceCounter++; - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); } } @@ -812,9 +815,9 @@ ucnv_loadSharedData(const char *converterName, pArgs->nestedLoads=1; pArgs->pkg=NULL; - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); mySharedConverterData = ucnv_load(pArgs, err); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); if (U_FAILURE (*err) || (mySharedConverterData == NULL)) { return NULL; @@ -1061,7 +1064,7 @@ ucnv_flushCache () * because the sequence of looking up in the cache + incrementing * is protected by cnvCacheMutex. */ - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); /* * double loop: A delta/extension-only converter has a pointer to its base table's * shared data; the first iteration of the outer loop may see the delta converter @@ -1090,7 +1093,7 @@ ucnv_flushCache () } } } while(++i == 1 && remaining > 0); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); UTRACE_DATA1(UTRACE_INFO, "ucnv_flushCache() exits with %d converters remaining", remaining); @@ -1196,7 +1199,7 @@ internalSetName(const char *name, UErrorCode *status) { } algorithmicSharedData = getAlgorithmicTypeFromName(stackArgs.name); - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); gDefaultAlgorithmicSharedData = algorithmicSharedData; gDefaultConverterContainsOption = containsOption; @@ -1212,7 +1215,7 @@ internalSetName(const char *name, UErrorCode *status) { ucnv_enableCleanup(); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); } #endif @@ -1237,7 +1240,7 @@ ucnv_getDefaultName() { but ucnv_setDefaultName is not thread safe. */ { - icu::Mutex lock(&cnvCacheMutex); + icu::Mutex lock(cnvCacheMutex()); name = gDefaultConverterName; } if(name==NULL) { diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index e1248a7bd36035..2fec6b4b1510d6 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -1383,7 +1383,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { uprv_strcat(name, UCNV_SWAP_LFNL_OPTION_STRING); /* set the pointers */ - umtx_lock(NULL); + icu::umtx_lock(NULL); if(mbcsTable->swapLFNLStateTable==NULL) { mbcsTable->swapLFNLStateTable=newStateTable; mbcsTable->swapLFNLFromUnicodeBytes=(uint8_t *)newResults; @@ -1391,7 +1391,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { newStateTable=NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); /* release the allocated memory if another thread beat us to it */ if(newStateTable!=NULL) { @@ -1919,9 +1919,9 @@ ucnv_MBCSOpen(UConverter *cnv, /* do this because double-checked locking is broken */ UBool isCached; - umtx_lock(NULL); + icu::umtx_lock(NULL); isCached=mbcsTable->swapLFNLStateTable!=NULL; - umtx_unlock(NULL); + icu::umtx_unlock(NULL); if(!isCached) { if(!_EBCDICSwapLFNL(cnv->sharedData, pErrorCode)) { diff --git a/deps/icu-small/source/common/ucptrie.cpp b/deps/icu-small/source/common/ucptrie.cpp index 13496ad56c5e58..b72e318387a186 100644 --- a/deps/icu-small/source/common/ucptrie.cpp +++ b/deps/icu-small/source/common/ucptrie.cpp @@ -280,7 +280,7 @@ UChar32 getRange(const void *t, UChar32 start, int32_t prevI3Block = -1; int32_t prevBlock = -1; UChar32 c = start; - uint32_t value; + uint32_t trieValue, value; bool haveValue = false; do { int32_t i3Block; @@ -319,6 +319,7 @@ UChar32 getRange(const void *t, UChar32 start, return c - 1; } } else { + trieValue = trie->nullValue; value = nullValue; if (pValue != nullptr) { *pValue = nullValue; } haveValue = true; @@ -357,6 +358,7 @@ UChar32 getRange(const void *t, UChar32 start, return c - 1; } } else { + trieValue = trie->nullValue; value = nullValue; if (pValue != nullptr) { *pValue = nullValue; } haveValue = true; @@ -364,23 +366,32 @@ UChar32 getRange(const void *t, UChar32 start, c = (c + dataBlockLength) & ~dataMask; } else { int32_t di = block + (c & dataMask); - uint32_t value2 = getValue(trie->data, valueWidth, di); - value2 = maybeFilterValue(value2, trie->nullValue, nullValue, - filter, context); + uint32_t trieValue2 = getValue(trie->data, valueWidth, di); if (haveValue) { - if (value2 != value) { - return c - 1; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, trie->nullValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } else { - value = value2; + trieValue = trieValue2; + value = maybeFilterValue(trieValue2, trie->nullValue, nullValue, + filter, context); if (pValue != nullptr) { *pValue = value; } haveValue = true; } while ((++c & dataMask) != 0) { - if (maybeFilterValue(getValue(trie->data, valueWidth, ++di), - trie->nullValue, nullValue, - filter, context) != value) { - return c - 1; + trieValue2 = getValue(trie->data, valueWidth, ++di); + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, trie->nullValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } } diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 5c9bbef70097e7..dba3247fef2c98 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -85,30 +85,14 @@ static const char CURRENCY_MAP[] = "CurrencyMap"; // Tag for default meta-data, in CURRENCY_META static const char DEFAULT_META[] = "DEFAULT"; -// Variant for legacy pre-euro mapping in CurrencyMap -static const char VAR_PRE_EURO[] = "PREEURO"; - -// Variant for legacy euro mapping in CurrencyMap -static const char VAR_EURO[] = "EURO"; - // Variant delimiter static const char VAR_DELIM = '_'; -static const char VAR_DELIM_STR[] = "_"; - -// Variant for legacy euro mapping in CurrencyMap -//static const char VAR_DELIM_EURO[] = "_EURO"; - -#define VARIANT_IS_EMPTY 0 -#define VARIANT_IS_EURO 0x1 -#define VARIANT_IS_PREEURO 0x2 // Tag for localized display names (symbols) of currencies static const char CURRENCIES[] = "Currencies"; static const char CURRENCIES_NARROW[] = "Currencies%narrow"; static const char CURRENCYPLURALS[] = "CurrencyPlurals"; -static const UChar EUR_STR[] = {0x0045,0x0055,0x0052,0}; - // ISO codes mapping table static const UHashtable* gIsoCodes = NULL; static icu::UInitOnce gIsoCodesInitOnce = U_INITONCE_INITIALIZER; @@ -360,30 +344,10 @@ _findMetaData(const UChar* currency, UErrorCode& ec) { // ------------------------------------- -/** - * @see VARIANT_IS_EURO - * @see VARIANT_IS_PREEURO - */ -static uint32_t +static void idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCode* ec) { - uint32_t variantType = 0; - // !!! this is internal only, assumes buffer is not null and capacity is sufficient - // Extract the country name and variant name. We only - // recognize two variant names, EURO and PREEURO. - char variant[ULOC_FULLNAME_CAPACITY]; ulocimp_getRegionForSupplementalData(locale, FALSE, countryAndVariant, capacity, ec); - uloc_getVariant(locale, variant, sizeof(variant), ec); - if (variant[0] != 0) { - variantType = (uint32_t)(0 == uprv_strcmp(variant, VAR_EURO)) - | ((uint32_t)(0 == uprv_strcmp(variant, VAR_PRE_EURO)) << 1); - if (variantType) - { - uprv_strcat(countryAndVariant, VAR_DELIM_STR); - uprv_strcat(countryAndVariant, variant); - } - } - return variantType; } // ------------------------------------------ @@ -401,7 +365,10 @@ U_CDECL_END #if !UCONFIG_NO_SERVICE struct CReg; -static UMutex gCRegLock = U_MUTEX_INITIALIZER; +static UMutex *gCRegLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static CReg* gCRegHead = 0; struct CReg : public icu::UMemory { @@ -427,14 +394,14 @@ struct CReg : public icu::UMemory { if (status && U_SUCCESS(*status) && _iso && _id) { CReg* n = new CReg(_iso, _id); if (n) { - umtx_lock(&gCRegLock); + umtx_lock(gCRegLock()); if (!gCRegHead) { /* register for the first time */ ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup); } n->next = gCRegHead; gCRegHead = n; - umtx_unlock(&gCRegLock); + umtx_unlock(gCRegLock()); return n; } *status = U_MEMORY_ALLOCATION_ERROR; @@ -444,7 +411,7 @@ struct CReg : public icu::UMemory { static UBool unreg(UCurrRegistryKey key) { UBool found = FALSE; - umtx_lock(&gCRegLock); + umtx_lock(gCRegLock()); CReg** p = &gCRegHead; while (*p) { @@ -457,13 +424,13 @@ struct CReg : public icu::UMemory { p = &((*p)->next); } - umtx_unlock(&gCRegLock); + umtx_unlock(gCRegLock()); return found; } static const UChar* get(const char* id) { const UChar* result = NULL; - umtx_lock(&gCRegLock); + umtx_lock(gCRegLock()); CReg* p = gCRegHead; /* register cleanup of the mutex */ @@ -475,7 +442,7 @@ struct CReg : public icu::UMemory { } p = p->next; } - umtx_unlock(&gCRegLock); + umtx_unlock(gCRegLock()); return result; } @@ -568,7 +535,7 @@ ucurr_forLocale(const char* locale, // get country or country_variant in `id' char id[ULOC_FULLNAME_CAPACITY]; - uint32_t variantType = idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + idForLocale(locale, id, UPRV_LENGTHOF(id), ec); if (U_FAILURE(*ec)) { return 0; } @@ -602,20 +569,6 @@ ucurr_forLocale(const char* locale, 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); - } else if ((variantType & VARIANT_IS_EURO)) { - s = EUR_STR; - } - } ures_close(currencyReq); ures_close(countryArray); } @@ -740,7 +693,13 @@ ucurr_getName(const UChar* currency, key.append("/", ec2); key.append(buf, ec2); s = ures_getStringByKeyWithFallback(rb.getAlias(), key.data(), len, &ec2); - } else { + if (ec2 == U_MISSING_RESOURCE_ERROR) { + *ec = U_USING_FALLBACK_WARNING; + ec2 = U_ZERO_ERROR; + choice = UCURR_SYMBOL_NAME; + } + } + if (s == NULL) { ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2); ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2); s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2); @@ -1397,7 +1356,10 @@ static CurrencyNameCacheEntry* currCache[CURRENCY_NAME_CACHE_NUM] = {NULL}; // It is a simple round-robin replacement strategy. static int8_t currentCacheEntryIndex = 0; -static UMutex gCurrencyCacheMutex = U_MUTEX_INITIALIZER; +static UMutex *gCurrencyCacheMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} // Cache deletion static void @@ -1446,7 +1408,7 @@ getCacheEntry(const char* locale, UErrorCode& ec) { CurrencyNameStruct* currencySymbols = NULL; CurrencyNameCacheEntry* cacheEntry = NULL; - umtx_lock(&gCurrencyCacheMutex); + umtx_lock(gCurrencyCacheMutex()); // in order to handle racing correctly, // not putting 'search' in a separate function. int8_t found = -1; @@ -1461,13 +1423,13 @@ getCacheEntry(const char* locale, UErrorCode& ec) { cacheEntry = currCache[found]; ++(cacheEntry->refCount); } - umtx_unlock(&gCurrencyCacheMutex); + umtx_unlock(gCurrencyCacheMutex()); if (found == -1) { collectCurrencyNames(locale, ¤cyNames, &total_currency_name_count, ¤cySymbols, &total_currency_symbol_count, ec); if (U_FAILURE(ec)) { return NULL; } - umtx_lock(&gCurrencyCacheMutex); + umtx_lock(gCurrencyCacheMutex()); // check again. for (int8_t i = 0; i < CURRENCY_NAME_CACHE_NUM; ++i) { if (currCache[i]!= NULL && @@ -1506,19 +1468,19 @@ getCacheEntry(const char* locale, UErrorCode& ec) { cacheEntry = currCache[found]; ++(cacheEntry->refCount); } - umtx_unlock(&gCurrencyCacheMutex); + umtx_unlock(gCurrencyCacheMutex()); } return cacheEntry; } static void releaseCacheEntry(CurrencyNameCacheEntry* cacheEntry) { - umtx_lock(&gCurrencyCacheMutex); + umtx_lock(gCurrencyCacheMutex()); --(cacheEntry->refCount); if (cacheEntry->refCount == 0) { // remove deleteCacheEntry(cacheEntry); } - umtx_unlock(&gCurrencyCacheMutex); + umtx_unlock(gCurrencyCacheMutex()); } U_CAPI void @@ -2305,7 +2267,7 @@ ucurr_countCurrencies(const char* locale, 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); + idForLocale(locale, id, sizeof(id), ec); if (U_FAILURE(*ec)) { @@ -2421,7 +2383,7 @@ ucurr_forLocaleAndDate(const char* locale, resLen = 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); + idForLocale(locale, id, sizeof(id), ec); if (U_FAILURE(*ec)) { return 0; diff --git a/deps/icu-small/source/common/uhash.cpp b/deps/icu-small/source/common/uhash.cpp index 239997d05d7e38..79241a282913ed 100644 --- a/deps/icu-small/source/common/uhash.cpp +++ b/deps/icu-small/source/common/uhash.cpp @@ -376,8 +376,7 @@ _uhash_find(const UHashtable *hash, UHashTok key, * WILL NEVER HAPPEN as long as uhash_put() makes sure that * count is always < length. */ - U_ASSERT(FALSE); - return NULL; /* Never happens if uhash_put() behaves */ + UPRV_UNREACHABLE; } return &(elements[theIndex]); } diff --git a/deps/icu-small/source/common/uinvchar.cpp b/deps/icu-small/source/common/uinvchar.cpp index eafb951e38a67c..2e0f42d9274d2a 100644 --- a/deps/icu-small/source/common/uinvchar.cpp +++ b/deps/icu-small/source/common/uinvchar.cpp @@ -207,8 +207,7 @@ u_UCharsToChars(const UChar *us, char *cs, int32_t length) { while(length>0) { u=*us++; if(!UCHAR_IS_INVARIANT(u)) { - U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */ - u=0; + UPRV_UNREACHABLE; /* Variant characters were used. These are not portable in ICU. */ } *cs++=(char)UCHAR_TO_CHAR(u); --length; diff --git a/deps/icu-small/source/common/ulayout_props.h b/deps/icu-small/source/common/ulayout_props.h new file mode 100644 index 00000000000000..c0f028c7132609 --- /dev/null +++ b/deps/icu-small/source/common/ulayout_props.h @@ -0,0 +1,46 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// ulayout_props.h +// created: 2019feb12 Markus W. Scherer + +#ifndef __ULAYOUT_PROPS_H__ +#define __ULAYOUT_PROPS_H__ + +#include "unicode/utypes.h" + +// file definitions ------------------------------------------------------------ + +#define ULAYOUT_DATA_NAME "ulayout" +#define ULAYOUT_DATA_TYPE "icu" + +// data format "Layo" +#define ULAYOUT_FMT_0 0x4c +#define ULAYOUT_FMT_1 0x61 +#define ULAYOUT_FMT_2 0x79 +#define ULAYOUT_FMT_3 0x6f + +// indexes into indexes[] +enum { + // Element 0 stores the length of the indexes[] array. + ULAYOUT_IX_INDEXES_LENGTH, + // Elements 1..7 store the tops of consecutive code point tries. + // No trie is stored if the difference between two of these is less than 16. + ULAYOUT_IX_INPC_TRIE_TOP, + ULAYOUT_IX_INSC_TRIE_TOP, + ULAYOUT_IX_VO_TRIE_TOP, + ULAYOUT_IX_RESERVED_TOP, + + ULAYOUT_IX_TRIES_TOP = 7, + + ULAYOUT_IX_MAX_VALUES = 9, + + // Length of indexes[]. Multiple of 4 to 16-align the tries. + ULAYOUT_IX_COUNT = 12 +}; + +constexpr int32_t ULAYOUT_MAX_INPC_SHIFT = 24; +constexpr int32_t ULAYOUT_MAX_INSC_SHIFT = 16; +constexpr int32_t ULAYOUT_MAX_VO_SHIFT = 8; + +#endif // __ULAYOUT_PROPS_H__ diff --git a/deps/icu-small/source/common/ulayout_props_data.h b/deps/icu-small/source/common/ulayout_props_data.h deleted file mode 100644 index f42d15fc830afd..00000000000000 --- a/deps/icu-small/source/common/ulayout_props_data.h +++ /dev/null @@ -1,722 +0,0 @@ -// © 2018 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// -// file name: ulayout_props_data.h -// -// machine-generated by: icu/tools/unicode/c/genprops/layoutpropsbuilder.cpp - - -#ifdef INCLUDED_FROM_UPROPS_CPP - -static const int32_t maxInPCValue = 14; - -static const uint16_t inpc_trieIndex[765]={ -0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x80,0xc0,0xff,0x13f,0x17e,0x1be,0x17e,0x1fe,0x23e,0x27e,0x2bc,0x2fc, -0x33c,0x37b,0x23e,0x3bb,0x3fb,0x439,0x477,0x4ad,0x4e1,0x521,0x531,0x571,0x599,0x5d9,0x619,0x656, -0x2b7,0x2c6,0x2d2,0x2c6,0x2ed,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0,0x10,0x20, -0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20, -0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0x80,0x90,0xa0, -0xb0,0xc0,0xd0,0xe0,0xf0,0xff,0x10f,0x11f,0x12f,0x13f,0x14f,0x15f,0x16f,0x17e,0x18e,0x19e, -0x1ae,0x1be,0x1ce,0x1de,0x1ee,0x17e,0x18e,0x19e,0x1ae,0x1fe,0x20e,0x21e,0x22e,0x23e,0x24e,0x25e, -0x26e,0x27e,0x28e,0x29e,0x2ae,0x2bc,0x2cc,0x2dc,0x2ec,0x2fc,0x30c,0x31c,0x32c,0x33c,0x34c,0x35c, -0x36c,0x37b,0x38b,0x39b,0x3ab,0x23e,0x24e,0x25e,0x26e,0x3bb,0x3cb,0x3db,0x3eb,0x3fb,0x40b,0x41b, -0x42b,0x439,0x449,0x459,0x469,0x477,0x487,0x497,0x4a7,0x4ad,0x4bd,0x4cd,0x4dd,0x4e1,0x4f1,0x501, -0x511,0x521,0x531,0x541,0x551,0x531,0x541,0x551,0x561,0x571,0x581,0x591,0x5a1,0x599,0x5a9,0x5b9, -0x5c9,0x5d9,0x5e9,0x5f9,0x609,0x619,0x629,0x639,0x649,0x656,0x666,0x676,0x686,0,0,0x68b, -0x69a,0,0x6a9,0x6b8,0x6c7,0x6d5,0x6e5,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x6f3,0,0x6f3, -0,0x701,0,0x701,0,0,0,0x70b,0x71b,0x729,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x739,0x749,0,0, -0,0,0,0,0,0x759,0x768,0,0,0,0x772,0,0,0,0x77e,0x78d, -0x79b,0,0,0,0,0,0,0,0,0x7ab,0,0,0x7b7,0x7c7,0,0x7cc, -0x52c,0x81,0,0x7dc,0,0,0,0x7ea,0x3fb,0,0,0x7fa,0x807,0,0,0, -0,0,0,0,0,0,0x817,0x827,0x835,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2b3,0x83f,0,0x84c,0,0,0,0, -0,0x101,0,0,0x858,0x864,0,0x874,0x882,0,0,0x892,0,0x8a0,0x3fb,0, -0,0x80,0,0,0x8b0,0x8c0,0,0x2b9,0,0,0x8c7,0x8d6,0x8e3,0,0,0x8f1, -0,0,0,0x901,0x2bd,0,0x911,0x151,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x921,0,0x930,0,0,0x940,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x950,0,0,0x958,0x966,0,0,0, -0x81,0,0,0x976,0,0,0,0,0x52d,0,0x981,0x991,0x3cb,0,0,0x659, -0x81,0,0,0x99e,0x9ae,0,0,0,0x9bb,0x9cb,0,0,0,0,0,0, -0,0,0,0x71,0x9db,0,0xff,0,0,0x9e6,0x9f6,0x14f,0xa04,0x52b,0,0, -0,0,0,0,0,0,0x99c,0xa14,0x16f,0,0,0,0,0,0xa24,0xa33, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb,0xa43,0xe3, -0x214,0,0,0,0xa53,0x2be,0,0,0,0,0,0xa63,0xa73,0,0,0, -0,0,0xa7b,0xa8b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa97,0xaa6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xab5, -0,0,0xac2,0,0xad1,0,0,0xadd,0xae7,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb, -0xaf7,0,0,0,0,0,0xb07,0xb0f,0xb1e,0,0,0,0,0,0,0, -0xb2d,0xb3c,0,0,0,0xb44,0xb54,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb61,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x45,0x4d,0x4d,0x4d,0x5d,0x7d,0x9d,0xbd,0xdd, -2,2,0xec,0x10a,0x129,0x149,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,0x169,0x188,2,2,2,2,2,2,2,2, -2,2,0x1a8,2,2,0x1c8,0x1e6,0x203,0x221,0x23f,0x25f,0x27d,0x297 -}; - -static const uint8_t inpc_trieData[2930]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,8,8,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8,7,1,0,7,4, -7,1,1,1,1,8,8,8,8,7,7,7,7,1,4,7, -0,8,1,8,8,8,1,1,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,7,4,7, -1,1,1,1,0,0,4,4,0,0,5,5,1,0,0,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0, -0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8, -8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,7,4,7,1, -1,0,0,0,0,8,8,0,0,8,8,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,8,8, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,7,1, -1,1,1,8,0,8,8,0xd,0,7,7,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8,8,8,8,8,8,0,8, -7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,7,8,7,1, -1,1,1,0,0,4,0xb,0,0,5,0xc,1,0,0,0,0, -0,0,0,0,8,0xd,0,0,0,0,0,0,0,0,0,0, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7,7,8,7,7,0, -0,0,4,4,4,0,5,5,5,8,0,0,0,0,0,0, -0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8,7,7,7, -8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8,8,7,7,7,7, -0,8,8,9,0,8,8,8,8,0,0,0,0,0,0,0, -8,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xd,7,7,7,7, -0,8,0xd,0xd,0,0xd,0xd,8,8,0,0,0,0,0,0,0, -7,7,0,0,0,0,0,0,0,0,0,0,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8,8,7,7,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8,8,0,7,7,7,1,1,0,4, -4,4,0,5,5,5,8,0,0,0,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8,0,0,0,0,7,7,7,8, -8,1,0,1,0,7,4,0xb,4,5,0xc,5,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, -7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7,8,7,7,8,8,8,8,1,1,1,0,0,0,0, -0,0xe,0xe,0xe,0xe,0xe,7,0,8,8,8,8,8,8,8,8, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7,8,7,7,8,8,8,8,1,1,0,8,1,0,0, -0,0xe,0xe,0xe,0xe,0xe,0,0,0,8,8,8,8,8,8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -1,0,8,0,0,0,0,7,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,0, -0,0,0,0,0,0,0,0,0,0,1,8,9,1,1,9, -9,9,9,8,8,8,8,8,7,8,9,8,8,1,0,8, -8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, -1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7,7,8,8,1,4,8,8,8,8, -8,1,7,0,8,7,0,1,1,0,0,0,0,0,0,7, -7,1,1,0,0,0,0,1,1,0,7,7,7,0,0,7, -7,7,7,7,7,7,0,0,8,8,8,8,0,0,0,0, -0,0,0,0,0,0,0,1,7,4,8,8,7,7,7,7, -7,7,1,0,7,0,0,0,0,0,0,0,0,0,0,7, -7,7,8,0,0,8,1,1,0,0,0,0,0,0,0,0, -0,0,0,8,1,0,0,0,0,0,0,0,0,0,0,0, -0,7,8,8,8,8,1,1,1,0xb,0xc,5,4,4,4,5, -5,8,7,7,8,8,8,8,8,8,8,0,8,0,0,0, -0,0,0,0,0,0,8,0,0,8,8,1,7,7,0xd,0xd, -8,8,7,7,7,0,0,0,0,7,7,1,7,7,7,7, -7,7,1,8,1,0,0,0,0,7,7,7,7,7,0xe,0xe, -0xe,7,7,0xe,7,7,7,7,7,0,0,0,0,0,0,0, -7,7,0,0,0,0,0,0,0,8,1,4,7,8,0,0, -0,0,0,4,1,7,8,8,8,1,1,1,1,0,7,8, -7,7,8,8,8,8,1,1,8,1,7,4,4,4,8,8, -8,8,8,8,8,8,8,8,0,0,1,8,8,8,8,7, -0,0,0,0,0,0,0,0,0,0,0,8,7,8,8,1, -1,1,3,9,0xa,4,4,5,5,8,0xd,7,0,0,0,0, -0,0,0,0,0,0,0,8,1,8,8,8,0,7,1,1, -8,1,4,7,8,8,7,0,1,1,0,0,0,0,0,0, -8,7,8,8,7,7,7,8,7,8,0,0,0,0,7,7, -7,4,4,0xb,7,7,1,8,8,8,8,4,4,8,1,0, -0,0,0,0,0,0,0,8,8,8,0,6,1,1,1,1, -1,8,8,1,1,1,1,8,7,6,6,6,6,6,6,6, -0,0,0,0,1,0,0,0,0,8,0,0,7,0,0,0, -0,0,0,0,0,8,0,0,0,0,8,0,0,0,0,7, -7,1,8,7,0,0,0,0,0,0,0,0,7,7,7,7, -7,7,7,7,7,7,7,7,1,8,0,0,0,0,0,0, -0,0,0,0,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,8,0,0,0,0,0,0,0,0,0,0,0,1,1,1, -0,0,0,0,0,0,0,1,1,1,8,1,1,1,1,8, -0,0,0,8,7,7,8,8,1,1,4,4,8,7,7,2, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,8,8,8,1,8,4,8,1,7,4,1,1,0,0,0, -0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,8, -7,0,0,0,0,0,0,0,0,0,0,0,7,8,7,0, -0,8,7,8,8,1,0xe,0xe,8,8,0xe,7,0xe,0xe,7,8, -8,0,0,0,0,0,0,0,0,0,0,0,4,1,8,4, -7,0,0,0,7,7,8,7,7,1,7,7,0,7,1,0, -0,6,1,1,0,8,6,0,0,0,0,0,1,1,1,8, -0,0,0,0,0,0,0,0,8,1,1,0,0,0,0,0, -7,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,8,8,8,1,1,1,1,8,8,8,8,8,0,0,0, -0,0,0,0,0,0,7,4,7,1,1,8,8,7,7,1, -1,0,0,0,0,0,0,0,8,8,8,1,1,4,8,9, -9,8,1,1,0,8,0,0,0,0,0,0,0,0,0,0, -0,7,4,7,1,1,1,1,1,1,8,8,8,0xd,7,0, -0,0,0,0,0,0,0,1,0,8,1,0,0,0,0,0, -0,0,0,0,0,0,0,7,7,7,1,8,8,0xd,0xd,8, -7,8,8,0,0,0,0,0,0,8,0,7,4,7,1,1, -8,8,8,8,1,1,0,0,0,0,0,0,0,0,0,0, -0,1,1,0,7,7,8,7,7,7,7,0,0,4,4,0, -0,5,5,7,0,0,7,7,0,0,8,8,8,8,8,8, -8,0,0,0,7,7,1,8,8,7,1,0,0,0,0,0, -0,0,0,0,7,4,7,1,1,1,1,1,1,4,8,0xb, -5,7,5,8,7,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,4,7,1,1,1,1,0,0,4,0xb,5,0xc,8, -8,7,1,7,7,7,1,1,1,1,1,1,8,8,7,7, -8,7,1,0,0,0,0,0,0,0,0,0,0,0,8,7, -8,4,7,1,1,8,8,8,8,7,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,8,7,7,8,8,1, -1,4,8,1,8,8,8,0,0,0,0,0,0,0,0,0, -0,0,0,7,4,7,1,1,1,8,8,8,8,8,7,1, -1,0,0,0,0,0,8,1,1,8,8,8,8,8,8,1, -0,0,0,0,0,1,1,8,8,8,8,7,0,1,1,1, -1,0,8,1,1,8,8,8,7,7,1,1,1,0,0,0, -0,0,0,0,0,0,0,1,1,1,1,1,1,8,7,8, -0,0,0,0,0,0,0,8,8,1,1,1,1,1,0,8, -8,8,8,8,8,7,1,0,0,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0,7,1,1,1,1,1,1,4, -1,8,7,8,8,0,0,0,0,0,0,0,0,0,8,8, -8,8,8,1,0,0,0,8,0,8,8,0,8,8,1,8, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,7,7, -7,7,7,0,8,8,0,7,7,8,7,0,0,0,0,0, -0,0,0,0,8,1,4,7,0,0,0,0,0,0,0,0, -0,0 -}; - -static const UCPTrie inpc_trie={ - inpc_trieIndex, - { inpc_trieData }, - 765, 2930, - 0x12000, 0x12, - 1, 2, - 0, 0, - 0x2, 0x0, - 0x0, -}; - -static const int32_t maxInSCValue = 35; - -static const uint16_t insc_trieIndex[834]={ -0,0x40,0x60,0x94,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,0xd4,0x112,0x152,0x190,0x1cf,0x20d,0x24c,0x28a,0x2ca,0x308,0x346,0x384, -0x3c4,0x402,0x441,0x47f,0x4bf,0x4fd,0x53d,0x57d,0x5bc,0x5fc,0x63b,0x67b,0x69b,0x6db,0x71b,0x758, -0x2f8,0x30b,0x317,0x30b,0x332,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x60,0x70,0x80, -0x90,0x94,0xa4,0xb4,0xc4,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60, -0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60, -0x70,0x40,0x50,0x60,0x70,0xd4,0xe4,0xf4,0x104,0x112,0x122,0x132,0x142,0x152,0x162,0x172, -0x182,0x190,0x1a0,0x1b0,0x1c0,0x1cf,0x1df,0x1ef,0x1ff,0x20d,0x21d,0x22d,0x23d,0x24c,0x25c,0x26c, -0x27c,0x28a,0x29a,0x2aa,0x2ba,0x2ca,0x2da,0x2ea,0x2fa,0x308,0x318,0x328,0x338,0x346,0x356,0x366, -0x376,0x384,0x394,0x3a4,0x3b4,0x3c4,0x3d4,0x3e4,0x3f4,0x402,0x412,0x422,0x432,0x441,0x451,0x461, -0x471,0x47f,0x48f,0x49f,0x4af,0x4bf,0x4cf,0x4df,0x4ef,0x4fd,0x50d,0x51d,0x52d,0x53d,0x54d,0x55d, -0x56d,0x57d,0x58d,0x59d,0x5ad,0x5bc,0x5cc,0x5dc,0x5ec,0x5fc,0x60c,0x61c,0x62c,0x63b,0x64b,0x65b, -0x66b,0x67b,0x68b,0x69b,0x6ab,0x69b,0x6ab,0x6bb,0x6cb,0x6db,0x6eb,0x6fb,0x70b,0x71b,0x72b,0x73b, -0x74b,0x758,0x768,0x778,0x788,0xe9,0xe9,0x798,0x7a3,0x7b3,0x7c3,0x7d2,0x7e1,0x7ef,0x7ff,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x80f,0x81d,0xe6,0x81d,0xe6,0x82d,0x80f,0x83d,0xe9,0xe9,0x84d, -0x859,0x863,0x872,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x882,0x16c,0x892,0x8a2,0x22d,0xe9,0x8b2,0x8c2,0xe9,0xe9,0x374,0x8d2, -0x8e1,0x30,0x40,0x40,0xe9,0x8f1,0xe9,0xe9,0x901,0x90e,0x91e,0x92a,0x30,0x30,0x40,0x40, -0x40,0x40,0x40,0x40,0x93a,0xe6,0xe9,0x94a,0x956,0x30,0x40,0x40,0x966,0xe9,0x975,0x985, -0xe9,0xe9,0x995,0x9a5,0xe9,0xe9,0x9b5,0x9c2,0x9d2,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x9e2,0x9f0,0x9fe,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0xa08,0xa14,0xa24,0x40,0x40,0x40,0x40,0x40,0x75a,0xa32,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,0x74,0x40,0x40,0x40,0xa42,0xe9,0xa4f, -0x40,0xe9,0xa5f,0xa6d,0xa7c,0xd6,0xe7,0xe9,0xa8c,0xa98,0x30,0xaa8,0xab6,0xac6,0xe9,0xad4, -0xe9,0xae4,0xaf3,0x40,0x40,0xb03,0xe9,0xe9,0xb12,0x297,0x30,0xb22,0xb32,0xe3,0xe9,0x889, -0xb42,0xb52,0x30,0xe9,0xb61,0xe9,0xe9,0xe9,0xb71,0xb81,0x40,0xb91,0xba1,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xbb1,0xbc1,0xbce,0x30,0xbde,0xbee,0xe9, -0xbf8,0x31,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,0xc08,0xe6,0xe9, -0x88a,0xc18,0xc26,0xc30,0xc40,0xc50,0xe9,0xe9,0xc60,0x40,0x40,0x40,0x40,0xc70,0xe9,0x88b, -0xc80,0xc90,0xca0,0xe9,0xcad,0xd5,0xe8,0xe9,0xcbd,0xccd,0x30,0x6ba,0x35,0xe1,0x3eb,0x886, -0xcdd,0x40,0x40,0x40,0x40,0xced,0x16d,0xcfc,0xdf,0xe9,0xd0c,0xd1c,0x30,0xd2c,0x162,0x172, -0xd3c,0x308,0xd4c,0xd5c,0x9ed,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xe9, -0xd6c,0xd7a,0xd8a,0x40,0x40,0xd99,0xe9,0xe9,0x91f,0xda9,0x30,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xff,0xdb9,0xdc9,0xdd1,0x40,0x40,0xdb,0xe9,0xe9, -0xde1,0xdf1,0x30,0x40,0x40,0xdf,0xe9,0xe01,0xe0e,0x30,0x40,0x40,0x40,0xe9,0xe1e,0xe2e, -0xe3e,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdf,0xe9,0x886, -0xe4e,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,0xe5e,0xe9,0xe9, -0xe6b,0xe7b,0xe8b,0xe9,0xe9,0xe97,0xea1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xeb1,0xe9,0xff, -0xec1,0xed1,0x6bb,0xee1,0x555,0xe9,0xeef,0x72b,0xeff,0x40,0x40,0x40,0x40,0xf0f,0xe9,0xe9, -0xf1e,0xf2e,0x30,0xf3e,0xe9,0xf4a,0xf57,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0xe9,0xf67,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x45,0x55,0x55,0x55,0x65,0x85,0xa5,0xc5, -0xe5,4,4,0xf5,0x114,0x134,0x154,4,0x174,4,0x17d,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,0x19d,0x1bd,4,4,4, -4,4,4,4,4,4,4,0x1dd,4,4,0x1fd,0x21d,0x23d,0x25d,0x27d,0x29d, -0x2bd,0x2d8 -}; - -static const uint8_t insc_trieData[3960]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,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,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x1c,0x1c,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x22,0x22, -0x17,1,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f, -0x22,0x22,0,4,4,0,0,0x22,0x22,0x22,5,5,5,5,5,5, -5,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0,0,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5, -5,5,0xc,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0, -0,0x23,0x23,0,0,0x23,0x23,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,0,5,0,0,0,5,5,5,5,0,0,0x17,1, -0x22,0x22,0x22,0x22,0x22,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,6,0, -0,0,0,0,0,0,0,0x22,0,0,0,0,5,5,0,5, -0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -5,5,0,0,0,0,0,0,0,0,0,0,2,0,0x1c,0, -2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0,0,0x23,0x23, -0,0,0x23,0x23,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, -0,5,5,0,5,5,0,5,5,0,0,0x17,0,0x22,0x22,0x22, -0,0,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,0,0,0,4,0, -0,0,0,0,0,0,5,5,5,5,0,5,0,0,0,0, -0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,2,0x12,0xc, -0xc,0,0xb,0,0,0,0,0,0,0,0,0,0,2,2,0x20, -0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0,0x23, -0x23,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,0,5,5, -0,5,5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0x22, -0,0x22,0x22,0x22,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x23,0x23,0x22,0x22,0,0, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0, -0,0,0,5,4,4,4,0x17,0x17,0x17,0,2,2,0x20,0,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,0x23,0,0,0x23,0x23,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,0,5,5,0,5, -5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0,0,0x22, -0x22,0,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0,0x22,0x22, -0,0,0,0,5,5,0,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,5,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0x15,0,0x23,0x23,0x23,0x23,0x23, -0x23,0,0,0,0x23,0x23,0x23,0,0x23,0x23,0x23,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,0x22,0x22,0x22,0,0,0,0x22,0x22,0x22,0,0x22,0x22, -0x22,0x1f,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,0x20,2,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0,0x23,0x23,0x23,0,0x23,0x23,0x23,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,0,0, -0,1,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f, -0,0,0,0,0,0,0,0x22,0x22,0,5,5,5,0,0,0, -0,0,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23, -0x23,0x23,0,0x23,0x23,0x23,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,0,5,5,5,5,5,0,0,0x17,1,0x22, -0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0,0,0, -0,0,0,0,0x22,0x22,0,0,0,0,0,0,0,5,0,0x23, -0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0, -0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23, -0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x1a,0x1a,1,0x22,0x22,0x22, -0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0xd,0,0,0,0, -0,6,6,6,0x22,0,0,0,0,0,0,0,0x23,0x23,0x23,0x22, -0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0, -0,0,0,0,0,0,0,6,6,6,6,6,6,0,0,2, -0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,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, -5,5,5,5,5,5,5,5,5,0,5,0,0,5,5,5, -5,5,5,5,0,0,0,0x1f,0,0,0,0,0x22,0x22,0x22,0x22, -0x22,0x22,0,0x22,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0,0, -0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0x22, -0x22,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,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0,0x22,0x22,0x22,0x22, -0x22,0x22,0,0x22,0x1e,0x1e,0x1e,0x1e,0xa,2,0x1a,0,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,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,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,0,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0,0x22,0xb,0xb,0,0,0x22,0x22,0x22,0x22,0x22, -0,0,0,0x1e,0x1e,0x1e,0x1e,0,2,0,0,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0,0,5,5,5,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0, -0x1c,0,0x1c,0,0x17,0,0,0,0,0,0,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,5, -5,5,5,5,5,5,5,5,0,0,0,0,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x22,2,2,0x1a, -1,0,0,8,8,8,8,8,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,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,0xf,0xf,0xf,0xf,0,0,0,0,0,0,0x1c,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e,0x20,0x13,0x1a,0xb,0xb, -0xb,0xb,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0xc,0, -0,0xc,0,5,5,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,5,5,5, -5,0xb,0xb,5,0x22,0x1e,0x1e,5,5,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e, -5,5,0x22,0x22,0x22,0x22,5,5,5,5,5,5,5,5,5,5, -5,0xb,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,5,0x1e,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1e,0x1e,0x22,0x22,0,0,0x23, -0x23,0x23,5,5,5,5,5,5,5,5,5,5,0,5,5,0x22, -0x22,0x1a,0,0,0,0,0,0,0,0,0,0,0,5,5,0x22, -0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0x22, -0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x1b,0x1b,0x1c,0x10, -0xa,0x1c,0x1c,0x1a,0x13,0x1c,0,0,0,0,0,0,0,0,1,0x1c, -0,0,0xc,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf,0xf,0xf,0,0, -0,0,7,7,2,7,7,7,7,7,7,7,0x22,0x1c,0,0, -0,0,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0,0,0x1d,0x1d,0x1d,0x1d,0x1d,0,0,0,0,0,0,0,0,0, -0,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,7,7,7,7,7,7,7,0x1e,0x1e,0,0,0,0,0, -0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23,0x23, -0x23,5,5,0xb,0xb,0xf,7,7,9,0xf,0xf,0xf,0xf,0,0x13,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1a,0x1c,0x1c,0,0,0x1c,2,2,2,0x10,0x20,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,0x17,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,5,5,5,5,5, -5,5,0,0,0,0,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -5,5,5,5,5,5,0xf,0xf,0xf,0x22,0x22,0x22,0x22,0x22,0x22,0x1a, -0x13,0xf,0xf,5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,1, -5,5,5,7,7,5,5,5,5,0x23,0x23,0x17,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,7,7,0x1a,0x1a,0,0,0,0,0,0,0, -0,0,0,0,0,5,5,5,5,0xf,0xf,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,7,7,7,7,2,2,0x1c,0x17,0,0,0,0,0,0, -0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,5, -5,5,4,4,4,0,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, -0x20,0x20,4,0x11,0x11,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0x1c,0,0,0,0,0,0,0,0,0,0,0,0, -0x16,0x14,0,0,0xc,0xc,0xc,0xc,0xc,0,0,0,0,0,0,0, -0,0,0,0,0x1c,0x1c,0x1c,0,0,0,0,0,0,0,0,0, -0,0,0x23,0x23,0,0x23,0x23,0x23,0x1a,5,5,5,5,2,5,5, -5,5,0x22,0x22,0x22,0x22,0x22,0,0,0,0,0,0,0,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x21,0x21,5, -5,5,5,0x21,0xf,0xf,5,5,5,5,5,5,5,0xf,5,2, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -0xb,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,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,2,2,0,0,0,0,0,0, -0,0,0,0,0x23,0x22,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -5,5,5,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1e, -0x1e,0x1e,0,0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,7,7,7,0x1a,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,5,5,5,0x23, -0x23,0x23,5,5,5,0x17,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf, -0xb,0xb,5,5,5,5,5,0x22,0,5,5,5,5,5,5,5, -5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,5,5,5,5, -5,0,0x22,0x22,0x22,0xb,0xb,0xb,0xb,0,0,0,0,0,0,0, -0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -0,0,5,5,5,0xc,0xc,0xc,0,0,0,5,0x1e,0x1e,0x1e,5, -5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x1e,0x1d,0x1e,0x1d,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x23,0x23,5,5,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22, -0x22,0,0,0,0,0,0x20,0x13,0,0,0,0,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23, -0x23,5,0x23,5,5,5,5,5,5,5,5,5,7,7,7,7, -7,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x1e,0x1a,0,0,5,0x22, -0x22,0x22,0,0x22,0x22,0,0,0,0,0,0x22,0x22,2,0x20,5,5, -5,5,0,5,5,5,0,5,5,5,5,5,5,5,0,0, -0x17,0x17,0x17,0,0,0,0,0x13,2,2,0x20,0x11,0x11,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0, -0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x19, -2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,0,0, -2,2,0x20,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5, -0x22,0x22,0x22,0x13,0x1a,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0,0,0,0,5,0x22,0x22,0,0,0,0,0,0,0,0,0, -0x21,0x21,0x21,0x21,0x21,5,5,5,5,5,5,5,5,5,5,5, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,1,0xe, -0xe,0,0,0,0,0,0x1c,0x17,0x22,0x22,0,0,0,0x22,0x22,0x22, -0x22,2,0x1f,0x17,0x12,0,0,0,0,0,0,4,0,0x23,0x23,0x23, -0x23,5,5,5,0,5,0,5,5,5,5,0,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,5,5,5,5,5,2,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x17,0x1a,0,0,0,0,0,2,2,2,0x20, -0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,5,0,5,5, -0,5,5,5,5,5,0,0x17,0x17,1,0x22,0x22,0,0,0,0, -0,0,0,0x22,0,0,0,0,0,0,2,2,0x23,0x23,0x22,0x22, -0,0,4,4,4,4,4,4,4,0,0,0,5,5,5,5, -5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,2,0x20, -0x17,1,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0,0,0,0,0x1c,0,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,2,0x20,0x1f,0x17,1,0,0, -0,0,0,0,0,0,0,0,0,0x22,0x22,0x22,0x22,0x22,0x22,0, -0,0x22,0x22,0x22,0x22,2,2,0x20,0x1f,0x17,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x23,0x23,0x23,0x23,0x22,0x22,0, -0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20, -0x1f,0x22,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,2,0x20,0x22,0x22, -0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,0,0,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,0,0,0xb,0xb,0xb,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,2,0x20,0x1f,0x17,0,0,0,0,0,0x23,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,5,0x1c,0x1a, -2,2,2,2,0x20,0xe,0xb,0xb,0xb,0xb,0xc,0,0,0,0,0, -0xc,0,0x13,0,0,0,0,0,0,0,0,0x23,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,0,0,0xe,0xe,0xe, -0xe,7,7,7,7,7,7,2,0x20,0x12,0x13,0,0,0,1,0, -0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0x23,5, -5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0x22,2,2,0x20, -0x1f,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0, -0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x22, -0x22,0x22,0x22,0x22,2,2,0,0,0,0,0,0,0,0,0,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,5,5,5,5,0x22, -0x22,0x22,0x22,0x22,0x22,0,0,0,0x22,0,0x22,0x22,0,0x22,2,0x20, -0x17,0x22,0x1a,0x13,0xd,0xb,0,0,0,0,0,0,0,0,0x23,0x23, -0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,0x23,5,5,5,5,5,5, -5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,2,0x20,0x13,0, -0,0,0,0,0,0,0,5,5,0xc,0x22,0x22,0x22,0x22,0,0, -0,0,0,0,0,0,0,0 -}; - -static const UCPTrie insc_trie={ - insc_trieIndex, - { insc_trieData }, - 834, 3960, - 0x12000, 0x12, - 1, 2, - 0, 0, - 0x4, 0x40, - 0x0, -}; - -static const int32_t maxVoValue = 3; - -static const uint16_t vo_trieIndex[1100]={ -0,0x40,0x59,0x98,0,0,0,0,0,0,0,0xd0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x33b,0x355,0x363,0x379,0x399,0x3b7,0x3d2,0x3ec,0x355,0x355,0x355,0x40c,0x355,0x355,0x355,0x40c, -0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, -0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, -0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x355,0x355,0x355,0x40c, -0x355,0x355,0x355,0x40c,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x59,0x69,0x79,0x89, -0x98,0xa8,0xb8,0xc8,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, -0,0x10,0x20,0x30,0xd0,0xe0,0xf0,0x100,0,0x10,0x20,0x30,0,0x10,0x20,0x30, -0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, -0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x10f,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa9,0x96,0x11e,0x12c,0xae,0xaa,0,0,0,0,0, -0,0x103,0x13c,0,0x14c,0x158,0x166,0x10b,0x175,0x110,0x110,0x110,0x184,0,0,0, -0,0,0,0,0x72,0,0xf6,0,0,0,0,0,0,0,0,0, -0,0,0,0x190,0x110,0x198,0,0,0,0,0x103,0x110,0x115,0,0xec,0x1a8, -0x1b6,0x10e,0x110,0x110,0x1c6,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110, -0x110,0x110,0x116,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x118,0x10a,0x110,0x1d2,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x10e,0x110,0,0, -0x116,0,0,0,0,0,0x108,0x110,0x1e2,0x114,0x110,0,0,0,0,0, -0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x1f1,0x1ff,0x110,0x20e,0x21d, -0x110,0x22a,0x110,0x237,0x246,0x256,0x110,0x22a,0x110,0x237,0x261,0x110,0x110,0x26e,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x27e,0x27e,0x27e,0x27e, -0x286,0x110,0x28e,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0,0, -0,0,0,0x110,0,0x110,0x117,0x29b,0x2aa,0,0,0,0,0,0,0, -0,0,0x2ba,0x2c9,0x110,0x2d9,0x110,0x2e9,0x2f8,0,0,0,0,0,0,0, -0x308,0x318,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0, -0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0,0,0,0,0,0,0,0,0x328,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x112,0x84,0x98,0xa8,0xa8,0xa8, -0xa8,0xa8,0xa8,0xc8,0xc,0xe8,0x100,0x115,0xc,0xc,0xc,0x134,0x153,0x172,0x191,0xc, -0x1ab,0xc,0x1cb,0x1eb,0x20b,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0xfb,0xc,0x243,0xc,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0xc,0xc,0xc,0xc,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0x262,0xc,0xc,0xc,0xc,0x282,0xc,0xc, -0xc,0xc,0xc,0x29c,0xc,0xc,0xfd,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0x223,0x223,0x2b9,0xc,0xc,0xc,0xc,0xc,0x223,0x100,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x2bc,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x2da,0xf8,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0x223,0x2fa,0xc,0xc,0x223,0xfd,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0x223,0x31a,0x223,0x223,0xc8,0x2b5,0xc,0xc,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x31b,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc -}; - -static const uint8_t vo_trieData[828]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,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,3,0,0,0,0,3,0,0,3,0,0,0,0,0, -0,0,0,0,0,3,3,3,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,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,0,0, -0,0,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,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -0,0,0,0,0,0,0,0,0,3,3,0,0,0,3,0, -0,0,0,3,3,3,0,0,0,0,0,0,3,0,3,3, -3,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3, -3,3,3,3,3,3,0,0,0,0,0,3,3,0,3,3, -0,0,0,0,0,0,3,3,3,3,0,3,0,3,0,3, -0,0,0,0,3,0,0,0,0,0,3,3,3,3,3,3, -0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,0, -3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3, -3,1,1,3,0,0,0,0,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3, -3,3,0,0,0,0,3,3,3,0,3,3,3,3,3,3, -3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3, -3,3,2,2,3,3,3,3,3,1,1,1,1,1,1,1, -1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3, -2,3,2,3,2,3,2,3,3,3,3,3,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,3, -3,3,3,3,3,2,3,3,3,3,3,2,2,3,3,3, -3,2,2,3,3,3,1,2,3,2,3,2,3,2,3,2, -3,3,3,3,3,3,2,2,3,3,3,3,3,1,3,3, -3,3,3,3,3,2,3,3,3,3,3,3,3,3,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,2,2,2,2,2,3,3, -3,3,3,0,1,1,1,1,1,1,3,3,3,0,0,0, -0,3,3,3,3,3,3,3,3,3,0,2,3,3,3,3, -3,3,1,1,3,3,2,0,2,3,3,3,3,3,3,3, -3,3,3,1,1,0,0,0,2,3,3,3,3,3,3,3, -3,3,3,3,1,3,1,3,1,3,3,3,3,3,3,3, -3,3,3,3,1,1,1,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,3,3,3,1,3,3,3,3, -0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3, -3,0,0,0,3,3,0,0,2,2,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,0,0,0,0 -}; - -static const UCPTrie vo_trie={ - vo_trieIndex, - { vo_trieData }, - 1100, 828, - 0x110000, 0x110, - 1, 2, - 0, 0, - 0xc, 0x0, - 0x0, -}; - -#endif // INCLUDED_FROM_UPROPS_CPP diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 81b6e0f68ab88b..73b43204b814b9 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -457,8 +457,6 @@ NULL typedef struct CanonicalizationMap { const char *id; /* input ID */ const char *canonicalID; /* canonicalized output ID */ - const char *keyword; /* keyword, or NULL if none */ - const char *value; /* keyword value, or NULL if kw==NULL */ } CanonicalizationMap; /** @@ -466,64 +464,16 @@ typedef struct CanonicalizationMap { * different semantic kinds of transformations. */ static const CanonicalizationMap CANONICALIZE_MAP[] = { - { "", "en_US_POSIX", NULL, NULL }, /* .NET name */ - { "c", "en_US_POSIX", NULL, NULL }, /* POSIX name */ - { "posix", "en_US_POSIX", NULL, NULL }, /* POSIX name (alias of C) */ - { "art_LOJBAN", "jbo", NULL, NULL }, /* registered name */ - { "az_AZ_CYRL", "az_Cyrl_AZ", NULL, NULL }, /* .NET name */ - { "az_AZ_LATN", "az_Latn_AZ", NULL, NULL }, /* .NET name */ - { "ca_ES_PREEURO", "ca_ES", "currency", "ESP" }, - { "de__PHONEBOOK", "de", "collation", "phonebook" }, /* Old ICU name */ - { "de_AT_PREEURO", "de_AT", "currency", "ATS" }, - { "de_DE_PREEURO", "de_DE", "currency", "DEM" }, - { "de_LU_PREEURO", "de_LU", "currency", "LUF" }, - { "el_GR_PREEURO", "el_GR", "currency", "GRD" }, - { "en_BE_PREEURO", "en_BE", "currency", "BEF" }, - { "en_IE_PREEURO", "en_IE", "currency", "IEP" }, - { "es__TRADITIONAL", "es", "collation", "traditional" }, /* Old ICU name */ - { "es_ES_PREEURO", "es_ES", "currency", "ESP" }, - { "eu_ES_PREEURO", "eu_ES", "currency", "ESP" }, - { "fi_FI_PREEURO", "fi_FI", "currency", "FIM" }, - { "fr_BE_PREEURO", "fr_BE", "currency", "BEF" }, - { "fr_FR_PREEURO", "fr_FR", "currency", "FRF" }, - { "fr_LU_PREEURO", "fr_LU", "currency", "LUF" }, - { "ga_IE_PREEURO", "ga_IE", "currency", "IEP" }, - { "gl_ES_PREEURO", "gl_ES", "currency", "ESP" }, - { "hi__DIRECT", "hi", "collation", "direct" }, /* Old ICU name */ - { "it_IT_PREEURO", "it_IT", "currency", "ITL" }, - { "ja_JP_TRADITIONAL", "ja_JP", "calendar", "japanese" }, /* Old ICU name */ - { "nb_NO_NY", "nn_NO", NULL, NULL }, /* "markus said this was ok" :-) */ - { "nl_BE_PREEURO", "nl_BE", "currency", "BEF" }, - { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" }, - { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" }, - { "sr_SP_CYRL", "sr_Cyrl_RS", NULL, NULL }, /* .NET name */ - { "sr_SP_LATN", "sr_Latn_RS", NULL, NULL }, /* .NET name */ - { "sr_YU_CYRILLIC", "sr_Cyrl_RS", NULL, NULL }, /* Linux name */ - { "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" }, /* Old ICU name */ - { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", NULL, NULL }, /* Linux name */ - { "uz_UZ_CYRL", "uz_Cyrl_UZ", NULL, NULL }, /* .NET name */ - { "uz_UZ_LATN", "uz_Latn_UZ", NULL, NULL }, /* .NET name */ - { "zh_CHS", "zh_Hans", NULL, NULL }, /* .NET name */ - { "zh_CHT", "zh_Hant", NULL, NULL }, /* .NET name */ - { "zh_GAN", "gan", NULL, NULL }, /* registered name */ - { "zh_GUOYU", "zh", NULL, NULL }, /* registered name */ - { "zh_HAKKA", "hak", NULL, NULL }, /* registered name */ - { "zh_MIN_NAN", "nan", NULL, NULL }, /* registered name */ - { "zh_WUU", "wuu", NULL, NULL }, /* registered name */ - { "zh_XIANG", "hsn", NULL, NULL }, /* registered name */ - { "zh_YUE", "yue", NULL, NULL }, /* registered name */ -}; - -typedef struct VariantMap { - const char *variant; /* input ID */ - const char *keyword; /* keyword, or NULL if none */ - const char *value; /* keyword value, or NULL if kw==NULL */ -} VariantMap; - -static const VariantMap VARIANT_MAP[] = { - { "EURO", "currency", "EUR" }, - { "PINYIN", "collation", "pinyin" }, /* Solaris variant */ - { "STROKE", "collation", "stroke" } /* Solaris variant */ + { "art_LOJBAN", "jbo" }, /* registered name */ + { "hy__AREVELA", "hy" }, /* Registered IANA variant */ + { "hy__AREVMDA", "hyw" }, /* Registered IANA variant */ + { "zh_GAN", "gan" }, /* registered name */ + { "zh_GUOYU", "zh" }, /* registered name */ + { "zh_HAKKA", "hak" }, /* registered name */ + { "zh_MIN_NAN", "nan" }, /* registered name */ + { "zh_WUU", "wuu" }, /* registered name */ + { "zh_XIANG", "hsn" }, /* registered name */ + { "zh_YUE", "yue" }, /* registered name */ }; /* ### BCP47 Conversion *******************************************/ @@ -643,20 +593,12 @@ compareKeywordStructs(const void * /*context*/, const void *left, const void *ri return uprv_strcmp(leftString, rightString); } -/** - * Both addKeyword and addValue must already be in canonical form. - * Either both addKeyword and addValue are NULL, or neither is NULL. - * If they are not NULL they must be zero terminated. - * If addKeyword is not NULL is must have length small enough to fit in KeywordStruct.keyword. - */ static int32_t _getKeywords(const char *localeID, char prev, char *keywords, int32_t keywordCapacity, char *values, int32_t valuesCapacity, int32_t *valLen, UBool valuesToo, - const char* addKeyword, - const char* addValue, UErrorCode *status) { KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS]; @@ -755,33 +697,6 @@ _getKeywords(const char *localeID, } } while(pos); - /* Handle addKeyword/addValue. */ - if (addKeyword != NULL) { - UBool duplicate = FALSE; - U_ASSERT(addValue != NULL); - /* Search for duplicate; if found, do nothing. Explicit keyword - overrides addKeyword. */ - for (j=0; j= 0); - while (len-- != 0) { - char d = *str; - if (d == c) { - return (char*) str; - } else if (d == 0) { - break; - } - ++str; - } - return NULL; -} - /** * Lookup 'key' in the array 'list'. The array 'list' should contain * a NULL entry, followed by more entries, and a second NULL entry. @@ -1279,6 +1180,16 @@ ulocimp_getLanguage(const char *localeID, int32_t offset; char lang[4]={ 0, 0, 0, 0 }; /* temporary buffer to hold language code for searching */ + if (uprv_stricmp(localeID, "root") == 0) { + localeID += 4; + } else if (uprv_strnicmp(localeID, "und", 3) == 0 && + (localeID[3] == '\0' || + localeID[3] == '-' || + localeID[3] == '_' || + localeID[3] == '@')) { + localeID += 3; + } + /* if it starts with i- or x- then copy that prefix */ if(_isIDPrefix(localeID)) { if(i "FOO_BAR". - * @param variants the source string of one or more variants, - * separated by '_'. This will be MODIFIED IN PLACE. Not zero - * terminated; if it is, trailing zero will NOT be maintained. - * @param variantsLen length of variants - * @param toDelete variant to delete, without separators, e.g. "EURO" - * or "PREEURO"; not zero terminated - * @param toDeleteLen length of toDelete - * @return number of characters deleted from variants - */ -static int32_t -_deleteVariant(char* variants, int32_t variantsLen, - const char* toDelete, int32_t toDeleteLen) -{ - int32_t delta = 0; /* number of chars deleted */ - for (;;) { - UBool flag = FALSE; - if (variantsLen < toDeleteLen) { - return delta; - } - if (uprv_strncmp(variants, toDelete, toDeleteLen) == 0 && - (variantsLen == toDeleteLen || - (flag=(variants[toDeleteLen] == '_')) != 0)) - { - int32_t d = toDeleteLen + (flag?1:0); - variantsLen -= d; - delta += d; - if (variantsLen > 0) { - uprv_memmove(variants, variants+d, variantsLen); - } - } else { - char* p = _strnchr(variants, variantsLen, '_'); - if (p == NULL) { - return delta; - } - ++p; - variantsLen -= (int32_t)(p - variants); - variants = p; - } - } -} - /* Keyword enumeration */ typedef struct UKeywordsContext { @@ -1698,8 +1565,6 @@ _canonicalize(const char* localeID, const char* tmpLocaleID; const char* keywordAssign = NULL; const char* separatorIndicator = NULL; - const char* addKeyword = NULL; - const char* addValue = NULL; char* name; char* variant = NULL; /* pointer into name, or NULL */ @@ -1738,7 +1603,7 @@ _canonicalize(const char* localeID, len = (int32_t)uprv_strlen(d); if (name != NULL) { - uprv_strncpy(name, d, len); + uprv_memcpy(name, d, len); } } else if(_isIDSeparator(*tmpLocaleID)) { const char *scriptID; @@ -1864,27 +1729,6 @@ _canonicalize(const char* localeID, } } - /* Handle generic variants first */ - if (variant) { - for (j=0; j 0) { - if (len > 0 && name[len-1] == '_') { /* delete trailing '_' */ - --len; - } - addKeyword = VARIANT_MAP[j].keyword; - addValue = VARIANT_MAP[j].value; - break; - } - } - if (len > 0 && len <= nameCapacity && name[len-1] == '_') { /* delete trailing '_' */ - --len; - } - } - /* Look up the ID in the canonicalization map */ for (j=0; j 0) - { + // First, attempt Windows platform lookup if available, but fall + // through to catch any special cases (ICU vs Windows name differences). + lcid = uprv_convertToLCIDPlatform(localeID, &status); + if (U_FAILURE(status)) { + return 0; + } + if (lcid > 0) { // Windows found an LCID, return that return lcid; } uloc_getLanguage(localeID, langID, sizeof(langID), &status); - if (U_FAILURE(status)) { + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { return 0; } diff --git a/deps/icu-small/source/common/uloc_keytype.cpp b/deps/icu-small/source/common/uloc_keytype.cpp index 17ad91da01586d..25f35b5ced42d5 100644 --- a/deps/icu-small/source/common/uloc_keytype.cpp +++ b/deps/icu-small/source/common/uloc_keytype.cpp @@ -6,8 +6,14 @@ * Corporation and others. All Rights Reserved. ********************************************************************** */ +#include + #include "unicode/utypes.h" +#include "unicode/unistr.h" +#include "unicode/uobject.h" +#include "charstr.h" +#include "cmemory.h" #include "cstring.h" #include "uassert.h" #include "ucln_cmn.h" @@ -19,9 +25,6 @@ static UHashtable* gLocExtKeyMap = NULL; static icu::UInitOnce gLocExtKeyMapInitOnce = U_INITONCE_INITIALIZER; -static icu::UVector* gKeyTypeStringPool = NULL; -static icu::UVector* gLocExtKeyDataEntries = NULL; -static icu::UVector* gLocExtTypeEntries = NULL; // bit flags for special types typedef enum { @@ -31,17 +34,21 @@ typedef enum { SPECIALTYPE_RG_KEY_VALUE = 4 } SpecialType; -typedef struct LocExtKeyData { +struct LocExtKeyData : public icu::UMemory { const char* legacyId; const char* bcpId; - UHashtable* typeMap; + icu::LocalUHashtablePointer typeMap; uint32_t specialTypes; -} LocExtKeyData; +}; -typedef struct LocExtType { +struct LocExtType : public icu::UMemory { const char* legacyId; const char* bcpId; -} LocExtType; +}; + +static icu::MemoryPool* gKeyTypeStringPool = NULL; +static icu::MemoryPool* gLocExtKeyDataEntries = NULL; +static icu::MemoryPool* gLocExtTypeEntries = NULL; U_CDECL_BEGIN @@ -65,25 +72,6 @@ uloc_key_type_cleanup(void) { return TRUE; } -static void U_CALLCONV -uloc_deleteKeyTypeStringPoolEntry(void* obj) { - uprv_free(obj); -} - -static void U_CALLCONV -uloc_deleteKeyDataEntry(void* obj) { - LocExtKeyData* keyData = (LocExtKeyData*)obj; - if (keyData->typeMap != NULL) { - uhash_close(keyData->typeMap); - } - uprv_free(keyData); -} - -static void U_CALLCONV -uloc_deleteTypeEntry(void* obj) { - uprv_free(obj); -} - U_CDECL_END @@ -107,32 +95,20 @@ initFromResourceBundle(UErrorCode& sts) { tmpSts = U_ZERO_ERROR; LocalUResourceBundlePointer bcpTypeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "bcpTypeAlias", NULL, &tmpSts)); - // initialize vectors storing dynamically allocated objects - gKeyTypeStringPool = new UVector(uloc_deleteKeyTypeStringPoolEntry, NULL, sts); + // initialize pools storing dynamically allocated objects + gKeyTypeStringPool = new icu::MemoryPool; if (gKeyTypeStringPool == NULL) { - if (U_SUCCESS(sts)) { - sts = U_MEMORY_ALLOCATION_ERROR; - } - } - if (U_FAILURE(sts)) { + sts = U_MEMORY_ALLOCATION_ERROR; return; } - gLocExtKeyDataEntries = new UVector(uloc_deleteKeyDataEntry, NULL, sts); + gLocExtKeyDataEntries = new icu::MemoryPool; if (gLocExtKeyDataEntries == NULL) { - if (U_SUCCESS(sts)) { - sts = U_MEMORY_ALLOCATION_ERROR; - } - } - if (U_FAILURE(sts)) { + sts = U_MEMORY_ALLOCATION_ERROR; return; } - gLocExtTypeEntries = new UVector(uloc_deleteTypeEntry, NULL, sts); + gLocExtTypeEntries = new icu::MemoryPool; if (gLocExtTypeEntries == NULL) { - if (U_SUCCESS(sts)) { - sts = U_MEMORY_ALLOCATION_ERROR; - } - } - if (U_FAILURE(sts)) { + sts = U_MEMORY_ALLOCATION_ERROR; return; } @@ -145,27 +121,24 @@ initFromResourceBundle(UErrorCode& sts) { break; } const char* legacyKeyId = ures_getKey(keyMapEntry.getAlias()); - int32_t bcpKeyIdLen = 0; - const UChar* uBcpKeyId = ures_getString(keyMapEntry.getAlias(), &bcpKeyIdLen, &sts); + UnicodeString uBcpKeyId = ures_getUnicodeString(keyMapEntry.getAlias(), &sts); if (U_FAILURE(sts)) { break; } // empty value indicates that BCP key is same with the legacy key. const char* bcpKeyId = legacyKeyId; - if (bcpKeyIdLen > 0) { - char* bcpKeyIdBuf = (char*)uprv_malloc(bcpKeyIdLen + 1); + if (!uBcpKeyId.isEmpty()) { + icu::CharString* bcpKeyIdBuf = gKeyTypeStringPool->create(); if (bcpKeyIdBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - u_UCharsToChars(uBcpKeyId, bcpKeyIdBuf, bcpKeyIdLen); - bcpKeyIdBuf[bcpKeyIdLen] = 0; - gKeyTypeStringPool->addElement(bcpKeyIdBuf, sts); + bcpKeyIdBuf->appendInvariantChars(uBcpKeyId, sts); if (U_FAILURE(sts)) { break; } - bcpKeyId = bcpKeyIdBuf; + bcpKeyId = bcpKeyIdBuf->data(); } UBool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0; @@ -199,7 +172,7 @@ initFromResourceBundle(UErrorCode& sts) { LocalUResourceBundlePointer typeMapResByKey(ures_getByKey(typeMapRes.getAlias(), legacyKeyId, NULL, &tmpSts)); if (U_FAILURE(tmpSts)) { // type map for each key must exist - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } else { LocalUResourceBundlePointer typeMapEntry; @@ -228,70 +201,54 @@ initFromResourceBundle(UErrorCode& sts) { // a timezone key uses a colon instead of a slash in the resource. // e.g. America:Los_Angeles if (uprv_strchr(legacyTypeId, ':') != NULL) { - int32_t legacyTypeIdLen = static_cast(uprv_strlen(legacyTypeId)); - char* legacyTypeIdBuf = (char*)uprv_malloc(legacyTypeIdLen + 1); + icu::CharString* legacyTypeIdBuf = + gKeyTypeStringPool->create(legacyTypeId, sts); if (legacyTypeIdBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - const char* p = legacyTypeId; - char* q = legacyTypeIdBuf; - while (*p) { - if (*p == ':') { - *q++ = '/'; - } else { - *q++ = *p; - } - p++; - } - *q = 0; - - gKeyTypeStringPool->addElement(legacyTypeIdBuf, sts); if (U_FAILURE(sts)) { break; } - legacyTypeId = legacyTypeIdBuf; + std::replace( + legacyTypeIdBuf->data(), + legacyTypeIdBuf->data() + legacyTypeIdBuf->length(), + ':', '/'); + legacyTypeId = legacyTypeIdBuf->data(); } } - int32_t bcpTypeIdLen = 0; - const UChar* uBcpTypeId = ures_getString(typeMapEntry.getAlias(), &bcpTypeIdLen, &sts); + UnicodeString uBcpTypeId = ures_getUnicodeString(typeMapEntry.getAlias(), &sts); if (U_FAILURE(sts)) { break; } // empty value indicates that BCP type is same with the legacy type. const char* bcpTypeId = legacyTypeId; - if (bcpTypeIdLen > 0) { - char* bcpTypeIdBuf = (char*)uprv_malloc(bcpTypeIdLen + 1); + if (!uBcpTypeId.isEmpty()) { + icu::CharString* bcpTypeIdBuf = gKeyTypeStringPool->create(); if (bcpTypeIdBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - u_UCharsToChars(uBcpTypeId, bcpTypeIdBuf, bcpTypeIdLen); - bcpTypeIdBuf[bcpTypeIdLen] = 0; - gKeyTypeStringPool->addElement(bcpTypeIdBuf, sts); + bcpTypeIdBuf->appendInvariantChars(uBcpTypeId, sts); if (U_FAILURE(sts)) { break; } - bcpTypeId = bcpTypeIdBuf; + bcpTypeId = bcpTypeIdBuf->data(); } // Note: legacy type value should never be // equivalent to bcp type value of a different // type under the same key. So we use a single // map for lookup. - LocExtType* t = (LocExtType*)uprv_malloc(sizeof(LocExtType)); + LocExtType* t = gLocExtTypeEntries->create(); if (t == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } t->bcpId = bcpTypeId; t->legacyId = legacyTypeId; - gLocExtTypeEntries->addElement((void*)t, sts); - if (U_FAILURE(sts)) { - break; - } uhash_put(typeDataMap, (void*)legacyTypeId, t, &sts); if (bcpTypeId != legacyTypeId) { @@ -320,29 +277,20 @@ initFromResourceBundle(UErrorCode& sts) { if (isTZ) { // replace colon with slash if necessary if (uprv_strchr(from, ':') != NULL) { - int32_t fromLen = static_cast(uprv_strlen(from)); - char* fromBuf = (char*)uprv_malloc(fromLen + 1); + icu::CharString* fromBuf = + gKeyTypeStringPool->create(from, sts); if (fromBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - const char* p = from; - char* q = fromBuf; - while (*p) { - if (*p == ':') { - *q++ = '/'; - } else { - *q++ = *p; - } - p++; - } - *q = 0; - - gKeyTypeStringPool->addElement(fromBuf, sts); if (U_FAILURE(sts)) { break; } - from = fromBuf; + std::replace( + fromBuf->data(), + fromBuf->data() + fromBuf->length(), + ':', '/'); + from = fromBuf->data(); } } uhash_put(typeDataMap, (void*)from, t, &sts); @@ -380,7 +328,7 @@ initFromResourceBundle(UErrorCode& sts) { break; } - LocExtKeyData* keyData = (LocExtKeyData*)uprv_malloc(sizeof(LocExtKeyData)); + LocExtKeyData* keyData = gLocExtKeyDataEntries->create(); if (keyData == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; @@ -388,12 +336,7 @@ initFromResourceBundle(UErrorCode& sts) { keyData->bcpId = bcpKeyId; keyData->legacyId = legacyKeyId; keyData->specialTypes = specialTypes; - keyData->typeMap = typeDataMap; - - gLocExtKeyDataEntries->addElement((void*)keyData, sts); - if (U_FAILURE(sts)) { - break; - } + keyData->typeMap.adoptInstead(typeDataMap); uhash_put(gLocExtKeyMap, (void*)legacyKeyId, keyData, &sts); if (legacyKeyId != bcpKeyId) { @@ -518,7 +461,7 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i if (isKnownKey != NULL) { *isKnownKey = TRUE; } - LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap, type); + LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type); if (t != NULL) { return t->bcpId; } @@ -563,7 +506,7 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool if (isKnownKey != NULL) { *isKnownKey = TRUE; } - LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap, type); + LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type); if (t != NULL) { return t->legacyId; } diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index 8120331c4b91ff..c732170cb62b9c 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -7,9 +7,12 @@ ********************************************************************** */ +#include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/ures.h" +#include "unicode/localpointer.h" #include "unicode/putil.h" +#include "unicode/uenum.h" #include "unicode/uloc.h" #include "ustr_imp.h" #include "charstr.h" @@ -18,7 +21,6 @@ #include "putilimp.h" #include "uinvchar.h" #include "ulocimp.h" -#include "uvector.h" #include "uassert.h" @@ -29,17 +31,17 @@ typedef struct VariantListEntry { } VariantListEntry; /* struct holding a single attribute value */ -typedef struct AttributeListEntry { +struct AttributeListEntry : public icu::UMemory { const char *attribute; struct AttributeListEntry *next; -} AttributeListEntry; +}; /* struct holding a single extension */ -typedef struct ExtensionListEntry { +struct ExtensionListEntry : public icu::UMemory { const char *key; const char *value; struct ExtensionListEntry *next; -} ExtensionListEntry; +}; #define MAXEXTLANG 3 typedef struct ULanguageTag { @@ -347,45 +349,20 @@ static const char* ultag_getGrandfathered(const ULanguageTag* langtag); #endif -namespace { - -// Helper class to memory manage CharString objects. -// Only ever stack-allocated, does not need to inherit UMemory. -class CharStringPool { -public: - CharStringPool() : status(U_ZERO_ERROR), pool(&deleter, nullptr, status) {} - ~CharStringPool() = default; - - CharStringPool(const CharStringPool&) = delete; - CharStringPool& operator=(const CharStringPool&) = delete; +U_NAMESPACE_BEGIN - icu::CharString* create() { - if (U_FAILURE(status)) { - return nullptr; - } - icu::CharString* const obj = new icu::CharString; - if (obj == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - pool.addElement(obj, status); - if (U_FAILURE(status)) { - delete obj; - return nullptr; - } - return obj; - } - -private: - static void U_CALLCONV deleter(void* obj) { - delete static_cast(obj); - } - - UErrorCode status; - icu::UVector pool; -}; +/** + * \class LocalULanguageTagPointer + * "Smart pointer" class, closes a ULanguageTag via ultag_close(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @internal + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalULanguageTagPointer, ULanguageTag, ultag_close); -} // namespace +U_NAMESPACE_END /* * ------------------------------------------------- @@ -429,13 +406,22 @@ _isAlphaNumericString(const char* s, int32_t len) { } static UBool -_isLanguageSubtag(const char* s, int32_t len) { +_isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int32_t max) { + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= min && len <= max && _isAlphaNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +U_CFUNC UBool +ultag_isLanguageSubtag(const char* s, int32_t len) { /* - * language = 2*3ALPHA ; shortest ISO 639 code - * ["-" extlang] ; sometimes followed by - * ; extended language subtags - * / 4ALPHA ; or reserved for future use - * / 5*8ALPHA ; or registered language subtag + * unicode_language_subtag = alpha{2,3} | alpha{5,8}; + * NOTE: Per ICUTC 2019/01/23- accepting alpha 4 + * See ICU-20372 */ if (len < 0) { len = (int32_t)uprv_strlen(s); @@ -461,8 +447,8 @@ _isExtlangSubtag(const char* s, int32_t len) { return FALSE; } -static UBool -_isScriptSubtag(const char* s, int32_t len) { +U_CFUNC UBool +ultag_isScriptSubtag(const char* s, int32_t len) { /* * script = 4ALPHA ; ISO 15924 code */ @@ -475,8 +461,8 @@ _isScriptSubtag(const char* s, int32_t len) { return FALSE; } -static UBool -_isRegionSubtag(const char* s, int32_t len) { +U_CFUNC UBool +ultag_isRegionSubtag(const char* s, int32_t len) { /* * region = 2ALPHA ; ISO 3166-1 code * / 3DIGIT ; UN M.49 code @@ -502,7 +488,7 @@ _isVariantSubtag(const char* s, int32_t len) { if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len >= 5 && len <= 8 && _isAlphaNumericString(s, len)) { + if (_isAlphaNumericStringLimitedLength(s, len, 5, 8)) { return TRUE; } if (len == 4 && ISNUMERIC(*s) && _isAlphaNumericString(s + 1, 3)) { @@ -511,30 +497,65 @@ _isVariantSubtag(const char* s, int32_t len) { return FALSE; } +static UBool +_isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { + const char *p = s; + const char *pSubtag = NULL; + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + + while ((p - s) < len) { + if (*p == SEP) { + if (pSubtag == NULL) { + return FALSE; + } + if (!test(pSubtag, (int32_t)(p - pSubtag))) { + return FALSE; + } + pSubtag = NULL; + } else if (pSubtag == NULL) { + pSubtag = p; + } + p++; + } + if (pSubtag == NULL) { + return FALSE; + } + return test(pSubtag, (int32_t)(p - pSubtag)); +} + +U_CFUNC UBool +ultag_isVariantSubtags(const char* s, int32_t len) { + return _isSepListOf(&_isVariantSubtag, s, len); +} + +// This is for the ICU-specific "lvariant" handling. static UBool _isPrivateuseVariantSubtag(const char* s, int32_t len) { /* * variant = 1*8alphanum ; registered variants * / (DIGIT 3alphanum) */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { - return TRUE; - } - return FALSE; + return _isAlphaNumericStringLimitedLength(s, len , 1, 8); } static UBool _isExtensionSingleton(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) + * + * singleton = DIGIT ; 0 - 9 + * / %x41-57 ; A - W + * / %x59-5A ; Y - Z + * / %x61-77 ; a - w + * / %x79-7A ; y - z */ if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len == 1 && ISALPHA(*s) && (uprv_tolower(*s) != PRIVATEUSE)) { + if (len == 1 && (ISALPHA(*s) || ISNUMERIC(*s)) && (uprv_tolower(*s) != PRIVATEUSE)) { return TRUE; } return FALSE; @@ -545,101 +566,208 @@ _isExtensionSubtag(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) */ + return _isAlphaNumericStringLimitedLength(s, len, 2, 8); +} + +U_CFUNC UBool +ultag_isExtensionSubtags(const char* s, int32_t len) { + return _isSepListOf(&_isExtensionSubtag, s, len); +} + +static UBool +_isPrivateuseValueSubtag(const char* s, int32_t len) { + /* + * privateuse = "x" 1*("-" (1*8alphanum)) + */ + return _isAlphaNumericStringLimitedLength(s, len, 1, 8); +} + +U_CFUNC UBool +ultag_isPrivateuseValueSubtags(const char* s, int32_t len) { + return _isSepListOf(&_isPrivateuseValueSubtag, s, len); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) { + /* + * attribute = alphanum{3,8} ; + */ + return _isAlphaNumericStringLimitedLength(s, len , 3, 8); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleAttributes(const char* s, int32_t len) { + return _isSepListOf(&ultag_isUnicodeLocaleAttribute, s, len); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleKey(const char* s, int32_t len) { + /* + * key = alphanum alpha ; + */ if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len >= 2 && len <= 8 && _isAlphaNumericString(s, len)) { + if (len == 2 && (ISALPHA(*s) || ISNUMERIC(*s)) && ISALPHA(s[1])) { return TRUE; } return FALSE; } -static UBool -_isExtensionSubtags(const char* s, int32_t len) { - const char *p = s; - const char *pSubtag = NULL; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } +U_CFUNC UBool +_isUnicodeLocaleTypeSubtag(const char*s, int32_t len) { + /* + * alphanum{3,8} + */ + return _isAlphaNumericStringLimitedLength(s, len , 3, 8); +} - while ((p - s) < len) { - if (*p == SEP) { - if (pSubtag == NULL) { - return FALSE; - } - if (!_isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag))) { - return FALSE; - } - pSubtag = NULL; - } else if (pSubtag == NULL) { - pSubtag = p; - } - p++; - } - if (pSubtag == NULL) { - return FALSE; - } - return _isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag)); +U_CFUNC UBool +ultag_isUnicodeLocaleType(const char*s, int32_t len) { + /* + * type = alphanum{3,8} (sep alphanum{3,8})* ; + */ + return _isSepListOf(&_isUnicodeLocaleTypeSubtag, s, len); } static UBool -_isPrivateuseValueSubtag(const char* s, int32_t len) { +_isTKey(const char* s, int32_t len) +{ /* - * privateuse = "x" 1*("-" (1*8alphanum)) + * tkey = alpha digit ; */ if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { + if (len == 2 && ISALPHA(*s) && ISNUMERIC(*(s + 1))) { return TRUE; } return FALSE; } static UBool -_isPrivateuseValueSubtags(const char* s, int32_t len) { - const char *p = s; - const char *pSubtag = NULL; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } +_isTValue(const char* s, int32_t len) +{ + /* + * tvalue = (sep alphanum{3,8})+ ; + */ + return _isAlphaNumericStringLimitedLength(s, len , 3, 8); +} - while ((p - s) < len) { - if (*p == SEP) { - if (pSubtag == NULL) { - return FALSE; +static UBool +_isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) +{ + const int32_t kStart = 0; // Start, wait for unicode_language_subtag, tkey or end + const int32_t kGotLanguage = 1; // Got unicode_language_subtag, wait for unicode_script_subtag, + // unicode_region_subtag, unicode_variant_subtag, tkey or end + const int32_t kGotScript = 2; // Got unicode_script_subtag, wait for unicode_region_subtag, + // unicode_variant_subtag, tkey, or end + const int32_t kGotRegion = 3; // Got unicode_region_subtag, wait for unicode_variant_subtag, + // tkey, or end. + const int32_t kGotVariant = 4; // Got unicode_variant_subtag, wait for unicode_variant_subtag + // tkey or end. + const int32_t kGotTKey = -1; // Got tkey, wait for tvalue. ERROR if stop here. + const int32_t kGotTValue = 6; // Got tvalue, wait for tkey, tvalue or end + + switch (state) { + case kStart: + if (ultag_isLanguageSubtag(s, len)) { + state = kGotLanguage; + return TRUE; + } + if (_isTKey(s, len)) { + state = kGotTKey; + return TRUE; } - if (!_isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag))) { - return FALSE; + return FALSE; + case kGotLanguage: + if (ultag_isScriptSubtag(s, len)) { + state = kGotScript; + return TRUE; + } + U_FALLTHROUGH; + case kGotScript: + if (ultag_isRegionSubtag(s, len)) { + state = kGotRegion; + return TRUE; + } + U_FALLTHROUGH; + case kGotRegion: + U_FALLTHROUGH; + case kGotVariant: + if (_isVariantSubtag(s, len)) { + state = kGotVariant; + return TRUE; + } + if (_isTKey(s, len)) { + state = kGotTKey; + return TRUE; } - pSubtag = NULL; - } else if (pSubtag == NULL) { - pSubtag = p; - } - p++; - } - if (pSubtag == NULL) { - return FALSE; + return FALSE; + case kGotTKey: + if (_isTValue(s, len)) { + state = kGotTValue; + return TRUE; + } + return FALSE; + case kGotTValue: + if (_isTKey(s, len)) { + state = kGotTKey; + return TRUE; + } + if (_isTValue(s, len)) { + return TRUE; + } + return FALSE; } - return _isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag)); + return FALSE; } -U_CFUNC UBool -ultag_isUnicodeLocaleKey(const char* s, int32_t len) { - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 2 && _isAlphaNumericString(s, len)) { - return TRUE; +static UBool +_isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len) +{ + const int32_t kStart = 0; // Start, wait for a key or attribute or end + const int32_t kGotKey = 1; // Got a key, wait for type or key or end + const int32_t kGotType = 2; // Got a type, wait for key or end + + switch (state) { + case kStart: + if (ultag_isUnicodeLocaleKey(s, len)) { + state = kGotKey; + return TRUE; + } + if (ultag_isUnicodeLocaleAttribute(s, len)) { + return TRUE; + } + return FALSE; + case kGotKey: + if (ultag_isUnicodeLocaleKey(s, len)) { + return TRUE; + } + if (_isUnicodeLocaleTypeSubtag(s, len)) { + state = kGotType; + return TRUE; + } + return FALSE; + case kGotType: + if (ultag_isUnicodeLocaleKey(s, len)) { + state = kGotKey; + return TRUE; + } + if (_isUnicodeLocaleTypeSubtag(s, len)) { + return TRUE; + } + return FALSE; } return FALSE; } -U_CFUNC UBool -ultag_isUnicodeLocaleType(const char*s, int32_t len) { +static UBool +_isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len) +{ + int32_t state = 0; const char* p; + const char* start = s; int32_t subtagLen = 0; if (len < 0) { @@ -648,22 +776,34 @@ ultag_isUnicodeLocaleType(const char*s, int32_t len) { for (p = s; len > 0; p++, len--) { if (*p == SEP) { - if (subtagLen < 3) { + if (!test(state, start, subtagLen)) { return FALSE; } subtagLen = 0; - } else if (ISALPHA(*p) || ISNUMERIC(*p)) { - subtagLen++; - if (subtagLen > 8) { - return FALSE; - } + start = p + 1; } else { - return FALSE; + subtagLen++; } } - return (subtagLen >= 3); + if (test(state, start, subtagLen) && state >= 0) { + return TRUE; + } + return FALSE; } + +U_CFUNC UBool +ultag_isTransformedExtensionSubtags(const char* s, int32_t len) +{ + return _isStatefulSepListOf(&_isTransformedExtensionSubtag, s, len); +} + +U_CFUNC UBool +ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) { + return _isStatefulSepListOf(&_isUnicodeExtensionSubtag, s, len); +} + + /* * ------------------------------------------------- * @@ -850,22 +990,21 @@ _initializeULanguageTag(ULanguageTag* langtag) { langtag->privateuse = EMPTY; } -static int32_t -_appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { +static void +_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { char buf[ULOC_LANG_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len, i; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus); if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return; } len = 0; } @@ -873,20 +1012,14 @@ _appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* Note: returned language code is in lower case letters */ if (len == 0) { - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); - } - reslen += LANG_UND_LEN; - } else if (!_isLanguageSubtag(buf, len)) { + sink.Append(LANG_UND, LANG_UND_LEN); + } else if (!ultag_isLanguageSubtag(buf, len)) { /* invalid language code */ if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return; } - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); - } - reslen += LANG_UND_LEN; + sink.Append(LANG_UND, LANG_UND_LEN); } else { /* resolve deprecated */ for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { @@ -901,24 +1034,18 @@ _appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capac break; } } - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(buf, len); } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { +static void +_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { char buf[ULOC_SCRIPT_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus); @@ -926,40 +1053,31 @@ _appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacit if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { - if (!_isScriptSubtag(buf, len)) { + if (!ultag_isScriptSubtag(buf, len)) { /* invalid script code */ if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append("-", 1); + sink.Append(buf, len); } } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { +static void +_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { char buf[ULOC_COUNTRY_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus); @@ -967,22 +1085,19 @@ _appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacit if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { - if (!_isRegionSubtag(buf, len)) { + if (!ultag_isRegionSubtag(buf, len)) { /* invalid region code */ if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - /* resolve deprecated */ + sink.Append("-", 1); + /* resolve deprecated */ for (int i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) { if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDREGIONS[i]) == 0) { uprv_strcpy(buf, DEPRECATEDREGIONS[i + 1]); @@ -990,26 +1105,19 @@ _appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacit break; } } - - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(buf, len); } } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool *hadPosix, UErrorCode* status) { +static void +_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool *hadPosix, UErrorCode* status) { char buf[ULOC_FULLNAME_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len, i; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); @@ -1017,7 +1125,7 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { @@ -1094,15 +1202,9 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* write out validated/normalized variants to the target */ var = varFirst; while (var != NULL) { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; + sink.Append("-", 1); varLen = (int32_t)uprv_strlen(var->variant); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, var->variant, uprv_min(varLen, capacity - reslen)); - } - reslen += varLen; + sink.Append(var->variant, varLen); var = var->next; } } @@ -1117,27 +1219,25 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } if (U_FAILURE(*status)) { - return 0; + return; } } - - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { +static void +_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; int32_t attrBufLength = 0; - UEnumeration *keywordEnum = NULL; - int32_t reslen = 0; - keywordEnum = uloc_openKeywords(localeID, status); + icu::MemoryPool attrPool; + icu::MemoryPool extPool; + icu::MemoryPool strPool; + + icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, status)); if (U_FAILURE(*status) && !hadPosix) { - uenum_close(keywordEnum); - return 0; + return; } - if (keywordEnum != NULL || hadPosix) { + if (keywordEnum.isValid() || hadPosix) { /* reorder extensions */ int32_t len; const char *key; @@ -1145,8 +1245,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac ExtensionListEntry *ext; AttributeListEntry *firstAttr = NULL; AttributeListEntry *attr; - char *attrValue; - CharStringPool extBufPool; + icu::MemoryPool extBufPool; const char *bcpKey=nullptr, *bcpValue=nullptr; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t keylen; @@ -1154,7 +1253,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac while (TRUE) { icu::CharString buf; - key = uenum_next(keywordEnum, NULL, status); + key = uenum_next(keywordEnum.getAlias(), NULL, status); if (key == NULL) { break; } @@ -1227,22 +1326,23 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } /* create AttributeListEntry */ - attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); + attr = attrPool.create(); if (attr == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; } - attrValue = (char*)uprv_malloc(attrBufLength + 1); + icu::CharString* attrValue = + strPool.create(attrBuf, attrBufLength, *status); if (attrValue == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; } - uprv_strcpy(attrValue, attrBuf); - attr->attribute = attrValue; + if (U_FAILURE(*status)) { + break; + } + attr->attribute = attrValue->data(); if (!_addAttributeToList(&firstAttr, attr)) { - uprv_free(attr); - uprv_free(attrValue); if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1309,7 +1409,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } } else { if (*key == PRIVATEUSE) { - if (!_isPrivateuseValueSubtags(buf.data(), len)) { + if (!ultag_isPrivateuseValueSubtags(buf.data(), len)) { if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1317,7 +1417,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac continue; } } else { - if (!_isExtensionSingleton(key, keylen) || !_isExtensionSubtags(buf.data(), len)) { + if (!_isExtensionSingleton(key, keylen) || !ultag_isExtensionSubtags(buf.data(), len)) { if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1326,12 +1426,12 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } } bcpKey = key; - icu::CharString* extBuf = extBufPool.create(); + icu::CharString* extBuf = + extBufPool.create(buf.data(), len, tmpStatus); if (extBuf == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; break; } - extBuf->append(buf.data(), len, tmpStatus); if (U_FAILURE(tmpStatus)) { *status = tmpStatus; break; @@ -1340,7 +1440,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } /* create ExtensionListEntry */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + ext = extPool.create(); if (ext == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; @@ -1349,7 +1449,6 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac ext->value = bcpValue; if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1360,16 +1459,16 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* Special handling for POSIX variant - add the keywords for POSIX */ if (hadPosix) { /* create ExtensionListEntry for POSIX */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + ext = extPool.create(); if (ext == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + return; } ext->key = POSIX_KEY; ext->value = POSIX_VALUE; if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); + // Silently ignore errors. } } @@ -1378,15 +1477,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac for (ext = firstExt; ext; ext = ext->next) { if (!startLDMLExtension && uprv_strlen(ext->key) > 1) { /* first LDML u singlton extension */ - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - if (reslen < capacity) { - *(appendAt + reslen) = LDMLEXT; - } - reslen++; - + sink.Append("-u", 2); startLDMLExtension = TRUE; } @@ -1394,64 +1485,19 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { /* write the value for the attributes */ for (attr = firstAttr; attr; attr = attr->next) { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(attr->attribute); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, attr->attribute, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append("-", 1); + sink.Append( + attr->attribute, static_cast(uprv_strlen(attr->attribute))); } } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(ext->key); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, ext->key, uprv_min(len, capacity - reslen)); - } - reslen += len; - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(ext->value); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, ext->value, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append("-", 1); + sink.Append(ext->key, static_cast(uprv_strlen(ext->key))); + sink.Append("-", 1); + sink.Append(ext->value, static_cast(uprv_strlen(ext->value))); } } } -cleanup: - /* clean up */ - ext = firstExt; - while (ext != NULL) { - ExtensionListEntry *tmpExt = ext->next; - uprv_free(ext); - ext = tmpExt; - } - - attr = firstAttr; - while (attr != NULL) { - AttributeListEntry *tmpAttr = attr->next; - char *pValue = (char *)attr->attribute; - uprv_free(pValue); - uprv_free(attr); - attr = tmpAttr; - } - - uenum_close(keywordEnum); - - if (U_FAILURE(*status)) { - return 0; - } } - - return u_terminateChars(appendAt, capacity, reslen, status); } /** @@ -1460,7 +1506,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac * Note: char* buf is used for storing keywords */ static void -_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, char* buf, int32_t bufSize, UBool *posixVariant, UErrorCode *status) { +_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool& extPool, icu::MemoryPool& kwdBuf, UBool *posixVariant, UErrorCode *status) { const char *pTag; /* beginning of current subtag */ const char *pKwds; /* beginning of key-type pairs */ UBool variantExists = *posixVariant; @@ -1468,14 +1514,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT ExtensionListEntry *kwdFirst = NULL; /* first LDML keyword */ ExtensionListEntry *kwd, *nextKwd; - AttributeListEntry *attrFirst = NULL; /* first attribute */ - AttributeListEntry *attr, *nextAttr; - int32_t len; - int32_t bufIdx = 0; - - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - int32_t attrBufIdx = 0; /* Reset the posixVariant value */ *posixVariant = FALSE; @@ -1483,100 +1522,92 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT pTag = ldmlext; pKwds = NULL; - /* Iterate through u extension attributes */ - while (*pTag) { - /* locate next separator char */ - for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); + { + AttributeListEntry *attrFirst = NULL; /* first attribute */ + AttributeListEntry *attr, *nextAttr; - if (ultag_isUnicodeLocaleKey(pTag, len)) { - pKwds = pTag; - break; - } + char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; + int32_t attrBufIdx = 0; - /* add this attribute to the list */ - attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); - if (attr == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } + icu::MemoryPool attrPool; - if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { - uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); - attrBuf[attrBufIdx + len] = 0; - attr->attribute = &attrBuf[attrBufIdx]; - attrBufIdx += (len + 1); - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(attr); - goto cleanup; - } + /* Iterate through u extension attributes */ + while (*pTag) { + /* locate next separator char */ + for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); - if (!_addAttributeToList(&attrFirst, attr)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(attr); - goto cleanup; - } + if (ultag_isUnicodeLocaleKey(pTag, len)) { + pKwds = pTag; + break; + } - /* next tag */ - pTag += len; - if (*pTag) { - /* next to the separator */ - pTag++; - } - } + /* add this attribute to the list */ + attr = attrPool.create(); + if (attr == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } - if (attrFirst) { - /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */ + if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { + uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); + attrBuf[attrBufIdx + len] = 0; + attr->attribute = &attrBuf[attrBufIdx]; + attrBufIdx += (len + 1); + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - if (attrBufIdx > bufSize) { - /* attrBufIdx == + 1 */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } + if (!_addAttributeToList(&attrFirst, attr)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (kwd == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + /* next tag */ + pTag += len; + if (*pTag) { + /* next to the separator */ + pTag++; + } } - kwd->key = LOCALE_ATTRIBUTE_KEY; - kwd->value = buf; - - /* attribute subtags sorted in alphabetical order as type */ - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; + if (attrFirst) { + /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */ - /* buffer size check is done above */ - if (attr != attrFirst) { - *(buf + bufIdx) = SEP; - bufIdx++; + kwd = extPool.create(); + if (kwd == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; } - len = static_cast(uprv_strlen(attr->attribute)); - uprv_memcpy(buf + bufIdx, attr->attribute, len); - bufIdx += len; + icu::CharString* value = kwdBuf.create(); + if (value == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } - attr = nextAttr; - } - *(buf + bufIdx) = 0; - bufIdx++; + /* attribute subtags sorted in alphabetical order as type */ + attr = attrFirst; + while (attr != NULL) { + nextAttr = attr->next; + if (attr != attrFirst) { + value->append('-', *status); + } + value->append(attr->attribute, *status); + attr = nextAttr; + } + if (U_FAILURE(*status)) { + return; + } - if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(kwd); - goto cleanup; - } + kwd->key = LOCALE_ATTRIBUTE_KEY; + kwd->value = value->data(); - /* once keyword entry is created, delete the attribute list */ - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - uprv_free(attr); - attr = nextAttr; + if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } } - attrFirst = NULL; } if (pKwds) { @@ -1640,7 +1671,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) { /* the BCP key is invalid */ *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } uprv_strncpy(bcpKeyBuf, pBcpKey, bcpKeyLen); @@ -1650,7 +1681,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT pKey = uloc_toLegacyKey(bcpKeyBuf); if (pKey == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } if (pKey == bcpKeyBuf) { /* @@ -1658,16 +1689,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT We normalize the result key to lower case. */ T_CString_toLowerCase(bcpKeyBuf); - if (bufSize - bufIdx - 1 >= bcpKeyLen) { - uprv_memcpy(buf + bufIdx, bcpKeyBuf, bcpKeyLen); - pKey = buf + bufIdx; - bufIdx += bcpKeyLen; - *(buf + bufIdx) = 0; - bufIdx++; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - goto cleanup; + icu::CharString* key = kwdBuf.create(bcpKeyBuf, bcpKeyLen, *status); + if (key == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + if (U_FAILURE(*status)) { + return; } + pKey = key->data(); } if (pBcpType) { @@ -1675,7 +1705,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) { /* the BCP type is too long */ *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen); @@ -1685,7 +1715,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT pType = uloc_toLegacyType(pKey, bcpTypeBuf); if (pType == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } if (pType == bcpTypeBuf) { /* @@ -1694,16 +1724,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT */ /* normalize to lower case */ T_CString_toLowerCase(bcpTypeBuf); - if (bufSize - bufIdx - 1 >= bcpTypeLen) { - uprv_memcpy(buf + bufIdx, bcpTypeBuf, bcpTypeLen); - pType = buf + bufIdx; - bufIdx += bcpTypeLen; - *(buf + bufIdx) = 0; - bufIdx++; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - goto cleanup; + icu::CharString* type = kwdBuf.create(bcpTypeBuf, bcpTypeLen, *status); + if (type == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + if (U_FAILURE(*status)) { + return; } + pType = type->data(); } } else { /* typeless - default type value is "yes" */ @@ -1716,10 +1745,10 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT *posixVariant = TRUE; } else { /* create an ExtensionListEntry for this keyword */ - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + kwd = extPool.create(); if (kwd == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + return; } kwd->key = pKey; @@ -1728,7 +1757,6 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { // duplicate keyword is allowed, Only the first // is honored. - uprv_free(kwd); } } @@ -1746,46 +1774,22 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT _addExtensionToList(appendTo, kwd, FALSE); kwd = nextKwd; } - - return; - -cleanup: - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - uprv_free(attr); - attr = nextAttr; - } - - kwd = kwdFirst; - while (kwd != NULL) { - nextKwd = kwd->next; - uprv_free(kwd); - kwd = nextKwd; - } } -static int32_t -_appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorCode* status) { - int32_t reslen = 0; +static void +_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) { int32_t i, n; int32_t len; ExtensionListEntry *kwdFirst = NULL; ExtensionListEntry *kwd; const char *key, *type; - char *kwdBuf = NULL; - int32_t kwdBufLength = capacity; + icu::MemoryPool extPool; + icu::MemoryPool kwdBuf; UBool posixVariant = FALSE; if (U_FAILURE(*status)) { - return 0; - } - - kwdBuf = (char*)uprv_malloc(kwdBufLength); - if (kwdBuf == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return; } /* Determine if variants already exists */ @@ -1800,12 +1804,12 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC key = ultag_getExtensionKey(langtag, i); type = ultag_getExtensionValue(langtag, i); if (*key == LDMLEXT) { - _appendLDMLExtensionAsKeywords(type, &kwdFirst, kwdBuf, kwdBufLength, &posixVariant, status); + _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status); if (U_FAILURE(*status)) { break; } } else { - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + kwd = extPool.create(); if (kwd == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; @@ -1813,7 +1817,6 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC kwd->key = key; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - uprv_free(kwd); *status = U_ILLEGAL_ARGUMENT_ERROR; break; } @@ -1824,14 +1827,13 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC type = ultag_getPrivateUse(langtag); if ((int32_t)uprv_strlen(type) > 0) { /* add private use as a keyword */ - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + kwd = extPool.create(); if (kwd == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; } else { kwd->key = PRIVATEUSE_KEY; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - uprv_free(kwd); *status = U_ILLEGAL_ARGUMENT_ERROR; } } @@ -1842,10 +1844,7 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC if (U_SUCCESS(*status) && posixVariant) { len = (int32_t) uprv_strlen(_POSIX); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, _POSIX, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(_POSIX, len); } if (U_SUCCESS(*status) && kwdFirst != NULL) { @@ -1853,70 +1852,39 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC UBool firstValue = TRUE; kwd = kwdFirst; do { - if (reslen < capacity) { - if (firstValue) { - /* '@' */ - *(appendAt + reslen) = LOCALE_EXT_SEP; - firstValue = FALSE; - } else { - /* ';' */ - *(appendAt + reslen) = LOCALE_KEYWORD_SEP; - } + if (firstValue) { + sink.Append("@", 1); + firstValue = FALSE; + } else { + sink.Append(";", 1); } - reslen++; /* key */ len = (int32_t)uprv_strlen(kwd->key); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, kwd->key, uprv_min(len, capacity - reslen)); - } - reslen += len; - - /* '=' */ - if (reslen < capacity) { - *(appendAt + reslen) = LOCALE_KEY_TYPE_SEP; - } - reslen++; + sink.Append(kwd->key, len); + sink.Append("=", 1); /* type */ len = (int32_t)uprv_strlen(kwd->value); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, kwd->value, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(kwd->value, len); kwd = kwd->next; } while (kwd); } - - /* clean up */ - kwd = kwdFirst; - while (kwd != NULL) { - ExtensionListEntry *tmpKwd = kwd->next; - uprv_free(kwd); - kwd = tmpKwd; - } - - uprv_free(kwdBuf); - - if (U_FAILURE(*status)) { - return 0; - } - - return u_terminateChars(appendAt, capacity, reslen, status); } -static int32_t -_appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { +static void +_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { (void)hadPosix; char buf[ULOC_FULLNAME_CAPACITY]; char tmpAppend[ULOC_FULLNAME_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len, i; int32_t reslen = 0; + int32_t capacity = sizeof tmpAppend; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); @@ -1924,7 +1892,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { @@ -2008,20 +1976,14 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap } if (U_FAILURE(*status)) { - return 0; + return; } } if (U_SUCCESS(*status)) { len = reslen; - if (reslen < capacity) { - uprv_memcpy(appendAt, tmpAppend, uprv_min(len, capacity - reslen)); - } + sink.Append(tmpAppend, len); } - - u_terminateChars(appendAt, capacity, reslen, status); - - return reslen; } /* @@ -2053,7 +2015,6 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap static ULanguageTag* ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { - ULanguageTag *t; char *tagBuf; int16_t next; char *pSubtag, *pNext, *pLastGoodPosition; @@ -2087,44 +2048,60 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta *(tagBuf + tagLen) = 0; /* create a ULanguageTag */ - t = (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag)); - if (t == NULL) { + icu::LocalULanguageTagPointer t( + (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag))); + if (t.isNull()) { uprv_free(tagBuf); *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - _initializeULanguageTag(t); + _initializeULanguageTag(t.getAlias()); t->buf = tagBuf; if (tagLen < MINLEN) { /* the input tag is too short - return empty ULanguageTag */ - return t; + return t.orphan(); } + size_t parsedLenDelta = 0; + // Grandfathered tag will be consider together. Grandfathered tag with intervening + // script and region such as art-DE-lojban or art-Latn-lojban won't be + // matched. /* check if the tag is grandfathered */ for (i = 0; i < UPRV_LENGTHOF(GRANDFATHERED); i += 2) { - if (uprv_stricmp(GRANDFATHERED[i], tagBuf) == 0) { + int32_t checkGrandfatheredLen = static_cast(uprv_strlen(GRANDFATHERED[i])); + if (tagLen < checkGrandfatheredLen) { + continue; + } + if (tagLen > checkGrandfatheredLen && tagBuf[checkGrandfatheredLen] != '-') { + // make sure next char is '-'. + continue; + } + if (uprv_strnicmp(GRANDFATHERED[i], tagBuf, checkGrandfatheredLen) == 0) { int32_t newTagLength; - grandfatheredLen = tagLen; /* back up for output parsedLen */ - newTagLength = static_cast(uprv_strlen(GRANDFATHERED[i+1])); + grandfatheredLen = checkGrandfatheredLen; /* back up for output parsedLen */ + int32_t replacementLen = static_cast(uprv_strlen(GRANDFATHERED[i+1])); + newTagLength = replacementLen + tagLen - checkGrandfatheredLen; if (tagLen < newTagLength) { uprv_free(tagBuf); tagBuf = (char*)uprv_malloc(newTagLength + 1); if (tagBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - ultag_close(t); return NULL; } t->buf = tagBuf; tagLen = newTagLength; } + parsedLenDelta = checkGrandfatheredLen - replacementLen; uprv_strcpy(t->buf, GRANDFATHERED[i + 1]); + if (checkGrandfatheredLen != tagLen) { + uprv_strcpy(t->buf + replacementLen, tag + checkGrandfatheredLen); + } break; } } - size_t parsedLenDelta = 0; if (grandfatheredLen == 0) { for (i = 0; i < UPRV_LENGTHOF(REDUNDANT); i += 2) { const char* redundantTag = REDUNDANT[i]; @@ -2193,7 +2170,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta subtagLen = (int32_t)(pSep - pSubtag); if (next & LANG) { - if (_isLanguageSubtag(pSubtag, subtagLen)) { + if (ultag_isLanguageSubtag(pSubtag, subtagLen)) { *pSep = 0; /* terminate */ // TODO: move deprecated language code handling here. t->language = T_CString_toLowerCase(pSubtag); @@ -2220,7 +2197,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } } if (next & SCRT) { - if (_isScriptSubtag(pSubtag, subtagLen)) { + if (ultag_isScriptSubtag(pSubtag, subtagLen)) { char *p = pSubtag; *pSep = 0; @@ -2240,7 +2217,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } } if (next & REGN) { - if (_isRegionSubtag(pSubtag, subtagLen)) { + if (ultag_isRegionSubtag(pSubtag, subtagLen)) { *pSep = 0; // TODO: move deprecated region code handling here. t->region = T_CString_toUpperCase(pSubtag); @@ -2259,7 +2236,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); if (var == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto error; + return NULL; } *pSep = 0; var->variant = T_CString_toUpperCase(pSubtag); @@ -2303,7 +2280,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); if (pExtension == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto error; + return NULL; } *pSep = 0; pExtension->key = T_CString_toLowerCase(pSubtag); @@ -2439,15 +2416,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } if (parsedLen != NULL) { - *parsedLen = (grandfatheredLen > 0) ? grandfatheredLen : - (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta); + *parsedLen = (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta); } - return t; - -error: - ultag_close(t); - return NULL; + return t.orphan(); } /** @@ -2637,6 +2609,34 @@ uloc_toLanguageTag(const char* localeID, int32_t langtagCapacity, UBool strict, UErrorCode* status) { + if (U_FAILURE(*status)) { + return 0; + } + + icu::CheckedArrayByteSink sink(langtag, langtagCapacity); + ulocimp_toLanguageTag(localeID, sink, strict, status); + + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return reslen; + } + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars(langtag, langtagCapacity, reslen, status); + } + + return reslen; +} + + +U_CAPI void U_EXPORT2 +ulocimp_toLanguageTag(const char* localeID, + icu::ByteSink& sink, + UBool strict, + UErrorCode* status) { icu::CharString canonical; int32_t reslen; UErrorCode tmpStatus = U_ZERO_ERROR; @@ -2657,7 +2657,7 @@ uloc_toLanguageTag(const char* localeID, if (U_FAILURE(tmpStatus)) { *status = tmpStatus; - return 0; + return; } reslen = @@ -2673,7 +2673,7 @@ uloc_toLanguageTag(const char* localeID, if (U_FAILURE(tmpStatus)) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return; } canonical.append(buffer, reslen, tmpStatus); @@ -2683,38 +2683,33 @@ uloc_toLanguageTag(const char* localeID, if (U_FAILURE(tmpStatus)) { *status = tmpStatus; - return 0; + return; } } - reslen = 0; - /* For handling special case - private use only tag */ pKeywordStart = locale_getKeywordsStart(canonical.data()); if (pKeywordStart == canonical.data()) { - UEnumeration *kwdEnum; int kwdCnt = 0; UBool done = FALSE; - kwdEnum = uloc_openKeywords(canonical.data(), &tmpStatus); - if (kwdEnum != NULL) { - kwdCnt = uenum_count(kwdEnum, &tmpStatus); + icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus)); + if (U_SUCCESS(tmpStatus)) { + kwdCnt = uenum_count(kwdEnum.getAlias(), &tmpStatus); if (kwdCnt == 1) { const char *key; int32_t len = 0; - key = uenum_next(kwdEnum, &len, &tmpStatus); + key = uenum_next(kwdEnum.getAlias(), &len, &tmpStatus); if (len == 1 && *key == PRIVATEUSE) { char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; buf[0] = PRIVATEUSE; buf[1] = SEP; len = uloc_getKeywordValue(localeID, key, &buf[2], sizeof(buf) - 2, &tmpStatus); if (U_SUCCESS(tmpStatus)) { - if (_isPrivateuseValueSubtags(&buf[2], len)) { + if (ultag_isPrivateuseValueSubtags(&buf[2], len)) { /* return private use only tag */ - reslen = len + 2; - uprv_memcpy(langtag, buf, uprv_min(reslen, langtagCapacity)); - u_terminateChars(langtag, langtagCapacity, reslen, status); + sink.Append(buf, len + 2); done = TRUE; } else if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; @@ -2727,21 +2722,18 @@ uloc_toLanguageTag(const char* localeID, } } } - uenum_close(kwdEnum); if (done) { - return reslen; + return; } } } - reslen += _appendLanguageToLanguageTag(canonical.data(), langtag, langtagCapacity, strict, status); - reslen += _appendScriptToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, status); - reslen += _appendRegionToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, status); - reslen += _appendVariantsToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, &hadPosix, status); - reslen += _appendKeywordsToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); - reslen += _appendPrivateuseToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); - - return reslen; + _appendLanguageToLanguageTag(canonical.data(), sink, strict, status); + _appendScriptToLanguageTag(canonical.data(), sink, strict, status); + _appendRegionToLanguageTag(canonical.data(), sink, strict, status); + _appendVariantsToLanguageTag(canonical.data(), sink, strict, &hadPosix, status); + _appendKeywordsToLanguageTag(canonical.data(), sink, strict, hadPosix, status); + _appendPrivateuseToLanguageTag(canonical.data(), sink, strict, hadPosix, status); } @@ -2751,134 +2743,116 @@ uloc_forLanguageTag(const char* langtag, int32_t localeIDCapacity, int32_t* parsedLength, UErrorCode* status) { - return ulocimp_forLanguageTag( - langtag, - -1, - localeID, - localeIDCapacity, - parsedLength, - status); + if (U_FAILURE(*status)) { + return 0; + } + + icu::CheckedArrayByteSink sink(localeID, localeIDCapacity); + ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status); + + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return reslen; + } + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars(localeID, localeIDCapacity, reslen, status); + } + + return reslen; } -U_CAPI int32_t U_EXPORT2 +U_CAPI void U_EXPORT2 ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, - char* localeID, - int32_t localeIDCapacity, + icu::ByteSink& sink, int32_t* parsedLength, UErrorCode* status) { - ULanguageTag *lt; - int32_t reslen = 0; + UBool isEmpty = TRUE; const char *subtag, *p; int32_t len; int32_t i, n; UBool noRegion = TRUE; - lt = ultag_parse(langtag, tagLen, parsedLength, status); + icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status)); if (U_FAILURE(*status)) { - return 0; + return; } /* language */ - subtag = ultag_getExtlangSize(lt) > 0 ? ultag_getExtlang(lt, 0) : ultag_getLanguage(lt); + subtag = ultag_getExtlangSize(lt.getAlias()) > 0 ? ultag_getExtlang(lt.getAlias(), 0) : ultag_getLanguage(lt.getAlias()); if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) { len = (int32_t)uprv_strlen(subtag); if (len > 0) { - if (reslen < localeIDCapacity) { - uprv_memcpy(localeID, subtag, uprv_min(len, localeIDCapacity - reslen)); - } - reslen += len; + sink.Append(subtag, len); + isEmpty = FALSE; } } /* script */ - subtag = ultag_getScript(lt); + subtag = ultag_getScript(lt.getAlias()); len = (int32_t)uprv_strlen(subtag); if (len > 0) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; + sink.Append("_", 1); + isEmpty = FALSE; /* write out the script in title case */ - p = subtag; - while (*p) { - if (reslen < localeIDCapacity) { - if (p == subtag) { - *(localeID + reslen) = uprv_toupper(*p); - } else { - *(localeID + reslen) = *p; - } - } - reslen++; - p++; - } + char c = uprv_toupper(*subtag); + sink.Append(&c, 1); + sink.Append(subtag + 1, len - 1); } /* region */ - subtag = ultag_getRegion(lt); + subtag = ultag_getRegion(lt.getAlias()); len = (int32_t)uprv_strlen(subtag); if (len > 0) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; - /* write out the retion in upper case */ + sink.Append("_", 1); + isEmpty = FALSE; + + /* write out the region in upper case */ p = subtag; while (*p) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = uprv_toupper(*p); - } - reslen++; + char c = uprv_toupper(*p); + sink.Append(&c, 1); p++; } noRegion = FALSE; } /* variants */ - n = ultag_getVariantsSize(lt); + n = ultag_getVariantsSize(lt.getAlias()); if (n > 0) { if (noRegion) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; + sink.Append("_", 1); + isEmpty = FALSE; } for (i = 0; i < n; i++) { - subtag = ultag_getVariant(lt, i); - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; + subtag = ultag_getVariant(lt.getAlias(), i); + sink.Append("_", 1); + /* write out the variant in upper case */ p = subtag; while (*p) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = uprv_toupper(*p); - } - reslen++; + char c = uprv_toupper(*p); + sink.Append(&c, 1); p++; } } } /* keywords */ - n = ultag_getExtensionsSize(lt); - subtag = ultag_getPrivateUse(lt); + n = ultag_getExtensionsSize(lt.getAlias()); + subtag = ultag_getPrivateUse(lt.getAlias()); if (n > 0 || uprv_strlen(subtag) > 0) { - if (reslen == 0 && n > 0) { + if (isEmpty && n > 0) { /* need a language */ - if (reslen < localeIDCapacity) { - uprv_memcpy(localeID + reslen, LANG_UND, uprv_min(LANG_UND_LEN, localeIDCapacity - reslen)); - } - reslen += LANG_UND_LEN; + sink.Append(LANG_UND, LANG_UND_LEN); } - len = _appendKeywords(lt, localeID + reslen, localeIDCapacity - reslen, status); - reslen += len; + _appendKeywords(lt.getAlias(), sink, status); } - - ultag_close(lt); - return u_terminateChars(localeID, localeIDCapacity, reslen, status); } diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index 6dd8e33e09c88c..dac82872e6ed40 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -10,6 +10,7 @@ #ifndef ULOCIMP_H #define ULOCIMP_H +#include "unicode/bytestream.h" #include "unicode/uloc.h" /** @@ -61,6 +62,31 @@ ulocimp_getCountry(const char *localeID, char *country, int32_t countryCapacity, const char **pEnd); +/** + * Writes a well-formed language tag for this locale ID. + * + * **Note**: When `strict` is FALSE, any locale fields which do not satisfy the + * BCP47 syntax requirement will be omitted from the result. When `strict` is + * TRUE, this function sets U_ILLEGAL_ARGUMENT_ERROR to the `err` if any locale + * fields do not satisfy the BCP47 syntax requirement. + * + * @param localeID the input locale ID + * @param sink the output sink receiving the BCP47 language + * tag for this Locale. + * @param strict boolean value indicating if the function returns + * an error for an ill-formed input locale ID. + * @param err error information if receiving the language + * tag failed. + * @return The length of the BCP47 language tag. + * + * @internal ICU 64 + */ +U_STABLE void U_EXPORT2 +ulocimp_toLanguageTag(const char* localeID, + icu::ByteSink& sink, + UBool strict, + UErrorCode* err); + /** * Returns a locale ID for the specified BCP47 language tag string. * If the specified language tag contains any ill-formed subtags, @@ -75,21 +101,18 @@ ulocimp_getCountry(const char *localeID, * the first paragraph, so some information might be lost. * @param langtag the input BCP47 language tag. * @param tagLen the length of langtag, or -1 to call uprv_strlen(). - * @param localeID the output buffer receiving a locale ID for the + * @param sink the output sink receiving a locale ID for the * specified BCP47 language tag. - * @param localeIDCapacity the size of the locale ID output buffer. * @param parsedLength if not NULL, successfully parsed length * for the input language tag is set. * @param err error information if receiving the locald ID * failed. - * @return the length of the locale ID. * @internal ICU 63 */ -U_CAPI int32_t U_EXPORT2 +U_CAPI void U_EXPORT2 ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, - char* localeID, - int32_t localeIDCapacity, + icu::ByteSink& sink, int32_t* parsedLength, UErrorCode* err); @@ -122,9 +145,103 @@ U_CAPI int32_t U_EXPORT2 ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, char *region, int32_t regionCapacity, UErrorCode* status); +/** + * Add the likely subtags for a provided locale ID, per the algorithm described + * in the following CLDR technical report: + * + * http://www.unicode.org/reports/tr35/#Likely_Subtags + * + * If localeID is already in the maximal form, or there is no data available + * for maximization, it will be copied to the output buffer. For example, + * "und-Zzzz" cannot be maximized, since there is no reasonable maximization. + * + * Examples: + * + * "en" maximizes to "en_Latn_US" + * + * "de" maximizes to "de_Latn_US" + * + * "sr" maximizes to "sr_Cyrl_RS" + * + * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.) + * + * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.) + * + * @param localeID The locale to maximize + * @param sink The output sink receiving the maximized locale + * @param err Error information if maximizing the locale failed. If the length + * of the localeID and the null-terminator is greater than the maximum allowed size, + * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. + * @internal ICU 64 + */ +U_STABLE void U_EXPORT2 +ulocimp_addLikelySubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err); + +/** + * Minimize the subtags for a provided locale ID, per the algorithm described + * in the following CLDR technical report: + * + * http://www.unicode.org/reports/tr35/#Likely_Subtags + * + * If localeID is already in the minimal form, or there is no data available + * for minimization, it will be copied to the output buffer. Since the + * minimization algorithm relies on proper maximization, see the comments + * for ulocimp_addLikelySubtags for reasons why there might not be any data. + * + * Examples: + * + * "en_Latn_US" minimizes to "en" + * + * "de_Latn_US" minimizes to "de" + * + * "sr_Cyrl_RS" minimizes to "sr" + * + * "zh_Hant_TW" minimizes to "zh_TW" (The region is preferred to the + * script, and minimizing to "zh" would imply "zh_Hans_CN".) + * + * @param localeID The locale to minimize + * @param sink The output sink receiving the maximized locale + * @param err Error information if minimizing the locale failed. If the length + * of the localeID and the null-terminator is greater than the maximum allowed size, + * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. + * @internal ICU 64 + */ +U_STABLE void U_EXPORT2 +ulocimp_minimizeSubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err); + U_CAPI const char * U_EXPORT2 locale_getKeywordsStart(const char *localeID); +U_CFUNC UBool +ultag_isExtensionSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isLanguageSubtag(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isPrivateuseValueSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isRegionSubtag(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isScriptSubtag(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isTransformedExtensionSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isUnicodeExtensionSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isUnicodeLocaleAttribute(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isUnicodeLocaleAttributes(const char* s, int32_t len); U_CFUNC UBool ultag_isUnicodeLocaleKey(const char* s, int32_t len); @@ -132,6 +249,9 @@ ultag_isUnicodeLocaleKey(const char* s, int32_t len); U_CFUNC UBool ultag_isUnicodeLocaleType(const char* s, int32_t len); +U_CFUNC UBool +ultag_isVariantSubtags(const char* s, int32_t len); + U_CFUNC const char* ulocimp_toBcpKey(const char* key); diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index a32573bbf70c95..40b543fb2219bc 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -37,12 +37,32 @@ # define NOSERVICE # define NOIME # define NOMCX + +# if U_PLATFORM_HAS_WINUWP_API == 1 + // Some previous versions of the Windows 10 SDK don't expose various APIs for UWP applications + // to use, even though UWP apps are allowed to call and use them. Temporarily change the + // WINAPI family partition below to Desktop, so that function declarations are visible for UWP. +# include +# if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)) +# pragma push_macro("WINAPI_PARTITION_DESKTOP") +# undef WINAPI_PARTITION_DESKTOP +# define WINAPI_PARTITION_DESKTOP 1 +# define CHANGED_WINAPI_PARTITION_DESKTOP_VALUE +# endif +# endif + # include + +# if U_PLATFORM_HAS_WINUWP_API == 1 && defined(CHANGED_WINAPI_PARTITION_DESKTOP_VALUE) +# pragma pop_macro("WINAPI_PARTITION_DESKTOP") +# endif + # include "cmemory.h" - typedef HANDLE MemoryMap; +typedef HANDLE MemoryMap; + +# define IS_MAP(map) ((map)!=nullptr) -# define IS_MAP(map) ((map)!=NULL) #elif MAP_IMPLEMENTATION==MAP_POSIX || MAP_IMPLEMENTATION==MAP_390DLL typedef size_t MemoryMap; @@ -74,7 +94,7 @@ typedef void *MemoryMap; -# define IS_MAP(map) ((map)!=NULL) +# define IS_MAP(map) ((map)!=nullptr) #endif /*----------------------------------------------------------------------------* @@ -105,20 +125,24 @@ UErrorCode *status /* Error status, used to report out-of-memory errors. */ ) { - HANDLE map; - HANDLE file; - if (U_FAILURE(*status)) { return FALSE; } + HANDLE map = nullptr; + HANDLE file = INVALID_HANDLE_VALUE; + UDataMemory_init(pData); /* Clear the output struct. */ /* open the input file */ #if U_PLATFORM_HAS_WINUWP_API == 0 - file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, + // Note: In the non-UWP code-path (ie: Win32), the value of the path variable might have come from + // the CRT 'getenv' function, and would be therefore be encoded in the default ANSI code page. + // This means that we can't call the *W version of API below, whereas in the UWP code-path + // there is no 'getenv' call, and thus the string will be only UTF-8/Invariant characters. + file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, NULL); + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, nullptr); #else // Convert from UTF-8 string to UTF-16 string. wchar_t utf16Path[MAX_PATH]; @@ -134,8 +158,9 @@ return FALSE; } - // TODO: Is it worth setting extended parameters to specify random access? - file = CreateFile2(utf16Path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL); + file = CreateFileW(utf16Path, GENERIC_READ, FILE_SHARE_READ, nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, nullptr); #endif if (file == INVALID_HANDLE_VALUE) { // If we failed to open the file due to an out-of-memory error, then we want @@ -146,36 +171,13 @@ return FALSE; } - /* Declare and initialize a security descriptor. - 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)) { - /* Make the security attributes point to the security descriptor */ - uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes)); - mappingAttributes.nLength = sizeof(mappingAttributes); - mappingAttributes.lpSecurityDescriptor = &securityDesc; - mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */ - mappingAttributesPtr = &mappingAttributes; - } - } - /* else creating security descriptors can fail when we are on Windows 98, - and mappingAttributesPtr == NULL for that case. */ - + // Note: We use NULL/nullptr for lpAttributes parameter below. + // This means our handle cannot be inherited and we will get the default security descriptor. /* create an unnamed Windows file-mapping object for the specified file */ - map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL); -#else - map = CreateFileMappingFromApp(file, NULL, PAGE_READONLY, 0, NULL); -#endif + map = CreateFileMappingW(file, nullptr, PAGE_READONLY, 0, 0, nullptr); + CloseHandle(file); - if (map == NULL) { + if (map == nullptr) { // If we failed to create the mapping due to an out-of-memory error, then // we want to report that error back to the caller. if (HRESULT_FROM_WIN32(GetLastError()) == E_OUTOFMEMORY) { @@ -185,22 +187,22 @@ } /* map a view of the file into our address space */ - pData->pHeader=(const DataHeader *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); - if(pData->pHeader==NULL) { + pData->pHeader = reinterpret_cast(MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0)); + if (pData->pHeader == nullptr) { CloseHandle(map); return FALSE; } - pData->map=map; + pData->map = map; return TRUE; } U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if (pData != nullptr && pData->map != nullptr) { UnmapViewOfFile(pData->pHeader); CloseHandle(pData->map); - pData->pHeader=NULL; - pData->map=NULL; + pData->pHeader = nullptr; + pData->map = nullptr; } } @@ -255,13 +257,13 @@ U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if(pData!=nullptr && pData->map!=nullptr) { size_t dataLen = (char *)pData->map - (char *)pData->mapAddr; if(munmap(pData->mapAddr, dataLen)==-1) { } - pData->pHeader=NULL; + pData->pHeader=nullptr; pData->map=0; - pData->mapAddr=NULL; + pData->mapAddr=nullptr; } } @@ -295,7 +297,7 @@ UDataMemory_init(pData); /* Clear the output struct. */ /* open the input file */ file=fopen(path, "rb"); - if(file==NULL) { + if(file==nullptr) { return FALSE; } @@ -308,7 +310,7 @@ /* allocate the memory to hold the file data */ p=uprv_malloc(fileLength); - if(p==NULL) { + if(p==nullptr) { fclose(file); *status = U_MEMORY_ALLOCATION_ERROR; return FALSE; @@ -330,11 +332,11 @@ U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if(pData!=nullptr && pData->map!=nullptr) { uprv_free(pData->map); - pData->map = NULL; - pData->mapAddr = NULL; - pData->pHeader = NULL; + pData->map = nullptr; + pData->mapAddr = nullptr; + pData->pHeader = nullptr; } } @@ -397,7 +399,7 @@ * Copy the ICU_DATA path to the path buffer and return that*/ const char *icuDataDir; icuDataDir=u_getDataDirectory(); - if(icuDataDir!=NULL && *icuDataDir!=0) { + if(icuDataDir!=nullptr && *icuDataDir!=0) { return strcpy_returnEnd(pathBuffer, icuDataDir); } else { /* there is no icuDataDir either. Just return the empty pathBuffer. */ @@ -429,7 +431,7 @@ } inBasename=uprv_strrchr(path, U_FILE_SEP_CHAR); - if(inBasename==NULL) { + if(inBasename==nullptr) { inBasename = path; } else { inBasename++; @@ -494,7 +496,7 @@ fprintf(stderr, " -> %08X\n", handle ); # endif - if(handle != NULL) { + if(handle != nullptr) { /* we have a data DLL - what kind of lookup do we need here? */ /* try to find the Table of Contents */ UDataMemory_init(pData); /* Clear the output struct. */ @@ -515,11 +517,11 @@ } U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if(pData!=nullptr && pData->map!=nullptr) { uprv_free(pData->map); - pData->map = NULL; - pData->mapAddr = NULL; - pData->pHeader = NULL; + pData->map = nullptr; + pData->mapAddr = nullptr; + pData->pHeader = nullptr; } } diff --git a/deps/icu-small/source/common/umutablecptrie.cpp b/deps/icu-small/source/common/umutablecptrie.cpp index 40af4b6c16a163..cdbe27080b491c 100644 --- a/deps/icu-small/source/common/umutablecptrie.cpp +++ b/deps/icu-small/source/common/umutablecptrie.cpp @@ -18,6 +18,11 @@ #include "uassert.h" #include "ucptrie_impl.h" +// ICU-20235 In case Microsoft math.h has defined this, undefine it. +#ifdef OVERFLOW +#undef OVERFLOW +#endif + U_NAMESPACE_BEGIN namespace { @@ -60,6 +65,7 @@ constexpr uint8_t I3_18 = 3; constexpr int32_t INDEX_3_18BIT_BLOCK_LENGTH = UCPTRIE_INDEX_3_BLOCK_LENGTH + UCPTRIE_INDEX_3_BLOCK_LENGTH / 8; class AllSameBlocks; +class MixedBlocks; class MutableCodePointTrie : public UMemory { public: @@ -92,8 +98,10 @@ class MutableCodePointTrie : public UMemory { void maskValues(uint32_t mask); UChar32 findHighStart() const; int32_t compactWholeDataBlocks(int32_t fastILimit, AllSameBlocks &allSameBlocks); - int32_t compactData(int32_t fastILimit, uint32_t *newData, int32_t dataNullIndex); - int32_t compactIndex(int32_t fastILimit, UErrorCode &errorCode); + int32_t compactData( + int32_t fastILimit, uint32_t *newData, int32_t newDataCapacity, + int32_t dataNullIndex, MixedBlocks &mixedBlocks, UErrorCode &errorCode); + int32_t compactIndex(int32_t fastILimit, MixedBlocks &mixedBlocks, UErrorCode &errorCode); int32_t compactTrie(int32_t fastILimit, UErrorCode &errorCode); uint32_t *index = nullptr; @@ -301,41 +309,56 @@ UChar32 MutableCodePointTrie::getRange( uint32_t nullValue = initialValue; if (filter != nullptr) { nullValue = filter(context, nullValue); } UChar32 c = start; - uint32_t value; + uint32_t trieValue, value; bool haveValue = false; int32_t i = c >> UCPTRIE_SHIFT_3; do { if (flags[i] == ALL_SAME) { - uint32_t value2 = maybeFilterValue(index[i], initialValue, nullValue, - filter, context); + uint32_t trieValue2 = index[i]; if (haveValue) { - if (value2 != value) { - return c - 1; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, initialValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } else { - value = value2; + trieValue = trieValue2; + value = maybeFilterValue(trieValue2, initialValue, nullValue, filter, context); if (pValue != nullptr) { *pValue = value; } haveValue = true; } c = (c + UCPTRIE_SMALL_DATA_BLOCK_LENGTH) & ~UCPTRIE_SMALL_DATA_MASK; } else /* MIXED */ { int32_t di = index[i] + (c & UCPTRIE_SMALL_DATA_MASK); - uint32_t value2 = maybeFilterValue(data[di], initialValue, nullValue, - filter, context); + uint32_t trieValue2 = data[di]; if (haveValue) { - if (value2 != value) { - return c - 1; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, initialValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } else { - value = value2; + trieValue = trieValue2; + value = maybeFilterValue(trieValue2, initialValue, nullValue, filter, context); if (pValue != nullptr) { *pValue = value; } haveValue = true; } while ((++c & UCPTRIE_SMALL_DATA_MASK) != 0) { - if (maybeFilterValue(data[++di], initialValue, nullValue, - filter, context) != value) { - return c - 1; + trieValue2 = data[++di]; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, initialValue, nullValue, + filter, context) != value) { + return c - 1; + } } + trieValue = trieValue2; // may or may not help } } ++i; @@ -548,28 +571,8 @@ void MutableCodePointTrie::maskValues(uint32_t mask) { } } -inline bool -equalBlocks(const uint32_t *s, const uint32_t *t, int32_t length) { - while (length > 0 && *s == *t) { - ++s; - ++t; - --length; - } - return length == 0; -} - -inline bool -equalBlocks(const uint16_t *s, const uint32_t *t, int32_t length) { - while (length > 0 && *s == *t) { - ++s; - ++t; - --length; - } - return length == 0; -} - -inline bool -equalBlocks(const uint16_t *s, const uint16_t *t, int32_t length) { +template +bool equalBlocks(const UIntA *s, const UIntB *t, int32_t length) { while (length > 0 && *s == *t) { ++s; ++t; @@ -585,36 +588,6 @@ bool allValuesSameAs(const uint32_t *p, int32_t length, uint32_t value) { } /** Search for an identical block. */ -int32_t findSameBlock(const uint32_t *p, int32_t pStart, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - // Ensure that we do not even partially get past length. - length -= blockLength; - - q += qStart; - while (pStart <= length) { - if (equalBlocks(p + pStart, q, blockLength)) { - return pStart; - } - ++pStart; - } - return -1; -} - -int32_t findSameBlock(const uint16_t *p, int32_t pStart, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - // Ensure that we do not even partially get past length. - length -= blockLength; - - q += qStart; - while (pStart <= length) { - if (equalBlocks(p + pStart, q, blockLength)) { - return pStart; - } - ++pStart; - } - return -1; -} - int32_t findSameBlock(const uint16_t *p, int32_t pStart, int32_t length, const uint16_t *q, int32_t qStart, int32_t blockLength) { // Ensure that we do not even partially get past length. @@ -655,30 +628,9 @@ int32_t findAllSameBlock(const uint32_t *p, int32_t start, int32_t limit, * Look for maximum overlap of the beginning of the other block * with the previous, adjacent block. */ -int32_t getOverlap(const uint32_t *p, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - int32_t overlap = blockLength - 1; - U_ASSERT(overlap <= length); - q += qStart; - while (overlap > 0 && !equalBlocks(p + (length - overlap), q, overlap)) { - --overlap; - } - return overlap; -} - -int32_t getOverlap(const uint16_t *p, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - int32_t overlap = blockLength - 1; - U_ASSERT(overlap <= length); - q += qStart; - while (overlap > 0 && !equalBlocks(p + (length - overlap), q, overlap)) { - --overlap; - } - return overlap; -} - -int32_t getOverlap(const uint16_t *p, int32_t length, - const uint16_t *q, int32_t qStart, int32_t blockLength) { +template +int32_t getOverlap(const UIntA *p, int32_t length, + const UIntB *q, int32_t qStart, int32_t blockLength) { int32_t overlap = blockLength - 1; U_ASSERT(overlap <= length); q += qStart; @@ -807,6 +759,171 @@ class AllSameBlocks { int32_t refCounts[CAPACITY]; }; +// Custom hash table for mixed-value blocks to be found anywhere in the +// compacted data or index so far. +class MixedBlocks { +public: + MixedBlocks() {} + ~MixedBlocks() { + uprv_free(table); + } + + bool init(int32_t maxLength, int32_t newBlockLength) { + // We store actual data indexes + 1 to reserve 0 for empty entries. + int32_t maxDataIndex = maxLength - newBlockLength + 1; + int32_t newLength; + if (maxDataIndex <= 0xfff) { // 4k + newLength = 6007; + shift = 12; + mask = 0xfff; + } else if (maxDataIndex <= 0x7fff) { // 32k + newLength = 50021; + shift = 15; + mask = 0x7fff; + } else if (maxDataIndex <= 0x1ffff) { // 128k + newLength = 200003; + shift = 17; + mask = 0x1ffff; + } else { + // maxDataIndex up to around MAX_DATA_LENGTH, ca. 1.1M + newLength = 1500007; + shift = 21; + mask = 0x1fffff; + } + if (newLength > capacity) { + uprv_free(table); + table = (uint32_t *)uprv_malloc(newLength * 4); + if (table == nullptr) { + return false; + } + capacity = newLength; + } + length = newLength; + uprv_memset(table, 0, length * 4); + + blockLength = newBlockLength; + return true; + } + + template + void extend(const UInt *data, int32_t minStart, int32_t prevDataLength, int32_t newDataLength) { + int32_t start = prevDataLength - blockLength; + if (start >= minStart) { + ++start; // Skip the last block that we added last time. + } else { + start = minStart; // Begin with the first full block. + } + for (int32_t end = newDataLength - blockLength; start <= end; ++start) { + uint32_t hashCode = makeHashCode(data, start); + addEntry(data, start, hashCode, start); + } + } + + template + int32_t findBlock(const UIntA *data, const UIntB *blockData, int32_t blockStart) const { + uint32_t hashCode = makeHashCode(blockData, blockStart); + int32_t entryIndex = findEntry(data, blockData, blockStart, hashCode); + if (entryIndex >= 0) { + return (table[entryIndex] & mask) - 1; + } else { + return -1; + } + } + + int32_t findAllSameBlock(const uint32_t *data, uint32_t blockValue) const { + uint32_t hashCode = makeHashCode(blockValue); + int32_t entryIndex = findEntry(data, blockValue, hashCode); + if (entryIndex >= 0) { + return (table[entryIndex] & mask) - 1; + } else { + return -1; + } + } + +private: + template + uint32_t makeHashCode(const UInt *blockData, int32_t blockStart) const { + int32_t blockLimit = blockStart + blockLength; + uint32_t hashCode = blockData[blockStart++]; + do { + hashCode = 37 * hashCode + blockData[blockStart++]; + } while (blockStart < blockLimit); + return hashCode; + } + + uint32_t makeHashCode(uint32_t blockValue) const { + uint32_t hashCode = blockValue; + for (int32_t i = 1; i < blockLength; ++i) { + hashCode = 37 * hashCode + blockValue; + } + return hashCode; + } + + template + void addEntry(const UInt *data, int32_t blockStart, uint32_t hashCode, int32_t dataIndex) { + U_ASSERT(0 <= dataIndex && dataIndex < (int32_t)mask); + int32_t entryIndex = findEntry(data, data, blockStart, hashCode); + if (entryIndex < 0) { + table[~entryIndex] = (hashCode << shift) | (dataIndex + 1); + } + } + + template + int32_t findEntry(const UIntA *data, const UIntB *blockData, int32_t blockStart, + uint32_t hashCode) const { + uint32_t shiftedHashCode = hashCode << shift; + int32_t initialEntryIndex = (hashCode % (length - 1)) + 1; // 1..length-1 + for (int32_t entryIndex = initialEntryIndex;;) { + uint32_t entry = table[entryIndex]; + if (entry == 0) { + return ~entryIndex; + } + if ((entry & ~mask) == shiftedHashCode) { + int32_t dataIndex = (entry & mask) - 1; + if (equalBlocks(data + dataIndex, blockData + blockStart, blockLength)) { + return entryIndex; + } + } + entryIndex = nextIndex(initialEntryIndex, entryIndex); + } + } + + int32_t findEntry(const uint32_t *data, uint32_t blockValue, uint32_t hashCode) const { + uint32_t shiftedHashCode = hashCode << shift; + int32_t initialEntryIndex = (hashCode % (length - 1)) + 1; // 1..length-1 + for (int32_t entryIndex = initialEntryIndex;;) { + uint32_t entry = table[entryIndex]; + if (entry == 0) { + return ~entryIndex; + } + if ((entry & ~mask) == shiftedHashCode) { + int32_t dataIndex = (entry & mask) - 1; + if (allValuesSameAs(data + dataIndex, blockLength, blockValue)) { + return entryIndex; + } + } + entryIndex = nextIndex(initialEntryIndex, entryIndex); + } + } + + inline int32_t nextIndex(int32_t initialEntryIndex, int32_t entryIndex) const { + // U_ASSERT(0 < initialEntryIndex && initialEntryIndex < length); + return (entryIndex + initialEntryIndex) % length; + } + + // Hash table. + // The length is a prime number, larger than the maximum data length. + // The "shift" lower bits store a data index + 1. + // The remaining upper bits store a partial hashCode of the block data values. + uint32_t *table = nullptr; + int32_t capacity = 0; + int32_t length = 0; + int32_t shift = 0; + uint32_t mask = 0; + + int32_t blockLength = 0; +}; + int32_t MutableCodePointTrie::compactWholeDataBlocks(int32_t fastILimit, AllSameBlocks &allSameBlocks) { #ifdef UCPTRIE_DEBUG bool overflow = false; @@ -962,8 +1079,9 @@ void printBlock(const uint32_t *block, int32_t blockLength, uint32_t value, * * It does not try to find an optimal order of writing, deduplicating, and overlapping blocks. */ -int32_t MutableCodePointTrie::compactData(int32_t fastILimit, - uint32_t *newData, int32_t dataNullIndex) { +int32_t MutableCodePointTrie::compactData( + int32_t fastILimit, uint32_t *newData, int32_t newDataCapacity, + int32_t dataNullIndex, MixedBlocks &mixedBlocks, UErrorCode &errorCode) { #ifdef UCPTRIE_DEBUG int32_t countSame=0, sumOverlaps=0; bool printData = dataLength == 29088 /* line.brk */ || @@ -983,8 +1101,14 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, #endif } - int32_t iLimit = highStart >> UCPTRIE_SHIFT_3; int32_t blockLength = UCPTRIE_FAST_DATA_BLOCK_LENGTH; + if (!mixedBlocks.init(newDataCapacity, blockLength)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + mixedBlocks.extend(newData, 0, 0, newDataLength); + + int32_t iLimit = highStart >> UCPTRIE_SHIFT_3; int32_t inc = SMALL_DATA_BLOCKS_PER_BMP_BLOCK; int32_t fastLength = 0; for (int32_t i = ASCII_I_LIMIT; i < iLimit; i += inc) { @@ -992,12 +1116,17 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, blockLength = UCPTRIE_SMALL_DATA_BLOCK_LENGTH; inc = 1; fastLength = newDataLength; + if (!mixedBlocks.init(newDataCapacity, blockLength)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + mixedBlocks.extend(newData, 0, 0, newDataLength); } if (flags[i] == ALL_SAME) { uint32_t value = index[i]; - int32_t n; // Find an earlier part of the data array of length blockLength // that is filled with this value. + int32_t n = mixedBlocks.findAllSameBlock(newData, value); // If we find a match, and the current block is the data null block, // and it is not a fast block but matches the start of a fast block, // then we need to continue looking. @@ -1005,12 +1134,10 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, // and not all of the rest of the fast block is filled with this value. // Otherwise trie.getRange() would detect that the fast block starts at // dataNullOffset and assume incorrectly that it is filled with the null value. - for (int32_t start = 0; - (n = findAllSameBlock(newData, start, newDataLength, - value, blockLength)) >= 0 && - i == dataNullIndex && i >= fastILimit && n < fastLength && - isStartOfSomeFastBlock(n, index, fastILimit); - start = n + 1) {} + while (n >= 0 && i == dataNullIndex && i >= fastILimit && n < fastLength && + isStartOfSomeFastBlock(n, index, fastILimit)) { + n = findAllSameBlock(newData, n + 1, newDataLength, value, blockLength); + } if (n >= 0) { DEBUG_DO(++countSame); index[i] = n; @@ -1023,14 +1150,16 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, } #endif index[i] = newDataLength - n; + int32_t prevDataLength = newDataLength; while (n < blockLength) { newData[newDataLength++] = value; ++n; } + mixedBlocks.extend(newData, 0, prevDataLength, newDataLength); } } else if (flags[i] == MIXED) { const uint32_t *block = data + index[i]; - int32_t n = findSameBlock(newData, 0, newDataLength, block, 0, blockLength); + int32_t n = mixedBlocks.findBlock(newData, block, 0); if (n >= 0) { DEBUG_DO(++countSame); index[i] = n; @@ -1043,9 +1172,11 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, } #endif index[i] = newDataLength - n; + int32_t prevDataLength = newDataLength; while (n < blockLength) { newData[newDataLength++] = block[n++]; } + mixedBlocks.extend(newData, 0, prevDataLength, newDataLength); } } else /* SAME_AS */ { uint32_t j = index[i]; @@ -1061,7 +1192,8 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, return newDataLength; } -int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &errorCode) { +int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, MixedBlocks &mixedBlocks, + UErrorCode &errorCode) { int32_t fastIndexLength = fastILimit >> (UCPTRIE_FAST_SHIFT - UCPTRIE_SHIFT_3); if ((highStart >> UCPTRIE_FAST_SHIFT) <= fastIndexLength) { // Only the linear fast index, no multi-stage index tables. @@ -1095,6 +1227,12 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } } + if (!mixedBlocks.init(fastIndexLength, UCPTRIE_INDEX_3_BLOCK_LENGTH)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + mixedBlocks.extend(fastIndex, 0, 0, fastIndexLength); + // Examine index-3 blocks. For each determine one of: // - same as the index-3 null block // - same as a fast-index block @@ -1105,6 +1243,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error // Also determine an upper limit for the index-3 table length. int32_t index3Capacity = 0; i3FirstNull = index3NullOffset; + bool hasLongI3Blocks = false; // If the fast index covers the whole BMP, then // the multi-stage index is only for supplementary code points. // Otherwise, the multi-stage index covers all of Unicode. @@ -1129,13 +1268,13 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index3Capacity += UCPTRIE_INDEX_3_BLOCK_LENGTH; } else { index3Capacity += INDEX_3_18BIT_BLOCK_LENGTH; + hasLongI3Blocks = true; } i3FirstNull = 0; } } else { if (oredI3 <= 0xffff) { - int32_t n = findSameBlock(fastIndex, 0, fastIndexLength, - index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH); + int32_t n = mixedBlocks.findBlock(fastIndex, index, i); if (n >= 0) { flags[i] = I3_BMP; index[i] = n; @@ -1146,6 +1285,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } else { flags[i] = I3_18; index3Capacity += INDEX_3_18BIT_BLOCK_LENGTH; + hasLongI3Blocks = true; } } i = j; @@ -1166,6 +1306,18 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } uprv_memcpy(index16, fastIndex, fastIndexLength * 2); + if (!mixedBlocks.init(index16Capacity, UCPTRIE_INDEX_3_BLOCK_LENGTH)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + MixedBlocks longI3Blocks; + if (hasLongI3Blocks) { + if (!longI3Blocks.init(index16Capacity, INDEX_3_18BIT_BLOCK_LENGTH)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + } + // Compact the index-3 table and write an uncompacted version of the index-2 table. uint16_t index2[UNICODE_LIMIT >> UCPTRIE_SHIFT_2]; // index2Capacity int32_t i2Length = 0; @@ -1185,8 +1337,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } else if (f == I3_BMP) { i3 = index[i]; } else if (f == I3_16) { - int32_t n = findSameBlock(index16, index3Start, indexLength, - index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH); + int32_t n = mixedBlocks.findBlock(index16, index, i); if (n >= 0) { i3 = n; } else { @@ -1198,12 +1349,18 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH); } i3 = indexLength - n; + int32_t prevIndexLength = indexLength; while (n < UCPTRIE_INDEX_3_BLOCK_LENGTH) { index16[indexLength++] = index[i + n++]; } + mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength); + if (hasLongI3Blocks) { + longI3Blocks.extend(index16, index3Start, prevIndexLength, indexLength); + } } } else { U_ASSERT(f == I3_18); + U_ASSERT(hasLongI3Blocks); // Encode an index-3 block that contains one or more data indexes exceeding 16 bits. int32_t j = i; int32_t jLimit = i + UCPTRIE_INDEX_3_BLOCK_LENGTH; @@ -1236,8 +1393,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index16[k++] = v; index16[k - 9] = upperBits; } while (j < jLimit); - int32_t n = findSameBlock(index16, index3Start, indexLength, - index16, indexLength, INDEX_3_18BIT_BLOCK_LENGTH); + int32_t n = longI3Blocks.findBlock(index16, index16, indexLength); if (n >= 0) { i3 = n | 0x8000; } else { @@ -1249,6 +1405,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index16, indexLength, INDEX_3_18BIT_BLOCK_LENGTH); } i3 = (indexLength - n) | 0x8000; + int32_t prevIndexLength = indexLength; if (n > 0) { int32_t start = indexLength; while (n < INDEX_3_18BIT_BLOCK_LENGTH) { @@ -1257,6 +1414,10 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } else { indexLength += INDEX_3_18BIT_BLOCK_LENGTH; } + mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength); + if (hasLongI3Blocks) { + longI3Blocks.extend(index16, index3Start, prevIndexLength, indexLength); + } } } if (index3NullOffset < 0 && i3FirstNull >= 0) { @@ -1279,16 +1440,23 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } // Compact the index-2 table and write the index-1 table. + static_assert(UCPTRIE_INDEX_2_BLOCK_LENGTH == UCPTRIE_INDEX_3_BLOCK_LENGTH, + "must re-init mixedBlocks"); int32_t blockLength = UCPTRIE_INDEX_2_BLOCK_LENGTH; int32_t i1 = fastIndexLength; for (int32_t i = 0; i < i2Length; i += blockLength) { - if ((i2Length - i) < blockLength) { + int32_t n; + if ((i2Length - i) >= blockLength) { + // normal block + U_ASSERT(blockLength == UCPTRIE_INDEX_2_BLOCK_LENGTH); + n = mixedBlocks.findBlock(index16, index2, i); + } else { // highStart is inside the last index-2 block. Shorten it. blockLength = i2Length - i; + n = findSameBlock(index16, index3Start, indexLength, + index2, i, blockLength); } int32_t i2; - int32_t n = findSameBlock(index16, index3Start, indexLength, - index2, i, blockLength); if (n >= 0) { i2 = n; } else { @@ -1299,9 +1467,11 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error n = getOverlap(index16, indexLength, index2, i, blockLength); } i2 = indexLength - n; + int32_t prevIndexLength = indexLength; while (n < blockLength) { index16[indexLength++] = index2[i + n++]; } + mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength); } // Set the index-1 table entry. index16[i1++] = i2; @@ -1369,7 +1539,11 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC uprv_memcpy(newData, asciiData, sizeof(asciiData)); int32_t dataNullIndex = allSameBlocks.findMostUsed(); - int32_t newDataLength = compactData(fastILimit, newData, dataNullIndex); + + MixedBlocks mixedBlocks; + int32_t newDataLength = compactData(fastILimit, newData, newDataCapacity, + dataNullIndex, mixedBlocks, errorCode); + if (U_FAILURE(errorCode)) { return 0; } U_ASSERT(newDataLength <= newDataCapacity); uprv_free(data); data = newData; @@ -1394,7 +1568,7 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC dataNullOffset = UCPTRIE_NO_DATA_NULL_OFFSET; } - int32_t indexLength = compactIndex(fastILimit, errorCode); + int32_t indexLength = compactIndex(fastILimit, mixedBlocks, errorCode); highStart = realHighStart; return indexLength; } diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index cbbd66cb5a8a65..20b03d6cd3e416 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -26,254 +26,116 @@ #include "uassert.h" #include "cmemory.h" +U_NAMESPACE_BEGIN -// The ICU global mutex. Used when ICU implementation code passes NULL for the mutex pointer. -static UMutex globalMutex = U_MUTEX_INITIALIZER; - -/* - * ICU Mutex wrappers. Wrap operating system mutexes, giving the rest of ICU a - * platform independent set of mutex operations. For internal ICU use only. - */ #if defined(U_USER_MUTEX_CPP) -// Build time user mutex hook: #include "U_USER_MUTEX_CPP" -#include U_MUTEX_XSTR(U_USER_MUTEX_CPP) - -#elif U_PLATFORM_USES_ONLY_WIN32_API - -#if defined U_NO_PLATFORM_ATOMICS -#error ICU on Win32 requires support for low level atomic operations. -// Visual Studio, gcc, clang are OK. Shouldn't get here. +// Support for including an alternate implementation of mutexes has been withdrawn. +// See issue ICU-20185. +#error U_USER_MUTEX_CPP not supported #endif +/************************************************************************************************* + * + * ICU Mutex wrappers. + * + *************************************************************************************************/ -// This function is called when a test of a UInitOnce::fState reveals that -// initialization has not completed, that we either need to call the -// function on this thread, or wait for some other thread to complete. -// -// The actual call to the init function is made inline by template code -// that knows the C++ types involved. This function returns TRUE if -// the caller needs to call the Init function. -// - -U_NAMESPACE_BEGIN - -U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &uio) { - for (;;) { - int32_t previousState = InterlockedCompareExchange( - (LONG volatile *) // this is the type given in the API doc for this function. - &uio.fState, // Destination - 1, // Exchange Value - 0); // Compare value - - if (previousState == 0) { - return true; // Caller will next call the init function. - // Current state == 1. - } else if (previousState == 2) { - // Another thread already completed the initialization. - // We can simply return FALSE, indicating no - // further action is needed by the caller. - return FALSE; - } else { - // Another thread is currently running the initialization. - // Wait until it completes. - do { - Sleep(1); - previousState = umtx_loadAcquire(uio.fState); - } while (previousState == 1); - } - } -} - -// This function is called by the thread that ran an initialization function, -// just after completing the function. - -U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce &uio) { - umtx_storeRelease(uio.fState, 2); -} - -U_NAMESPACE_END - -static void winMutexInit(CRITICAL_SECTION *cs) { - InitializeCriticalSection(cs); - return; +// The ICU global mutex. Used when ICU implementation code passes NULL for the mutex pointer. +static UMutex *globalMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; } U_CAPI void U_EXPORT2 umtx_lock(UMutex *mutex) { - if (mutex == NULL) { - mutex = &globalMutex; + if (mutex == nullptr) { + mutex = globalMutex(); } - CRITICAL_SECTION *cs = &mutex->fCS; - umtx_initOnce(mutex->fInitOnce, winMutexInit, cs); - EnterCriticalSection(cs); + mutex->fMutex.lock(); } + U_CAPI void U_EXPORT2 umtx_unlock(UMutex* mutex) { - if (mutex == NULL) { - mutex = &globalMutex; + if (mutex == nullptr) { + mutex = globalMutex(); } - LeaveCriticalSection(&mutex->fCS); + mutex->fMutex.unlock(); } - -U_CAPI void U_EXPORT2 -umtx_condBroadcast(UConditionVar *condition) { - // We require that the associated mutex be held by the caller, - // so access to fWaitCount is protected and safe. No other thread can - // call condWait() while we are here. - if (condition->fWaitCount == 0) { - return; - } - ResetEvent(condition->fExitGate); - SetEvent(condition->fEntryGate); +UConditionVar::UConditionVar() : fCV() { } -U_CAPI void U_EXPORT2 -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 - // becomes trivial to provide. - U_ASSERT(FALSE); +UConditionVar::~UConditionVar() { } -U_CAPI void U_EXPORT2 -umtx_condWait(UConditionVar *condition, UMutex *mutex) { - if (condition->fEntryGate == NULL) { - // Note: because the associated mutex must be locked when calling - // wait, we know that there can not be multiple threads - // running here with the same condition variable. - // Meaning that lazy initialization is safe. - U_ASSERT(condition->fExitGate == NULL); - condition->fEntryGate = CreateEvent(NULL, // Security Attributes - TRUE, // Manual Reset - FALSE, // Initially reset - NULL); // Name. - U_ASSERT(condition->fEntryGate != NULL); - condition->fExitGate = CreateEvent(NULL, TRUE, TRUE, NULL); - U_ASSERT(condition->fExitGate != NULL); - } - - condition->fWaitCount++; - umtx_unlock(mutex); - WaitForSingleObject(condition->fEntryGate, INFINITE); - umtx_lock(mutex); - condition->fWaitCount--; - if (condition->fWaitCount == 0) { - // All threads that were waiting at the entry gate have woken up - // and moved through. Shut the entry gate and open the exit gate. - ResetEvent(condition->fEntryGate); - SetEvent(condition->fExitGate); - } else { - umtx_unlock(mutex); - WaitForSingleObject(condition->fExitGate, INFINITE); - umtx_lock(mutex); - } -} - - -#elif U_PLATFORM_IMPLEMENTS_POSIX - -//------------------------------------------------------------------------------------------- -// -// POSIX specific definitions -// -//------------------------------------------------------------------------------------------- - -# include - -// Each UMutex consists of a pthread_mutex_t. -// All are statically initialized and ready for use. -// There is no runtime mutex initialization code needed. - -U_CAPI void U_EXPORT2 -umtx_lock(UMutex *mutex) { - if (mutex == NULL) { - mutex = &globalMutex; - } - int sysErr = pthread_mutex_lock(&mutex->fMutex); - (void)sysErr; // Suppress unused variable warnings. - U_ASSERT(sysErr == 0); -} - - -U_CAPI void U_EXPORT2 -umtx_unlock(UMutex* mutex) -{ - if (mutex == NULL) { - mutex = &globalMutex; - } - int sysErr = pthread_mutex_unlock(&mutex->fMutex); - (void)sysErr; // Suppress unused variable warnings. - U_ASSERT(sysErr == 0); -} - - U_CAPI void U_EXPORT2 umtx_condWait(UConditionVar *cond, UMutex *mutex) { - if (mutex == NULL) { - mutex = &globalMutex; + if (mutex == nullptr) { + mutex = globalMutex(); } - int sysErr = pthread_cond_wait(&cond->fCondition, &mutex->fMutex); - (void)sysErr; - U_ASSERT(sysErr == 0); + cond->fCV.wait(mutex->fMutex); } + U_CAPI void U_EXPORT2 umtx_condBroadcast(UConditionVar *cond) { - int sysErr = pthread_cond_broadcast(&cond->fCondition); - (void)sysErr; - U_ASSERT(sysErr == 0); + cond->fCV.notify_all(); } + U_CAPI void U_EXPORT2 umtx_condSignal(UConditionVar *cond) { - int sysErr = pthread_cond_signal(&cond->fCondition); - (void)sysErr; - U_ASSERT(sysErr == 0); + cond->fCV.notify_one(); } +/************************************************************************************************* + * + * UInitOnce Implementation + * + *************************************************************************************************/ -U_NAMESPACE_BEGIN +static std::mutex &initMutex() { + static std::mutex m; + return m; +} -static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t initCondition = PTHREAD_COND_INITIALIZER; +static std::condition_variable &initCondition() { + static std::condition_variable cv; + return cv; +} // This function is called when a test of a UInitOnce::fState reveals that -// initialization has not completed, that we either need to call the +// initialization has not completed, that we either need to call the init // function on this thread, or wait for some other thread to complete. // // The actual call to the init function is made inline by template code -// that knows the C++ types involved. This function returns TRUE if +// that knows the C++ types involved. This function returns true if // the caller needs to call the Init function. // U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &uio) { - pthread_mutex_lock(&initMutex); - int32_t state = uio.fState; - if (state == 0) { + std::unique_lock lock(initMutex()); + + if (umtx_loadAcquire(uio.fState) == 0) { umtx_storeRelease(uio.fState, 1); - pthread_mutex_unlock(&initMutex); - return TRUE; // Caller will next call the init function. + return true; // Caller will next call the init function. } else { - while (uio.fState == 1) { + while (umtx_loadAcquire(uio.fState) == 1) { // Another thread is currently running the initialization. // Wait until it completes. - pthread_cond_wait(&initCondition, &initMutex); + initCondition().wait(lock); } - pthread_mutex_unlock(&initMutex); U_ASSERT(uio.fState == 2); - return FALSE; + return false; } } - // This function is called by the thread that ran an initialization function, // just after completing the function. // Some threads may be waiting on the condition, requiring the broadcast wakeup. @@ -282,80 +144,20 @@ umtx_initImplPreInit(UInitOnce &uio) { U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce &uio) { - pthread_mutex_lock(&initMutex); - umtx_storeRelease(uio.fState, 2); - pthread_cond_broadcast(&initCondition); - pthread_mutex_unlock(&initMutex); -} - -U_NAMESPACE_END - -// End of POSIX specific umutex implementation. - -#else // Platform #define chain. - -#error Unknown Platform - -#endif // Platform #define chain. - - -//------------------------------------------------------------------------------- -// -// Atomic Operations, out-of-line versions. -// These are conditional, only defined if better versions -// were not available for the platform. -// -// These versions are platform neutral. -// -//-------------------------------------------------------------------------------- - -#if defined U_NO_PLATFORM_ATOMICS -static UMutex gIncDecMutex = U_MUTEX_INITIALIZER; - -U_NAMESPACE_BEGIN - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_inc(u_atomic_int32_t *p) { - int32_t retVal; - umtx_lock(&gIncDecMutex); - retVal = ++(*p); - umtx_unlock(&gIncDecMutex); - return retVal; -} - - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_dec(u_atomic_int32_t *p) { - int32_t retVal; - umtx_lock(&gIncDecMutex); - retVal = --(*p); - umtx_unlock(&gIncDecMutex); - return retVal; -} - -U_COMMON_API int32_t U_EXPORT2 -umtx_loadAcquire(u_atomic_int32_t &var) { - umtx_lock(&gIncDecMutex); - int32_t val = var; - umtx_unlock(&gIncDecMutex); - return val; -} - -U_COMMON_API void U_EXPORT2 -umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - umtx_lock(&gIncDecMutex); - var = val; - umtx_unlock(&gIncDecMutex); + { + std::unique_lock lock(initMutex()); + umtx_storeRelease(uio.fState, 2); + } + initCondition().notify_all(); } U_NAMESPACE_END -#endif -//-------------------------------------------------------------------------- -// -// Deprecated functions for setting user mutexes. -// -//-------------------------------------------------------------------------- +/************************************************************************************************* + * + * Deprecated functions for setting user mutexes. + * + *************************************************************************************************/ U_DEPRECATED void U_EXPORT2 u_setMutexFunctions(const void * /*context */, UMtxInitFn *, UMtxFn *, diff --git a/deps/icu-small/source/common/umutex.h b/deps/icu-small/source/common/umutex.h old mode 100644 new mode 100755 index 37e49871049b93..1674d00bb2d59b --- a/deps/icu-small/source/common/umutex.h +++ b/deps/icu-small/source/common/umutex.h @@ -20,48 +20,51 @@ #ifndef UMUTEX_H #define UMUTEX_H +#include +#include +#include + #include "unicode/utypes.h" #include "unicode/uclean.h" +#include "unicode/uobject.h" + #include "putilimp.h" +#if defined(U_USER_ATOMICS_H) || defined(U_USER_MUTEX_H) +// Support for including an alternate implementation of atomic & mutex operations has been withdrawn. +// See issue ICU-20185. +#error U_USER_ATOMICS and U_USER_MUTEX_H are not supported +#endif -// Forward Declarations. UMutex is not in the ICU namespace (yet) because -// there are some remaining references from plain C. -struct UMutex; -struct UConditionVar; +// Export an explicit template instantiation of std::atomic. +// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class. +// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) +#if defined(__clang__) || defined(_MSC_VER) + #if defined(__clang__) + // Suppress the warning that the explicit instantiation after explicit specialization has no effect. + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Winstantiation-after-specialization" + #endif +template struct U_COMMON_API std::atomic; + #if defined(__clang__) + #pragma clang diagnostic pop + #endif +#elif defined(__GNUC__) +// For GCC this class is already exported/visible, so no need for U_COMMON_API. +template struct std::atomic; +#endif +#endif -U_NAMESPACE_BEGIN -struct UInitOnce; -U_NAMESPACE_END -// Stringify macros, to allow #include of user supplied atomic & mutex files. -#define U_MUTEX_STR(s) #s -#define U_MUTEX_XSTR(s) U_MUTEX_STR(s) +U_NAMESPACE_BEGIN /**************************************************************************** * - * Low Level Atomic Operations. - * Compiler dependent. Not operating system dependent. + * Low Level Atomic Operations, ICU wrappers for. * ****************************************************************************/ -#if defined (U_USER_ATOMICS_H) -#include U_MUTEX_XSTR(U_USER_ATOMICS_H) - -#elif U_HAVE_STD_ATOMICS - -// C++11 atomics are available. - -#include - -U_NAMESPACE_BEGIN - -// Export an explicit template instantiation of std::atomic. -// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class. -// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template struct U_COMMON_API std::atomic; -#endif typedef std::atomic u_atomic_int32_t; #define ATOMIC_INT32_T_INITIALIZER(val) ATOMIC_VAR_INIT(val) @@ -81,155 +84,19 @@ inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { return var->fetch_sub(1) - 1; } -U_NAMESPACE_END - -#elif U_PLATFORM_HAS_WIN32_API - -// MSVC compiler. Reads and writes of volatile variables have -// acquire and release memory semantics, respectively. -// This is a Microsoft extension, not standard C++ behavior. -// -// Update: can't use this because of MinGW, built with gcc. -// Original plan was to use gcc atomics for MinGW, but they -// aren't supported, so we fold MinGW into this path. - -#ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -# define VC_EXTRALEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -# ifndef NOMINMAX -# define NOMINMAX -# endif -# include - -U_NAMESPACE_BEGIN -typedef volatile LONG u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { - return InterlockedCompareExchange(&var, 0, 0); -} - -inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - InterlockedExchange(&var, val); -} - - -inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { - return InterlockedIncrement(var); -} - -inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { - return InterlockedDecrement(var); -} -U_NAMESPACE_END - - -#elif U_HAVE_CLANG_ATOMICS -/* - * Clang __c11 atomic built-ins - */ - -U_NAMESPACE_BEGIN -typedef _Atomic(int32_t) u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { - return __c11_atomic_load(&var, __ATOMIC_ACQUIRE); -} - -inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - return __c11_atomic_store(&var, val, __ATOMIC_RELEASE); -} - -inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { - return __c11_atomic_fetch_add(var, 1, __ATOMIC_SEQ_CST) + 1; -} - -inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { - return __c11_atomic_fetch_sub(var, 1, __ATOMIC_SEQ_CST) - 1; -} -U_NAMESPACE_END - - -#elif U_HAVE_GCC_ATOMICS -/* - * gcc atomic ops. These are available on several other compilers as well. - */ - -U_NAMESPACE_BEGIN -typedef int32_t u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { - int32_t val = var; - __sync_synchronize(); - return val; -} - -inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - __sync_synchronize(); - var = val; -} - -inline int32_t umtx_atomic_inc(u_atomic_int32_t *p) { - return __sync_add_and_fetch(p, 1); -} - -inline int32_t umtx_atomic_dec(u_atomic_int32_t *p) { - return __sync_sub_and_fetch(p, 1); -} -U_NAMESPACE_END - -#else - -/* - * Unknown Platform. Use out-of-line functions, which in turn use mutexes. - * Slow but correct. - */ - -#define U_NO_PLATFORM_ATOMICS - -U_NAMESPACE_BEGIN -typedef int32_t u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -U_COMMON_API int32_t U_EXPORT2 -umtx_loadAcquire(u_atomic_int32_t &var); - -U_COMMON_API void U_EXPORT2 -umtx_storeRelease(u_atomic_int32_t &var, int32_t val); - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_inc(u_atomic_int32_t *p); - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_dec(u_atomic_int32_t *p); - -U_NAMESPACE_END - -#endif /* Low Level Atomic Ops Platform Chain */ - /************************************************************************************************* * * UInitOnce Definitions. - * These are platform neutral. * *************************************************************************************************/ -U_NAMESPACE_BEGIN - struct UInitOnce { u_atomic_int32_t fState; UErrorCode fErrCode; - void reset() {fState = 0;}; - UBool isReset() {return umtx_loadAcquire(fState) == 0;}; + void reset() {fState = 0;} + UBool isReset() {return umtx_loadAcquire(fState) == 0;} // Note: isReset() is used by service registration code. // Thread safety of this usage needs review. }; @@ -313,106 +180,49 @@ template void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UE } } -U_NAMESPACE_END - - /************************************************************************************************* * - * Mutex Definitions. Platform Dependent, #if platform chain follows. - * TODO: Add a C++11 version. - * Need to convert all mutex using files to C++ first. + * ICU Mutex wrappers. Originally wrapped operating system mutexes, giving the rest of ICU a + * platform independent set of mutex operations. Now vestigial, wrapping std::mutex only. + * For internal ICU use only. * *************************************************************************************************/ -#if defined(U_USER_MUTEX_H) -// #include "U_USER_MUTEX_H" -#include U_MUTEX_XSTR(U_USER_MUTEX_H) - -#elif U_PLATFORM_USES_ONLY_WIN32_API +struct UMutex : public icu::UMemory { + UMutex() = default; + ~UMutex() = default; + UMutex(const UMutex &other) = delete; + UMutex &operator =(const UMutex &other) = delete; -/* For CRITICAL_SECTION */ - -/* - * Note: there is an earlier include of windows.h in this file, but it is in - * different conditionals. - * This one is needed if we are using C++11 for atomic ops, but - * win32 APIs for Critical Sections. - */ - -#ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -# define VC_EXTRALEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -# ifndef NOMINMAX -# define NOMINMAX -# endif -# include - - -typedef struct UMutex { - icu::UInitOnce fInitOnce; - CRITICAL_SECTION fCS; -} UMutex; - -/* Initializer for a static UMUTEX. Deliberately contains no value for the - * CRITICAL_SECTION. - */ -#define U_MUTEX_INITIALIZER {U_INITONCE_INITIALIZER} - -struct UConditionVar { - HANDLE fEntryGate; - HANDLE fExitGate; - int32_t fWaitCount; + std::mutex fMutex = {}; // Note: struct - pubic members - because most access is from + // // plain C style functions (umtx_lock(), etc.) }; -#define U_CONDITION_INITIALIZER {NULL, NULL, 0} - - - -#elif U_PLATFORM_IMPLEMENTS_POSIX -/* - * POSIX platform - */ +struct UConditionVar : public icu::UMemory { + U_COMMON_API UConditionVar(); + U_COMMON_API ~UConditionVar(); + UConditionVar(const UConditionVar &other) = delete; + UConditionVar &operator =(const UConditionVar &other) = delete; -#include - -struct UMutex { - pthread_mutex_t fMutex; + std::condition_variable_any fCV; }; -typedef struct UMutex UMutex; -#define U_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER} -struct UConditionVar { - pthread_cond_t fCondition; -}; -#define U_CONDITION_INITIALIZER {PTHREAD_COND_INITIALIZER} +#define U_MUTEX_INITIALIZER {} +#define U_CONDITION_INITIALIZER {} -#else - -/* - * Unknown platform type. - * This is an error condition. ICU requires mutexes. - */ - -#error Unknown Platform. - -#endif - - - -/************************************************************************************** - * - * Mutex Implementation function declarations. - * Declarations are platform neutral. - * Implementations, in umutex.cpp, are platform specific. - * - ************************************************************************************/ +// Implementation notes for UConditionVar: +// +// Use an out-of-line constructor to reduce problems with the ICU dependency checker. +// On Linux, the default constructor of std::condition_variable_any +// produces an in-line reference to global operator new(), which the +// dependency checker flags for any file that declares a UConditionVar. With +// an out-of-line constructor, the dependency is constrained to umutex.o +// +// Do not export (U_COMMON_API) the entire class, but only the constructor +// and destructor, to avoid Windows build problems with attempting to export the +// std::condition_variable_any. /* Lock a mutex. * @param mutex The given mutex to be locked. Pass NULL to specify @@ -441,8 +251,6 @@ U_INTERNAL void U_EXPORT2 umtx_condWait(UConditionVar *cond, UMutex *mutex); /* * Broadcast wakeup of all threads waiting on a Condition. - * The associated mutex must be locked by the calling thread when calling - * this function; this is a temporary ICU restriction. * * @param cond the condition variable. */ @@ -450,9 +258,11 @@ U_INTERNAL void U_EXPORT2 umtx_condBroadcast(UConditionVar *cond); /* * Signal a condition variable, waking up one waiting thread. - * CAUTION: Do not use. Place holder only. Not implemented for Windows. */ U_INTERNAL void U_EXPORT2 umtx_condSignal(UConditionVar *cond); + +U_NAMESPACE_END + #endif /* UMUTEX_H */ /*eof*/ diff --git a/deps/icu-small/source/common/unames.cpp b/deps/icu-small/source/common/unames.cpp index 5f752b0d1725cb..038743004ea589 100644 --- a/deps/icu-small/source/common/unames.cpp +++ b/deps/icu-small/source/common/unames.cpp @@ -1526,7 +1526,7 @@ u_charFromName(UCharNameChoice nameChoice, uint32_t i; UChar32 cp = 0; char c0; - UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */ + static constexpr UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return error; @@ -1560,39 +1560,45 @@ u_charFromName(UCharNameChoice nameChoice, /* try extended names first */ if (lower[0] == '<') { - if (nameChoice == U_EXTENDED_CHAR_NAME) { + if (nameChoice == U_EXTENDED_CHAR_NAME && lower[--i] == '>') { // Parse a string like "" where HHHH is a hex code point. - if (lower[--i] == '>' && i >= 3 && lower[--i] != '-') { - while (i >= 3 && lower[--i] != '-') {} - - if (i >= 2 && lower[i] == '-') { - uint32_t cIdx; - - lower[i] = 0; - - for (++i; lower[i] != '>'; ++i) { - if (lower[i] >= '0' && lower[i] <= '9') { - cp = (cp << 4) + lower[i] - '0'; - } else if (lower[i] >= 'a' && lower[i] <= 'f') { - cp = (cp << 4) + lower[i] - 'a' + 10; - } else { - *pErrorCode = U_ILLEGAL_CHAR_FOUND; - return error; - } - } + uint32_t limit = i; + while (i >= 3 && lower[--i] != '-') {} + + // There should be 1 to 8 hex digits. + int32_t hexLength = limit - (i + 1); + if (i >= 2 && lower[i] == '-' && 1 <= hexLength && hexLength <= 8) { + uint32_t cIdx; + + lower[i] = 0; - /* Now validate the category name. - We could use a binary search, or a trie, if - we really wanted to. */ + for (++i; i < limit; ++i) { + if (lower[i] >= '0' && lower[i] <= '9') { + cp = (cp << 4) + lower[i] - '0'; + } else if (lower[i] >= 'a' && lower[i] <= 'f') { + cp = (cp << 4) + lower[i] - 'a' + 10; + } else { + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + return error; + } + // Prevent signed-integer overflow and out-of-range code points. + if (cp > UCHAR_MAX_VALUE) { + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + return error; + } + } - for (lower[i] = 0, cIdx = 0; cIdx < UPRV_LENGTHOF(charCatNames); ++cIdx) { + /* Now validate the category name. + We could use a binary search, or a trie, if + we really wanted to. */ + uint8_t cat = getCharCat(cp); + for (lower[i] = 0, cIdx = 0; cIdx < UPRV_LENGTHOF(charCatNames); ++cIdx) { - if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) { - if (getCharCat(cp) == cIdx) { - return cp; - } - break; + if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) { + if (cat == cIdx) { + return cp; } + break; } } } diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 5faeedfa93ecb8..ac1bf1df29f214 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -431,12 +431,13 @@ class U_COMMON_API BreakIterator : public UObject { static BreakIterator* U_EXPORT2 createSentenceInstance(const Locale& where, UErrorCode& status); +#ifndef U_HIDE_DEPRECATED_API /** * Create BreakIterator for title-casing breaks using the specified locale * Returns an instance of a BreakIterator implementing title breaks. * The iterator returned locates title boundaries as described for * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration, - * please use Word Boundary iterator.{@link #createWordInstance } + * please use a word boundary iterator. See {@link #createWordInstance }. * * @param where the locale. * @param status The error code. @@ -451,10 +452,11 @@ class U_COMMON_API BreakIterator : public UObject { * used; neither the requested locale nor any of its fall back locales * could be found. * The caller owns the returned object and is responsible for deleting it. - * @stable ICU 2.1 + * @deprecated ICU 64 Use createWordInstance instead. */ static BreakIterator* U_EXPORT2 createTitleInstance(const Locale& where, UErrorCode& status); +#endif /* U_HIDE_DEPRECATED_API */ /** * Get the set of Locales for which TextBoundaries are installed. diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 243fa17b87917a..89906799877622 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -33,7 +33,7 @@ * then detailed member descriptions.

* *

C Programmers:

- *

Use Module List or File Members + *

Use Module List or File Members * to find a list of all the functions and constants. * For example, to find BreakIterator functions you would click on * File List, @@ -115,7 +115,7 @@ * * Locales * uloc.h - * icu::Locale + * icu::Locale, icu::LocaleBuilder * * * Resource Bundles @@ -143,11 +143,16 @@ * icu::MessageFormat * * - * Number Formatting + * Number Formatting
(includes currency and unit formatting) * unumberformatter.h, unum.h * icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions) * * + * Number Range Formatting
(includes currency and unit ranges) + * (no C API) + * icu::number::NumberRangeFormatter + * + * * Number Spellout
(Rule Based Number Formatting) * unum.h
(use UNUM_SPELLOUT) * icu::RuleBasedNumberFormat diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index c99011e26c81dd..625456f0c868e9 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -53,14 +53,14 @@ class U_COMMON_API DateInterval : public UObject { * @return the from date in dateInterval. * @stable ICU 4.0 */ - UDate getFromDate() const; + inline UDate getFromDate() const; /** * Get the to date. * @return the to date in dateInterval. * @stable ICU 4.0 */ - UDate getToDate() const; + inline UDate getToDate() const; /** @@ -114,7 +114,7 @@ class U_COMMON_API DateInterval : public UObject { * @return TRUE if the two DateIntervals are not the same * @stable ICU 4.0 */ - UBool operator!=(const DateInterval& other) const; + inline UBool operator!=(const DateInterval& other) const; /** diff --git a/deps/icu-small/source/common/unicode/localebuilder.h b/deps/icu-small/source/common/unicode/localebuilder.h new file mode 100644 index 00000000000000..960e5980c03c2e --- /dev/null +++ b/deps/icu-small/source/common/unicode/localebuilder.h @@ -0,0 +1,292 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html#License +#ifndef __LOCALEBUILDER_H__ +#define __LOCALEBUILDER_H__ + +#include "unicode/locid.h" +#include "unicode/stringpiece.h" +#include "unicode/uobject.h" +#include "unicode/utypes.h" + + +#ifndef U_HIDE_DRAFT_API +/** + * \file + * \brief C++ API: Builder API for Locale + */ + +U_NAMESPACE_BEGIN +class CharString; + +/** + * LocaleBuilder is used to build instances of Locale + * from values configured by the setters. Unlike the Locale + * constructors, the LocaleBuilder checks if a value configured by a + * setter satisfies the syntax requirements defined by the Locale + * class. A Locale object created by a LocaleBuilder is + * well-formed and can be transformed to a well-formed IETF BCP 47 language tag + * without losing information. + * + *

The following example shows how to create a Locale object + * with the LocaleBuilder. + *

+ *
+ *     UErrorCode status = U_ZERO_ERROR;
+ *     Locale aLocale = LocaleBuilder()
+ *                          .setLanguage("sr")
+ *                          .setScript("Latn")
+ *                          .setRegion("RS")
+ *                          .build(status);
+ *     if (U_SUCCESS(status)) {
+ *       // ...
+ *     }
+ * 
+ *
+ * + *

LocaleBuilders can be reused; clear() resets all + * fields to their default values. + * + *

LocaleBuilder tracks errors in an internal UErrorCode. For all setters, + * except setLanguageTag and setLocale, LocaleBuilder will return immediately + * if the internal UErrorCode is in error state. + * To reset internal state and error code, call clear method. + * The setLanguageTag and setLocale method will first clear the internal + * UErrorCode, then track the error of the validation of the input parameter + * into the internal UErrorCode. + * + * @draft ICU 64 + */ +class U_COMMON_API LocaleBuilder : public UObject { +public: + /** + * Constructs an empty LocaleBuilder. The default value of all + * fields, extensions, and private use information is the + * empty string. + * + * @draft ICU 64 + */ + LocaleBuilder(); + + /** + * Destructor + * @draft ICU 64 + */ + virtual ~LocaleBuilder(); + + /** + * Resets the LocaleBuilder to match the provided + * locale. Existing state is discarded. + * + *

All fields of the locale must be well-formed. + *

This method clears the internal UErrorCode. + * + * @param locale the locale + * @return This builder. + * + * @draft ICU 64 + */ + LocaleBuilder& setLocale(const Locale& locale); + + /** + * Resets the LocaleBuilder to match the provided + * [Unicode Locale Identifier](http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_id) . + * Discards the existing state. the empty string cause the builder to be + * reset, like {@link #clear}. Grandfathered tags are converted to their + * canonical form before being processed. Otherwise, the language + * tag must be well-formed, or else the build() method will later + * report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

This method clears the internal UErrorCode. + * + * @param tag the language tag, defined as + * [unicode_locale_id](http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_id). + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setLanguageTag(StringPiece tag); + + /** + * Sets the language. If language is the empty string, the + * language in this LocaleBuilder is removed. Otherwise, the + * language must be well-formed, or else the build() method will + * later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

The syntax of language value is defined as + * [unicode_language_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_language_subtag). + * + * @param language the language + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setLanguage(StringPiece language); + + /** + * Sets the script. If script is the empty string, the script in + * this LocaleBuilder is removed. + * Otherwise, the script must be well-formed, or else the build() + * method will later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

The script value is a four-letter script code as + * [unicode_script_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_script_subtag) + * defined by ISO 15924 + * + * @param script the script + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setScript(StringPiece script); + + /** + * Sets the region. If region is the empty string, the region in this + * LocaleBuilder is removed. Otherwise, the region + * must be well-formed, or else the build() method will later report an + * U_ILLEGAL_ARGUMENT_ERROR. + * + *

The region value is defined by + * [unicode_region_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_region_subtag) + * as a two-letter ISO 3166 code or a three-digit UN M.49 area code. + * + *

The region value in the Locale created by the + * LocaleBuilder is always normalized to upper case. + * + * @param region the region + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setRegion(StringPiece region); + + /** + * Sets the variant. If variant is the empty string, the variant in this + * LocaleBuilder is removed. Otherwise, the variant + * must be well-formed, or else the build() method will later report an + * U_ILLEGAL_ARGUMENT_ERROR. + * + *

Note: This method checks if variant + * satisfies the + * [unicode_variant_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_variant_subtag) + * syntax requirements, and normalizes the value to lowercase letters. However, + * the Locale class does not impose any syntactic + * restriction on variant. To set an ill-formed variant, use a Locale constructor. + * If there are multiple unicode_variant_subtag, the caller must concatenate + * them with '-' as separator (ex: "foobar-fibar"). + * + * @param variant the variant + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setVariant(StringPiece variant); + + /** + * Sets the extension for the given key. If the value is the empty string, + * the extension is removed. Otherwise, the key and + * value must be well-formed, or else the build() method will + * later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

Note: The key ('u') is used for the Unicode locale extension. + * Setting a value for this key replaces any existing Unicode locale key/type + * pairs with those defined in the extension. + * + *

Note: The key ('x') is used for the private use code. To be + * well-formed, the value for this key needs only to have subtags of one to + * eight alphanumeric characters, not two to eight as in the general case. + * + * @param key the extension key + * @param value the extension value + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setExtension(char key, StringPiece value); + + /** + * Sets the Unicode locale keyword type for the given key. If the type + * StringPiece is constructed with a nullptr, the keyword is removed. + * If the type is the empty string, the keyword is set without type subtags. + * Otherwise, the key and type must be well-formed, or else the build() + * method will later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

Keys and types are converted to lower case. + * + *

Note:Setting the 'u' extension via {@link #setExtension} + * replaces all Unicode locale keywords with those defined in the + * extension. + * + * @param key the Unicode locale key + * @param type the Unicode locale type + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setUnicodeLocaleKeyword( + StringPiece key, StringPiece type); + + /** + * Adds a unicode locale attribute, if not already present, otherwise + * has no effect. The attribute must not be empty string and must be + * well-formed or U_ILLEGAL_ARGUMENT_ERROR will be set to status + * during the build() call. + * + * @param attribute the attribute + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& addUnicodeLocaleAttribute(StringPiece attribute); + + /** + * Removes a unicode locale attribute, if present, otherwise has no + * effect. The attribute must not be empty string and must be well-formed + * or U_ILLEGAL_ARGUMENT_ERROR will be set to status during the build() call. + * + *

Attribute comparison for removal is case-insensitive. + * + * @param attribute the attribute + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& removeUnicodeLocaleAttribute(StringPiece attribute); + + /** + * Resets the builder to its initial, empty state. + *

This method clears the internal UErrorCode. + * + * @return this builder + * @draft ICU 64 + */ + LocaleBuilder& clear(); + + /** + * Resets the extensions to their initial, empty state. + * Language, script, region and variant are unchanged. + * + * @return this builder + * @draft ICU 64 + */ + LocaleBuilder& clearExtensions(); + + /** + * Returns an instance of Locale created from the fields set + * on this builder. + * If any set methods or during the build() call require memory allocation + * but fail U_MEMORY_ALLOCATION_ERROR will be set to status. + * If any of the fields set by the setters are not well-formed, the status + * will be set to U_ILLEGAL_ARGUMENT_ERROR. The state of the builder will + * not change after the build() call and the caller is free to keep using + * the same builder to build more locales. + * + * @return a new Locale + * @draft ICU 64 + */ + Locale build(UErrorCode& status); + +private: + UErrorCode status_; + char language_[9]; + char script_[5]; + char region_[4]; + CharString *variant_; // Pointer not object so we need not #include internal charstr.h. + icu::Locale *extensions_; // Pointer not object. Storage for all other fields. + +}; + +U_NAMESPACE_END + +#endif // U_HIDE_DRAFT_API +#endif // __LOCALEBUILDER_H__ diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index e17ee3d886ef34..e011688b1a54df 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -42,6 +42,8 @@ #if U_SHOW_CPLUSPLUS_API +#include + U_NAMESPACE_BEGIN /** @@ -65,6 +67,13 @@ U_NAMESPACE_BEGIN template class LocalPointerBase { public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) = delete; + static void* U_EXPORT2 operator new[](size_t) = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) = delete; +#endif + /** * Constructor takes ownership. * @param p simple pointer to an object that is adopted @@ -158,12 +167,6 @@ class LocalPointerBase { // No ownership sharing: No copy constructor, no assignment operator. LocalPointerBase(const LocalPointerBase &other); void operator=(const LocalPointerBase &other); - // No heap allocation. Use only on the stack. - static void * U_EXPORT2 operator new(size_t size); - static void * U_EXPORT2 operator new[](size_t size); -#if U_HAVE_PLACEMENT_NEW - static void * U_EXPORT2 operator new(size_t, void *ptr); -#endif }; /** @@ -221,6 +224,22 @@ class LocalPointer : public LocalPointerBase { LocalPointer(LocalPointer &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } + +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a LocalPointer from a C++11 std::unique_ptr. + * The LocalPointer steals the object owned by the std::unique_ptr. + * + * This constructor works via move semantics. If your std::unique_ptr is + * in a local variable, you must use std::move. + * + * @param p The std::unique_ptr from which the pointer will be stolen. + * @draft ICU 64 + */ + explicit LocalPointer(std::unique_ptr &&p) + : LocalPointerBase(p.release()) {} +#endif /* U_HIDE_DRAFT_API */ + /** * Destructor deletes the object it owns. * @stable ICU 4.4 @@ -236,24 +255,27 @@ class LocalPointer : public LocalPointerBase { * @stable ICU 56 */ LocalPointer &operator=(LocalPointer &&src) U_NOEXCEPT { - return moveFrom(src); + delete LocalPointerBase::ptr; + LocalPointerBase::ptr=src.ptr; + src.ptr=NULL; + return *this; } - // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API + +#ifndef U_HIDE_DRAFT_API /** - * Move assignment, leaves src with isNull(). - * The behavior is undefined if *this and src are the same object. + * Move-assign from an std::unique_ptr to this LocalPointer. + * Steals the pointer from the std::unique_ptr. * - * Can be called explicitly, does not need C++11 support. - * @param src source smart pointer + * @param p The std::unique_ptr from which the pointer will be stolen. * @return *this - * @draft ICU 56 + * @draft ICU 64 */ - LocalPointer &moveFrom(LocalPointer &src) U_NOEXCEPT { - delete LocalPointerBase::ptr; - LocalPointerBase::ptr=src.ptr; - src.ptr=NULL; + LocalPointer &operator=(std::unique_ptr &&p) U_NOEXCEPT { + adoptInstead(p.release()); return *this; } +#endif /* U_HIDE_DRAFT_API */ + /** * Swap pointers. * @param other other smart pointer @@ -309,6 +331,23 @@ class LocalPointer : public LocalPointerBase { delete p; } } + +#ifndef U_HIDE_DRAFT_API + /** + * Conversion operator to a C++11 std::unique_ptr. + * Disowns the object and gives it to the returned std::unique_ptr. + * + * This operator works via move semantics. If your LocalPointer is + * in a local variable, you must use std::move. + * + * @return An std::unique_ptr owning the pointer previously owned by this + * icu::LocalPointer. + * @draft ICU 64 + */ + operator std::unique_ptr () && { + return std::unique_ptr(LocalPointerBase::orphan()); + } +#endif /* U_HIDE_DRAFT_API */ }; /** @@ -366,6 +405,22 @@ class LocalArray : public LocalPointerBase { LocalArray(LocalArray &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } + +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a LocalArray from a C++11 std::unique_ptr of an array type. + * The LocalPointer steals the array owned by the std::unique_ptr. + * + * This constructor works via move semantics. If your std::unique_ptr is + * in a local variable, you must use std::move. + * + * @param p The std::unique_ptr from which the array will be stolen. + * @draft ICU 64 + */ + explicit LocalArray(std::unique_ptr &&p) + : LocalPointerBase(p.release()) {} +#endif /* U_HIDE_DRAFT_API */ + /** * Destructor deletes the array it owns. * @stable ICU 4.4 @@ -381,24 +436,27 @@ class LocalArray : public LocalPointerBase { * @stable ICU 56 */ LocalArray &operator=(LocalArray &&src) U_NOEXCEPT { - return moveFrom(src); + delete[] LocalPointerBase::ptr; + LocalPointerBase::ptr=src.ptr; + src.ptr=NULL; + return *this; } - // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API + +#ifndef U_HIDE_DRAFT_API /** - * Move assignment, leaves src with isNull(). - * The behavior is undefined if *this and src are the same object. + * Move-assign from an std::unique_ptr to this LocalPointer. + * Steals the array from the std::unique_ptr. * - * Can be called explicitly, does not need C++11 support. - * @param src source smart pointer + * @param p The std::unique_ptr from which the array will be stolen. * @return *this - * @draft ICU 56 + * @draft ICU 64 */ - LocalArray &moveFrom(LocalArray &src) U_NOEXCEPT { - delete[] LocalPointerBase::ptr; - LocalPointerBase::ptr=src.ptr; - src.ptr=NULL; + LocalArray &operator=(std::unique_ptr &&p) U_NOEXCEPT { + adoptInstead(p.release()); return *this; } +#endif /* U_HIDE_DRAFT_API */ + /** * Swap pointers. * @param other other smart pointer @@ -462,6 +520,23 @@ class LocalArray : public LocalPointerBase { * @stable ICU 4.4 */ T &operator[](ptrdiff_t i) const { return LocalPointerBase::ptr[i]; } + +#ifndef U_HIDE_DRAFT_API + /** + * Conversion operator to a C++11 std::unique_ptr. + * Disowns the object and gives it to the returned std::unique_ptr. + * + * This operator works via move semantics. If your LocalPointer is + * in a local variable, you must use std::move. + * + * @return An std::unique_ptr owning the pointer previously owned by this + * icu::LocalPointer. + * @draft ICU 64 + */ + operator std::unique_ptr () && { + return std::unique_ptr(LocalPointerBase::orphan()); + } +#endif /* U_HIDE_DRAFT_API */ }; /** @@ -494,16 +569,21 @@ class LocalArray : public LocalPointerBase { : LocalPointerBase(src.ptr) { \ src.ptr=NULL; \ } \ + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ + explicit LocalPointerClassName(std::unique_ptr &&p) \ + : LocalPointerBase(p.release()) {} \ ~LocalPointerClassName() { if (ptr != NULL) { closeFunction(ptr); } } \ LocalPointerClassName &operator=(LocalPointerClassName &&src) U_NOEXCEPT { \ - return moveFrom(src); \ - } \ - LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ if (ptr != NULL) { closeFunction(ptr); } \ LocalPointerBase::ptr=src.ptr; \ src.ptr=NULL; \ return *this; \ } \ + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ + LocalPointerClassName &operator=(std::unique_ptr &&p) { \ + adoptInstead(p.release()); \ + return *this; \ + } \ void swap(LocalPointerClassName &other) U_NOEXCEPT { \ Type *temp=LocalPointerBase::ptr; \ LocalPointerBase::ptr=other.ptr; \ @@ -516,6 +596,9 @@ class LocalArray : public LocalPointerBase { if (ptr != NULL) { closeFunction(ptr); } \ ptr=p; \ } \ + operator std::unique_ptr () && { \ + return std::unique_ptr(LocalPointerBase::orphan(), closeFunction); \ + } \ } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/locdspnm.h b/deps/icu-small/source/common/unicode/locdspnm.h index 7f227829b4cc00..f6e778356feced 100644 --- a/deps/icu-small/source/common/unicode/locdspnm.h +++ b/deps/icu-small/source/common/unicode/locdspnm.h @@ -49,7 +49,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @return a LocaleDisplayNames instance * @stable ICU 4.4 */ - static LocaleDisplayNames* U_EXPORT2 createInstance(const Locale& locale); + inline static LocaleDisplayNames* U_EXPORT2 createInstance(const Locale& locale); /** * Returns an instance of LocaleDisplayNames that returns names diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index 415bced82299e3..7350e381ffa540 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -340,7 +340,7 @@ class U_COMMON_API Locale : public UObject { * otherwise. * @stable ICU 2.0 */ - UBool operator!=(const Locale& other) const; + inline UBool operator!=(const Locale& other) const; /** * Clone this object. @@ -962,7 +962,7 @@ class U_COMMON_API Locale : public UObject { * @return FALSE if it is a real locale, TRUE if it is a bogus locale * @stable ICU 2.1 */ - UBool isBogus(void) const; + inline UBool isBogus(void) const; /** * Returns a list of all installed locales. diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index 50cc56db590cf8..c02c8169565738 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -90,21 +90,21 @@ class U_COMMON_API ParsePosition : public UObject { * Assignment operator * @stable ICU 2.0 */ - ParsePosition& operator=(const ParsePosition& copy); + inline ParsePosition& operator=(const ParsePosition& copy); /** * Equality operator. * @return TRUE if the two parse positions are equal, FALSE otherwise. * @stable ICU 2.0 */ - UBool operator==(const ParsePosition& that) const; + inline UBool operator==(const ParsePosition& that) const; /** * Equality operator. * @return TRUE if the two parse positions are not equal, FALSE otherwise. * @stable ICU 2.0 */ - UBool operator!=(const ParsePosition& that) const; + inline UBool operator!=(const ParsePosition& that) const; /** * Clone this object. @@ -126,14 +126,14 @@ class U_COMMON_API ParsePosition : public UObject { * @return the current index. * @stable ICU 2.0 */ - int32_t getIndex(void) const; + inline int32_t getIndex(void) const; /** * Set the current parse position. * @param index the new index. * @stable ICU 2.0 */ - void setIndex(int32_t index); + inline void setIndex(int32_t index); /** * Set the index at which a parse error occurred. Formatters @@ -142,14 +142,14 @@ class U_COMMON_API ParsePosition : public UObject { * set. * @stable ICU 2.0 */ - void setErrorIndex(int32_t ei); + inline void setErrorIndex(int32_t ei); /** * Retrieve the index at which an error occurred, or -1 if the * error index has not been set. * @stable ICU 2.0 */ - int32_t getErrorIndex(void) const; + inline int32_t getErrorIndex(void) const; /** * ICU "poor man's RTTI", returns a UClassID for this class. diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index 47abd554eaf0f1..365ae2d3d2ac75 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -107,7 +107,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * * If present, the special LanguageBreakEngine used for handling * characters that are in the dictionary set, but not handled by any - * LangugageBreakEngine. + * LanguageBreakEngine. * @internal (private) */ UnhandledEngine *fUnhandledBreakEngine; @@ -260,7 +260,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * @return TRUE if both BreakIterators are not same. * @stable ICU 2.0 */ - UBool operator!=(const BreakIterator& that) const; + inline UBool operator!=(const BreakIterator& that) const; /** * Returns a newly-constructed RuleBasedBreakIterator with the same diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 850949caaf5cda..3f7d93dc094a18 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -265,9 +265,38 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @stable ICU 57 */ UnicodeString getTextWithNoArguments() const { - return getTextWithNoArguments(compiledPattern.getBuffer(), compiledPattern.length()); + return getTextWithNoArguments( + compiledPattern.getBuffer(), + compiledPattern.length(), + nullptr, + 0); } +#ifndef U_HIDE_INTERNAL_API + /** + * Returns the pattern text with none of the arguments. + * Like formatting with all-empty string values. + * + * TODO(ICU-20406): Replace this with an Iterator interface. + * + * @param offsets offsets[i] receives the offset of where {i} was located + * before it was replaced by an empty string. + * For example, "a{0}b{1}" produces offset 1 for i=0 and 2 for i=1. + * Can be nullptr if offsetsLength==0. + * If there is no {i} in the pattern, then offsets[i] is set to -1. + * @param offsetsLength The length of the offsets array. + * + * @internal + */ + UnicodeString getTextWithNoArguments(int32_t *offsets, int32_t offsetsLength) const { + return getTextWithNoArguments( + compiledPattern.getBuffer(), + compiledPattern.length(), + offsets, + offsetsLength); + } +#endif // U_HIDE_INTERNAL_API + private: /** * Binary representation of the compiled pattern. @@ -285,7 +314,11 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { return compiledPatternLength == 0 ? 0 : compiledPattern[0]; } - static UnicodeString getTextWithNoArguments(const char16_t *compiledPattern, int32_t compiledPatternLength); + static UnicodeString getTextWithNoArguments( + const char16_t *compiledPattern, + int32_t compiledPatternLength, + int32_t *offsets, + int32_t offsetsLength); static UnicodeString &format( const char16_t *compiledPattern, int32_t compiledPatternLength, diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 9e180db53b665a..d70c964e38e5b8 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -60,7 +60,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "11.0" +#define U_UNICODE_VERSION "12.1" /** * \file @@ -1767,6 +1767,27 @@ enum UBlockCode { /** @stable ICU 62 */ UBLOCK_SOGDIAN = 291, /*[10F30]*/ + // New blocks in Unicode 12.0 + + /** @stable ICU 64 */ + UBLOCK_EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS = 292, /*[13430]*/ + /** @stable ICU 64 */ + UBLOCK_ELYMAIC = 293, /*[10FE0]*/ + /** @stable ICU 64 */ + UBLOCK_NANDINAGARI = 294, /*[119A0]*/ + /** @stable ICU 64 */ + UBLOCK_NYIAKENG_PUACHUE_HMONG = 295, /*[1E100]*/ + /** @stable ICU 64 */ + UBLOCK_OTTOMAN_SIYAQ_NUMBERS = 296, /*[1ED00]*/ + /** @stable ICU 64 */ + UBLOCK_SMALL_KANA_EXTENSION = 297, /*[1B130]*/ + /** @stable ICU 64 */ + UBLOCK_SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A = 298, /*[1FA70]*/ + /** @stable ICU 64 */ + UBLOCK_TAMIL_SUPPLEMENT = 299, /*[11FC0]*/ + /** @stable ICU 64 */ + UBLOCK_WANCHO = 300, /*[1E2C0]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -1774,7 +1795,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 292, + UBLOCK_COUNT = 301, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 3a7d2db9aa07c8..9c82d828125603 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -369,6 +369,18 @@ # define UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE UMSGPAT_APOS_DOUBLE_OPTIONAL #endif +/** + * \def UCONFIG_USE_WINDOWS_LCID_MAPPING_API + * On platforms where U_PLATFORM_HAS_WIN32_API is true, this switch determines + * if the Windows platform APIs are used for LCID<->Locale Name conversions. + * Otherwise, only the built-in ICU tables are used. + * + * @internal ICU 64 + */ +#ifndef UCONFIG_USE_WINDOWS_LCID_MAPPING_API +# define UCONFIG_USE_WINDOWS_LCID_MAPPING_API 1 +#endif + /* i18n library switches ---------------------------------------------------- */ /** diff --git a/deps/icu-small/source/common/unicode/ucurr.h b/deps/icu-small/source/common/unicode/ucurr.h index 1021adc83e7ee2..a1c6de80b772f7 100644 --- a/deps/icu-small/source/common/unicode/ucurr.h +++ b/deps/icu-small/source/common/unicode/ucurr.h @@ -103,20 +103,17 @@ typedef enum UCurrNameStyle { * currency, such as "US Dollar" for USD. * @stable ICU 2.6 */ - UCURR_LONG_NAME + UCURR_LONG_NAME, -#ifndef U_HIDE_DRAFT_API - , /** * Selector for getName() indicating the narrow currency symbol. * The narrow currency symbol is similar to the regular currency * symbol, but it always takes the shortest form: for example, * "$" instead of "US$" for USD in en-CA. * - * @draft ICU 61 + * @stable ICU 61 */ UCURR_NARROW_SYMBOL_NAME -#endif // U_HIDE_DRAFT_API } UCurrNameStyle; #if !UCONFIG_NO_SERVICE @@ -208,6 +205,13 @@ ucurr_getPluralName(const UChar* currency, * Returns the number of the number of fraction digits that should * be displayed for the given currency. * This is equivalent to ucurr_getDefaultFractionDigitsForUsage(currency,UCURR_USAGE_STANDARD,ec); + * + * Important: The number of fraction digits for a given currency is NOT + * guaranteed to be constant across versions of ICU or CLDR. For example, + * do NOT use this value as a mechanism for deciding the magnitude used + * to store currency values in a database. You should use this value for + * display purposes only. + * * @param currency null-terminated 3-letter ISO 4217 code * @param ec input-output error code * @return a non-negative number of fraction digits to be @@ -221,6 +225,13 @@ ucurr_getDefaultFractionDigits(const UChar* currency, /** * Returns the number of the number of fraction digits that should * be displayed for the given currency with usage. + * + * Important: The number of fraction digits for a given currency is NOT + * guaranteed to be constant across versions of ICU or CLDR. For example, + * do NOT use this value as a mechanism for deciding the magnitude used + * to store currency values in a database. You should use this value for + * display purposes only. + * * @param currency null-terminated 3-letter ISO 4217 code * @param usage enum usage for the currency * @param ec input-output error code diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index 2ab2695a8780d7..e5e7726d604a73 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -27,7 +27,6 @@ U_NAMESPACE_BEGIN // Forward Declarations. class BMPSet; -class CharacterProperties; class ParsePosition; class RBBIRuleScanner; class SymbolTable; @@ -276,14 +275,23 @@ class RuleCharacterIterator; * @stable ICU 2.0 */ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { +private: + /** + * Enough for sets with few ranges. + * For example, White_Space has 10 ranges, list length 21. + */ + static constexpr int32_t INITIAL_CAPACITY = 25; + // fFlags constant + static constexpr uint8_t kIsBogus = 1; // This set is bogus (i.e. not valid) + + UChar32* list = stackList; // MUST be terminated with HIGH + int32_t capacity = INITIAL_CAPACITY; // capacity of list + int32_t len = 1; // length of list used; 1 <= len <= capacity + uint8_t fFlags = 0; // Bit flag (see constants above) - int32_t len; // length of list used; 0 <= len <= capacity - int32_t capacity; // capacity of list - UChar32* list; // MUST be terminated with HIGH - BMPSet *bmpSet; // The set is frozen iff either bmpSet or stringSpan is not NULL. - UChar32* buffer; // internal buffer, may be NULL - int32_t bufferCapacity; // capacity of buffer - int32_t patLen; + BMPSet *bmpSet = nullptr; // The set is frozen iff either bmpSet or stringSpan is not NULL. + UChar32* buffer = nullptr; // internal buffer, may be NULL + int32_t bufferCapacity = 0; // capacity of buffer /** * The pattern representation of this set. This may not be the @@ -294,15 +302,19 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * indicating that toPattern() must generate a pattern * representation from the inversion list. */ - char16_t *pat; - UVector* strings; // maintained in sorted order - UnicodeSetStringSpan *stringSpan; + char16_t *pat = nullptr; + int32_t patLen = 0; + + UVector* strings = nullptr; // maintained in sorted order + UnicodeSetStringSpan *stringSpan = nullptr; + + /** + * Initial list array. + * Avoids some heap allocations, and list is never nullptr. + * Increases the object size a bit. + */ + UChar32 stackList[INITIAL_CAPACITY]; -private: - enum { // constants - kIsBogus = 1 // This set is bogus (i.e. not valid) - }; - uint8_t fFlags; // Bit flag (see constants above) public: /** * Determine if this object contains a valid set. @@ -478,7 +490,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * true if the specified set is not equal to this set. * @stable ICU 2.0 */ - UBool operator!=(const UnicodeSet& o) const; + inline UBool operator!=(const UnicodeSet& o) const; /** * Returns a copy of this object. All UnicodeFunctor objects have @@ -1480,8 +1492,6 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { friend class USetAccess; - int32_t getStringCount() const; - const UnicodeString* getString(int32_t index) const; //---------------------------------------------------------------- @@ -1528,13 +1538,18 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { // Implementation: Utility methods //---------------------------------------------------------------- - void ensureCapacity(int32_t newLen, UErrorCode& ec); + static int32_t nextCapacity(int32_t minCapacity); + + bool ensureCapacity(int32_t newLen); - void ensureBufferCapacity(int32_t newLen, UErrorCode& ec); + bool ensureBufferCapacity(int32_t newLen); void swapBuffers(void); UBool allocateStrings(UErrorCode &status); + UBool hasStrings() const; + int32_t stringsSize() const; + UBool stringsContains(const UnicodeString &s) const; UnicodeString& _toPattern(UnicodeString& result, UBool escapeUnprintable) const; @@ -1614,7 +1629,6 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { UnicodeString& rebuiltPat, UErrorCode& ec); - friend class CharacterProperties; static const UnicodeSet* getInclusions(int32_t src, UErrorCode &status); /** @@ -1646,7 +1660,10 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { /** * Set the new pattern to cache. */ - void setPattern(const UnicodeString& newPat); + void setPattern(const UnicodeString& newPat) { + setPattern(newPat.getBuffer(), newPat.length()); + } + void setPattern(const char16_t *newPat, int32_t newPatLen); /** * Release existing cached pattern. */ diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index bf954b5f1d8232..8fd144425e87c0 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -106,7 +106,7 @@ class UnicodeStringAppendable; // unicode/appendable.h * * The string parameter must be a C string literal. * The length of the string, not including the terminating - * NUL, must be specified as a constant. + * `NUL`, must be specified as a constant. * @stable ICU 2.0 */ #if !U_CHAR16_IS_TYPEDEF @@ -221,35 +221,35 @@ class UnicodeStringAppendable; // unicode/appendable.h * * The UnicodeString class is not suitable for subclassing. * - *

For an overview of Unicode strings in C and C++ see the - * User Guide Strings chapter.

+ * For an overview of Unicode strings in C and C++ see the + * [User Guide Strings chapter](http://userguide.icu-project.org/strings#TOC-Strings-in-C-C-). * - *

In ICU, a Unicode string consists of 16-bit Unicode code units. + * In ICU, a Unicode string consists of 16-bit Unicode *code units*. * A Unicode character may be stored with either one code unit * (the most common case) or with a matched pair of special code units * ("surrogates"). The data type for code units is char16_t. - * For single-character handling, a Unicode character code point is a value - * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.

+ * For single-character handling, a Unicode character code *point* is a value + * in the range 0..0x10ffff. ICU uses the UChar32 type for code points. * - *

Indexes and offsets into and lengths of strings always count code units, not code points. + * Indexes and offsets into and lengths of strings always count code units, not code points. * This is the same as with multi-byte char* strings in traditional string handling. * Operations on partial strings typically do not test for code point boundaries. * If necessary, the user needs to take care of such boundaries by testing for the code unit * values or by using functions like * UnicodeString::getChar32Start() and UnicodeString::getChar32Limit() - * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h).

+ * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h). * * UnicodeString methods are more lenient with regard to input parameter values * than other ICU APIs. In particular: * - If indexes are out of bounds for a UnicodeString object - * (<0 or >length()) then they are "pinned" to the nearest boundary. + * (< 0 or > length()) then they are "pinned" to the nearest boundary. * - If the buffer passed to an insert/append/replace operation is owned by the * target object, e.g., calling str.append(str), an extra copy may take place * to ensure safety. * - If primitive string pointer values (e.g., const char16_t * or char *) * for input strings are NULL, then those input string parameters are treated * as if they pointed to an empty string. - * However, this is not the case for char * parameters for charset names + * However, this is *not* the case for char * parameters for charset names * or other IDs. * - Most UnicodeString methods do not take a UErrorCode parameter because * there are usually very few opportunities for failure other than a shortage @@ -273,14 +273,14 @@ class UnicodeStringAppendable; // unicode/appendable.h * This includes the const UnicodeString & parameters for * copy construction, assignment, and cloning. * - *

UnicodeString uses several storage methods. + * UnicodeString uses several storage methods. * String contents can be stored inside the UnicodeString object itself, * in an allocated and shared buffer, or in an outside buffer that is "aliased". * Most of this is done transparently, but careful aliasing in particular provides * significant performance improvements. * Also, the internal buffer is accessible via special functions. * For details see the - * User Guide Strings chapter.

+ * [User Guide Strings chapter](http://userguide.icu-project.org/strings#TOC-Maximizing-Performance-with-the-UnicodeString-Storage-Model). * * @see utf.h * @see CharacterIterator @@ -315,7 +315,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Equality operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return TRUE if text contains the same characters as this one, + * @return TRUE if `text` contains the same characters as this one, * FALSE otherwise. * @stable ICU 2.0 */ @@ -324,7 +324,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Inequality operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return FALSE if text contains the same characters as this one, + * @return FALSE if `text` contains the same characters as this one, * TRUE otherwise. * @stable ICU 2.0 */ @@ -334,7 +334,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Greater than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * greater than the characters in text, FALSE otherwise + * greater than the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator> (const UnicodeString& text) const; @@ -343,7 +343,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Less than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * less than the characters in text, FALSE otherwise + * less than the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator< (const UnicodeString& text) const; @@ -352,7 +352,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Greater than or equal operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * greater than or equal to the characters in text, FALSE otherwise + * greater than or equal to the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator>= (const UnicodeString& text) const; @@ -361,37 +361,37 @@ class U_COMMON_API UnicodeString : public Replaceable * Less than or equal operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * less than or equal to the characters in text, FALSE otherwise + * less than or equal to the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator<= (const UnicodeString& text) const; /** * Compare the characters bitwise in this UnicodeString to - * the characters in text. + * the characters in `text`. * @param text The UnicodeString to compare to this one. * @return The result of bitwise character comparison: 0 if this - * contains the same characters as text, -1 if the characters in - * this are bitwise less than the characters in text, +1 if the + * contains the same characters as `text`, -1 if the characters in + * this are bitwise less than the characters in `text`, +1 if the * characters in this are bitwise greater than the characters - * in text. + * in `text`. * @stable ICU 2.0 */ inline int8_t compare(const UnicodeString& text) const; /** * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in the entire string text. + * [`start`, `start + length`) with the characters + * in the **entire string** `text`. * (The parameters "start" and "length" are not applied to the other text "text".) * @param start the offset at which the compare operation begins * @param length the number of characters of text to compare. * @param text the other text to be compared against this string. * @return The result of bitwise character comparison: 0 if this - * contains the same characters as text, -1 if the characters in - * this are bitwise less than the characters in text, +1 if the + * contains the same characters as `text`, -1 if the characters in + * this are bitwise less than the characters in `text`, +1 if the * characters in this are bitwise greater than the characters - * in text. + * in `text`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -400,19 +400,19 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcText in the range - * [srcStart, srcStart + srcLength). + * [`start`, `start + length`) with the characters + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`). * @param start the offset at which the compare operation begins * @param length the number of characters in this to compare. * @param srcText the text to be compared - * @param srcStart the offset into srcText to start comparison - * @param srcLength the number of characters in src to compare + * @param srcStart the offset into `srcText` to start comparison + * @param srcLength the number of characters in `src` to compare * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcText, -1 if the characters in - * this are bitwise less than the characters in srcText, +1 if the + * contains the same characters as `srcText`, -1 if the characters in + * this are bitwise less than the characters in `srcText`, +1 if the * characters in this are bitwise greater than the characters - * in srcText. + * in `srcText`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -423,14 +423,14 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in this UnicodeString with the first - * srcLength characters in srcChars. + * `srcLength` characters in `srcChars`. * @param srcChars The characters to compare to this UnicodeString. - * @param srcLength the number of characters in srcChars to compare + * @param srcLength the number of characters in `srcChars` to compare * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcChars, -1 if the characters in - * this are bitwise less than the characters in srcChars, +1 if the + * contains the same characters as `srcChars`, -1 if the characters in + * this are bitwise less than the characters in `srcChars`, +1 if the * characters in this are bitwise greater than the characters - * in srcChars. + * in `srcChars`. * @stable ICU 2.0 */ inline int8_t compare(ConstChar16Ptr srcChars, @@ -438,16 +438,16 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, start + length) with the first - * length characters in srcChars + * [`start`, `start + length`) with the first + * `length` characters in `srcChars` * @param start the offset at which the compare operation begins * @param length the number of characters to compare. * @param srcChars the characters to be compared * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcChars, -1 if the characters in - * this are bitwise less than the characters in srcChars, +1 if the + * contains the same characters as `srcChars`, -1 if the characters in + * this are bitwise less than the characters in `srcChars`, +1 if the * characters in this are bitwise greater than the characters - * in srcChars. + * in `srcChars`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -456,19 +456,19 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength). + * [`start`, `start + length`) with the characters + * in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`). * @param start the offset at which the compare operation begins * @param length the number of characters in this to compare * @param srcChars the characters to be compared - * @param srcStart the offset into srcChars to start comparison - * @param srcLength the number of characters in srcChars to compare + * @param srcStart the offset into `srcChars` to start comparison + * @param srcLength the number of characters in `srcChars` to compare * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcChars, -1 if the characters in - * this are bitwise less than the characters in srcChars, +1 if the + * contains the same characters as `srcChars`, -1 if the characters in + * this are bitwise less than the characters in `srcChars`, +1 if the * characters in this are bitwise greater than the characters - * in srcChars. + * in `srcChars`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -479,19 +479,19 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, limit) with the characters - * in srcText in the range - * [srcStart, srcLimit). + * [`start`, `limit`) with the characters + * in `srcText` in the range + * [`srcStart`, `srcLimit`). * @param start the offset at which the compare operation begins * @param limit the offset immediately following the compare operation * @param srcText the text to be compared - * @param srcStart the offset into srcText to start comparison - * @param srcLimit the offset into srcText to limit comparison + * @param srcStart the offset into `srcText` to start comparison + * @param srcLimit the offset into `srcText` to limit comparison * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcText, -1 if the characters in - * this are bitwise less than the characters in srcText, +1 if the + * contains the same characters as `srcText`, -1 if the characters in + * this are bitwise less than the characters in `srcText`, +1 if the * characters in this are bitwise greater than the characters - * in srcText. + * in `srcText`. * @stable ICU 2.0 */ inline int8_t compareBetween(int32_t start, @@ -848,21 +848,21 @@ class U_COMMON_API UnicodeString : public Replaceable uint32_t options) const; /** - * Determine if this starts with the characters in text + * Determine if this starts with the characters in `text` * @param text The text to match. - * @return TRUE if this starts with the characters in text, + * @return TRUE if this starts with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ inline UBool startsWith(const UnicodeString& text) const; /** - * Determine if this starts with the characters in srcText - * in the range [srcStart, srcStart + srcLength). + * Determine if this starts with the characters in `srcText` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcText The text to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcText to match - * @return TRUE if this starts with the characters in text, + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcText` to match + * @return TRUE if this starts with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ @@ -871,10 +871,10 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this starts with the characters in srcChars + * Determine if this starts with the characters in `srcChars` * @param srcChars The characters to match. - * @param srcLength the number of characters in srcChars - * @return TRUE if this starts with the characters in srcChars, + * @param srcLength the number of characters in `srcChars` + * @return TRUE if this starts with the characters in `srcChars`, * FALSE otherwise * @stable ICU 2.0 */ @@ -882,12 +882,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in `srcChars` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcChars The characters to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcChars to match - * @return TRUE if this ends with the characters in srcChars, FALSE otherwise + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcChars` to match + * @return TRUE if this ends with the characters in `srcChars`, FALSE otherwise * @stable ICU 2.0 */ inline UBool startsWith(const char16_t *srcChars, @@ -895,21 +895,21 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in text + * Determine if this ends with the characters in `text` * @param text The text to match. - * @return TRUE if this ends with the characters in text, + * @return TRUE if this ends with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ inline UBool endsWith(const UnicodeString& text) const; /** - * Determine if this ends with the characters in srcText - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in `srcText` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcText The text to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcText to match - * @return TRUE if this ends with the characters in text, + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcText` to match + * @return TRUE if this ends with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ @@ -918,10 +918,10 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars + * Determine if this ends with the characters in `srcChars` * @param srcChars The characters to match. - * @param srcLength the number of characters in srcChars - * @return TRUE if this ends with the characters in srcChars, + * @param srcLength the number of characters in `srcChars` + * @return TRUE if this ends with the characters in `srcChars`, * FALSE otherwise * @stable ICU 2.0 */ @@ -929,12 +929,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in `srcChars` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcChars The characters to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcChars to match - * @return TRUE if this ends with the characters in srcChars, + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcChars` to match + * @return TRUE if this ends with the characters in `srcChars`, * FALSE otherwise * @stable ICU 2.0 */ @@ -946,21 +946,21 @@ class U_COMMON_API UnicodeString : public Replaceable /* Searching - bitwise only */ /** - * Locate in this the first occurrence of the characters in text, + * Locate in this the first occurrence of the characters in `text`, * using bitwise comparison. * @param text The text to search for. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(const UnicodeString& text) const; /** - * Locate in this the first occurrence of the characters in text - * starting at offset start, using bitwise comparison. + * Locate in this the first occurrence of the characters in `text` + * starting at offset `start`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -969,12 +969,12 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in text, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `text`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -984,17 +984,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcText in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcText The text to search for. - * @param srcStart the offset into srcText at which + * @param srcStart the offset into `srcText` at which * to start matching - * @param srcLength the number of characters in srcText to match + * @param srcLength the number of characters in `srcText` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1006,12 +1006,12 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence of the characters in - * srcChars - * starting at offset start, using bitwise comparison. + * `srcChars` + * starting at offset `start`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1021,13 +1021,13 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcChars, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `srcChars`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of srcChars, + * @return The offset into this of the start of `srcChars`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1038,17 +1038,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcChars The text to search for. - * @param srcStart the offset into srcChars at which + * @param srcStart the offset into `srcChars` at which * to start matching - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1059,55 +1059,55 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the first occurrence of the BMP code point c, + * Locate in this the first occurrence of the BMP code point `c`, * using bitwise comparison. * @param c The code unit to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(char16_t c) const; /** - * Locate in this the first occurrence of the code point c, + * Locate in this the first occurrence of the code point `c`, * using bitwise comparison. * * @param c The code point to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(UChar32 c) const; /** - * Locate in this the first occurrence of the BMP code point c, - * starting at offset start, using bitwise comparison. + * Locate in this the first occurrence of the BMP code point `c`, + * starting at offset `start`, using bitwise comparison. * @param c The code unit to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(char16_t c, int32_t start) const; /** - * Locate in this the first occurrence of the code point c - * starting at offset start, using bitwise comparison. + * Locate in this the first occurrence of the code point `c` + * starting at offset `start`, using bitwise comparison. * * @param c The code point to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(UChar32 c, int32_t start) const; /** - * Locate in this the first occurrence of the BMP code point c - * in the range [start, start + length), + * Locate in this the first occurrence of the BMP code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * @param c The code unit to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(char16_t c, @@ -1115,14 +1115,14 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the first occurrence of the code point c - * in the range [start, start + length), + * Locate in this the first occurrence of the code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * * @param c The code point to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(UChar32 c, @@ -1130,21 +1130,21 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the characters in text, + * Locate in this the last occurrence of the characters in `text`, * using bitwise comparison. * @param text The text to search for. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(const UnicodeString& text) const; /** - * Locate in this the last occurrence of the characters in text - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the characters in `text` + * starting at offset `start`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1153,12 +1153,12 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in text, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `text`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1168,17 +1168,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcText in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcText The text to search for. - * @param srcStart the offset into srcText at which + * @param srcStart the offset into `srcText` at which * to start matching - * @param srcLength the number of characters in srcText to match + * @param srcLength the number of characters in `srcText` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1189,12 +1189,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the characters in srcChars - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the characters in `srcChars` + * starting at offset `start`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1204,13 +1204,13 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcChars, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `srcChars`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of srcChars, + * @return The offset into this of the start of `srcChars`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1221,17 +1221,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcChars The text to search for. - * @param srcStart the offset into srcChars at which + * @param srcStart the offset into `srcChars` at which * to start matching - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1242,55 +1242,55 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the BMP code point c, + * Locate in this the last occurrence of the BMP code point `c`, * using bitwise comparison. * @param c The code unit to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(char16_t c) const; /** - * Locate in this the last occurrence of the code point c, + * Locate in this the last occurrence of the code point `c`, * using bitwise comparison. * * @param c The code point to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(UChar32 c) const; /** - * Locate in this the last occurrence of the BMP code point c - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the BMP code point `c` + * starting at offset `start`, using bitwise comparison. * @param c The code unit to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(char16_t c, int32_t start) const; /** - * Locate in this the last occurrence of the code point c - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the code point `c` + * starting at offset `start`, using bitwise comparison. * * @param c The code point to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(UChar32 c, int32_t start) const; /** - * Locate in this the last occurrence of the BMP code point c - * in the range [start, start + length), + * Locate in this the last occurrence of the BMP code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * @param c The code unit to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(char16_t c, @@ -1298,14 +1298,14 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the code point c - * in the range [start, start + length), + * Locate in this the last occurrence of the code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * * @param c The code point to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(UChar32 c, @@ -1316,32 +1316,32 @@ class U_COMMON_API UnicodeString : public Replaceable /* Character access */ /** - * Return the code unit at offset offset. + * Return the code unit at offset `offset`. * If the offset is not valid (0..length()-1) then U+ffff is returned. * @param offset a valid offset into the text - * @return the code unit at offset offset + * @return the code unit at offset `offset` * or 0xffff if the offset is not valid for this string * @stable ICU 2.0 */ inline char16_t charAt(int32_t offset) const; /** - * Return the code unit at offset offset. + * Return the code unit at offset `offset`. * If the offset is not valid (0..length()-1) then U+ffff is returned. * @param offset a valid offset into the text - * @return the code unit at offset offset + * @return the code unit at offset `offset` * @stable ICU 2.0 */ inline char16_t operator[] (int32_t offset) const; /** * Return the code point that contains the code unit - * at offset offset. + * at offset `offset`. * If the offset is not valid (0..length()-1) then U+ffff is returned. * @param offset a valid offset into the text * that indicates the text offset of any of the code units * that will be assembled into a code point (21-bit value) and returned - * @return the code point of text at offset + * @return the code point of text at `offset` * or 0xffff if the offset is not valid for this string * @stable ICU 2.0 */ @@ -1398,33 +1398,33 @@ class U_COMMON_API UnicodeString : public Replaceable * This behaves like CharacterIterator::move32(delta, kCurrent). * * Behavior for out-of-bounds indexes: - * moveIndex32 pins the input index to 0..length(), i.e., + * `moveIndex32` pins the input index to 0..length(), i.e., * if the input index<0 then it is pinned to 0; * if it is index>length() then it is pinned to length(). - * Afterwards, the index is moved by delta code points + * Afterwards, the index is moved by `delta` code points * forward or backward, * but no further backward than to 0 and no further forward than to length(). * The resulting index return value will be in between 0 and length(), inclusively. * * Examples: - *
-   * // s has code points 'a' U+10000 'b' U+10ffff U+2029
-   * UnicodeString s=UNICODE_STRING("a\\U00010000b\\U0010ffff\\u2029", 31).unescape();
+   * \code
+   *     // s has code points 'a' U+10000 'b' U+10ffff U+2029
+   *     UnicodeString s(u"a\U00010000b\U0010ffff\u2029");
    *
-   * // initial index: position of U+10000
-   * int32_t index=1;
+   *     // initial index: position of U+10000
+   *     int32_t index=1;
    *
-   * // the following examples will all result in index==4, position of U+10ffff
+   *     // the following examples will all result in index==4, position of U+10ffff
    *
-   * // skip 2 code points from some position in the string
-   * index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
+   *     // skip 2 code points from some position in the string
+   *     index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
    *
-   * // go to the 3rd code point from the start of s (0-based)
-   * index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
+   *     // go to the 3rd code point from the start of s (0-based)
+   *     index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
    *
-   * // go to the next-to-last code point of s
-   * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff
-   * 
+ * // go to the next-to-last code point of s + * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff + * \endcode * * @param index input code unit index * @param delta (signed) code point count to move the index forward or backward @@ -1438,16 +1438,16 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into the array dst, - * beginning at dstStart. - * If the string aliases to dst itself as an external buffer, + * [`start`, `start + length`) into the array `dst`, + * beginning at `dstStart`. + * If the string aliases to `dst` itself as an external buffer, * then extract() will not copy the contents. * * @param start offset of first character which will be copied into the array * @param length the number of characters to extract - * @param dst array in which to copy characters. The length of dst - * must be at least (dstStart + length). - * @param dstStart the offset in dst where the first character + * @param dst array in which to copy characters. The length of `dst` + * must be at least (`dstStart + length`). + * @param dstStart the offset in `dst` where the first character * will be extracted * @stable ICU 2.0 */ @@ -1468,7 +1468,7 @@ class U_COMMON_API UnicodeString : public Replaceable * If the string itself does not fit into dest * (length()>destCapacity) then the error code is set to U_BUFFER_OVERFLOW_ERROR. * - * If the string aliases to dest itself as an external buffer, + * If the string aliases to `dest` itself as an external buffer, * then extract() will not copy the contents. * * @param dest Destination string buffer. @@ -1483,12 +1483,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into the UnicodeString - * target. + * [`start`, `start + length`) into the UnicodeString + * `target`. * @param start offset of first character which will be copied * @param length the number of characters to extract * @param target UnicodeString into which to copy characters. - * @return A reference to target * @stable ICU 2.0 */ inline void extract(int32_t start, @@ -1496,13 +1495,13 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString& target) const; /** - * Copy the characters in the range [start, limit) - * into the array dst, beginning at dstStart. + * Copy the characters in the range [`start`, `limit`) + * into the array `dst`, beginning at `dstStart`. * @param start offset of first character which will be copied into the array * @param limit offset immediately following the last character to be copied - * @param dst array in which to copy characters. The length of dst - * must be at least (dstStart + (limit - start)). - * @param dstStart the offset in dst where the first character + * @param dst array in which to copy characters. The length of `dst` + * must be at least (`dstStart + (limit - start)`). + * @param dstStart the offset in `dst` where the first character * will be extracted * @stable ICU 2.0 */ @@ -1512,12 +1511,11 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t dstStart = 0) const; /** - * Copy the characters in the range [start, limit) - * into the UnicodeString target. Replaceable API. + * Copy the characters in the range [`start`, `limit`) + * into the UnicodeString `target`. Replaceable API. * @param start offset of first character which will be copied * @param limit offset immediately following the last character to be copied * @param target UnicodeString into which to copy characters. - * @return A reference to target * @stable ICU 2.0 */ virtual void extractBetween(int32_t start, @@ -1526,11 +1524,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + startLength) into an array of characters. + * [`start`, `start + startLength`) into an array of characters. * All characters must be invariant (see utypes.h). * Use US_INV as the last, signature-distinguishing parameter. * - * This function does not write any more than targetCapacity + * This function does not write any more than `targetCapacity` * characters but returns the length of the entire output string * so that one can allocate a larger buffer and call the function again * if necessary. @@ -1555,9 +1553,9 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into an array of characters + * [`start`, `start + length`) into an array of characters * in the platform's default codepage. - * This function does not write any more than targetLength + * This function does not write any more than `targetLength` * characters but returns the length of the entire output string * so that one can allocate a larger buffer and call the function again * if necessary. @@ -1567,8 +1565,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @param startLength the number of characters to extract * @param target the target buffer for extraction * @param targetLength the length of the target buffer - * If target is NULL, then the number of bytes required for - * target is returned. + * If `target` is NULL, then the number of bytes required for + * `target` is returned. * @return the output string length, not including the terminating NUL * @stable ICU 2.0 */ @@ -1583,7 +1581,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into an array of characters + * [`start`, `start + length`) into an array of characters * in a specified codepage. * The output string is NUL-terminated. * @@ -1597,11 +1595,11 @@ class U_COMMON_API UnicodeString : public Replaceable * @param target the target buffer for extraction * @param codepage the desired codepage for the characters. 0 has * the special meaning of the default codepage - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. - * If target is NULL, then the number of bytes required for - * target is returned. It is assumed that the target is big enough + * If `target` is NULL, then the number of bytes required for + * `target` is returned. It is assumed that the target is big enough * to fit all of the characters. * @return the output string length, not including the terminating NUL * @stable ICU 2.0 @@ -1613,9 +1611,9 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into an array of characters + * [`start`, `start + length`) into an array of characters * in a specified codepage. - * This function does not write any more than targetLength + * This function does not write any more than `targetLength` * characters but returns the length of the entire output string * so that one can allocate a larger buffer and call the function again * if necessary. @@ -1632,11 +1630,11 @@ class U_COMMON_API UnicodeString : public Replaceable * @param targetLength the length of the target buffer * @param codepage the desired codepage for the characters. 0 has * the special meaning of the default codepage - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. - * If target is NULL, then the number of bytes required for - * target is returned. + * If `target` is NULL, then the number of bytes required for + * `target` is returned. * @return the output string length, not including the terminating NUL * @stable ICU 2.0 */ @@ -1849,7 +1847,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Assignment operator. Replace the characters in this UnicodeString - * with the characters from srcText. + * with the characters from `srcText`. * * Starting with ICU 2.4, the assignment operator and the copy constructor * allocate a new buffer and copy the buffer contents even for readonly aliases. @@ -1870,7 +1868,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Almost the same as the assignment operator. * Replace the characters in this UnicodeString - * with the characters from srcText. + * with the characters from `srcText`. * * This function works the same as the assignment operator * for all strings except for ones that are readonly aliases. @@ -1902,22 +1900,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return *this * @stable ICU 56 */ - UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT { - return moveFrom(src); - } - - // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API - /** - * Move assignment; might leave src in bogus state. - * This string will have the same contents and state that the source string had. - * The behavior is undefined if *this and src are the same object. - * - * Can be called explicitly, does not need C++11 support. - * @param src source string - * @return *this - * @draft ICU 56 - */ - UnicodeString &moveFrom(UnicodeString &src) U_NOEXCEPT; + UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT; /** * Swap strings. @@ -1932,14 +1915,14 @@ class U_COMMON_API UnicodeString : public Replaceable * @param s2 will get s1's contents and state * @stable ICU 56 */ - friend U_COMMON_API inline void U_EXPORT2 + friend inline void U_EXPORT2 swap(UnicodeString &s1, UnicodeString &s2) U_NOEXCEPT { s1.swap(s2); } /** * Assignment operator. Replace the characters in this UnicodeString - * with the code unit ch. + * with the code unit `ch`. * @param ch the code unit to replace * @return a reference to this * @stable ICU 2.0 @@ -1948,7 +1931,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Assignment operator. Replace the characters in this UnicodeString - * with the code point ch. + * with the code point `ch`. * @param ch the code point to replace * @return a reference to this * @stable ICU 2.0 @@ -1957,11 +1940,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the text in the UnicodeString object to the characters - * in srcText in the range - * [srcStart, srcText.length()). - * srcText is not modified. + * in `srcText` in the range + * [`srcStart`, `srcText.length()`). + * `srcText` is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained * @return a reference to this * @stable ICU 2.2 @@ -1971,13 +1954,13 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the text in the UnicodeString object to the characters - * in srcText in the range - * [srcStart, srcStart + srcLength). - * srcText is not modified. + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`). + * `srcText` is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in the + * @param srcLength the number of characters in `srcText` in the * replace string. * @return a reference to this * @stable ICU 2.0 @@ -1988,8 +1971,8 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the text in the UnicodeString object to the characters in - * srcText. - * srcText is not modified. + * `srcText`. + * `srcText` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 @@ -1998,7 +1981,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the characters in the UnicodeString object to the characters - * in srcChars. srcChars is not modified. + * in `srcChars`. `srcChars` is not modified. * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars. * @return a reference to this @@ -2009,23 +1992,23 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the characters in the UnicodeString object to the code unit - * srcChar. + * `srcChar`. * @param srcChar the code unit which becomes the UnicodeString's character * content * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& setTo(char16_t srcChar); + inline UnicodeString& setTo(char16_t srcChar); /** * Set the characters in the UnicodeString object to the code point - * srcChar. + * `srcChar`. * @param srcChar the code point which becomes the UnicodeString's character * content * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& setTo(UChar32 srcChar); + inline UnicodeString& setTo(UChar32 srcChar); /** * Aliasing setTo() function, analogous to the readonly-aliasing char16_t* constructor. @@ -2041,12 +2024,12 @@ class U_COMMON_API UnicodeString : public Replaceable * When using fastCopyFrom(), the text will be aliased again, * so that both strings then alias the same readonly-text. * - * @param isTerminated specifies if text is NUL-terminated. - * This must be true if textLength==-1. + * @param isTerminated specifies if `text` is `NUL`-terminated. + * This must be true if `textLength==-1`. * @param text The characters to alias for the UnicodeString. - * @param textLength The number of Unicode characters in text to alias. + * @param textLength The number of Unicode characters in `text` to alias. * If -1, then this constructor will determine the length - * by calling u_strlen(). + * by calling `u_strlen()`. * @return a reference to this * @stable ICU 2.0 */ @@ -2068,8 +2051,8 @@ class U_COMMON_API UnicodeString : public Replaceable * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. - * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in char16_ts. + * @param buffLength The number of Unicode characters in `buffer` to alias. + * @param buffCapacity The size of `buffer` in char16_ts. * @return a reference to this * @stable ICU 2.0 */ @@ -2133,7 +2116,7 @@ class U_COMMON_API UnicodeString : public Replaceable /* Append operations */ /** - * Append operator. Append the code unit ch to the UnicodeString + * Append operator. Append the code unit `ch` to the UnicodeString * object. * @param ch the code unit to be appended * @return a reference to this @@ -2142,7 +2125,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& operator+= (char16_t ch); /** - * Append operator. Append the code point ch to the UnicodeString + * Append operator. Append the code point `ch` to the UnicodeString * object. * @param ch the code point to be appended * @return a reference to this @@ -2151,8 +2134,8 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& operator+= (UChar32 ch); /** - * Append operator. Append the characters in srcText to the - * UnicodeString object. srcText is not modified. + * Append operator. Append the characters in `srcText` to the + * UnicodeString object. `srcText` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 @@ -2161,14 +2144,14 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Append the characters - * in srcText in the range - * [srcStart, srcStart + srcLength) to the - * UnicodeString object at offset start. srcText + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`) to the + * UnicodeString object at offset `start`. `srcText` * is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in `srcText` in * the append string * @return a reference to this * @stable ICU 2.0 @@ -2178,8 +2161,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the characters in srcText to the UnicodeString object. - * srcText is not modified. + * Append the characters in `srcText` to the UnicodeString object. + * `srcText` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 @@ -2187,15 +2170,15 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& append(const UnicodeString& srcText); /** - * Append the characters in srcChars in the range - * [srcStart, srcStart + srcLength) to the UnicodeString + * Append the characters in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`) to the UnicodeString * object at offset - * start. srcChars is not modified. + * `start`. `srcChars` is not modified. * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained - * @param srcLength the number of characters in srcChars in - * the append string; can be -1 if srcChars is NUL-terminated + * @param srcLength the number of characters in `srcChars` in + * the append string; can be -1 if `srcChars` is NUL-terminated * @return a reference to this * @stable ICU 2.0 */ @@ -2204,11 +2187,11 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the characters in srcChars to the UnicodeString object - * at offset start. srcChars is not modified. + * Append the characters in `srcChars` to the UnicodeString object + * at offset `start`. `srcChars` is not modified. * @param srcChars the source for the new characters - * @param srcLength the number of Unicode characters in srcChars; - * can be -1 if srcChars is NUL-terminated + * @param srcLength the number of Unicode characters in `srcChars`; + * can be -1 if `srcChars` is NUL-terminated * @return a reference to this * @stable ICU 2.0 */ @@ -2216,7 +2199,7 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the code unit srcChar to the UnicodeString object. + * Append the code unit `srcChar` to the UnicodeString object. * @param srcChar the code unit to append * @return a reference to this * @stable ICU 2.0 @@ -2224,7 +2207,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& append(char16_t srcChar); /** - * Append the code point srcChar to the UnicodeString object. + * Append the code point `srcChar` to the UnicodeString object. * @param srcChar the code point to append * @return a reference to this * @stable ICU 2.0 @@ -2235,14 +2218,14 @@ class U_COMMON_API UnicodeString : public Replaceable /* Insert operations */ /** - * Insert the characters in srcText in the range - * [srcStart, srcStart + srcLength) into the UnicodeString - * object at offset start. srcText is not modified. + * Insert the characters in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`) into the UnicodeString + * object at offset `start`. `srcText` is not modified. * @param start the offset where the insertion begins * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in `srcText` in * the insert string * @return a reference to this * @stable ICU 2.0 @@ -2253,8 +2236,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Insert the characters in srcText into the UnicodeString object - * at offset start. srcText is not modified. + * Insert the characters in `srcText` into the UnicodeString object + * at offset `start`. `srcText` is not modified. * @param start the offset where the insertion begins * @param srcText the source for the new characters * @return a reference to this @@ -2264,14 +2247,14 @@ class U_COMMON_API UnicodeString : public Replaceable const UnicodeString& srcText); /** - * Insert the characters in srcChars in the range - * [srcStart, srcStart + srcLength) into the UnicodeString - * object at offset start. srcChars is not modified. + * Insert the characters in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`) into the UnicodeString + * object at offset `start`. `srcChars` is not modified. * @param start the offset at which the insertion begins * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * in the insert string * @return a reference to this * @stable ICU 2.0 @@ -2282,8 +2265,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Insert the characters in srcChars into the UnicodeString object - * at offset start. srcChars is not modified. + * Insert the characters in `srcChars` into the UnicodeString object + * at offset `start`. `srcChars` is not modified. * @param start the offset where the insertion begins * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars. @@ -2295,8 +2278,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Insert the code unit srcChar into the UnicodeString object at - * offset start. + * Insert the code unit `srcChar` into the UnicodeString object at + * offset `start`. * @param start the offset at which the insertion occurs * @param srcChar the code unit to insert * @return a reference to this @@ -2306,8 +2289,8 @@ class U_COMMON_API UnicodeString : public Replaceable char16_t srcChar); /** - * Insert the code point srcChar into the UnicodeString object at - * offset start. + * Insert the code point `srcChar` into the UnicodeString object at + * offset `start`. * @param start the offset at which the insertion occurs * @param srcChar the code point to insert * @return a reference to this @@ -2321,22 +2304,22 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the characters in - * srcText in the range - * [srcStart, srcStart + srcLength). - * srcText is not modified. + * [`start`, `start + length`) with the characters in + * `srcText` in the range + * [`srcStart`, `srcStart + srcLength`). + * `srcText` is not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in `srcText` in * the replace string * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, + inline UnicodeString& replace(int32_t start, int32_t length, const UnicodeString& srcText, int32_t srcStart, @@ -2344,38 +2327,38 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) - * with the characters in srcText. srcText is + * [`start`, `start + length`) + * with the characters in `srcText`. `srcText` is * not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, + inline UnicodeString& replace(int32_t start, int32_t length, const UnicodeString& srcText); /** * Replace the characters in the range - * [start, start + length) with the characters in - * srcChars in the range - * [srcStart, srcStart + srcLength). srcChars + * [`start`, `start + length`) with the characters in + * `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`). `srcChars` * is not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * in the replace string * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, + inline UnicodeString& replace(int32_t start, int32_t length, const char16_t *srcChars, int32_t srcStart, @@ -2383,11 +2366,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the characters in - * srcChars. srcChars is not modified. + * [`start`, `start + length`) with the characters in + * `srcChars`. `srcChars` is not modified. * @param start the offset at which the replace operation begins * @param length number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars * @return a reference to this @@ -2400,11 +2383,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the code unit - * srcChar. + * [`start`, `start + length`) with the code unit + * `srcChar`. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChar the new code unit * @return a reference to this * @stable ICU 2.0 @@ -2415,11 +2398,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the code point - * srcChar. + * [`start`, `start + length`) with the code point + * `srcChar`. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChar the new code point * @return a reference to this * @stable ICU 2.0 @@ -2427,8 +2410,8 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString& replace(int32_t start, int32_t length, UChar32 srcChar); /** - * Replace the characters in the range [start, limit) - * with the characters in srcText. srcText is not modified. + * Replace the characters in the range [`start`, `limit`) + * with the characters in `srcText`. `srcText` is not modified. * @param start the offset at which the replace operation begins * @param limit the offset immediately following the replace range * @param srcText the source for the new characters @@ -2440,16 +2423,16 @@ class U_COMMON_API UnicodeString : public Replaceable const UnicodeString& srcText); /** - * Replace the characters in the range [start, limit) - * with the characters in srcText in the range - * [srcStart, srcLimit). srcText is not modified. + * Replace the characters in the range [`start`, `limit`) + * with the characters in `srcText` in the range + * [`srcStart`, `srcLimit`). `srcText` is not modified. * @param start the offset at which the replace operation begins * @param limit the offset immediately following the replace range * @param srcText the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained * @param srcLimit the offset immediately following the range to copy - * in srcText + * in `srcText` * @return a reference to this * @stable ICU 2.0 */ @@ -2461,12 +2444,9 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace a substring of this object with the given text. - * @param start the beginning index, inclusive; 0 <= start - * <= limit. - * @param limit the ending index, exclusive; start <= limit - * <= length(). - * @param text the text to replace characters start - * to limit - 1 + * @param start the beginning index, inclusive; `0 <= start <= limit`. + * @param limit the ending index, exclusive; `start <= limit <= length()`. + * @param text the text to replace characters `start` to `limit - 1` * @stable ICU 2.0 */ virtual void handleReplaceBetween(int32_t start, @@ -2485,14 +2465,12 @@ class U_COMMON_API UnicodeString : public Replaceable * information. This method is used to duplicate or reorder substrings. * The destination index must not overlap the source range. * - * @param start the beginning index, inclusive; 0 <= start <= - * limit. - * @param limit the ending index, exclusive; start <= limit <= - * length(). + * @param start the beginning index, inclusive; `0 <= start <= limit`. + * @param limit the ending index, exclusive; `start <= limit <= length()`. * @param dest the destination index. The characters from - * start..limit-1 will be copied to dest. - * Implementations of this method may assume that dest <= start || - * dest >= limit. + * `start..limit-1` will be copied to `dest`. + * Implementations of this method may assume that `dest <= start || + * dest >= limit`. * @stable ICU 2.0 */ virtual void copy(int32_t start, int32_t limit, int32_t dest); @@ -2513,7 +2491,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace all occurrences of characters in oldText with characters * in newText - * in the range [start, start + length). + * in the range [`start`, `start + length`). * @param start the start of the range in which replace will performed * @param length the length of the range in which replace will be performed * @param oldText the text containing the search text @@ -2528,18 +2506,18 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace all occurrences of characters in oldText in the range - * [oldStart, oldStart + oldLength) with the characters + * [`oldStart`, `oldStart + oldLength`) with the characters * in newText in the range - * [newStart, newStart + newLength) - * in the range [start, start + length). + * [`newStart`, `newStart + newLength`) + * in the range [`start`, `start + length`). * @param start the start of the range in which replace will performed * @param length the length of the range in which replace will be performed * @param oldText the text containing the search text - * @param oldStart the start of the search range in oldText - * @param oldLength the length of the search range in oldText + * @param oldStart the start of the search range in `oldText` + * @param oldLength the length of the search range in `oldText` * @param newText the text containing the replacement text - * @param newStart the start of the replacement range in newText - * @param newLength the length of the replacement range in newText + * @param newStart the start of the replacement range in `newText` + * @param newLength the length of the replacement range in `newText` * @return a reference to this * @stable ICU 2.0 */ @@ -2564,7 +2542,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Remove the characters in the range - * [start, start + length) from the UnicodeString object. + * [`start`, `start + length`) from the UnicodeString object. * @param start the offset of the first character to remove * @param length the number of characters to remove * @return a reference to this @@ -2575,7 +2553,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Remove the characters in the range - * [start, limit) from the UnicodeString object. + * [`start`, `limit`) from the UnicodeString object. * @param start the offset of the first character to remove * @param limit the offset immediately following the range to remove * @return a reference to this @@ -2586,8 +2564,8 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Retain only the characters in the range - * [start, limit) from the UnicodeString object. - * Removes characters before start and at and after limit. + * [`start`, `limit`) from the UnicodeString object. + * Removes characters before `start` and at and after `limit`. * @param start the offset of the first character to retain * @param limit the offset immediately following the range to retain * @return a reference to this @@ -2598,7 +2576,7 @@ class U_COMMON_API UnicodeString : public Replaceable /* Length operations */ /** - * Pad the start of this UnicodeString with the character padChar. + * Pad the start of this UnicodeString with the character `padChar`. * If the length of this UnicodeString is less than targetLength, * length() - targetLength copies of padChar will be added to the * beginning of this UnicodeString. @@ -2612,7 +2590,7 @@ class U_COMMON_API UnicodeString : public Replaceable char16_t padChar = 0x0020); /** - * Pad the end of this UnicodeString with the character padChar. + * Pad the end of this UnicodeString with the character `padChar`. * If the length of this UnicodeString is less than targetLength, * length() - targetLength copies of padChar will be added to the * end of this UnicodeString. @@ -2626,7 +2604,7 @@ class U_COMMON_API UnicodeString : public Replaceable char16_t padChar = 0x0020); /** - * Truncate this UnicodeString to the targetLength. + * Truncate this UnicodeString to the `targetLength`. * @param targetLength the desired length of this UnicodeString. * @return TRUE if the text was truncated, FALSE otherwise * @stable ICU 2.0 @@ -2651,7 +2629,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& reverse(void); /** - * Reverse the range [start, start + length) in + * Reverse the range [`start`, `start + length`) in * this UnicodeString. * @param start the start of the range to reverse * @param length the number of characters to to reverse @@ -2836,7 +2814,7 @@ class U_COMMON_API UnicodeString : public Replaceable * If the length() was greater than minCapacity, then any contents after minCapacity * may be lost. * The buffer contents is not NUL-terminated by getBuffer(). - * If length()(s.length(). + * `(s.length() < s.getCapacity() && buffer[s.length()]==0)`. * (See getTerminatedBuffer().) * * The buffer may reside in read-only memory. Its contents must not @@ -2952,7 +2930,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString(); /** - * Construct a UnicodeString with capacity to hold capacity char16_ts + * Construct a UnicodeString with capacity to hold `capacity` char16_ts * @param capacity the number of char16_ts this UnicodeString should hold * before a resize is necessary; if count is greater than 0 and count * code points c take up more space than capacity, then capacity is adjusted @@ -2968,7 +2946,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Single char16_t (code unit) constructor. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_CHAR_EXPLICIT=explicit + * `-DUNISTR_FROM_CHAR_EXPLICIT=explicit` * on the compiler command line or similar. * @param ch the character to place in the UnicodeString * @stable ICU 2.0 @@ -2979,7 +2957,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Single UChar32 (code point) constructor. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_CHAR_EXPLICIT=explicit + * `-DUNISTR_FROM_CHAR_EXPLICIT=explicit` * on the compiler command line or similar. * @param ch the character to place in the UnicodeString * @stable ICU 2.0 @@ -2990,9 +2968,9 @@ class U_COMMON_API UnicodeString : public Replaceable * char16_t* constructor. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. - * @param text The characters to place in the UnicodeString. text + * @param text The characters to place in the UnicodeString. `text` * must be NULL (U+0000) terminated. * @stable ICU 2.0 */ @@ -3004,7 +2982,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Delegates to UnicodeString(const char16_t *). * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param text NUL-terminated UTF-16 string * @stable ICU 59 @@ -3020,7 +2998,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Delegates to UnicodeString(const char16_t *). * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param text NUL-terminated UTF-16 string * @stable ICU 59 @@ -3034,7 +3012,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Effectively the same as the default constructor, makes an empty string object. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param text nullptr * @stable ICU 59 @@ -3044,7 +3022,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char16_t* constructor. * @param text The characters to place in the UnicodeString. - * @param textLength The number of Unicode characters in text + * @param textLength The number of Unicode characters in `text` * to copy. * @stable ICU 2.0 */ @@ -3099,12 +3077,12 @@ class U_COMMON_API UnicodeString : public Replaceable * When using fastCopyFrom(), the text will be aliased again, * so that both strings then alias the same readonly-text. * - * @param isTerminated specifies if text is NUL-terminated. - * This must be true if textLength==-1. + * @param isTerminated specifies if `text` is `NUL`-terminated. + * This must be true if `textLength==-1`. * @param text The characters to alias for the UnicodeString. - * @param textLength The number of Unicode characters in text to alias. + * @param textLength The number of Unicode characters in `text` to alias. * If -1, then this constructor will determine the length - * by calling u_strlen(). + * by calling `u_strlen()`. * @stable ICU 2.0 */ UnicodeString(UBool isTerminated, @@ -3125,8 +3103,8 @@ class U_COMMON_API UnicodeString : public Replaceable * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. - * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in char16_ts. + * @param buffLength The number of Unicode characters in `buffer` to alias. + * @param buffCapacity The size of `buffer` in char16_ts. * @stable ICU 2.0 */ UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); @@ -3181,7 +3159,7 @@ class U_COMMON_API UnicodeString : public Replaceable * UNICODE_STRING_SIMPLE. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param codepageData an array of bytes, null-terminated, * in the platform's default codepage. @@ -3196,7 +3174,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Uses the default converter (and thus depends on the ICU conversion code) * unless U_CHARSET_IS_UTF8 is set to 1. * @param codepageData an array of bytes in the platform's default codepage. - * @param dataLength The number of bytes in codepageData. + * @param dataLength The number of bytes in `codepageData`. * @stable ICU 2.0 */ UnicodeString(const char *codepageData, int32_t dataLength); @@ -3208,11 +3186,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char* constructor. * @param codepageData an array of bytes, null-terminated - * @param codepage the encoding of codepageData. The special - * value 0 for codepage indicates that the text is in the + * @param codepage the encoding of `codepageData`. The special + * value 0 for `codepage` indicates that the text is in the * platform's default codepage. * - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. * Recommendation: For invariant-character strings use the constructor @@ -3227,11 +3205,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char* constructor. * @param codepageData an array of bytes. - * @param dataLength The number of bytes in codepageData. - * @param codepage the encoding of codepageData. The special - * value 0 for codepage indicates that the text is in the + * @param dataLength The number of bytes in `codepageData`. + * @param codepage the encoding of `codepageData`. The special + * value 0 for `codepage` indicates that the text is in the * platform's default codepage. - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. * Recommendation: For invariant-character strings use the constructor @@ -3282,12 +3260,11 @@ class U_COMMON_API UnicodeString : public Replaceable * * For example: * \code - * void fn(const char *s) { - * UnicodeString ustr(s, -1, US_INV); - * // use ustr ... - * } + * void fn(const char *s) { + * UnicodeString ustr(s, -1, US_INV); + * // use ustr ... + * } * \endcode - * * @param src String using only invariant characters. * @param length Length of src, or -1 if NUL-terminated. * @param inv Signature-distinguishing paramater, use US_INV. @@ -3327,7 +3304,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * 'Substring' constructor from tail of source string. * @param src The UnicodeString object to copy. - * @param srcStart The offset into src at which to start copying. + * @param srcStart The offset into `src` at which to start copying. * @stable ICU 2.2 */ UnicodeString(const UnicodeString& src, int32_t srcStart); @@ -3335,8 +3312,8 @@ class U_COMMON_API UnicodeString : public Replaceable /** * 'Substring' constructor from subrange of source string. * @param src The UnicodeString object to copy. - * @param srcStart The offset into src at which to start copying. - * @param srcLength The number of characters from src to copy. + * @param srcStart The offset into `src` at which to start copying. + * @param srcLength The number of characters from `src` to copy. * @stable ICU 2.2 */ UnicodeString(const UnicodeString& src, int32_t srcStart, int32_t srcLength); @@ -3408,7 +3385,7 @@ class U_COMMON_API UnicodeString : public Replaceable * * \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A, * \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B, - * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C + * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C * * Anything else following a backslash is generically escaped. For * example, "[a\\-z]" returns "[a-z]". @@ -3656,9 +3633,9 @@ class U_COMMON_API UnicodeString : public Replaceable * Real constructor for converting from codepage data. * It assumes that it is called with !fRefCounted. * - * If codepage==0, then the default converter + * If `codepage==0`, then the default converter * is used for the platform encoding. - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. */ diff --git a/deps/icu-small/source/common/unicode/uobject.h b/deps/icu-small/source/common/unicode/uobject.h index f7a7b6eddbc96b..53b8eb005f4cc0 100644 --- a/deps/icu-small/source/common/unicode/uobject.h +++ b/deps/icu-small/source/common/unicode/uobject.h @@ -20,6 +20,7 @@ #define __UOBJECT_H__ #include "unicode/utypes.h" +#include "unicode/platform.h" /** * \file @@ -28,7 +29,9 @@ /** * \def U_NO_THROW - * Define this to define the throw() specification so + * Since ICU 64, use U_NOEXCEPT instead. + * + * Previously, define this to define the throw() specification so * certain functions do not throw any exceptions * * UMemory operator new methods should have the throw() specification @@ -37,7 +40,7 @@ * constructor is still called, and if the constructor references member * data, (which it typically does), the result is a segmentation violation. * - * @stable ICU 4.2 + * @stable ICU 4.2. Since ICU 64, Use U_NOEXCEPT instead. See ICU-20422. */ #ifndef U_NO_THROW #define U_NO_THROW throw() @@ -125,14 +128,14 @@ class U_COMMON_API UMemory { * for ICU4C C++ classes * @stable ICU 2.4 */ - static void * U_EXPORT2 operator new(size_t size) U_NO_THROW; + static void * U_EXPORT2 operator new(size_t size) U_NOEXCEPT; /** * Override for ICU4C C++ memory management. * See new(). * @stable ICU 2.4 */ - static void * U_EXPORT2 operator new[](size_t size) U_NO_THROW; + static void * U_EXPORT2 operator new[](size_t size) U_NOEXCEPT; /** * Override for ICU4C C++ memory management. @@ -142,14 +145,14 @@ class U_COMMON_API UMemory { * for ICU4C C++ classes * @stable ICU 2.4 */ - static void U_EXPORT2 operator delete(void *p) U_NO_THROW; + static void U_EXPORT2 operator delete(void *p) U_NOEXCEPT; /** * Override for ICU4C C++ memory management. * See delete(). * @stable ICU 2.4 */ - static void U_EXPORT2 operator delete[](void *p) U_NO_THROW; + static void U_EXPORT2 operator delete[](void *p) U_NOEXCEPT; #if U_HAVE_PLACEMENT_NEW /** @@ -157,14 +160,14 @@ class U_COMMON_API UMemory { * See new(). * @stable ICU 2.6 */ - static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NO_THROW { return ptr; } + static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NOEXCEPT { return ptr; } /** * Override for ICU4C C++ memory management for STL. * See delete(). * @stable ICU 2.6 */ - static inline void U_EXPORT2 operator delete(void *, void *) U_NO_THROW {} + static inline void U_EXPORT2 operator delete(void *, void *) U_NOEXCEPT {} #endif /* U_HAVE_PLACEMENT_NEW */ #if U_HAVE_DEBUG_LOCATION_NEW /** @@ -174,7 +177,7 @@ class U_COMMON_API UMemory { * @param file The file where the allocation was requested * @param line The line where the allocation was requested */ - static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NO_THROW; + static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NOEXCEPT; /** * This method provides a matching delete for the MFC debug new * @@ -182,7 +185,7 @@ class U_COMMON_API UMemory { * @param file The file where the allocation was requested * @param line The line where the allocation was requested */ - static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NO_THROW; + static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NOEXCEPT; #endif /* U_HAVE_DEBUG_LOCATION_NEW */ #endif /* U_OVERRIDE_CXX_ALLOCATION */ diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 5812173e39cfd2..eaf56c9614d7f2 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -109,12 +109,13 @@ #define _UTF32LEData U_ICU_ENTRY_POINT_RENAME(_UTF32LEData) #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data) #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data) +#define _isUnicodeLocaleTypeSubtag U_ICU_ENTRY_POINT_RENAME(_isUnicodeLocaleTypeSubtag) #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) #define gTimeZoneFilesInitOnce U_ICU_ENTRY_POINT_RENAME(gTimeZoneFilesInitOnce) +#define initNumsysNames U_ICU_ENTRY_POINT_RENAME(initNumsysNames) #define izrule_clone U_ICU_ENTRY_POINT_RENAME(izrule_clone) #define izrule_close U_ICU_ENTRY_POINT_RENAME(izrule_close) #define izrule_equals U_ICU_ENTRY_POINT_RENAME(izrule_equals) @@ -133,6 +134,7 @@ #define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart) #define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default) #define locale_set_default U_ICU_ENTRY_POINT_RENAME(locale_set_default) +#define numSysCleanup U_ICU_ENTRY_POINT_RENAME(numSysCleanup) #define pl_addFontRun U_ICU_ENTRY_POINT_RENAME(pl_addFontRun) #define pl_addLocaleRun U_ICU_ENTRY_POINT_RENAME(pl_addLocaleRun) #define pl_addValueRun U_ICU_ENTRY_POINT_RENAME(pl_addValueRun) @@ -583,6 +585,18 @@ #define ucasemap_utf8ToLower U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToLower) #define ucasemap_utf8ToTitle U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToTitle) #define ucasemap_utf8ToUpper U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToUpper) +#define ucfpos_close U_ICU_ENTRY_POINT_RENAME(ucfpos_close) +#define ucfpos_constrainCategory U_ICU_ENTRY_POINT_RENAME(ucfpos_constrainCategory) +#define ucfpos_constrainField U_ICU_ENTRY_POINT_RENAME(ucfpos_constrainField) +#define ucfpos_getCategory U_ICU_ENTRY_POINT_RENAME(ucfpos_getCategory) +#define ucfpos_getField U_ICU_ENTRY_POINT_RENAME(ucfpos_getField) +#define ucfpos_getIndexes U_ICU_ENTRY_POINT_RENAME(ucfpos_getIndexes) +#define ucfpos_getInt64IterationContext U_ICU_ENTRY_POINT_RENAME(ucfpos_getInt64IterationContext) +#define ucfpos_matchesField U_ICU_ENTRY_POINT_RENAME(ucfpos_matchesField) +#define ucfpos_open U_ICU_ENTRY_POINT_RENAME(ucfpos_open) +#define ucfpos_reset U_ICU_ENTRY_POINT_RENAME(ucfpos_reset) +#define ucfpos_setInt64IterationContext U_ICU_ENTRY_POINT_RENAME(ucfpos_setInt64IterationContext) +#define ucfpos_setState U_ICU_ENTRY_POINT_RENAME(ucfpos_setState) #define uchar_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uchar_addPropertyStarts) #define uchar_swapNames U_ICU_ENTRY_POINT_RENAME(uchar_swapNames) #define ucln_cleanupOne U_ICU_ENTRY_POINT_RENAME(ucln_cleanupOne) @@ -897,8 +911,12 @@ #define udatpg_setDecimal U_ICU_ENTRY_POINT_RENAME(udatpg_setDecimal) #define udict_swap U_ICU_ENTRY_POINT_RENAME(udict_swap) #define udtitvfmt_close U_ICU_ENTRY_POINT_RENAME(udtitvfmt_close) +#define udtitvfmt_closeResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_closeResult) #define udtitvfmt_format U_ICU_ENTRY_POINT_RENAME(udtitvfmt_format) +#define udtitvfmt_formatToResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_formatToResult) #define udtitvfmt_open U_ICU_ENTRY_POINT_RENAME(udtitvfmt_open) +#define udtitvfmt_openResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_openResult) +#define udtitvfmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(udtitvfmt_resultAsValue) #define uenum_close U_ICU_ENTRY_POINT_RENAME(uenum_close) #define uenum_count U_ICU_ENTRY_POINT_RENAME(uenum_count) #define uenum_next U_ICU_ENTRY_POINT_RENAME(uenum_next) @@ -938,6 +956,8 @@ #define ufmt_ptou U_ICU_ENTRY_POINT_RENAME(ufmt_ptou) #define ufmt_uto64 U_ICU_ENTRY_POINT_RENAME(ufmt_uto64) #define ufmt_utop U_ICU_ENTRY_POINT_RENAME(ufmt_utop) +#define ufmtval_getString U_ICU_ENTRY_POINT_RENAME(ufmtval_getString) +#define ufmtval_nextPosition U_ICU_ENTRY_POINT_RENAME(ufmtval_nextPosition) #define ugender_getInstance U_ICU_ENTRY_POINT_RENAME(ugender_getInstance) #define ugender_getListGender U_ICU_ENTRY_POINT_RENAME(ugender_getListGender) #define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close) @@ -1040,8 +1060,12 @@ #define ulist_resetList U_ICU_ENTRY_POINT_RENAME(ulist_resetList) #define ulist_reset_keyword_values_iterator U_ICU_ENTRY_POINT_RENAME(ulist_reset_keyword_values_iterator) #define ulistfmt_close U_ICU_ENTRY_POINT_RENAME(ulistfmt_close) +#define ulistfmt_closeResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_closeResult) #define ulistfmt_format U_ICU_ENTRY_POINT_RENAME(ulistfmt_format) +#define ulistfmt_formatStringsToResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_formatStringsToResult) #define ulistfmt_open U_ICU_ENTRY_POINT_RENAME(ulistfmt_open) +#define ulistfmt_openResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_openResult) +#define ulistfmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(ulistfmt_resultAsValue) #define uloc_acceptLanguage U_ICU_ENTRY_POINT_RENAME(uloc_acceptLanguage) #define uloc_acceptLanguageFromHTTP U_ICU_ENTRY_POINT_RENAME(uloc_acceptLanguageFromHTTP) #define uloc_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(uloc_addLikelySubtags) @@ -1099,17 +1123,30 @@ #define ulocdata_getPaperSize U_ICU_ENTRY_POINT_RENAME(ulocdata_getPaperSize) #define ulocdata_open U_ICU_ENTRY_POINT_RENAME(ulocdata_open) #define ulocdata_setNoSubstitute U_ICU_ENTRY_POINT_RENAME(ulocdata_setNoSubstitute) +#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags) #define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag) #define ulocimp_getCountry U_ICU_ENTRY_POINT_RENAME(ulocimp_getCountry) #define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage) #define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData) #define ulocimp_getScript U_ICU_ENTRY_POINT_RENAME(ulocimp_getScript) +#define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags) #define ulocimp_toBcpKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpKey) #define ulocimp_toBcpType U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpType) +#define ulocimp_toLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_toLanguageTag) #define ulocimp_toLegacyKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKey) #define ulocimp_toLegacyType U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyType) +#define ultag_isExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isExtensionSubtags) +#define ultag_isLanguageSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isLanguageSubtag) +#define ultag_isPrivateuseValueSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isPrivateuseValueSubtags) +#define ultag_isRegionSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isRegionSubtag) +#define ultag_isScriptSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isScriptSubtag) +#define ultag_isTransformedExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isTransformedExtensionSubtags) +#define ultag_isUnicodeExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeExtensionSubtags) +#define ultag_isUnicodeLocaleAttribute U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleAttribute) +#define ultag_isUnicodeLocaleAttributes U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleAttributes) #define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey) #define ultag_isUnicodeLocaleType U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleType) +#define ultag_isVariantSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isVariantSubtags) #define umsg_applyPattern U_ICU_ENTRY_POINT_RENAME(umsg_applyPattern) #define umsg_autoQuoteApostrophe U_ICU_ENTRY_POINT_RENAME(umsg_autoQuoteApostrophe) #define umsg_clone U_ICU_ENTRY_POINT_RENAME(umsg_clone) @@ -1208,7 +1245,9 @@ #define unumf_formatDouble U_ICU_ENTRY_POINT_RENAME(unumf_formatDouble) #define unumf_formatInt U_ICU_ENTRY_POINT_RENAME(unumf_formatInt) #define unumf_openForSkeletonAndLocale U_ICU_ENTRY_POINT_RENAME(unumf_openForSkeletonAndLocale) +#define unumf_openForSkeletonAndLocaleWithError U_ICU_ENTRY_POINT_RENAME(unumf_openForSkeletonAndLocaleWithError) #define unumf_openResult U_ICU_ENTRY_POINT_RENAME(unumf_openResult) +#define unumf_resultAsValue U_ICU_ENTRY_POINT_RENAME(unumf_resultAsValue) #define unumf_resultGetAllFieldPositions U_ICU_ENTRY_POINT_RENAME(unumf_resultGetAllFieldPositions) #define unumf_resultNextFieldPosition U_ICU_ENTRY_POINT_RENAME(unumf_resultNextFieldPosition) #define unumf_resultToString U_ICU_ENTRY_POINT_RENAME(unumf_resultToString) @@ -1225,6 +1264,7 @@ #define uplrules_open U_ICU_ENTRY_POINT_RENAME(uplrules_open) #define uplrules_openForType U_ICU_ENTRY_POINT_RENAME(uplrules_openForType) #define uplrules_select U_ICU_ENTRY_POINT_RENAME(uplrules_select) +#define uplrules_selectFormatted U_ICU_ENTRY_POINT_RENAME(uplrules_selectFormatted) #define uplrules_selectWithFormat U_ICU_ENTRY_POINT_RENAME(uplrules_selectWithFormat) #define uplug_closeLibrary U_ICU_ENTRY_POINT_RENAME(uplug_closeLibrary) #define uplug_findLibrary U_ICU_ENTRY_POINT_RENAME(uplug_findLibrary) @@ -1499,10 +1539,15 @@ #define uregion_getRegionFromNumericCode U_ICU_ENTRY_POINT_RENAME(uregion_getRegionFromNumericCode) #define uregion_getType U_ICU_ENTRY_POINT_RENAME(uregion_getType) #define ureldatefmt_close U_ICU_ENTRY_POINT_RENAME(ureldatefmt_close) +#define ureldatefmt_closeResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_closeResult) #define ureldatefmt_combineDateAndTime U_ICU_ENTRY_POINT_RENAME(ureldatefmt_combineDateAndTime) #define ureldatefmt_format U_ICU_ENTRY_POINT_RENAME(ureldatefmt_format) #define ureldatefmt_formatNumeric U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatNumeric) +#define ureldatefmt_formatNumericToResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatNumericToResult) +#define ureldatefmt_formatToResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatToResult) #define ureldatefmt_open U_ICU_ENTRY_POINT_RENAME(ureldatefmt_open) +#define ureldatefmt_openResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_openResult) +#define ureldatefmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(ureldatefmt_resultAsValue) #define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close) #define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb) #define ures_countArrayItems U_ICU_ENTRY_POINT_RENAME(ures_countArrayItems) @@ -1543,6 +1588,7 @@ #define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open) #define ures_openAvailableLocales U_ICU_ENTRY_POINT_RENAME(ures_openAvailableLocales) #define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect) +#define ures_openDirectFillIn U_ICU_ENTRY_POINT_RENAME(ures_openDirectFillIn) #define ures_openFillIn U_ICU_ENTRY_POINT_RENAME(ures_openFillIn) #define ures_openNoDefault U_ICU_ENTRY_POINT_RENAME(ures_openNoDefault) #define ures_openU U_ICU_ENTRY_POINT_RENAME(ures_openU) diff --git a/deps/icu-small/source/common/unicode/ures.h b/deps/icu-small/source/common/unicode/ures.h index af0ce76f25b1a2..839779fada804d 100644 --- a/deps/icu-small/source/common/unicode/ures.h +++ b/deps/icu-small/source/common/unicode/ures.h @@ -333,19 +333,19 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle, #ifndef U_HIDE_INTERNAL_API /** - * Same as ures_open() but uses the fill-in parameter instead of allocating - * a bundle, if r!=NULL. + * Same as ures_open() but uses the fill-in parameter instead of allocating a new bundle. + * * TODO need to revisit usefulness of this function * and usage model for fillIn parameters without knowing sizeof(UResourceBundle) - * @param r The resourcebundle to open + * @param r The existing UResourceBundle to fill in. If NULL then status will be + * set to U_ILLEGAL_ARGUMENT_ERROR. * @param packageName The packageName and locale together point to an ICU udata object, * as defined by udata_open( packageName, "res", locale, err) * or equivalent. Typically, packageName will refer to a (.dat) file, or to * a package registered with udata_setAppData(). Using a full file or directory * pathname for packageName is deprecated. If NULL, ICU data will be used. * @param localeID specifies the locale for which we want to open the resource - * @param status The error code - * @return a newly allocated resource bundle or NULL if it doesn't exist. + * @param status The error code. * @internal */ U_INTERNAL void U_EXPORT2 diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index faf9edf8ae2694..c8babdf03068a3 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -466,6 +466,15 @@ typedef enum UScriptCode { /** @stable ICU 62 */ USCRIPT_OLD_SOGDIAN = 184,/* Sogo */ + /** @stable ICU 64 */ + USCRIPT_ELYMAIC = 185,/* Elym */ + /** @stable ICU 64 */ + USCRIPT_NYIAKENG_PUACHUE_HMONG = 186,/* Hmnp */ + /** @stable ICU 64 */ + USCRIPT_NANDINAGARI = 187,/* Nand */ + /** @stable ICU 64 */ + USCRIPT_WANCHO = 188,/* Wcho */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -473,7 +482,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 185 + USCRIPT_CODE_LIMIT = 189 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index 51d11a2e00efb4..ff78784c61ec54 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -1555,7 +1555,7 @@ struct UText { U_STABLE UText * U_EXPORT2 utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status); -#ifndef U_HIDE_INTERNAL_API +// do not use #ifndef U_HIDE_INTERNAL_API around the following! /** * @internal * Value used to help identify correctly initialized UText structs. @@ -1564,7 +1564,6 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status); enum { UTEXT_MAGIC = 0x345ad82c }; -#endif /* U_HIDE_INTERNAL_API */ /** * initializer to be used with local (stack) instances of a UText diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 1f076343590240..41155f119bbb86 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -609,7 +609,6 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); } \ } -#ifndef U_HIDE_DRAFT_API /** * If the string ends with a UTF-8 byte sequence that is valid so far * but incomplete, then reduce the length of the string to end before @@ -634,7 +633,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @param start int32_t starting string offset (usually 0) * @param length int32_t string length (usually start<=length) * @see U8_SET_CP_START - * @draft ICU 61 + * @stable ICU 61 */ #define U8_TRUNCATE_IF_INCOMPLETE(s, start, length) \ if((length)>(start)) { \ @@ -658,7 +657,6 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); } \ } \ } -#endif // U_HIDE_DRAFT_API /* definitions with backward iteration -------------------------------------- */ diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index f1814e06498da2..49eb12cd40022c 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -544,12 +544,8 @@ typedef enum UErrorCode { U_DEFAULT_KEYWORD_MISSING, /**< Missing DEFAULT rule in plural rules */ U_DECIMAL_NUMBER_SYNTAX_ERROR, /**< Decimal number syntax error */ U_FORMAT_INEXACT_ERROR, /**< Cannot format a number exactly and rounding mode is ROUND_UNNECESSARY @stable ICU 4.8 */ -#ifndef U_HIDE_DRAFT_API - U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @draft ICU 61 */ -#endif // U_HIDE_DRAFT_API -#ifndef U_HIDE_DRAFT_API - U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @draft ICU 62 */ -#endif // U_HIDE_DRAFT_API + U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @stable ICU 61 */ + U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @stable ICU 62 */ #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal formatting API error code. diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 83d0b4ecd1c8a0..7c114be2cc87f1 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -60,13 +60,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 63 +#define U_ICU_VERSION_MAJOR_NUM 64 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 1 +#define U_ICU_VERSION_MINOR_NUM 2 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -86,7 +86,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _63 +#define U_ICU_VERSION_SUFFIX _64 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -103,16 +103,34 @@ * \def U_ICU_ENTRY_POINT_RENAME * @stable ICU 4.2 */ +/** + * Disable the version suffix. Use the custom suffix if exists. + * \def U_DISABLE_VERSION_SUFFIX + * @internal + */ +#ifndef U_DISABLE_VERSION_SUFFIX +#define U_DISABLE_VERSION_SUFFIX 0 +#endif #ifndef U_ICU_ENTRY_POINT_RENAME #ifdef U_HAVE_LIB_SUFFIX -#define U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) x ## y ## z -#define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y,z) U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) -#define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME) +# if !U_DISABLE_VERSION_SUFFIX +# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) x ## y ## z +# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y,z) U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) +# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME) +# else +# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y +# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y) +# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_LIB_SUFFIX_C_NAME) +# endif #else -#define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y -#define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y) -#define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX) +# if !U_DISABLE_VERSION_SUFFIX +# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y +# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y) +# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX) +# else +# define U_ICU_ENTRY_POINT_RENAME(x) x +# endif #endif #endif @@ -121,7 +139,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "63.1" +#define U_ICU_VERSION "64.2" /** * The current ICU library major version number as a string, for library name suffixes. @@ -134,13 +152,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "63" +#define U_ICU_VERSION_SHORT "64" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "63.1" +#define U_ICU_DATA_VERSION "64.2" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index d33d8d2c01c0e5..641f4ec6594e12 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -21,8 +21,14 @@ #include "umutex.h" static icu::UnifiedCache *gCache = NULL; -static UMutex gCacheMutex = U_MUTEX_INITIALIZER; -static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER; +static icu::UMutex *gCacheMutex() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} +static icu::UConditionVar *gInProgressValueAddedCond() { + static icu::UConditionVar cv = U_CONDITION_INITIALIZER; + return &cv; +} static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER; static const int32_t MAX_EVICT_ITERATIONS = 10; @@ -132,28 +138,28 @@ void UnifiedCache::setEvictionPolicy( status = U_ILLEGAL_ARGUMENT_ERROR; return; } - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); fMaxUnused = count; fMaxPercentageOfInUse = percentageOfInUseItems; } int32_t UnifiedCache::unusedCount() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); return uhash_count(fHashtable) - fNumValuesInUse; } int64_t UnifiedCache::autoEvictedCount() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); return fAutoEvictedCount; } int32_t UnifiedCache::keyCount() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); return uhash_count(fHashtable); } void UnifiedCache::flush() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); // Use a loop in case cache items that are flushed held hard references to // other cache items making those additional cache items eligible for @@ -162,7 +168,7 @@ void UnifiedCache::flush() const { } void UnifiedCache::handleUnreferencedObject() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); --fNumValuesInUse; _runEvictionSlice(); } @@ -181,7 +187,7 @@ void UnifiedCache::dump() { } void UnifiedCache::dumpContents() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); _dumpContents(); } @@ -221,7 +227,7 @@ UnifiedCache::~UnifiedCache() { // Now all that should be left in the cache are entries that refer to // each other and entries with hard references from outside the cache. // Nothing we can do about these so proceed to wipe out the cache. - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); _flush(TRUE); } uhash_close(fHashtable); @@ -322,7 +328,7 @@ void UnifiedCache::_putIfAbsentAndGet( const CacheKeyBase &key, const SharedObject *&value, UErrorCode &status) const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); const UHashElement *element = uhash_find(fHashtable, &key); if (element != NULL && !_inProgress(element)) { _fetch(element, value, status); @@ -347,14 +353,14 @@ UBool UnifiedCache::_poll( UErrorCode &status) const { U_ASSERT(value == NULL); U_ASSERT(status == U_ZERO_ERROR); - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); const UHashElement *element = uhash_find(fHashtable, &key); // If the hash table contains an inProgress placeholder entry for this key, // this means that another thread is currently constructing the value object. // Loop, waiting for that construction to complete. while (element != NULL && _inProgress(element)) { - umtx_condWait(&gInProgressValueAddedCond, &gCacheMutex); + umtx_condWait(gInProgressValueAddedCond(), gCacheMutex()); element = uhash_find(fHashtable, &key); } @@ -427,7 +433,7 @@ void UnifiedCache::_put( // Tell waiting threads that we replace in-progress status with // an error. - umtx_condBroadcast(&gInProgressValueAddedCond); + umtx_condBroadcast(gInProgressValueAddedCond()); } void UnifiedCache::_fetch( diff --git a/deps/icu-small/source/common/unifiedcache.h b/deps/icu-small/source/common/unifiedcache.h index b3ccd60d177ea1..5c0bd76f4a2b94 100644 --- a/deps/icu-small/source/common/unifiedcache.h +++ b/deps/icu-small/source/common/unifiedcache.h @@ -137,7 +137,7 @@ class LocaleCacheKey : public CacheKey { protected: Locale fLoc; public: - LocaleCacheKey(const Locale &loc) : fLoc(loc) {}; + LocaleCacheKey(const Locale &loc) : fLoc(loc) {} LocaleCacheKey(const LocaleCacheKey &other) : CacheKey(other), fLoc(other.fLoc) { } virtual ~LocaleCacheKey() { } diff --git a/deps/icu-small/source/common/uniset.cpp b/deps/icu-small/source/common/uniset.cpp index 7d2e3cd619fc1d..1db382afe6f6ba 100644 --- a/deps/icu-small/source/common/uniset.cpp +++ b/deps/icu-small/source/common/uniset.cpp @@ -14,6 +14,7 @@ #include "unicode/parsepos.h" #include "unicode/symtable.h" #include "unicode/uniset.h" +#include "unicode/ustring.h" #include "unicode/utf8.h" #include "unicode/utf16.h" #include "ruleiter.h" @@ -53,11 +54,8 @@ // LOW <= all valid values. ZERO for codepoints #define UNICODESET_LOW 0x000000 -// initial storage. Must be >= 0 -#define START_EXTRA 16 - -// extra amount for growth. Must be >= 0 -#define GROW_EXTRA START_EXTRA +/** Max list [0, 1, 2, ..., max code point, HIGH] */ +constexpr int32_t MAX_LENGTH = UNICODESET_HIGH + 1; U_NAMESPACE_BEGIN @@ -137,6 +135,18 @@ static int8_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) { return a.compare(b); } +UBool UnicodeSet::hasStrings() const { + return strings != nullptr && !strings->isEmpty(); +} + +int32_t UnicodeSet::stringsSize() const { + return strings == nullptr ? 0 : strings->size(); +} + +UBool UnicodeSet::stringsContains(const UnicodeString &s) const { + return strings != nullptr && strings->contains((void*) &s); +} + //---------------------------------------------------------------- // Constructors &c //---------------------------------------------------------------- @@ -144,24 +154,8 @@ static int8_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) { /** * Constructs an empty set. */ -UnicodeSet::UnicodeSet() : - len(1), capacity(1 + START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ - list[0] = UNICODESET_HIGH; - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; - } +UnicodeSet::UnicodeSet() { + list[0] = UNICODESET_HIGH; _dbgct(this); } @@ -172,89 +166,39 @@ UnicodeSet::UnicodeSet() : * @param start first character, inclusive, of range * @param end last character, inclusive, of range */ -UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) : - len(1), capacity(1 + START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ - list[0] = UNICODESET_HIGH; - complement(start, end); - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; - } +UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) { + list[0] = UNICODESET_HIGH; + add(start, end); _dbgct(this); } /** * Constructs a set that is identical to the given UnicodeSet. */ -UnicodeSet::UnicodeSet(const UnicodeSet& o) : - UnicodeFilter(o), - len(0), capacity(o.isFrozen() ? o.len : o.len + GROW_EXTRA), list(0), - bmpSet(0), - buffer(0), bufferCapacity(0), - patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ - *this = o; - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; - } +UnicodeSet::UnicodeSet(const UnicodeSet& o) : UnicodeFilter(o) { + *this = o; _dbgct(this); } // Copy-construct as thawed. -UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : - UnicodeFilter(o), - len(0), capacity(o.len + GROW_EXTRA), list(0), - bmpSet(0), - buffer(0), bufferCapacity(0), - patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ +UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : UnicodeFilter(o) { + if (ensureCapacity(o.len)) { // *this = o except for bmpSet and stringSpan len = o.len; uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32)); - if (strings != NULL && o.strings != NULL) { - strings->assign(*o.strings, cloneUnicodeString, status); - } else { // Invalid strings. - setToBogus(); - return; + if (o.hasStrings()) { + UErrorCode status = U_ZERO_ERROR; + if (!allocateStrings(status) || + (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) { + setToBogus(); + return; + } } if (o.pat) { - setPattern(UnicodeString(o.pat, o.patLen)); + setPattern(o.pat, o.patLen); } - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; + _dbgct(this); } - _dbgct(this); } /** @@ -262,9 +206,11 @@ UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : */ UnicodeSet::~UnicodeSet() { _dbgdt(this); // first! - uprv_free(list); + if (list != stackList) { + uprv_free(list); + } delete bmpSet; - if (buffer) { + if (buffer != stackList) { uprv_free(buffer); } delete strings; @@ -290,32 +236,30 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { setToBogus(); return *this; } - UErrorCode ec = U_ZERO_ERROR; - ensureCapacity(o.len, ec); - if (U_FAILURE(ec)) { + if (!ensureCapacity(o.len)) { // ensureCapacity will mark the UnicodeSet as Bogus if OOM failure happens. return *this; } len = o.len; uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32)); - if (o.bmpSet == NULL || asThawed) { - bmpSet = NULL; - } else { + if (o.bmpSet != nullptr && !asThawed) { bmpSet = new BMPSet(*o.bmpSet, list, len); if (bmpSet == NULL) { // Check for memory allocation error. setToBogus(); return *this; } } - if (strings != NULL && o.strings != NULL) { - strings->assign(*o.strings, cloneUnicodeString, ec); - } else { // Invalid strings. - setToBogus(); - return *this; + if (o.hasStrings()) { + UErrorCode status = U_ZERO_ERROR; + if ((strings == nullptr && !allocateStrings(status)) || + (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) { + setToBogus(); + return *this; + } + } else if (hasStrings()) { + strings->removeAllElements(); } - if (o.stringSpan == NULL || asThawed) { - stringSpan = NULL; - } else { + if (o.stringSpan != nullptr && !asThawed) { stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings); if (stringSpan == NULL) { // Check for memory allocation error. setToBogus(); @@ -324,7 +268,7 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { } releasePattern(); if (o.pat) { - setPattern(UnicodeString(o.pat, o.patLen)); + setPattern(o.pat, o.patLen); } return *this; } @@ -357,7 +301,8 @@ UBool UnicodeSet::operator==(const UnicodeSet& o) const { for (int32_t i = 0; i < len; ++i) { if (list[i] != o.list[i]) return FALSE; } - if (*strings != *o.strings) return FALSE; + if (hasStrings() != o.hasStrings()) { return FALSE; } + if (hasStrings() && *strings != *o.strings) return FALSE; return TRUE; } @@ -393,7 +338,7 @@ int32_t UnicodeSet::size(void) const { for (int32_t i = 0; i < count; ++i) { n += getRangeEnd(i) - getRangeStart(i) + 1; } - return n + strings->size(); + return n + stringsSize(); } /** @@ -402,7 +347,7 @@ int32_t UnicodeSet::size(void) const { * @return true if this set contains no elements. */ UBool UnicodeSet::isEmpty(void) const { - return len == 1 && strings->size() == 0; + return len == 1 && !hasStrings(); } /** @@ -502,7 +447,7 @@ UBool UnicodeSet::contains(const UnicodeString& s) const { if (s.length() == 0) return FALSE; int32_t cp = getSingleCP(s); if (cp < 0) { - return strings->contains((void*) &s); + return stringsContains(s); } else { return contains((UChar32) cp); } @@ -524,8 +469,7 @@ UBool UnicodeSet::containsAll(const UnicodeSet& c) const { return FALSE; } } - if (!strings->containsAll(*c.strings)) return FALSE; - return TRUE; + return !c.hasStrings() || (strings != nullptr && strings->containsAll(*c.strings)); } /** @@ -571,8 +515,7 @@ UBool UnicodeSet::containsNone(const UnicodeSet& c) const { return FALSE; } } - if (!strings->containsNone(*c.strings)) return FALSE; - return TRUE; + return strings == nullptr || !c.hasStrings() || strings->containsNone(*c.strings); } /** @@ -613,7 +556,7 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const { return TRUE; } } - if (strings->size() != 0) { + if (hasStrings()) { for (i=0; isize(); ++i) { const UnicodeString& s = *(const UnicodeString*)strings->elementAt(i); //if (s.length() == 0) { @@ -648,7 +591,7 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, return U_MISMATCH; } } else { - if (strings->size() != 0) { // try strings first + if (hasStrings()) { // try strings first // might separate forward and backward loops later // for now they are combined @@ -849,7 +792,39 @@ UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) { */ UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) { if (pinCodePoint(start) < pinCodePoint(end)) { - UChar32 range[3] = { start, end+1, UNICODESET_HIGH }; + UChar32 limit = end + 1; + // Fast path for adding a new range after the last one. + // Odd list length: [..., lastStart, lastLimit, HIGH] + if ((len & 1) != 0) { + // If the list is empty, set lastLimit low enough to not be adjacent to 0. + UChar32 lastLimit = len == 1 ? -2 : list[len - 2]; + if (lastLimit <= start && !isFrozen() && !isBogus()) { + if (lastLimit == start) { + // Extend the last range. + list[len - 2] = limit; + if (limit == UNICODESET_HIGH) { + --len; + } + } else { + list[len - 1] = start; + if (limit < UNICODESET_HIGH) { + if (ensureCapacity(len + 2)) { + list[len++] = limit; + list[len++] = UNICODESET_HIGH; + } + } else { // limit == UNICODESET_HIGH + if (ensureCapacity(len + 1)) { + list[len++] = UNICODESET_HIGH; + } + } + } + releasePattern(); + return *this; + } + } + // This is slow. Could be much faster using findCodePoint(start) + // and modifying the list, dealing with adjacent & overlapping ranges. + UChar32 range[3] = { start, limit, UNICODESET_HIGH }; add(range, 2, 0); } else if (start == end) { add(start); @@ -918,9 +893,7 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { list[i] = c; // if we touched the HIGH mark, then add a new one if (c == (UNICODESET_HIGH - 1)) { - UErrorCode status = U_ZERO_ERROR; - ensureCapacity(len+1, status); - if (U_FAILURE(status)) { + if (!ensureCapacity(len+1)) { // ensureCapacity will mark the object as Bogus if OOM failure happens. return *this; } @@ -964,21 +937,13 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { // ^ // list[i] - UErrorCode status = U_ZERO_ERROR; - ensureCapacity(len+2, status); - if (U_FAILURE(status)) { + if (!ensureCapacity(len+2)) { // ensureCapacity will mark the object as Bogus if OOM failure happens. return *this; } - //for (int32_t k=len-1; k>=i; --k) { - // list[k+2] = list[k]; - //} - UChar32* src = list + len; - UChar32* dst = src + 2; - UChar32* srclimit = list + i; - while (src > srclimit) *(--dst) = *(--src); - + UChar32 *p = list + i; + uprv_memmove(p + 2, p, (len - i) * sizeof(*p)); list[i] = c; list[i+1] = c+1; len += 2; @@ -1014,7 +979,7 @@ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { if (s.length() == 0 || isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - if (!strings->contains((void*) &s)) { + if (!stringsContains(s)) { _add(s); releasePattern(); } @@ -1033,12 +998,16 @@ void UnicodeSet::_add(const UnicodeString& s) { if (isFrozen() || isBogus()) { return; } + UErrorCode ec = U_ZERO_ERROR; + if (strings == nullptr && !allocateStrings(ec)) { + setToBogus(); + return; + } UnicodeString* t = new UnicodeString(s); if (t == NULL) { // Check for memory allocation error. setToBogus(); return; } - UErrorCode ec = U_ZERO_ERROR; strings->sortedInsert(t, compareUnicodeString, ec); if (U_FAILURE(ec)) { setToBogus(); @@ -1121,7 +1090,10 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) { } UnicodeSet& UnicodeSet::removeAllStrings() { - strings->removeAllElements(); + if (!isFrozen() && hasStrings()) { + strings->removeAllElements(); + releasePattern(); + } return *this; } @@ -1217,8 +1189,9 @@ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { if (s.length() == 0 || isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - strings->removeElement((void*) &s); - releasePattern(); + if (strings != nullptr && strings->removeElement((void*) &s)) { + releasePattern(); + } } else { remove((UChar32)cp, (UChar32)cp); } @@ -1260,24 +1233,17 @@ UnicodeSet& UnicodeSet::complement(void) { if (isFrozen() || isBogus()) { return *this; } - UErrorCode status = U_ZERO_ERROR; if (list[0] == UNICODESET_LOW) { - ensureBufferCapacity(len-1, status); - if (U_FAILURE(status)) { - return *this; - } - uprv_memcpy(buffer, list + 1, (size_t)(len-1)*sizeof(UChar32)); + uprv_memmove(list, list + 1, (size_t)(len-1)*sizeof(UChar32)); --len; } else { - ensureBufferCapacity(len+1, status); - if (U_FAILURE(status)) { + if (!ensureCapacity(len+1)) { return *this; } - uprv_memcpy(buffer + 1, list, (size_t)len*sizeof(UChar32)); - buffer[0] = UNICODESET_LOW; + uprv_memmove(list + 1, list, (size_t)len*sizeof(UChar32)); + list[0] = UNICODESET_LOW; ++len; } - swapBuffers(); releasePattern(); return *this; } @@ -1294,7 +1260,7 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { if (s.length() == 0 || isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - if (strings->contains((void*) &s)) { + if (stringsContains(s)) { strings->removeElement((void*) &s); } else { _add(s); @@ -1325,7 +1291,7 @@ UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) { if ( c.strings!=NULL ) { for (int32_t i=0; isize(); ++i) { const UnicodeString* s = (const UnicodeString*)c.strings->elementAt(i); - if (!strings->contains((void*) s)) { + if (!stringsContains(*s)) { _add(*s); } } @@ -1347,7 +1313,13 @@ UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) { return *this; } retain(c.list, c.len, 0); - strings->retainAll(*c.strings); + if (hasStrings()) { + if (!c.hasStrings()) { + strings->removeAllElements(); + } else { + strings->retainAll(*c.strings); + } + } return *this; } @@ -1365,7 +1337,9 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) { return *this; } retain(c.list, c.len, 2); - strings->removeAll(*c.strings); + if (hasStrings() && c.hasStrings()) { + strings->removeAll(*c.strings); + } return *this; } @@ -1383,10 +1357,12 @@ UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) { } exclusiveOr(c.list, c.len, 0); - for (int32_t i=0; isize(); ++i) { - void* e = c.strings->elementAt(i); - if (!strings->removeElement(e)) { - _add(*(const UnicodeString*)e); + if (c.strings != nullptr) { + for (int32_t i=0; isize(); ++i) { + void* e = c.strings->elementAt(i); + if (strings == nullptr || !strings->removeElement(e)) { + _add(*(const UnicodeString*)e); + } } } return *this; @@ -1400,18 +1376,14 @@ UnicodeSet& UnicodeSet::clear(void) { if (isFrozen()) { return *this; } - if (list != NULL) { - list[0] = UNICODESET_HIGH; - } + list[0] = UNICODESET_HIGH; len = 1; releasePattern(); if (strings != NULL) { strings->removeAllElements(); } - if (list != NULL && strings != NULL) { - // Remove bogus - fFlags = 0; - } + // Remove bogus + fFlags = 0; return *this; } @@ -1445,10 +1417,6 @@ UChar32 UnicodeSet::getRangeEnd(int32_t index) const { return list[index*2 + 1] - 1; } -int32_t UnicodeSet::getStringCount() const { - return strings->size(); -} - const UnicodeString* UnicodeSet::getString(int32_t index) const { return (const UnicodeString*) strings->elementAt(index); } @@ -1462,22 +1430,32 @@ UnicodeSet& UnicodeSet::compact() { return *this; } // Delete buffer first to defragment memory less. - if (buffer != NULL) { + if (buffer != stackList) { uprv_free(buffer); buffer = NULL; - } - if (len < capacity) { - // Make the capacity equal to len or 1. - // We don't want to realloc of 0 size. - int32_t newCapacity = len + (len == 0); - UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * newCapacity); + bufferCapacity = 0; + } + if (list == stackList) { + // pass + } else if (len <= INITIAL_CAPACITY) { + uprv_memcpy(stackList, list, len * sizeof(UChar32)); + uprv_free(list); + list = stackList; + capacity = INITIAL_CAPACITY; + } else if ((len + 7) < capacity) { + // If we have more than a little unused capacity, shrink it to len. + UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * len); if (temp) { list = temp; - capacity = newCapacity; + capacity = len; } // else what the heck happened?! We allocated less memory! // Oh well. We'll keep our original array. } + if (strings != nullptr && strings->isEmpty()) { + delete strings; + strings = nullptr; + } return *this; } @@ -1488,10 +1466,8 @@ UnicodeSet& UnicodeSet::compact() { /** * Deserialize constructor. */ -UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization serialization, UErrorCode &ec) - : len(1), capacity(1+START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) { +UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization serialization, + UErrorCode &ec) { if(U_FAILURE(ec)) { setToBogus(); @@ -1506,24 +1482,15 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se return; } - allocateStrings(ec); - if (U_FAILURE(ec)) { - setToBogus(); - return; - } - // bmp? int32_t headerSize = ((data[0]&0x8000)) ?2:1; int32_t bmpLength = (headerSize==1)?data[0]:data[1]; - len = (((data[0]&0x7FFF)-bmpLength)/2)+bmpLength; + int32_t newLength = (((data[0]&0x7FFF)-bmpLength)/2)+bmpLength; #ifdef DEBUG_SERIALIZE - printf("dataLen %d headerSize %d bmpLen %d len %d. data[0]=%X/%X/%X/%X\n", dataLen,headerSize,bmpLength,len, data[0],data[1],data[2],data[3]); + printf("dataLen %d headerSize %d bmpLen %d len %d. data[0]=%X/%X/%X/%X\n", dataLen,headerSize,bmpLength,newLength, data[0],data[1],data[2],data[3]); #endif - capacity = len+1; - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(!list || U_FAILURE(ec)) { - setToBogus(); + if(!ensureCapacity(newLength + 1)) { // +1 for HIGH return; } // copy bmp @@ -1535,15 +1502,18 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se #endif } // copy smp - for(i=bmpLength;i MAX_LENGTH) { + newCapacity = MAX_LENGTH; + } + return newCapacity; + } +} + +bool UnicodeSet::ensureCapacity(int32_t newLen) { + if (newLen > MAX_LENGTH) { + newLen = MAX_LENGTH; + } if (newLen <= capacity) { - return; + return true; } - UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * (newLen + GROW_EXTRA)); + int32_t newCapacity = nextCapacity(newLen); + UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32)); if (temp == NULL) { - ec = U_MEMORY_ALLOCATION_ERROR; setToBogus(); // set the object to bogus state if an OOM failure occurred. - return; + return false; + } + // Copy only the actual contents. + uprv_memcpy(temp, list, len * sizeof(UChar32)); + if (list != stackList) { + uprv_free(list); } list = temp; - capacity = newLen + GROW_EXTRA; - // else we keep the original contents on the memory failure. + capacity = newCapacity; + return true; } -void UnicodeSet::ensureBufferCapacity(int32_t newLen, UErrorCode& ec) { - if (buffer != NULL && newLen <= bufferCapacity) - return; - UChar32* temp = (UChar32*) uprv_realloc(buffer, sizeof(UChar32) * (newLen + GROW_EXTRA)); +bool UnicodeSet::ensureBufferCapacity(int32_t newLen) { + if (newLen > MAX_LENGTH) { + newLen = MAX_LENGTH; + } + if (newLen <= bufferCapacity) { + return true; + } + int32_t newCapacity = nextCapacity(newLen); + UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32)); if (temp == NULL) { - ec = U_MEMORY_ALLOCATION_ERROR; setToBogus(); - return; + return false; + } + // The buffer has no contents to be copied. + // It is always filled from scratch after this call. + if (buffer != stackList) { + uprv_free(buffer); } buffer = temp; - bufferCapacity = newLen + GROW_EXTRA; - // else we keep the original contents on the memory failure. + bufferCapacity = newCapacity; + return true; } /** @@ -1727,9 +1729,7 @@ void UnicodeSet::exclusiveOr(const UChar32* other, int32_t otherLen, int8_t pola if (isFrozen() || isBogus()) { return; } - UErrorCode status = U_ZERO_ERROR; - ensureBufferCapacity(len + otherLen, status); - if (U_FAILURE(status)) { + if (!ensureBufferCapacity(len + otherLen)) { return; } @@ -1777,9 +1777,7 @@ void UnicodeSet::add(const UChar32* other, int32_t otherLen, int8_t polarity) { if (isFrozen() || isBogus() || other==NULL) { return; } - UErrorCode status = U_ZERO_ERROR; - ensureBufferCapacity(len + otherLen, status); - if (U_FAILURE(status)) { + if (!ensureBufferCapacity(len + otherLen)) { return; } @@ -1890,9 +1888,7 @@ void UnicodeSet::retain(const UChar32* other, int32_t otherLen, int8_t polarity) if (isFrozen() || isBogus()) { return; } - UErrorCode status = U_ZERO_ERROR; - ensureBufferCapacity(len + otherLen, status); - if (U_FAILURE(status)) { + if (!ensureBufferCapacity(len + otherLen)) { return; } @@ -2138,12 +2134,14 @@ UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, } } - for (int32_t i = 0; isize(); ++i) { - result.append(OPEN_BRACE); - _appendToPat(result, - *(const UnicodeString*) strings->elementAt(i), - escapeUnprintable); - result.append(CLOSE_BRACE); + if (strings != nullptr) { + for (int32_t i = 0; isize(); ++i) { + result.append(OPEN_BRACE); + _appendToPat(result, + *(const UnicodeString*) strings->elementAt(i), + escapeUnprintable); + result.append(CLOSE_BRACE); + } } return result.append(SET_CLOSE); } @@ -2162,13 +2160,12 @@ void UnicodeSet::releasePattern() { /** * Set the new pattern to cache. */ -void UnicodeSet::setPattern(const UnicodeString& newPat) { +void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) { releasePattern(); - int32_t newPatLen = newPat.length(); pat = (UChar *)uprv_malloc((newPatLen + 1) * sizeof(UChar)); if (pat) { patLen = newPatLen; - newPat.extractBetween(0, patLen, pat); + u_memcpy(pat, newPat, patLen); pat[patLen] = 0; } // else we don't care if malloc failed. This was just a nice cache. @@ -2177,30 +2174,15 @@ void UnicodeSet::setPattern(const UnicodeString& newPat) { UnicodeFunctor *UnicodeSet::freeze() { if(!isFrozen() && !isBogus()) { - // Do most of what compact() does before freezing because - // compact() will not work when the set is frozen. - // Small modification: Don't shrink if the savings would be tiny (<=GROW_EXTRA). - - // Delete buffer first to defragment memory less. - if (buffer != NULL) { - uprv_free(buffer); - buffer = NULL; - } - if (capacity > (len + GROW_EXTRA)) { - // Make the capacity equal to len or 1. - // We don't want to realloc of 0 size. - capacity = len + (len == 0); - list = (UChar32*) uprv_realloc(list, sizeof(UChar32) * capacity); - if (list == NULL) { // Check for memory allocation error. - setToBogus(); - return this; - } - } + compact(); // Optimize contains() and span() and similar functions. - if (!strings->isEmpty()) { + if (hasStrings()) { stringSpan = new UnicodeSetStringSpan(*this, *strings, UnicodeSetStringSpan::ALL); - if (stringSpan != NULL && !stringSpan->needsStringSpanUTF16()) { + if (stringSpan == nullptr) { + setToBogus(); + return this; + } else if (!stringSpan->needsStringSpanUTF16()) { // All strings are irrelevant for span() etc. because // all of each string's code points are contained in this set. // Do not check needsStringSpanUTF8() because UTF-8 has at most as @@ -2233,7 +2215,7 @@ int32_t UnicodeSet::span(const UChar *s, int32_t length, USetSpanCondition spanC } if(stringSpan!=NULL) { return stringSpan->span(s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::FWD_UTF16_NOT_CONTAINED : UnicodeSetStringSpan::FWD_UTF16_CONTAINED; @@ -2270,7 +2252,7 @@ int32_t UnicodeSet::spanBack(const UChar *s, int32_t length, USetSpanCondition s } if(stringSpan!=NULL) { return stringSpan->spanBack(s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::BACK_UTF16_NOT_CONTAINED : UnicodeSetStringSpan::BACK_UTF16_CONTAINED; @@ -2308,7 +2290,7 @@ int32_t UnicodeSet::spanUTF8(const char *s, int32_t length, USetSpanCondition sp } if(stringSpan!=NULL) { return stringSpan->spanUTF8((const uint8_t *)s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::FWD_UTF8_NOT_CONTAINED : UnicodeSetStringSpan::FWD_UTF8_CONTAINED; @@ -2346,7 +2328,7 @@ int32_t UnicodeSet::spanBackUTF8(const char *s, int32_t length, USetSpanConditio } if(stringSpan!=NULL) { return stringSpan->spanBackUTF8((const uint8_t *)s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::BACK_UTF8_NOT_CONTAINED : UnicodeSetStringSpan::BACK_UTF8_CONTAINED; diff --git a/deps/icu-small/source/common/uniset_closure.cpp b/deps/icu-small/source/common/uniset_closure.cpp index 97c7bc9d352ab9..882231ba1a5d5d 100644 --- a/deps/icu-small/source/common/uniset_closure.cpp +++ b/deps/icu-small/source/common/uniset_closure.cpp @@ -31,10 +31,6 @@ #include "util.h" #include "uvector.h" -// initial storage. Must be >= 0 -// *** same as in uniset.cpp ! *** -#define START_EXTRA 16 - U_NAMESPACE_BEGIN // TODO memory debugging provided inside uniset.cpp @@ -49,42 +45,16 @@ U_NAMESPACE_BEGIN UnicodeSet::UnicodeSet(const UnicodeString& pattern, uint32_t options, const SymbolTable* symbols, - UErrorCode& status) : - len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(status); - applyPattern(pattern, options, symbols, status); - } - } + UErrorCode& status) { + applyPattern(pattern, options, symbols, status); _dbgct(this); } UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, uint32_t options, const SymbolTable* symbols, - UErrorCode& status) : - len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(status); - applyPattern(pattern, pos, options, symbols, status); - } - } + UErrorCode& status) { + applyPattern(pattern, pos, options, symbols, status); _dbgct(this); } @@ -199,7 +169,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { // start with input set to guarantee inclusion // USET_CASE: remove strings because the strings will actually be reduced (folded); // therefore, start with no strings and add only those needed - if (attribute & USET_CASE_INSENSITIVE) { + if ((attribute & USET_CASE_INSENSITIVE) && foldSet.hasStrings()) { foldSet.strings->removeAllElements(); } @@ -234,7 +204,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { } } } - if (strings != NULL && strings->size() > 0) { + if (hasStrings()) { if (attribute & USET_CASE_INSENSITIVE) { for (int32_t j=0; jsize(); ++j) { str = *(const UnicodeString *) strings->elementAt(j); diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index 1312de209802b5..6f7918a91ab9ed 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -47,10 +47,6 @@ U_NAMESPACE_USE -// initial storage. Must be >= 0 -// *** same as in uniset.cpp ! *** -#define START_EXTRA 16 - // Define UChar constants using hex for EBCDIC compatibility // Used #define to reduce private static exports and memory access time. #define SET_OPEN ((UChar)0x005B) /*[*/ @@ -185,21 +181,8 @@ isPOSIXClose(const UnicodeString &pattern, int32_t pos) { * @param pattern a string specifying what characters are in the set */ UnicodeSet::UnicodeSet(const UnicodeString& pattern, - UErrorCode& status) : - len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(status); - applyPattern(pattern, status); - } - } + UErrorCode& status) { + applyPattern(pattern, status); _dbgct(this); } @@ -713,6 +696,11 @@ static UBool numericValueFilter(UChar32 ch, void* context) { return u_getNumericValue(ch) == *(double*)context; } +static UBool generalCategoryMaskFilter(UChar32 ch, void* context) { + int32_t value = *(int32_t*)context; + return (U_GET_GC_MASK((UChar32) ch) & value) != 0; +} + static UBool versionFilter(UChar32 ch, void* context) { static const UVersionInfo none = { 0, 0, 0, 0 }; UVersionInfo v; @@ -721,6 +709,16 @@ static UBool versionFilter(UChar32 ch, void* context) { return uprv_memcmp(&v, &none, sizeof(v)) > 0 && uprv_memcmp(&v, version, sizeof(v)) <= 0; } +typedef struct { + UProperty prop; + int32_t value; +} IntPropertyContext; + +static UBool intPropertyFilter(UChar32 ch, void* context) { + IntPropertyContext* c = (IntPropertyContext*)context; + return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value; +} + static UBool scriptExtensionsFilter(UChar32 ch, void* context) { return uscript_hasScript(ch, *(UScriptCode*)context); } @@ -781,43 +779,6 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter, namespace { -/** Maps map values to 1 if the mask contains their value'th bit, all others to 0. */ -uint32_t U_CALLCONV generalCategoryMaskFilter(const void *context, uint32_t value) { - uint32_t mask = *(const uint32_t *)context; - value = U_MASK(value) & mask; - if (value != 0) { value = 1; } - return value; -} - -/** Maps one map value to 1, all others to 0. */ -uint32_t U_CALLCONV intValueFilter(const void *context, uint32_t value) { - uint32_t v = *(const uint32_t *)context; - return value == v ? 1 : 0; -} - -} // namespace - -void UnicodeSet::applyIntPropertyValue(const UCPMap *map, - UCPMapValueFilter *filter, const void *context, - UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - clear(); - UChar32 start = 0, end; - uint32_t value; - while ((end = ucpmap_getRange(map, start, UCPMAP_RANGE_NORMAL, 0, - filter, context, &value)) >= 0) { - if (value != 0) { - add(start, end); - } - start = end + 1; - } - if (isBogus()) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } -} - -namespace { - static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { /* Note: we use ' ' in compiler code page */ int32_t j = 0; @@ -845,11 +806,10 @@ static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { UnicodeSet& UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) { - if (U_FAILURE(ec)) { return *this; } - // All of the following check isFrozen() before modifying this set. + if (U_FAILURE(ec) || isFrozen()) { return *this; } if (prop == UCHAR_GENERAL_CATEGORY_MASK) { - const UCPMap *map = u_getIntPropertyMap(UCHAR_GENERAL_CATEGORY, &ec); - applyIntPropertyValue(map, generalCategoryMaskFilter, &value, ec); + const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); + applyFilter(generalCategoryMaskFilter, &value, inclusions, ec); } else if (prop == UCHAR_SCRIPT_EXTENSIONS) { const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); UScriptCode script = (UScriptCode)value; @@ -866,14 +826,11 @@ UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) clear(); } } else if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) { - const UCPMap *map = u_getIntPropertyMap(prop, &ec); - applyIntPropertyValue(map, intValueFilter, &value, ec); + const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); + IntPropertyContext c = {prop, value}; + applyFilter(intPropertyFilter, &c, inclusions, ec); } else { - // This code used to always call getInclusions(property source) - // which sets an error for an unsupported property. ec = U_ILLEGAL_ARGUMENT_ERROR; - // Otherwise we would just clear() this set because - // getIntPropertyValue(c, prop) returns 0 for all code points. } return *this; } diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index ff85734d615efa..31b0ed84bee07d 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -309,8 +309,7 @@ UnicodeString::UnicodeString(const UnicodeString& that) { } UnicodeString::UnicodeString(UnicodeString &&src) U_NOEXCEPT { - fUnion.fFields.fLengthAndFlags = kShortString; - moveFrom(src); + copyFieldsFrom(src, TRUE); } UnicodeString::UnicodeString(const UnicodeString& that, @@ -572,7 +571,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { return *this; } -UnicodeString &UnicodeString::moveFrom(UnicodeString &src) U_NOEXCEPT { +UnicodeString &UnicodeString::operator=(UnicodeString &&src) U_NOEXCEPT { // No explicit check for self move assignment, consistent with standard library. // Self move assignment causes no crash nor leak but might make the object bogus. releaseArray(); @@ -580,7 +579,7 @@ UnicodeString &UnicodeString::moveFrom(UnicodeString &src) U_NOEXCEPT { return *this; } -// Same as moveFrom() except without memory management. +// Same as move assignment except without memory management. void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) U_NOEXCEPT { int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags; if(lengthAndFlags & kUsingStackBuffer) { diff --git a/deps/icu-small/source/common/uobject.cpp b/deps/icu-small/source/common/uobject.cpp index 1133dd9b67aaa6..e222b2ce9b9096 100644 --- a/deps/icu-small/source/common/uobject.cpp +++ b/deps/icu-small/source/common/uobject.cpp @@ -58,32 +58,32 @@ U_NAMESPACE_BEGIN * and replace with uprv_malloc/uprv_free. */ -void * U_EXPORT2 UMemory::operator new(size_t size) U_NO_THROW { +void * U_EXPORT2 UMemory::operator new(size_t size) U_NOEXCEPT { return uprv_malloc(size); } -void U_EXPORT2 UMemory::operator delete(void *p) U_NO_THROW { +void U_EXPORT2 UMemory::operator delete(void *p) U_NOEXCEPT { if(p!=NULL) { uprv_free(p); } } -void * U_EXPORT2 UMemory::operator new[](size_t size) U_NO_THROW { +void * U_EXPORT2 UMemory::operator new[](size_t size) U_NOEXCEPT { return uprv_malloc(size); } -void U_EXPORT2 UMemory::operator delete[](void *p) U_NO_THROW { +void U_EXPORT2 UMemory::operator delete[](void *p) U_NOEXCEPT { if(p!=NULL) { uprv_free(p); } } #if U_HAVE_DEBUG_LOCATION_NEW -void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NO_THROW { +void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NOEXCEPT { return UMemory::operator new(size); } -void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NO_THROW { +void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NOEXCEPT { UMemory::operator delete(p); } #endif /* U_HAVE_DEBUG_LOCATION_NEW */ diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 2421c15d2bd0b6..7d99675220eb5f 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -26,23 +26,131 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" #include "unicode/ucptrie.h" +#include "unicode/udata.h" #include "unicode/unorm2.h" #include "unicode/uscript.h" #include "unicode/ustring.h" #include "cstring.h" +#include "mutex.h" #include "normalizer2impl.h" #include "umutex.h" #include "ubidi_props.h" #include "uprops.h" #include "ucase.h" +#include "ucln_cmn.h" +#include "ulayout_props.h" #include "ustr_imp.h" -// ulayout_props_data.h is machine-generated by genprops -#define INCLUDED_FROM_UPROPS_CPP -#include "ulayout_props_data.h" - U_NAMESPACE_USE +// Unicode text layout properties data ----------------------------------------- + +namespace { + +icu::UInitOnce gLayoutInitOnce = U_INITONCE_INITIALIZER; +UDataMemory *gLayoutMemory = nullptr; + +UCPTrie *gInpcTrie = nullptr; // Indic_Positional_Category +UCPTrie *gInscTrie = nullptr; // Indic_Syllabic_Category +UCPTrie *gVoTrie = nullptr; // Vertical_Orientation + +int32_t gMaxInpcValue = 0; +int32_t gMaxInscValue = 0; +int32_t gMaxVoValue = 0; + +UBool U_CALLCONV uprops_cleanup() { + udata_close(gLayoutMemory); + gLayoutMemory = nullptr; + + ucptrie_close(gInpcTrie); + gInpcTrie = nullptr; + ucptrie_close(gInscTrie); + gInscTrie = nullptr; + ucptrie_close(gVoTrie); + gVoTrie = nullptr; + + gMaxInpcValue = 0; + gMaxInscValue = 0; + gMaxVoValue = 0; + + gLayoutInitOnce.reset(); + return TRUE; +} + +UBool U_CALLCONV +ulayout_isAcceptable(void * /*context*/, + const char * /* type */, const char * /*name*/, + const UDataInfo *pInfo) { + return pInfo->size >= 20 && + pInfo->isBigEndian == U_IS_BIG_ENDIAN && + pInfo->charsetFamily == U_CHARSET_FAMILY && + pInfo->dataFormat[0] == ULAYOUT_FMT_0 && + pInfo->dataFormat[1] == ULAYOUT_FMT_1 && + pInfo->dataFormat[2] == ULAYOUT_FMT_2 && + pInfo->dataFormat[3] == ULAYOUT_FMT_3 && + pInfo->formatVersion[0] == 1; +} + +// UInitOnce singleton initialization function +void U_CALLCONV ulayout_load(UErrorCode &errorCode) { + gLayoutMemory = udata_openChoice( + nullptr, ULAYOUT_DATA_TYPE, ULAYOUT_DATA_NAME, + ulayout_isAcceptable, nullptr, &errorCode); + if (U_FAILURE(errorCode)) { return; } + + const uint8_t *inBytes = (const uint8_t *)udata_getMemory(gLayoutMemory); + const int32_t *inIndexes = (const int32_t *)inBytes; + int32_t indexesLength = inIndexes[ULAYOUT_IX_INDEXES_LENGTH]; + if (indexesLength < 12) { + errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes. + return; + } + int32_t offset = indexesLength * 4; + int32_t top = inIndexes[ULAYOUT_IX_INPC_TRIE_TOP]; + int32_t trieSize = top - offset; + if (trieSize >= 16) { + gInpcTrie = ucptrie_openFromBinary( + UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY, + inBytes + offset, trieSize, nullptr, &errorCode); + } + offset = top; + top = inIndexes[ULAYOUT_IX_INSC_TRIE_TOP]; + trieSize = top - offset; + if (trieSize >= 16) { + gInscTrie = ucptrie_openFromBinary( + UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY, + inBytes + offset, trieSize, nullptr, &errorCode); + } + offset = top; + top = inIndexes[ULAYOUT_IX_VO_TRIE_TOP]; + trieSize = top - offset; + if (trieSize >= 16) { + gVoTrie = ucptrie_openFromBinary( + UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY, + inBytes + offset, trieSize, nullptr, &errorCode); + } + + uint32_t maxValues = inIndexes[ULAYOUT_IX_MAX_VALUES]; + gMaxInpcValue = maxValues >> ULAYOUT_MAX_INPC_SHIFT; + gMaxInscValue = (maxValues >> ULAYOUT_MAX_INSC_SHIFT) & 0xff; + gMaxVoValue = (maxValues >> ULAYOUT_MAX_VO_SHIFT) & 0xff; + + ucln_common_registerCleanup(UCLN_COMMON_UPROPS, uprops_cleanup); +} + +UBool ulayout_ensureData(UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + umtx_initOnce(gLayoutInitOnce, &ulayout_load, errorCode); + return U_SUCCESS(errorCode); +} + +UBool ulayout_ensureData() { + UErrorCode errorCode = U_ZERO_ERROR; + return ulayout_ensureData(errorCode); +} + +} // namespace + /* general properties API functions ----------------------------------------- */ struct BinaryProperty; @@ -434,15 +542,29 @@ static int32_t getTrailCombiningClass(const IntProperty &/*prop*/, UChar32 c, UP #endif static int32_t getInPC(const IntProperty &, UChar32 c, UProperty) { - return ucptrie_get(&inpc_trie, c); + return ulayout_ensureData() && gInpcTrie != nullptr ? ucptrie_get(gInpcTrie, c) : 0; } static int32_t getInSC(const IntProperty &, UChar32 c, UProperty) { - return ucptrie_get(&insc_trie, c); + return ulayout_ensureData() && gInscTrie != nullptr ? ucptrie_get(gInscTrie, c) : 0; } static int32_t getVo(const IntProperty &, UChar32 c, UProperty) { - return ucptrie_get(&vo_trie, c); + return ulayout_ensureData() && gVoTrie != nullptr ? ucptrie_get(gVoTrie, c) : 0; +} + +static int32_t layoutGetMaxValue(const IntProperty &/*prop*/, UProperty which) { + if (!ulayout_ensureData()) { return 0; } + switch (which) { + case UCHAR_INDIC_POSITIONAL_CATEGORY: + return gMaxInpcValue; + case UCHAR_INDIC_SYLLABIC_CATEGORY: + return gMaxInscValue; + case UCHAR_VERTICAL_ORIENTATION: + return gMaxVoValue; + default: + return 0; + } } static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ @@ -480,9 +602,9 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ { 2, UPROPS_SB_MASK, UPROPS_SB_SHIFT, defaultGetValue, defaultGetMaxValue }, { 2, UPROPS_WB_MASK, UPROPS_WB_SHIFT, defaultGetValue, defaultGetMaxValue }, { UPROPS_SRC_BIDI, 0, 0, getBiDiPairedBracketType, biDiGetMaxValue }, - { UPROPS_SRC_INPC, 0, maxInPCValue, getInPC, getMaxValueFromShift }, - { UPROPS_SRC_INSC, 0, maxInSCValue, getInSC, getMaxValueFromShift }, - { UPROPS_SRC_VO, 0, maxVoValue, getVo, getMaxValueFromShift }, + { UPROPS_SRC_INPC, 0, 0, getInPC, layoutGetMaxValue }, + { UPROPS_SRC_INSC, 0, 0, getInSC, layoutGetMaxValue }, + { UPROPS_SRC_VO, 0, 0, getVo, layoutGetMaxValue }, }; U_CAPI int32_t U_EXPORT2 @@ -586,23 +708,28 @@ uprops_getSource(UProperty which) { U_CFUNC void U_EXPORT2 uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *pErrorCode) { - if (U_FAILURE(*pErrorCode)) { return; } + if (!ulayout_ensureData(*pErrorCode)) { return; } const UCPTrie *trie; switch (src) { case UPROPS_SRC_INPC: - trie = &inpc_trie; + trie = gInpcTrie; break; case UPROPS_SRC_INSC: - trie = &insc_trie; + trie = gInscTrie; break; case UPROPS_SRC_VO: - trie = &vo_trie; + trie = gVoTrie; break; default: *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } + if (trie == nullptr) { + *pErrorCode = U_MISSING_RESOURCE_ERROR; + return; + } + // Add the start code point of each same-value range of the trie. UChar32 start = 0, end; while ((end = ucptrie_getRange(trie, start, UCPMAP_RANGE_NORMAL, 0, diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index 1a8e4e84f7445d..c7d648694ee5c3 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -95,8 +95,15 @@ enum { * denominator: den = 20<<(frac20>>2) */ UPROPS_NTV_FRACTION20_START=UPROPS_NTV_BASE60_START+36, // 0x300+9*4=0x324 + /** + * Fraction-32 values: + * frac32 = ntv-0x34c = 0..15 -> 1|3|5|7 / 32|64|128|256 + * numerator: num = 2*(frac32&3)+1 + * denominator: den = 32<<(frac32>>2) + */ + UPROPS_NTV_FRACTION32_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c /** No numeric value (yet). */ - UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c + UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION32_START+16, // 0x34c+4*4=0x35c UPROPS_NTV_MAX_SMALL_INT=UPROPS_NTV_FRACTION_START-UPROPS_NTV_NUMERIC_START-1 }; @@ -462,7 +469,6 @@ class UnicodeSet; class CharacterProperties { public: CharacterProperties() = delete; - static void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode); static const UnicodeSet *getInclusionsForProperty(UProperty prop, UErrorCode &errorCode); }; diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 3da73421c0cfb7..c9f2c860da7c33 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -21,6 +21,7 @@ ****************************************************************************** */ +#include "unicode/ures.h" #include "unicode/ustring.h" #include "unicode/ucnv.h" #include "charstr.h" @@ -48,7 +49,10 @@ TODO: This cache should probably be removed when the deprecated code is static UHashtable *cache = NULL; static icu::UInitOnce gCacheInitOnce; -static UMutex resbMutex = U_MUTEX_INITIALIZER; +static UMutex *resbMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} /* INTERNAL: hashes an entry */ static int32_t U_CALLCONV hashEntry(const UHashTok parm) { @@ -92,13 +96,13 @@ static UBool chopLocale(char *name) { * Internal function */ static void entryIncrease(UResourceDataEntry *entry) { - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); entry->fCountExisting++; while(entry->fParent != NULL) { entry = entry->fParent; entry->fCountExisting++; } - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); } /** @@ -180,9 +184,9 @@ static int32_t ures_flushCache() /*if shared data hasn't even been lazy evaluated yet * return 0 */ - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); if (cache == NULL) { - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return 0; } @@ -214,7 +218,7 @@ static int32_t ures_flushCache() * got decremented by free_entry(). */ } while(deletedMore); - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return rbDeletedNum; } @@ -228,9 +232,9 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void) { const UHashElement *e; UResourceDataEntry *resB; - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); if (cache == NULL) { - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); fprintf(stderr,"%s:%d: RB Cache is NULL.\n", __FILE__, __LINE__); return FALSE; } @@ -250,7 +254,7 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void) { fprintf(stderr,"%s:%d: RB Cache still contains %d items.\n", __FILE__, __LINE__, uhash_count(cache)); - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return cacheNotEmpty; } @@ -488,6 +492,9 @@ findFirstExisting(const char* path, char* name, /*Fallback data stuff*/ *hasChopped = chopLocale(name); + if (*hasChopped && *name == '\0') { + uprv_strcpy(name, "und"); + } } return r; } @@ -512,6 +519,18 @@ U_CFUNC void ures_initStackObject(UResourceBundle* resB) { ures_setIsStackObject(resB, TRUE); } +U_NAMESPACE_BEGIN + +StackUResourceBundle::StackUResourceBundle() { + ures_initStackObject(&bundle); +} + +StackUResourceBundle::~StackUResourceBundle() { + ures_close(&bundle); +} + +U_NAMESPACE_END + static UBool // returns U_SUCCESS(*status) loadParentsExceptRoot(UResourceDataEntry *&t1, char name[], int32_t nameCapacity, @@ -647,7 +666,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, } } - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); { /* umtx_lock */ /* We're going to skip all the locales that do not have any data */ r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus); @@ -746,7 +765,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, } } /* umtx_lock */ finishUnlock: - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); if(U_SUCCESS(*status)) { if(intStatus != U_ZERO_ERROR) { @@ -771,7 +790,7 @@ entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) { return NULL; } - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); // findFirstExisting() without fallbacks. UResourceDataEntry *r = init_entry(localeID, path, status); if(U_SUCCESS(*status)) { @@ -809,7 +828,7 @@ entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) { t1 = t1->fParent; } } - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return r; } @@ -852,9 +871,9 @@ static void entryCloseInt(UResourceDataEntry *resB) { */ static void entryClose(UResourceDataEntry *resB) { - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); entryCloseInt(resB); - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); } /* @@ -1110,7 +1129,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, UResourceDataEntry *dataEntry = mainRes->fData; char stackPath[URES_MAX_BUFFER_SIZE]; char *pathBuf = stackPath, *myPath = pathBuf; - if(uprv_strlen(keyPath) > URES_MAX_BUFFER_SIZE) { + if(uprv_strlen(keyPath) >= UPRV_LENGTHOF(stackPath)) { pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char)); if(pathBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -2300,11 +2319,13 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) { } /** - * API: This function is used to open a resource bundle + * Internal API: This function is used to open a resource bundle * proper fallback chaining is executed while initialization. * The result is stored in cache for later fallback search. + * + * Same as ures_open(), but uses the fill-in parameter and does not allocate a new bundle. */ -U_CAPI void U_EXPORT2 +U_INTERNAL void U_EXPORT2 ures_openFillIn(UResourceBundle *r, const char* path, const char* localeID, UErrorCode* status) { if(U_SUCCESS(*status) && r == NULL) { @@ -2314,6 +2335,18 @@ ures_openFillIn(UResourceBundle *r, const char* path, ures_openWithType(r, path, localeID, URES_OPEN_LOCALE_DEFAULT_ROOT, status); } +/** + * Same as ures_openDirect(), but uses the fill-in parameter and does not allocate a new bundle. + */ +U_INTERNAL void U_EXPORT2 +ures_openDirectFillIn(UResourceBundle *r, const char* path, const char* localeID, UErrorCode* status) { + if(U_SUCCESS(*status) && r == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + ures_openWithType(r, path, localeID, URES_OPEN_DIRECT, status); +} + /** * API: Counts members. For arrays and tables, returns number of resources. * For strings, returns 1. diff --git a/deps/icu-small/source/common/uresimp.h b/deps/icu-small/source/common/uresimp.h index e4f75c9f115d0e..16144012a5bc0d 100644 --- a/deps/icu-small/source/common/uresimp.h +++ b/deps/icu-small/source/common/uresimp.h @@ -11,6 +11,7 @@ #define URESIMP_H #include "unicode/ures.h" +#include "unicode/utypes.h" #include "uresdata.h" @@ -82,6 +83,60 @@ struct UResourceBundle { U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB); +#ifdef __cplusplus + +U_NAMESPACE_BEGIN + +/** + * \class StackUResourceBundle + * "Smart pointer" like class, closes a UResourceBundle via ures_close(). + * + * This code: + * + * StackUResourceBundle bundle; + * foo(bundle.getAlias()); + * + * Is equivalent to this code: + * + * UResourceBundle bundle; + * ures_initStackObject(&bundle); + * foo(&bundle); + * ures_close(&bundle); + * + * @see LocalUResourceBundlePointer + * @internal + */ +class U_COMMON_API StackUResourceBundle { +public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif + + StackUResourceBundle(); + ~StackUResourceBundle(); + + UResourceBundle* getAlias() { return &bundle; } + + UResourceBundle& ref() { return bundle; } + const UResourceBundle& ref() const { return bundle; } + + StackUResourceBundle(const StackUResourceBundle&) = delete; + StackUResourceBundle& operator=(const StackUResourceBundle&) = delete; + + StackUResourceBundle(StackUResourceBundle&&) = delete; + StackUResourceBundle& operator=(StackUResourceBundle&&) = delete; + +private: + UResourceBundle bundle; +}; + +U_NAMESPACE_END + +#endif /* __cplusplus */ + /** * Opens a resource bundle for the locale; * if there is not even a base language bundle, then loads the root bundle; @@ -275,4 +330,27 @@ U_CAPI const char* U_EXPORT2 ures_getLocaleInternal(const UResourceBundle* resourceBundle, UErrorCode* status); +/** + * Same as ures_openDirect() but uses the fill-in parameter instead of allocating a new bundle. + * + * @param r The existing UResourceBundle to fill in. If NULL then status will be + * set to U_ILLEGAL_ARGUMENT_ERROR. + * @param packageName The packageName and locale together point to an ICU udata object, + * as defined by udata_open( packageName, "res", locale, err) + * or equivalent. Typically, packageName will refer to a (.dat) file, or to + * a package registered with udata_setAppData(). Using a full file or directory + * pathname for packageName is deprecated. If NULL, ICU data will be used. + * @param locale specifies the locale for which we want to open the resource + * if NULL, the default locale will be used. If strlen(locale) == 0 + * root locale will be used. + * @param status The error code. + * @see ures_openDirect + * @internal + */ +U_CAPI void U_EXPORT2 +ures_openDirectFillIn(UResourceBundle *r, + const char *packageName, + const char *locale, + UErrorCode *status); + #endif /*URESIMP_H*/ diff --git a/deps/icu-small/source/common/uscript.cpp b/deps/icu-small/source/common/uscript.cpp index 83b5f7ef168f7e..98528c158b4387 100644 --- a/deps/icu-small/source/common/uscript.cpp +++ b/deps/icu-small/source/common/uscript.cpp @@ -18,8 +18,11 @@ #include "unicode/uchar.h" #include "unicode/uscript.h" #include "unicode/uloc.h" +#include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "ulocimp.h" static const UScriptCode JAPANESE[3] = { USCRIPT_KATAKANA, USCRIPT_HIRAGANA, USCRIPT_HAN }; static const UScriptCode KOREAN[2] = { USCRIPT_HANGUL, USCRIPT_HAN }; @@ -98,7 +101,6 @@ uscript_getCode(const char* nameOrAbbrOrLocale, int32_t capacity, UErrorCode* err){ UBool triedCode; - char likely[ULOC_FULLNAME_CAPACITY]; UErrorCode internalErrorCode; int32_t length; @@ -125,10 +127,13 @@ uscript_getCode(const char* nameOrAbbrOrLocale, if(U_FAILURE(*err) || length != 0) { return length; } - (void)uloc_addLikelySubtags(nameOrAbbrOrLocale, - likely, UPRV_LENGTHOF(likely), &internalErrorCode); + icu::CharString likely; + { + icu::CharStringByteSink sink(&likely); + ulocimp_addLikelySubtags(nameOrAbbrOrLocale, sink, &internalErrorCode); + } if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) { - length = getCodesFromLocale(likely, fillIn, capacity, err); + length = getCodesFromLocale(likely.data(), fillIn, capacity, err); if(U_FAILURE(*err) || length != 0) { return length; } diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index bfdb68c7a9c998..ee120b4ca1d34a 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -229,6 +229,10 @@ const int32_t SCRIPT_PROPS[] = { 0x10D12 | LIMITED_USE | RTL, // Rohg 0x10F42 | EXCLUSION | RTL, // Sogd 0x10F19 | EXCLUSION | RTL, // Sogo + 0x10FF1 | EXCLUSION | RTL, // Elym + 0x1E108 | LIMITED_USE, // Hmnp + 0x119CE | EXCLUSION, // Nand + 0x1E2E1 | LIMITED_USE, // Wcho // End copy-paste from parsescriptmetadata.py }; diff --git a/deps/icu-small/source/common/uset.cpp b/deps/icu-small/source/common/uset.cpp index 75ff5ddff52d1a..265a300b19060c 100644 --- a/deps/icu-small/source/common/uset.cpp +++ b/deps/icu-small/source/common/uset.cpp @@ -249,7 +249,7 @@ class USetAccess /* not : public UObject because all methods are static */ { public: /* Try to have the compiler inline these*/ inline static int32_t getStringCount(const UnicodeSet& set) { - return set.getStringCount(); + return set.stringsSize(); } inline static const UnicodeString* getString(const UnicodeSet& set, int32_t i) { diff --git a/deps/icu-small/source/common/usetiter.cpp b/deps/icu-small/source/common/usetiter.cpp index 5d5d3c4e3d6200..5c9780548c182d 100644 --- a/deps/icu-small/source/common/usetiter.cpp +++ b/deps/icu-small/source/common/usetiter.cpp @@ -116,7 +116,7 @@ void UnicodeSetIterator::reset() { stringCount = 0; } else { endRange = set->getRangeCount() - 1; - stringCount = set->strings->size(); + stringCount = set->stringsSize(); } range = 0; endElement = -1; diff --git a/deps/icu-small/source/common/usprep.cpp b/deps/icu-small/source/common/usprep.cpp index 1e54e6cab59eb2..9155ae077b3497 100644 --- a/deps/icu-small/source/common/usprep.cpp +++ b/deps/icu-small/source/common/usprep.cpp @@ -47,7 +47,10 @@ Static cache for already opened StringPrep profiles static UHashtable *SHARED_DATA_HASHTABLE = NULL; static icu::UInitOnce gSharedDataInitOnce; -static UMutex usprepMutex = U_MUTEX_INITIALIZER; +static UMutex *usprepMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} /* format version of spp file */ //static uint8_t formatVersion[4]={ 0, 0, 0, 0 }; @@ -148,9 +151,9 @@ usprep_internal_flushCache(UBool noRefCount){ * if shared data hasn't even been lazy evaluated yet * return 0 */ - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); if (SHARED_DATA_HASHTABLE == NULL) { - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); return 0; } @@ -181,7 +184,7 @@ usprep_internal_flushCache(UBool noRefCount){ } } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); return deletedNum; } @@ -259,7 +262,7 @@ loadData(UStringPrepProfile* profile, } /* in the mutex block, set the data for this process */ - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); if(profile->sprepData==NULL) { profile->sprepData=dataMemory; dataMemory=NULL; @@ -268,7 +271,7 @@ loadData(UStringPrepProfile* profile, } else { p=(const int32_t *)udata_getMemory(profile->sprepData); } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); /* initialize some variables */ profile->mappingData=(uint16_t *)((uint8_t *)(p+_SPREP_INDEX_TOP)+profile->indexes[_SPREP_INDEX_TRIE_SIZE]); @@ -325,12 +328,12 @@ usprep_getProfile(const char* path, stackKey.path = (char*) path; /* fetch the data from the cache */ - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); if(profile != NULL) { profile->refCount++; } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); if(profile == NULL) { /* else load the data and put the data in the cache */ @@ -362,7 +365,7 @@ usprep_getProfile(const char* path, return NULL; } - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); // If another thread already inserted the same key/value, refcount and cleanup our thread data profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); if(profile != NULL) { @@ -383,7 +386,7 @@ usprep_getProfile(const char* path, profile->refCount = 1; uhash_put(SHARED_DATA_HASHTABLE, key.orphan(), profile, status); } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); } return profile; @@ -422,12 +425,12 @@ usprep_close(UStringPrepProfile* profile){ return; } - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); /* decrement the ref count*/ if(profile->refCount > 0){ profile->refCount--; } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); } diff --git a/deps/icu-small/source/common/ustr_cnv.cpp b/deps/icu-small/source/common/ustr_cnv.cpp index eb37232c25d50b..d2c2afea1592b3 100644 --- a/deps/icu-small/source/common/ustr_cnv.cpp +++ b/deps/icu-small/source/common/ustr_cnv.cpp @@ -40,14 +40,14 @@ u_getDefaultConverter(UErrorCode *status) UConverter *converter = NULL; if (gDefaultConverter != NULL) { - umtx_lock(NULL); + icu::umtx_lock(NULL); /* need to check to make sure it wasn't taken out from under us */ if (gDefaultConverter != NULL) { converter = gDefaultConverter; gDefaultConverter = NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); } /* if the cache was empty, create a converter */ @@ -70,12 +70,12 @@ u_releaseDefaultConverter(UConverter *converter) ucnv_reset(converter); } ucnv_enableCleanup(); - umtx_lock(NULL); + icu::umtx_lock(NULL); if(gDefaultConverter == NULL) { gDefaultConverter = converter; converter = NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); } if(converter != NULL) { @@ -89,14 +89,14 @@ u_flushDefaultConverter() UConverter *converter = NULL; if (gDefaultConverter != NULL) { - umtx_lock(NULL); + icu::umtx_lock(NULL); /* need to check to make sure it wasn't taken out from under us */ if (gDefaultConverter != NULL) { converter = gDefaultConverter; gDefaultConverter = NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); } /* if the cache was populated, flush it */ diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 89888cf336b0e9..056b40eb4175f6 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -77,13 +77,7 @@ UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return 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; + UPRV_UNREACHABLE; // really should not be called } UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const { if (U_SUCCESS(errorCode)) { @@ -105,10 +99,8 @@ void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) { } } } -void WholeStringBreakIterator::adoptText(CharacterIterator* it) { - U_ASSERT(FALSE); // should not be called - length = it->getLength(); - delete it; +void WholeStringBreakIterator::adoptText(CharacterIterator*) { + UPRV_UNREACHABLE; // should not be called } int32_t WholeStringBreakIterator::first() { return 0; } diff --git a/deps/icu-small/source/common/utrace.cpp b/deps/icu-small/source/common/utrace.cpp index 7d0ddc6f8b0339..01bdb38e907518 100644 --- a/deps/icu-small/source/common/utrace.cpp +++ b/deps/icu-small/source/common/utrace.cpp @@ -67,8 +67,7 @@ utrace_exit(int32_t fnNumber, int32_t returnType, ...) { fmt = gExitFmtPtrStatus; break; default: - U_ASSERT(FALSE); - fmt = gExitFmt; + UPRV_UNREACHABLE; } va_start(args, returnType); diff --git a/deps/icu-small/source/common/utrie2_builder.cpp b/deps/icu-small/source/common/utrie2_builder.cpp index 80e09c9c26b3e1..8de824cc3d48cb 100644 --- a/deps/icu-small/source/common/utrie2_builder.cpp +++ b/deps/icu-small/source/common/utrie2_builder.cpp @@ -309,6 +309,7 @@ utrie2_clone(const UTrie2 *other, UErrorCode *pErrorCode) { trie=(UTrie2 *)uprv_malloc(sizeof(UTrie2)); if(trie==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return NULL; } uprv_memcpy(trie, other, sizeof(UTrie2)); @@ -333,6 +334,7 @@ utrie2_clone(const UTrie2 *other, UErrorCode *pErrorCode) { } if(trie->memory==NULL && trie->newTrie==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; uprv_free(trie); trie=NULL; } diff --git a/deps/icu-small/source/common/uvector.h b/deps/icu-small/source/common/uvector.h index ad75e23400aa9b..a7625cd01ac59a 100644 --- a/deps/icu-small/source/common/uvector.h +++ b/deps/icu-small/source/common/uvector.h @@ -142,19 +142,19 @@ class U_COMMON_API UVector : public UObject { UBool equals(const UVector &other) const; - void* firstElement(void) const; + inline void* firstElement(void) const; - void* lastElement(void) const; + inline void* lastElement(void) const; - int32_t lastElementi(void) const; + inline int32_t lastElementi(void) const; int32_t indexOf(void* obj, int32_t startIndex = 0) const; int32_t indexOf(int32_t obj, int32_t startIndex = 0) const; - UBool contains(void* obj) const; + inline UBool contains(void* obj) const; - UBool contains(int32_t obj) const; + inline UBool contains(int32_t obj) const; UBool containsAll(const UVector& other) const; @@ -168,9 +168,9 @@ class U_COMMON_API UVector : public UObject { void removeAllElements(); - int32_t size(void) const; + inline int32_t size(void) const; - UBool isEmpty(void) const; + inline UBool isEmpty(void) const; UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status); @@ -195,7 +195,7 @@ class U_COMMON_API UVector : public UObject { UElementsAreEqual *setComparer(UElementsAreEqual *c); - void* operator[](int32_t index) const; + inline void* operator[](int32_t index) const; /** * Removes the element at the given index from this vector and @@ -309,19 +309,19 @@ class U_COMMON_API UStack : public UVector { // It's okay not to have a virtual destructor (in UVector) // because UStack has no special cleanup to do. - UBool empty(void) const; + inline UBool empty(void) const; - void* peek(void) const; + inline void* peek(void) const; - int32_t peeki(void) const; + inline int32_t peeki(void) const; void* pop(void); int32_t popi(void); - void* push(void* obj, UErrorCode &status); + inline void* push(void* obj, UErrorCode &status); - int32_t push(int32_t i, UErrorCode &status); + inline int32_t push(int32_t i, UErrorCode &status); /* If the object o occurs as an item in this stack, diff --git a/deps/icu-small/source/common/uvectr32.h b/deps/icu-small/source/common/uvectr32.h index 3174e94c9f55a9..91a2dd2009eecb 100644 --- a/deps/icu-small/source/common/uvectr32.h +++ b/deps/icu-small/source/common/uvectr32.h @@ -97,21 +97,21 @@ class U_COMMON_API UVector32 : public UObject { // java.util.Vector API //------------------------------------------------------------ - void addElement(int32_t elem, UErrorCode &status); + inline void addElement(int32_t elem, UErrorCode &status); void setElementAt(int32_t elem, int32_t index); void insertElementAt(int32_t elem, int32_t index, UErrorCode &status); - int32_t elementAti(int32_t index) const; + inline int32_t elementAti(int32_t index) const; UBool equals(const UVector32 &other) const; - int32_t lastElementi(void) const; + inline int32_t lastElementi(void) const; int32_t indexOf(int32_t elem, int32_t startIndex = 0) const; - UBool contains(int32_t elem) const; + inline UBool contains(int32_t elem) const; UBool containsAll(const UVector32& other) const; @@ -123,9 +123,9 @@ class U_COMMON_API UVector32 : public UObject { void removeAllElements(); - int32_t size(void) const; + inline int32_t size(void) const; - UBool isEmpty(void) const; + inline UBool isEmpty(void) const; // Inline. Use this one for speedy size check. inline UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status); @@ -163,7 +163,7 @@ class U_COMMON_API UVector32 : public UObject { /** * Returns a pointer to the internal array holding the vector. */ - int32_t *getBuffer() const; + inline int32_t *getBuffer() const; /** * Set the maximum allowed buffer capacity for this vector/stack. @@ -197,16 +197,16 @@ class U_COMMON_API UVector32 : public UObject { // In the original UVector, these were in a separate derived class, UStack. // Here in UVector32, they are all together. public: - UBool empty(void) const; // TODO: redundant, same as empty(). Remove it? + inline UBool empty(void) const; // TODO: redundant, same as empty(). Remove it? - int32_t peeki(void) const; + inline int32_t peeki(void) const; - int32_t popi(void); + inline int32_t popi(void); - int32_t push(int32_t i, UErrorCode &status); + inline int32_t push(int32_t i, UErrorCode &status); - int32_t *reserveBlock(int32_t size, UErrorCode &status); - int32_t *popFrame(int32_t size); + inline int32_t *reserveBlock(int32_t size, UErrorCode &status); + inline int32_t *popFrame(int32_t size); }; diff --git a/deps/icu-small/source/common/uvectr64.h b/deps/icu-small/source/common/uvectr64.h index 1db4a1fe2ea3c4..6d26863eabc00d 100644 --- a/deps/icu-small/source/common/uvectr64.h +++ b/deps/icu-small/source/common/uvectr64.h @@ -96,17 +96,17 @@ class U_COMMON_API UVector64 : public UObject { // subset of java.util.Vector API //------------------------------------------------------------ - void addElement(int64_t elem, UErrorCode &status); + inline void addElement(int64_t elem, UErrorCode &status); void setElementAt(int64_t elem, int32_t index); void insertElementAt(int64_t elem, int32_t index, UErrorCode &status); - int64_t elementAti(int32_t index) const; + inline int64_t elementAti(int32_t index) const; //UBool equals(const UVector64 &other) const; - int64_t lastElementi(void) const; + inline int64_t lastElementi(void) const; //int32_t indexOf(int64_t elem, int32_t startIndex = 0) const; @@ -122,7 +122,7 @@ class U_COMMON_API UVector64 : public UObject { void removeAllElements(); - int32_t size(void) const; + inline int32_t size(void) const; inline UBool isEmpty(void) const { return count == 0; } @@ -152,7 +152,7 @@ class U_COMMON_API UVector64 : public UObject { /** * Returns a pointer to the internal array holding the vector. */ - int64_t *getBuffer() const; + inline int64_t *getBuffer() const; /** * Set the maximum allowed buffer capacity for this vector/stack. @@ -190,12 +190,12 @@ class U_COMMON_API UVector64 : public UObject { //int64_t peeki(void) const; - int64_t popi(void); + inline int64_t popi(void); - int64_t push(int64_t i, UErrorCode &status); + inline int64_t push(int64_t i, UErrorCode &status); - int64_t *reserveBlock(int32_t size, UErrorCode &status); - int64_t *popFrame(int32_t size); + inline int64_t *reserveBlock(int32_t size, UErrorCode &status); + inline int64_t *popFrame(int32_t size); }; diff --git a/deps/icu-small/source/common/wintz.cpp b/deps/icu-small/source/common/wintz.cpp index 764d99d06b30e7..115512e704cced 100644 --- a/deps/icu-small/source/common/wintz.cpp +++ b/deps/icu-small/source/common/wintz.cpp @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN -// The value of MAX_TIMEZONE_ID_LENGTH is 128, which is defined in DYNAMIC_TIME_ZONE_INFORMATION +// The max size of TimeZoneKeyName is 128, defined in DYNAMIC_TIME_ZONE_INFORMATION #define MAX_TIMEZONE_ID_LENGTH 128 /** @@ -44,7 +44,7 @@ U_NAMESPACE_BEGIN * Note: We use the Win32 API GetDynamicTimeZoneInformation to get the current time zone info. * This API returns a non-localized time zone name, which we can then map to an ICU time zone name. */ -U_CFUNC const char* U_EXPORT2 +U_INTERNAL const char* U_EXPORT2 uprv_detectWindowsTimeZone() { UErrorCode status = U_ZERO_ERROR; @@ -79,26 +79,25 @@ uprv_detectWindowsTimeZone() // convert from wchar_t* (UTF-16 on Windows) to char* (UTF-8). u_strToUTF8(dynamicTZKeyName, UPRV_LENGTHOF(dynamicTZKeyName), nullptr, - reinterpret_cast(dynamicTZI.TimeZoneKeyName), UPRV_LENGTHOF(dynamicTZI.TimeZoneKeyName), &status); + reinterpret_cast(dynamicTZI.TimeZoneKeyName), -1, &status); if (U_FAILURE(status)) { return nullptr; } if (dynamicTZI.TimeZoneKeyName[0] != 0) { - UResourceBundle winTZ; - ures_initStackObject(&winTZ); - ures_getByKey(bundle.getAlias(), dynamicTZKeyName, &winTZ, &status); + StackUResourceBundle winTZ; + ures_getByKey(bundle.getAlias(), dynamicTZKeyName, winTZ.getAlias(), &status); if (U_SUCCESS(status)) { const UChar* icuTZ = nullptr; if (errorCode != 0) { - icuTZ = ures_getStringByKey(&winTZ, ISOcode, &len, &status); + icuTZ = ures_getStringByKey(winTZ.getAlias(), ISOcode, &len, &status); } if (errorCode == 0 || icuTZ == nullptr) { /* fallback to default "001" and reset status */ status = U_ZERO_ERROR; - icuTZ = ures_getStringByKey(&winTZ, "001", &len, &status); + icuTZ = ures_getStringByKey(winTZ.getAlias(), "001", &len, &status); } if (U_SUCCESS(status)) { @@ -111,7 +110,6 @@ uprv_detectWindowsTimeZone() tmpid[index] = '\0'; } } - ures_close(&winTZ); } // Copy the timezone ID to icuid to be returned. diff --git a/deps/icu-small/source/common/wintz.h b/deps/icu-small/source/common/wintz.h index 0625bb204b197c..9140d2729a98f8 100644 --- a/deps/icu-small/source/common/wintz.h +++ b/deps/icu-small/source/common/wintz.h @@ -28,7 +28,7 @@ U_CDECL_BEGIN typedef struct _TIME_ZONE_INFORMATION TIME_ZONE_INFORMATION; U_CDECL_END -U_CFUNC const char* U_EXPORT2 +U_INTERNAL const char* U_EXPORT2 uprv_detectWindowsTimeZone(); #endif /* U_PLATFORM_USES_ONLY_WIN32_API */ diff --git a/deps/icu-small/source/data/in/icudt63l.dat b/deps/icu-small/source/data/in/icudt64l.dat similarity index 58% rename from deps/icu-small/source/data/in/icudt63l.dat rename to deps/icu-small/source/data/in/icudt64l.dat index 60f57612c0d0e32564ed40c84177cdddcea92062..113b88a48048055426a004b008bdf144aece6ec3 100644 GIT binary patch delta 418700 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 z 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⁢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 delta 376983 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

2Usq!#i`c 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

I25!QC;OARWrJxG*hWW4$uEBjM$(LH*gcL}H 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, key); U_DEBUG_ASTRO_MSG(("%p: GET: [%d] == %d\n", (*cache)->fTable, key, res)); - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); return res; } @@ -1570,12 +1573,12 @@ void CalendarCache::put(CalendarCache** cache, int32_t key, int32_t value, UErro if(U_FAILURE(status)) { return; } - umtx_lock(&ccLock); + umtx_lock(ccLock()); if(*cache == NULL) { createCache(cache, status); if(U_FAILURE(status)) { - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); return; } } @@ -1583,7 +1586,7 @@ void CalendarCache::put(CalendarCache** cache, int32_t key, int32_t value, UErro uhash_iputi((*cache)->fTable, key, value, &status); U_DEBUG_ASTRO_MSG(("%p: PUT: [%d] := %d\n", (*cache)->fTable, key, value)); - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); } CalendarCache::CalendarCache(int32_t size, UErrorCode &status) { diff --git a/deps/icu-small/source/i18n/brktrans.cpp b/deps/icu-small/source/i18n/brktrans.cpp index ab5a8038420b78..ac9e2afb7e4679 100644 --- a/deps/icu-small/source/i18n/brktrans.cpp +++ b/deps/icu-small/source/i18n/brktrans.cpp @@ -10,6 +10,8 @@ ********************************************************************** */ +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_TRANSLITERATION && !UCONFIG_NO_BREAK_ITERATION @@ -79,8 +81,8 @@ void BreakTransliterator::handleTransliterate(Replaceable& text, UTransPosition& { Mutex m; BreakTransliterator *nonConstThis = const_cast(this); - boundaries.moveFrom(nonConstThis->cachedBoundaries); - bi.moveFrom(nonConstThis->cachedBI); + boundaries = std::move(nonConstThis->cachedBoundaries); + bi = std::move(nonConstThis->cachedBI); } if (bi.isNull()) { bi.adoptInstead(BreakIterator::createWordInstance(Locale::getEnglish(), status)); @@ -145,10 +147,10 @@ void BreakTransliterator::handleTransliterate(Replaceable& text, UTransPosition& Mutex m; BreakTransliterator *nonConstThis = const_cast(this); if (nonConstThis->cachedBI.isNull()) { - nonConstThis->cachedBI.moveFrom(bi); + nonConstThis->cachedBI = std::move(bi); } if (nonConstThis->cachedBoundaries.isNull()) { - nonConstThis->cachedBoundaries.moveFrom(boundaries); + nonConstThis->cachedBoundaries = std::move(boundaries); } } diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 24c2fb964e91a1..85a387ef49ed16 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -327,68 +327,73 @@ static ECalType getCalendarTypeForLocale(const char *locid) { } static Calendar *createStandardCalendar(ECalType calType, const Locale &loc, UErrorCode& status) { - Calendar *cal = NULL; + if (U_FAILURE(status)) { + return nullptr; + } + LocalPointer cal; switch (calType) { case CALTYPE_GREGORIAN: - cal = new GregorianCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status); break; case CALTYPE_JAPANESE: - cal = new JapaneseCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new JapaneseCalendar(loc, status), status); break; case CALTYPE_BUDDHIST: - cal = new BuddhistCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new BuddhistCalendar(loc, status), status); break; case CALTYPE_ROC: - cal = new TaiwanCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new TaiwanCalendar(loc, status), status); break; case CALTYPE_PERSIAN: - cal = new PersianCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new PersianCalendar(loc, status), status); break; case CALTYPE_ISLAMIC_TBLA: - cal = new IslamicCalendar(loc, status, IslamicCalendar::TBLA); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::TBLA), status); break; case CALTYPE_ISLAMIC_CIVIL: - cal = new IslamicCalendar(loc, status, IslamicCalendar::CIVIL); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::CIVIL), status); break; case CALTYPE_ISLAMIC_RGSA: // default any region specific not handled individually to islamic case CALTYPE_ISLAMIC: - cal = new IslamicCalendar(loc, status, IslamicCalendar::ASTRONOMICAL); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::ASTRONOMICAL), status); break; case CALTYPE_ISLAMIC_UMALQURA: - cal = new IslamicCalendar(loc, status, IslamicCalendar::UMALQURA); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::UMALQURA), status); break; case CALTYPE_HEBREW: - cal = new HebrewCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new HebrewCalendar(loc, status), status); break; case CALTYPE_CHINESE: - cal = new ChineseCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new ChineseCalendar(loc, status), status); break; case CALTYPE_INDIAN: - cal = new IndianCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new IndianCalendar(loc, status), status); break; case CALTYPE_COPTIC: - cal = new CopticCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new CopticCalendar(loc, status), status); break; case CALTYPE_ETHIOPIC: - cal = new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_MIHRET_ERA); + cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_MIHRET_ERA), status); break; case CALTYPE_ETHIOPIC_AMETE_ALEM: - cal = new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_ALEM_ERA); + cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_ALEM_ERA), status); break; case CALTYPE_ISO8601: - cal = new GregorianCalendar(loc, status); - cal->setFirstDayOfWeek(UCAL_MONDAY); - cal->setMinimalDaysInFirstWeek(4); + cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status); + if (cal.isValid()) { + cal->setFirstDayOfWeek(UCAL_MONDAY); + cal->setMinimalDaysInFirstWeek(4); + } break; case CALTYPE_DANGI: - cal = new DangiCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new DangiCalendar(loc, status), status); break; default: status = U_UNSUPPORTED_ERROR; } - return cal; + return cal.orphan(); } @@ -536,6 +541,10 @@ class CalendarService : public ICULocaleService { fprintf(stderr, "CalSvc:handleDefault for currentLoc %s, canloc %s\n", (const char*)loc.getName(), (const char*)loc2.getName()); #endif Calendar *nc = new GregorianCalendar(loc, status); + if (nc == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nc; + } #ifdef U_DEBUG_CALSVC UErrorCode status2 = U_ZERO_ERROR; @@ -1093,7 +1102,11 @@ Calendar::getKeywordValuesForLocale(const char* key, uenum_close(uenum); return NULL; } - return new UStringEnumeration(uenum); + UStringEnumeration* ustringenum = new UStringEnumeration(uenum); + if (ustringenum == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return ustringenum; } // ------------------------------------- @@ -3783,18 +3796,16 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& // 2). If the locale has a script designation then we ignore it, // then remove it ( i.e. "en_Latn_US" becomes "en_US" ) - char minLocaleID[ULOC_FULLNAME_CAPACITY] = { 0 }; UErrorCode myStatus = U_ZERO_ERROR; - uloc_minimizeSubtags(desiredLocale.getName(),minLocaleID,ULOC_FULLNAME_CAPACITY,&myStatus); - Locale min = Locale::createFromName(minLocaleID); + Locale min(desiredLocale); + min.minimizeSubtags(myStatus); Locale useLocale; if ( uprv_strlen(desiredLocale.getCountry()) == 0 || (uprv_strlen(desiredLocale.getScript()) > 0 && uprv_strlen(min.getScript()) == 0) ) { - char maxLocaleID[ULOC_FULLNAME_CAPACITY] = { 0 }; myStatus = U_ZERO_ERROR; - uloc_addLikelySubtags(desiredLocale.getName(),maxLocaleID,ULOC_FULLNAME_CAPACITY,&myStatus); - Locale max = Locale::createFromName(maxLocaleID); + Locale max(desiredLocale); + max.addLikelySubtags(myStatus); useLocale = Locale(max.getLanguage(),max.getCountry()); } else { useLocale = desiredLocale; diff --git a/deps/icu-small/source/i18n/chnsecal.cpp b/deps/icu-small/source/i18n/chnsecal.cpp index 17712ae62e7651..3c4ad2a846619f 100644 --- a/deps/icu-small/source/i18n/chnsecal.cpp +++ b/deps/icu-small/source/i18n/chnsecal.cpp @@ -51,7 +51,10 @@ static void debug_chnsecal_msg(const char *pat, ...) // --- The cache -- -static UMutex astroLock = U_MUTEX_INITIALIZER; // Protects access to gChineseCalendarAstro. +static icu::UMutex *astroLock() { // Protects access to gChineseCalendarAstro. + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static icu::CalendarAstronomer *gChineseCalendarAstro = NULL; // Lazy Creation & Access synchronized by class CalendarCache with a mutex. @@ -535,14 +538,14 @@ int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { // PST 1298 with a final result of Dec 14 10:31:59 PST 1299. double ms = daysToMillis(Grego::fieldsToDay(gyear, UCAL_DECEMBER, 1)); - umtx_lock(&astroLock); + umtx_lock(astroLock()); if(gChineseCalendarAstro == NULL) { gChineseCalendarAstro = new CalendarAstronomer(); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } gChineseCalendarAstro->setTime(ms); UDate solarLong = gChineseCalendarAstro->getSunTime(CalendarAstronomer::WINTER_SOLSTICE(), TRUE); - umtx_unlock(&astroLock); + umtx_unlock(astroLock()); // Winter solstice is 270 degrees solar longitude aka Dongzhi cacheValue = (int32_t)millisToDays(solarLong); @@ -565,14 +568,14 @@ int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { */ int32_t ChineseCalendar::newMoonNear(double days, UBool after) const { - umtx_lock(&astroLock); + umtx_lock(astroLock()); if(gChineseCalendarAstro == NULL) { gChineseCalendarAstro = new CalendarAstronomer(); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } gChineseCalendarAstro->setTime(daysToMillis(days)); UDate newMoon = gChineseCalendarAstro->getMoonTime(CalendarAstronomer::NEW_MOON(), after); - umtx_unlock(&astroLock); + umtx_unlock(astroLock()); return (int32_t) millisToDays(newMoon); } @@ -597,14 +600,14 @@ int32_t ChineseCalendar::synodicMonthsBetween(int32_t day1, int32_t day2) const */ int32_t ChineseCalendar::majorSolarTerm(int32_t days) const { - umtx_lock(&astroLock); + umtx_lock(astroLock()); if(gChineseCalendarAstro == NULL) { gChineseCalendarAstro = new CalendarAstronomer(); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } gChineseCalendarAstro->setTime(daysToMillis(days)); UDate solarLongitude = gChineseCalendarAstro->getSunLongitude(); - umtx_unlock(&astroLock); + umtx_unlock(astroLock()); // Compute (floor(solarLongitude / (pi/6)) + 2) % 12 int32_t term = ( ((int32_t)(6 * solarLongitude / CalendarAstronomer::PI)) + 2 ) % 12; diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index 2a614fac5dcfbc..8bbe133664c2cd 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -226,27 +226,25 @@ initAvailableLocaleList(UErrorCode &status) { U_ASSERT(availableLocaleList == NULL); // for now, there is a hardcoded list, so just walk through that list and set it up. UResourceBundle *index = NULL; - UResourceBundle installed; + StackUResourceBundle installed; int32_t i = 0; - ures_initStackObject(&installed); index = ures_openDirect(U_ICUDATA_COLL, "res_index", &status); - ures_getByKey(index, "InstalledLocales", &installed, &status); + ures_getByKey(index, "InstalledLocales", installed.getAlias(), &status); if(U_SUCCESS(status)) { - availableLocaleListCount = ures_getSize(&installed); + availableLocaleListCount = ures_getSize(installed.getAlias()); availableLocaleList = new Locale[availableLocaleListCount]; if (availableLocaleList != NULL) { - ures_resetIterator(&installed); - while(ures_hasNext(&installed)) { + ures_resetIterator(installed.getAlias()); + while(ures_hasNext(installed.getAlias())) { const char *tempKey = NULL; - ures_getNextString(&installed, NULL, &tempKey, &status); + ures_getNextString(installed.getAlias(), NULL, &tempKey, &status); availableLocaleList[i++] = Locale(tempKey); } } U_ASSERT(availableLocaleListCount == i); - ures_close(&installed); } ures_close(index); ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); diff --git a/deps/icu-small/source/i18n/collationbuilder.cpp b/deps/icu-small/source/i18n/collationbuilder.cpp index 954a20d2d97d45..45ac6ddcd5839b 100644 --- a/deps/icu-small/source/i18n/collationbuilder.cpp +++ b/deps/icu-small/source/i18n/collationbuilder.cpp @@ -577,8 +577,7 @@ CollationBuilder::getSpecialResetPosition(const UnicodeString &str, parserErrorReason = "LDML forbids tailoring to U+FFFF"; return 0; default: - U_ASSERT(FALSE); - return 0; + UPRV_UNREACHABLE; } int32_t index = findOrInsertNodeForRootCE(ce, strength, errorCode); diff --git a/deps/icu-small/source/i18n/collationdatabuilder.cpp b/deps/icu-small/source/i18n/collationdatabuilder.cpp index 1ebc20316021c3..fdd264f8aaa65a 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.cpp +++ b/deps/icu-small/source/i18n/collationdatabuilder.cpp @@ -852,8 +852,7 @@ CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withConte ce32 = encodeOneCE(Collation::unassignedCEFromCodePoint(c), errorCode); break; default: - U_ASSERT(FALSE); // require ce32 == base->getFinalCE32(ce32) - break; + UPRV_UNREACHABLE; // require ce32 == base->getFinalCE32(ce32) } return ce32; } diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index 1aff936dee1d2a..2527f2f055a3f0 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -25,7 +25,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0x11,0x12,0x13,0,0,0,0x14,0x15,0,0x16,0x17,0,0,0x16,0x18,0x19, 0,0x16,0x18,0,0,0x16,0x18,0,0,0x16,0x18,0,0,0,0x18,0, 0,0,0x1a,0,0,0x16,0x18,0,0,0x1b,0x18,0,0,0,0x1c,0, -0,0x1d,0x1e,0,0,0x1f,0x1e,0,0x1f,0x20,0,0x21,0x22,0,0x23,0, +0,0x1d,0x1e,0,0,0x1d,0x1e,0,0x1f,0x20,0,0x21,0x22,0,0x23,0, 0,0x24,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x25,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -164,7 +164,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0x26,0x27,0x28,0,0,0,0x29,0x2a,0,0x2b,0x2c,0,0,0x2d,0x2e,0x2f, 0,0x30,0x31,0,0,0x2d,0x32,0,0,0x2d,0x33,0,0,0,0x32,0, 0,0,0x34,0,0,0x2d,0x32,0,0,0x35,0x32,0,0,0,0x36,0, -0,0x37,0x38,0,0,0x39,0x38,0,0x39,0x3a,0,0x3b,0x3c,0,0x3d,0, +0,0x37,0x38,0,0,0x37,0x38,0,0x39,0x3a,0,0x3b,0x3c,0,0x3d,0, 0,0x3e,0,0,0x32,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x3f,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/deps/icu-small/source/i18n/collationruleparser.cpp b/deps/icu-small/source/i18n/collationruleparser.cpp index 96dcc0d940b77a..ade6ecb552ae13 100644 --- a/deps/icu-small/source/i18n/collationruleparser.cpp +++ b/deps/icu-small/source/i18n/collationruleparser.cpp @@ -622,8 +622,11 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { setParseError("expected language tag in [import langTag]", errorCode); return; } - if(length == 3 && uprv_memcmp(baseID, "und", 3) == 0) { + if(length == 0) { uprv_strcpy(baseID, "root"); + } else if(*baseID == '_') { + uprv_memmove(baseID + 3, baseID, length + 1); + uprv_memcpy(baseID, "und", 3); } // @collation=type, or length=0 if not specified char collationType[ULOC_KEYWORDS_CAPACITY]; diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index 0afecb287a7a40..ad3565155dd382 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -36,9 +36,9 @@ U_NAMESPACE_BEGIN struct CSRecognizerInfo : public UMemory { CSRecognizerInfo(CharsetRecognizer *recognizer, UBool isDefaultEnabled) - : recognizer(recognizer), isDefaultEnabled(isDefaultEnabled) {}; + : recognizer(recognizer), isDefaultEnabled(isDefaultEnabled) {} - ~CSRecognizerInfo() {delete recognizer;}; + ~CSRecognizerInfo() {delete recognizer;} CharsetRecognizer *recognizer; UBool isDefaultEnabled; diff --git a/deps/icu-small/source/i18n/currfmt.cpp b/deps/icu-small/source/i18n/currfmt.cpp index 06bdad042aad0e..8f20f783d25031 100644 --- a/deps/icu-small/source/i18n/currfmt.cpp +++ b/deps/icu-small/source/i18n/currfmt.cpp @@ -21,19 +21,16 @@ U_NAMESPACE_BEGIN CurrencyFormat::CurrencyFormat(const Locale& locale, UErrorCode& ec) : - MeasureFormat(locale, UMEASFMT_WIDTH_WIDE, ec), fmt(NULL) + MeasureFormat(locale, UMEASFMT_WIDTH_WIDE, ec) { - fmt = NumberFormat::createCurrencyInstance(locale, ec); } CurrencyFormat::CurrencyFormat(const CurrencyFormat& other) : - MeasureFormat(other), fmt(NULL) + MeasureFormat(other) { - fmt = (NumberFormat*) other.fmt->clone(); } CurrencyFormat::~CurrencyFormat() { - delete fmt; } Format* CurrencyFormat::clone() const { @@ -45,14 +42,14 @@ UnicodeString& CurrencyFormat::format(const Formattable& obj, FieldPosition& pos, UErrorCode& ec) const { - return fmt->format(obj, appendTo, pos, ec); + return getCurrencyFormatInternal().format(obj, appendTo, pos, ec); } void CurrencyFormat::parseObject(const UnicodeString& source, Formattable& result, ParsePosition& pos) const { - CurrencyAmount* currAmt = fmt->parseCurrency(source, pos); + CurrencyAmount* currAmt = getCurrencyFormatInternal().parseCurrency(source, pos); if (currAmt != NULL) { result.adoptObject(currAmt); } diff --git a/deps/icu-small/source/i18n/currfmt.h b/deps/icu-small/source/i18n/currfmt.h index 97d44cbb1d146f..cc9bb3c1bacd05 100644 --- a/deps/icu-small/source/i18n/currfmt.h +++ b/deps/icu-small/source/i18n/currfmt.h @@ -86,10 +86,6 @@ class CurrencyFormat : public MeasureFormat { * Returns the class ID for this class. */ static UClassID U_EXPORT2 getStaticClassID(); - - private: - - NumberFormat* fmt; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/currunit.cpp b/deps/icu-small/source/i18n/currunit.cpp index 2ece508751bcec..39c49e468d117d 100644 --- a/deps/icu-small/source/i18n/currunit.cpp +++ b/deps/icu-small/source/i18n/currunit.cpp @@ -18,8 +18,10 @@ #include "unicode/ustring.h" #include "cstring.h" #include "uinvchar.h" +#include "charstr.h" static constexpr char16_t kDefaultCurrency[] = u"XXX"; +static constexpr char kDefaultCurrency8[] = "XXX"; U_NAMESPACE_BEGIN @@ -50,6 +52,30 @@ CurrencyUnit::CurrencyUnit(ConstChar16Ptr _isoCode, UErrorCode& ec) { initCurrency(simpleIsoCode); } +CurrencyUnit::CurrencyUnit(StringPiece _isoCode, UErrorCode& ec) { + // Note: unlike the old constructor, reject empty arguments with an error. + char isoCodeBuffer[4]; + const char* isoCodeToUse; + // uprv_memchr checks that the string contains no internal NULs + if (_isoCode.length() != 3 || uprv_memchr(_isoCode.data(), 0, 3) != nullptr) { + isoCodeToUse = kDefaultCurrency8; + ec = U_ILLEGAL_ARGUMENT_ERROR; + } else if (!uprv_isInvariantString(_isoCode.data(), 3)) { + // TODO: Perform a more strict ASCII check like in ICU4J isAlpha3Code? + isoCodeToUse = kDefaultCurrency8; + ec = U_INVARIANT_CONVERSION_ERROR; + } else { + // Have to use isoCodeBuffer to ensure the string is NUL-terminated + uprv_strncpy(isoCodeBuffer, _isoCode.data(), 3); + isoCodeBuffer[3] = 0; + isoCodeToUse = isoCodeBuffer; + } + // TODO: Perform uppercasing here like in ICU4J Currency.getInstance()? + u_charsToUChars(isoCodeToUse, isoCode, 3); + isoCode[3] = 0; + initCurrency(isoCodeToUse); +} + CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : MeasureUnit(other) { u_strcpy(isoCode, other.isoCode); } diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index 58696f6e93dfd5..039f5bc226bb0a 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -460,7 +460,12 @@ DateFormat::createInstanceForSkeleton( status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } - DateFormat *result = createInstanceForSkeleton(skeleton, locale, status); + Locale localeWithCalendar = locale; + localeWithCalendar.setKeywordValue("calendar", calendar->getType(), status); + if (U_FAILURE(status)) { + return NULL; + } + DateFormat *result = createInstanceForSkeleton(skeleton, localeWithCalendar, status); if (U_FAILURE(status)) { return NULL; } diff --git a/deps/icu-small/source/i18n/decNumberLocal.h b/deps/icu-small/source/i18n/decNumberLocal.h index a45b7d8cc63ef2..f6c291a9ad3359 100644 --- a/deps/icu-small/source/i18n/decNumberLocal.h +++ b/deps/icu-small/source/i18n/decNumberLocal.h @@ -166,7 +166,9 @@ /* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN */ /* digits, and D2UTABLE -- the initializer for the D2U table */ - #if DECDPUN==1 + #ifndef DECDPUN + // no-op + #elif DECDPUN==1 #define DECDPUNMAX 9 #define D2UTABLE {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, \ 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, \ @@ -212,7 +214,7 @@ #define D2UTABLE {0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3, \ 3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5, \ 5,5,6,6,6,6} - #elif defined(DECDPUN) + #else #error DECDPUN must be in the range 1-9 #endif @@ -228,9 +230,9 @@ /* D2U -- return the number of Units needed to hold d digits */ /* (runtime version, with table lookaside for small d) */ - #if DECDPUN==8 + #if defined(DECDPUN) && DECDPUN==8 #define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+7)>>3)) - #elif DECDPUN==4 + #elif defined(DECDPUN) && DECDPUN==4 #define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+3)>>2)) #else #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN) diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index edd8910d9d4fd6..2a1e9347fa10d0 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -31,7 +31,7 @@ using namespace icu::numparse::impl; using ERoundingMode = icu::DecimalFormat::ERoundingMode; using EPadPosition = icu::DecimalFormat::EPadPosition; -// MSVC warns C4805 when comparing bool with UBool +// MSVC VS2015 warns C4805 when comparing bool with UBool, VS2017 no longer emits this warning. // TODO: Move this macro into a better place? #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN #define UBOOL_TO_BOOL(b) static_cast(b) @@ -45,6 +45,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormat) DecimalFormat::DecimalFormat(UErrorCode& status) : DecimalFormat(nullptr, status) { + if (U_FAILURE(status)) { return; } // Use the default locale and decimal pattern. const char* localeName = Locale::getDefault().getName(); LocalPointer ns(NumberingSystem::createInstance(status)); @@ -59,6 +60,7 @@ DecimalFormat::DecimalFormat(UErrorCode& status) DecimalFormat::DecimalFormat(const UnicodeString& pattern, UErrorCode& status) : DecimalFormat(nullptr, status) { + if (U_FAILURE(status)) { return; } setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); } @@ -66,6 +68,7 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, UErrorCode& status) DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) : DecimalFormat(symbolsToAdopt, status) { + if (U_FAILURE(status)) { return; } setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); } @@ -73,8 +76,10 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UNumberFormatStyle style, UErrorCode& status) : DecimalFormat(symbolsToAdopt, status) { + if (U_FAILURE(status)) { return; } // If choice is a currency type, ignore the rounding information. - if (style == UNumberFormatStyle::UNUM_CURRENCY || style == UNumberFormatStyle::UNUM_CURRENCY_ISO || + if (style == UNumberFormatStyle::UNUM_CURRENCY || + style == UNumberFormatStyle::UNUM_CURRENCY_ISO || style == UNumberFormatStyle::UNUM_CURRENCY_ACCOUNTING || style == UNumberFormatStyle::UNUM_CASH_CURRENCY || style == UNumberFormatStyle::UNUM_CURRENCY_STANDARD || @@ -96,15 +101,17 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* } DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) { + // we must take ownership of symbolsToAdopt, even in a failure case. LocalPointer adoptedSymbols(symbolsToAdopt); - fields = new DecimalFormatFields(); if (U_FAILURE(status)) { return; } + fields = new DecimalFormatFields(); if (fields == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } + fields->formatter.adoptInsteadAndCheckErrorCode(new LocalizedNumberFormatter(), status); fields->properties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status); fields->exportedProperties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status); if (adoptedSymbols.isNull()) { @@ -112,11 +119,20 @@ DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorC } else { fields->symbols.adoptInsteadAndCheckErrorCode(adoptedSymbols.orphan(), status); } + // In order to simplify error handling logic in the various getters/setters/etc, we do not allow + // any partially populated DecimalFormatFields object. We must have a fully complete fields object + // or else we set it to nullptr. + if (fields->formatter.isNull() || fields->properties.isNull() || fields->exportedProperties.isNull() || fields->symbols.isNull()) { + delete fields; + fields = nullptr; + status = U_MEMORY_ALLOCATION_ERROR; + } } #if UCONFIG_HAVE_PARSEALLINPUT void DecimalFormat::setParseAllInput(UNumberFormatAttributeValue value) { + if (fields == nullptr) { return; } if (value == fields->properties->parseAllInput) { return; } fields->properties->parseAllInput = value; } @@ -127,6 +143,12 @@ DecimalFormat& DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status) { if (U_FAILURE(status)) { return *this; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + switch (attr) { case UNUM_LENIENT_PARSE: setLenient(newValue != 0); @@ -254,6 +276,13 @@ DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErro int32_t DecimalFormat::getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const { if (U_FAILURE(status)) { return -1; } + + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } + switch (attr) { case UNUM_LENIENT_PARSE: return isLenient(); @@ -347,6 +376,9 @@ int32_t DecimalFormat::getAttribute(UNumberFormatAttribute attr, UErrorCode& sta } void DecimalFormat::setGroupingUsed(UBool enabled) { + if (fields == nullptr) { + return; + } if (UBOOL_TO_BOOL(enabled) == fields->properties->groupingUsed) { return; } NumberFormat::setGroupingUsed(enabled); // to set field for compatibility fields->properties->groupingUsed = enabled; @@ -354,6 +386,9 @@ void DecimalFormat::setGroupingUsed(UBool enabled) { } void DecimalFormat::setParseIntegerOnly(UBool value) { + if (fields == nullptr) { + return; + } if (UBOOL_TO_BOOL(value) == fields->properties->parseIntegerOnly) { return; } NumberFormat::setParseIntegerOnly(value); // to set field for compatibility fields->properties->parseIntegerOnly = value; @@ -361,6 +396,9 @@ void DecimalFormat::setParseIntegerOnly(UBool value) { } void DecimalFormat::setLenient(UBool enable) { + if (fields == nullptr) { + return; + } ParseMode mode = enable ? PARSE_MODE_LENIENT : PARSE_MODE_STRICT; if (!fields->properties->parseMode.isNull() && mode == fields->properties->parseMode.getNoError()) { return; } NumberFormat::setLenient(enable); // to set field for compatibility @@ -371,6 +409,7 @@ void DecimalFormat::setLenient(UBool enable) { DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UParseError&, UErrorCode& status) : DecimalFormat(symbolsToAdopt, status) { + if (U_FAILURE(status)) { return; } // TODO: What is parseError for? setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); @@ -378,44 +417,94 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* DecimalFormat::DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status) - : DecimalFormat(new DecimalFormatSymbols(symbols), status) { + : DecimalFormat(nullptr, status) { + if (U_FAILURE(status)) { return; } + LocalPointer dfs(new DecimalFormatSymbols(symbols), status); + if (U_FAILURE(status)) { + // If we failed to allocate DecimalFormatSymbols, then release fields and its members. + // We must have a fully complete fields object, we cannot have partially populated members. + delete fields; + fields = nullptr; + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + fields->symbols.adoptInstead(dfs.orphan()); setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); } DecimalFormat::DecimalFormat(const DecimalFormat& source) : NumberFormat(source) { + // If the object that we are copying from is invalid, no point in going further. + if (source.fields == nullptr) { + return; + } // Note: it is not safe to copy fields->formatter or fWarehouse directly because fields->formatter might have // dangling pointers to fields inside fWarehouse. The safe thing is to re-construct fields->formatter from // the property bag, despite being somewhat slower. fields = new DecimalFormatFields(); if (fields == nullptr) { - return; + return; // no way to report an error. } - fields->properties.adoptInstead(new DecimalFormatProperties(*source.fields->properties)); - fields->symbols.adoptInstead(new DecimalFormatSymbols(*source.fields->symbols)); - fields->exportedProperties.adoptInstead(new DecimalFormatProperties()); - if (fields->properties == nullptr || fields->symbols == nullptr || fields->exportedProperties == nullptr) { + UErrorCode status = U_ZERO_ERROR; + fields->formatter.adoptInsteadAndCheckErrorCode(new LocalizedNumberFormatter(), status); + fields->properties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(*source.fields->properties), status); + fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(*source.fields->symbols), status); + fields->exportedProperties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status); + // In order to simplify error handling logic in the various getters/setters/etc, we do not allow + // any partially populated DecimalFormatFields object. We must have a fully complete fields object + // or else we set it to nullptr. + if (fields->formatter.isNull() || fields->properties.isNull() || fields->exportedProperties.isNull() || fields->symbols.isNull()) { + delete fields; + fields = nullptr; return; } - touchNoError(); + touch(status); } DecimalFormat& DecimalFormat::operator=(const DecimalFormat& rhs) { + // guard against self-assignment + if (this == &rhs) { + return *this; + } + // Make sure both objects are valid. + if (fields == nullptr || rhs.fields == nullptr) { + return *this; // unfortunately, no way to report an error. + } *fields->properties = *rhs.fields->properties; fields->exportedProperties->clear(); - fields->symbols.adoptInstead(new DecimalFormatSymbols(*rhs.fields->symbols)); - touchNoError(); + UErrorCode status = U_ZERO_ERROR; + LocalPointer dfs(new DecimalFormatSymbols(*rhs.fields->symbols), status); + if (U_FAILURE(status)) { + // We failed to allocate DecimalFormatSymbols, release fields and its members. + // We must have a fully complete fields object, we cannot have partially populated members. + delete fields; + fields = nullptr; + return *this; + } + fields->symbols.adoptInstead(dfs.orphan()); + touch(status); + return *this; } DecimalFormat::~DecimalFormat() { + if (fields == nullptr) { return; } + delete fields->atomicParser.exchange(nullptr); delete fields->atomicCurrencyParser.exchange(nullptr); - delete fields; + delete fields; } Format* DecimalFormat::clone() const { - return new DecimalFormat(*this); + // can only clone valid objects. + if (fields == nullptr) { + return nullptr; + } + LocalPointer df(new DecimalFormat(*this)); + if (df.isValid() && df->fields != nullptr) { + return df.orphan(); + } + return nullptr; } UBool DecimalFormat::operator==(const Format& other) const { @@ -423,10 +512,19 @@ UBool DecimalFormat::operator==(const Format& other) const { if (otherDF == nullptr) { return false; } + // If either object is in an invalid state, prevent dereferencing nullptr below. + // Additionally, invalid objects should not be considered equal to anything. + if (fields == nullptr || otherDF->fields == nullptr) { + return false; + } return *fields->properties == *otherDF->fields->properties && *fields->symbols == *otherDF->fields->symbols; } UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos) const { + if (fields == nullptr) { + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatDouble(number, appendTo)) { return appendTo; } @@ -434,32 +532,50 @@ UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, Fie FormattedNumber output = fields->formatter->formatDouble(number, localStatus); fieldPositionHelper(output, pos, appendTo.length(), localStatus); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, localStatus); return appendTo; } UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatDouble(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatDouble(number, status); fieldPositionHelper(output, pos, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (posIter == nullptr && fastFormatDouble(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatDouble(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } @@ -479,6 +595,10 @@ DecimalFormat::format(int32_t number, UnicodeString& appendTo, FieldPositionIter } UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const { + if (fields == nullptr) { + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatInt64(number, appendTo)) { return appendTo; } @@ -486,67 +606,119 @@ UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, Fi FormattedNumber output = fields->formatter->formatInt(number, localStatus); fieldPositionHelper(output, pos, appendTo.length(), localStatus); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, localStatus); return appendTo; } UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatInt64(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatInt(number, status); fieldPositionHelper(output, pos, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (posIter == nullptr && fastFormatInt64(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatInt(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } FormattedNumber output = fields->formatter->formatDecimal(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(const DecimalQuantity& number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } FormattedNumber output = fields->formatter->formatDecimalQuantity(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(const DecimalQuantity& number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } FormattedNumber output = fields->formatter->formatDecimalQuantity(number, status); fieldPositionHelper(output, pos, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } void DecimalFormat::parse(const UnicodeString& text, Formattable& output, ParsePosition& parsePosition) const { + if (fields == nullptr) { + return; + } if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) { + if (parsePosition.getIndex() == text.length()) { + // If there is nothing to parse, it is an error + parsePosition.setErrorIndex(parsePosition.getIndex()); + } return; } @@ -556,8 +728,13 @@ void DecimalFormat::parse(const UnicodeString& text, Formattable& output, // parseCurrency method (backwards compatibility) int32_t startIndex = parsePosition.getIndex(); const NumberParserImpl* parser = getParser(status); - if (U_FAILURE(status)) { return; } + if (U_FAILURE(status)) { + return; // unfortunately no way to report back the error. + } parser->parse(text, startIndex, true, result, status); + if (U_FAILURE(status)) { + return; // unfortunately no way to report back the error. + } // TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here? if (result.success()) { parsePosition.setIndex(result.charEnd); @@ -568,6 +745,9 @@ void DecimalFormat::parse(const UnicodeString& text, Formattable& output, } CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePosition& parsePosition) const { + if (fields == nullptr) { + return nullptr; + } if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) { return nullptr; } @@ -578,14 +758,24 @@ CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePos // parseCurrency method (backwards compatibility) int32_t startIndex = parsePosition.getIndex(); const NumberParserImpl* parser = getCurrencyParser(status); - if (U_FAILURE(status)) { return nullptr; } + if (U_FAILURE(status)) { + return nullptr; + } parser->parse(text, startIndex, true, result, status); + if (U_FAILURE(status)) { + return nullptr; + } // TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here? if (result.success()) { parsePosition.setIndex(result.charEnd); Formattable formattable; result.populateFormattable(formattable, parser->getParseFlags()); - return new CurrencyAmount(formattable, result.currencyCode, status); + LocalPointer currencyAmount( + new CurrencyAmount(formattable, result.currencyCode, status), status); + if (U_FAILURE(status)) { + return nullptr; + } + return currencyAmount.orphan(); } else { parsePosition.setErrorIndex(startIndex + result.charEnd); return nullptr; @@ -593,6 +783,9 @@ CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePos } const DecimalFormatSymbols* DecimalFormat::getDecimalFormatSymbols(void) const { + if (fields == nullptr) { + return nullptr; + } return fields->symbols.getAlias(); } @@ -600,26 +793,56 @@ void DecimalFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdo if (symbolsToAdopt == nullptr) { return; // do not allow caller to set fields->symbols to NULL } - fields->symbols.adoptInstead(symbolsToAdopt); + // we must take ownership of symbolsToAdopt, even in a failure case. + LocalPointer dfs(symbolsToAdopt); + if (fields == nullptr) { + return; + } + fields->symbols.adoptInstead(dfs.orphan()); touchNoError(); } void DecimalFormat::setDecimalFormatSymbols(const DecimalFormatSymbols& symbols) { - fields->symbols.adoptInstead(new DecimalFormatSymbols(symbols)); + if (fields == nullptr) { + return; + } + UErrorCode status = U_ZERO_ERROR; + LocalPointer dfs(new DecimalFormatSymbols(symbols), status); + if (U_FAILURE(status)) { + // We failed to allocate DecimalFormatSymbols, release fields and its members. + // We must have a fully complete fields object, we cannot have partially populated members. + delete fields; + fields = nullptr; + return; + } + fields->symbols.adoptInstead(dfs.orphan()); touchNoError(); } const CurrencyPluralInfo* DecimalFormat::getCurrencyPluralInfo(void) const { + if (fields == nullptr) { + return nullptr; + } return fields->properties->currencyPluralInfo.fPtr.getAlias(); } void DecimalFormat::adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt) { - fields->properties->currencyPluralInfo.fPtr.adoptInstead(toAdopt); + // TODO: should we guard against nullptr input, like in adoptDecimalFormatSymbols? + // we must take ownership of toAdopt, even in a failure case. + LocalPointer cpi(toAdopt); + if (fields == nullptr) { + return; + } + fields->properties->currencyPluralInfo.fPtr.adoptInstead(cpi.orphan()); touchNoError(); } void DecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) { + if (fields == nullptr) { + return; + } if (fields->properties->currencyPluralInfo.fPtr.isNull()) { + // Note: clone() can fail with OOM error, but we have no way to report it. :( fields->properties->currencyPluralInfo.fPtr.adoptInstead(info.clone()); } else { *fields->properties->currencyPluralInfo.fPtr = info; // copy-assignment operator @@ -628,74 +851,122 @@ void DecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) { } UnicodeString& DecimalFormat::getPositivePrefix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(true, false, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(true, false, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setPositivePrefix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->positivePrefix) { return; } fields->properties->positivePrefix = newValue; touchNoError(); } UnicodeString& DecimalFormat::getNegativePrefix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(true, true, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(true, true, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setNegativePrefix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->negativePrefix) { return; } fields->properties->negativePrefix = newValue; touchNoError(); } UnicodeString& DecimalFormat::getPositiveSuffix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(false, false, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(false, false, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setPositiveSuffix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->positiveSuffix) { return; } fields->properties->positiveSuffix = newValue; touchNoError(); } UnicodeString& DecimalFormat::getNegativeSuffix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(false, true, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(false, true, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setNegativeSuffix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->negativeSuffix) { return; } fields->properties->negativeSuffix = newValue; touchNoError(); } UBool DecimalFormat::isSignAlwaysShown() const { + // Not much we can do to report an error. + if (fields == nullptr) { + return DecimalFormatProperties::getDefault().signAlwaysShown; + } return fields->properties->signAlwaysShown; } void DecimalFormat::setSignAlwaysShown(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->signAlwaysShown) { return; } fields->properties->signAlwaysShown = value; touchNoError(); } int32_t DecimalFormat::getMultiplier(void) const { - if (fields->properties->multiplier != 1) { - return fields->properties->multiplier; - } else if (fields->properties->magnitudeMultiplier != 0) { - return static_cast(uprv_pow10(fields->properties->magnitudeMultiplier)); + const DecimalFormatProperties *dfp; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + dfp = &(DecimalFormatProperties::getDefault()); + } else { + dfp = fields->properties.getAlias(); + } + if (dfp->multiplier != 1) { + return dfp->multiplier; + } else if (dfp->magnitudeMultiplier != 0) { + return static_cast(uprv_pow10(dfp->magnitudeMultiplier)); } else { return 1; } } void DecimalFormat::setMultiplier(int32_t multiplier) { + if (fields == nullptr) { + return; + } if (multiplier == 0) { multiplier = 1; // one being the benign default value for a multiplier. } @@ -723,31 +994,49 @@ void DecimalFormat::setMultiplier(int32_t multiplier) { } int32_t DecimalFormat::getMultiplierScale() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().multiplierScale; + } return fields->properties->multiplierScale; } void DecimalFormat::setMultiplierScale(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->multiplierScale) { return; } fields->properties->multiplierScale = newValue; touchNoError(); } double DecimalFormat::getRoundingIncrement(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().roundingIncrement; + } return fields->exportedProperties->roundingIncrement; } void DecimalFormat::setRoundingIncrement(double newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->roundingIncrement) { return; } fields->properties->roundingIncrement = newValue; touchNoError(); } ERoundingMode DecimalFormat::getRoundingMode(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return static_cast(DecimalFormatProperties::getDefault().roundingMode.getNoError()); + } // UNumberFormatRoundingMode and ERoundingMode have the same values. return static_cast(fields->exportedProperties->roundingMode.getNoError()); } void DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { + if (fields == nullptr) { return; } auto uRoundingMode = static_cast(roundingMode); if (!fields->properties->roundingMode.isNull() && uRoundingMode == fields->properties->roundingMode.getNoError()) { return; @@ -758,17 +1047,23 @@ void DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { } int32_t DecimalFormat::getFormatWidth(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().formatWidth; + } return fields->properties->formatWidth; } void DecimalFormat::setFormatWidth(int32_t width) { + if (fields == nullptr) { return; } if (width == fields->properties->formatWidth) { return; } fields->properties->formatWidth = width; touchNoError(); } UnicodeString DecimalFormat::getPadCharacterString() const { - if (fields->properties->padString.isBogus()) { + if (fields == nullptr || fields->properties->padString.isBogus()) { // Readonly-alias the static string kFallbackPaddingString return {TRUE, kFallbackPaddingString, -1}; } else { @@ -777,6 +1072,7 @@ UnicodeString DecimalFormat::getPadCharacterString() const { } void DecimalFormat::setPadCharacter(const UnicodeString& padChar) { + if (fields == nullptr) { return; } if (padChar == fields->properties->padString) { return; } if (padChar.length() > 0) { fields->properties->padString = UnicodeString(padChar.char32At(0)); @@ -787,7 +1083,7 @@ void DecimalFormat::setPadCharacter(const UnicodeString& padChar) { } EPadPosition DecimalFormat::getPadPosition(void) const { - if (fields->properties->padPosition.isNull()) { + if (fields == nullptr || fields->properties->padPosition.isNull()) { return EPadPosition::kPadBeforePrefix; } else { // UNumberFormatPadPosition and EPadPosition have the same values. @@ -796,6 +1092,7 @@ EPadPosition DecimalFormat::getPadPosition(void) const { } void DecimalFormat::setPadPosition(EPadPosition padPos) { + if (fields == nullptr) { return; } auto uPadPos = static_cast(padPos); if (!fields->properties->padPosition.isNull() && uPadPos == fields->properties->padPosition.getNoError()) { return; @@ -805,10 +1102,16 @@ void DecimalFormat::setPadPosition(EPadPosition padPos) { } UBool DecimalFormat::isScientificNotation(void) const { - return fields->properties->minimumExponentDigits != -1; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return (DecimalFormatProperties::getDefault().minimumExponentDigits != -1); + } + return (fields->properties->minimumExponentDigits != -1); } void DecimalFormat::setScientificNotation(UBool useScientific) { + if (fields == nullptr) { return; } int32_t minExp = useScientific ? 1 : -1; if (fields->properties->minimumExponentDigits == minExp) { return; } if (useScientific) { @@ -820,40 +1123,68 @@ void DecimalFormat::setScientificNotation(UBool useScientific) { } int8_t DecimalFormat::getMinimumExponentDigits(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return static_cast(DecimalFormatProperties::getDefault().minimumExponentDigits); + } return static_cast(fields->properties->minimumExponentDigits); } void DecimalFormat::setMinimumExponentDigits(int8_t minExpDig) { + if (fields == nullptr) { return; } if (minExpDig == fields->properties->minimumExponentDigits) { return; } fields->properties->minimumExponentDigits = minExpDig; touchNoError(); } UBool DecimalFormat::isExponentSignAlwaysShown(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().exponentSignAlwaysShown; + } return fields->properties->exponentSignAlwaysShown; } void DecimalFormat::setExponentSignAlwaysShown(UBool expSignAlways) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(expSignAlways) == fields->properties->exponentSignAlwaysShown) { return; } fields->properties->exponentSignAlwaysShown = expSignAlways; touchNoError(); } int32_t DecimalFormat::getGroupingSize(void) const { - if (fields->properties->groupingSize < 0) { + int32_t groupingSize; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + groupingSize = DecimalFormatProperties::getDefault().groupingSize; + } else { + groupingSize = fields->properties->groupingSize; + } + if (groupingSize < 0) { return 0; } - return fields->properties->groupingSize; + return groupingSize; } void DecimalFormat::setGroupingSize(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->groupingSize) { return; } fields->properties->groupingSize = newValue; touchNoError(); } int32_t DecimalFormat::getSecondaryGroupingSize(void) const { - int grouping2 = fields->properties->secondaryGroupingSize; + int32_t grouping2; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + grouping2 = DecimalFormatProperties::getDefault().secondaryGroupingSize; + } else { + grouping2 = fields->properties->secondaryGroupingSize; + } if (grouping2 < 0) { return 0; } @@ -861,84 +1192,128 @@ int32_t DecimalFormat::getSecondaryGroupingSize(void) const { } void DecimalFormat::setSecondaryGroupingSize(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->secondaryGroupingSize) { return; } fields->properties->secondaryGroupingSize = newValue; touchNoError(); } int32_t DecimalFormat::getMinimumGroupingDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().minimumGroupingDigits; + } return fields->properties->minimumGroupingDigits; } void DecimalFormat::setMinimumGroupingDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->minimumGroupingDigits) { return; } fields->properties->minimumGroupingDigits = newValue; touchNoError(); } UBool DecimalFormat::isDecimalSeparatorAlwaysShown(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().decimalSeparatorAlwaysShown; + } return fields->properties->decimalSeparatorAlwaysShown; } void DecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(newValue) == fields->properties->decimalSeparatorAlwaysShown) { return; } fields->properties->decimalSeparatorAlwaysShown = newValue; touchNoError(); } UBool DecimalFormat::isDecimalPatternMatchRequired(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().decimalPatternMatchRequired; + } return fields->properties->decimalPatternMatchRequired; } void DecimalFormat::setDecimalPatternMatchRequired(UBool newValue) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(newValue) == fields->properties->decimalPatternMatchRequired) { return; } fields->properties->decimalPatternMatchRequired = newValue; touchNoError(); } UBool DecimalFormat::isParseNoExponent() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().parseNoExponent; + } return fields->properties->parseNoExponent; } void DecimalFormat::setParseNoExponent(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->parseNoExponent) { return; } fields->properties->parseNoExponent = value; touchNoError(); } UBool DecimalFormat::isParseCaseSensitive() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().parseCaseSensitive; + } return fields->properties->parseCaseSensitive; } void DecimalFormat::setParseCaseSensitive(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->parseCaseSensitive) { return; } fields->properties->parseCaseSensitive = value; touchNoError(); } UBool DecimalFormat::isFormatFailIfMoreThanMaxDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().formatFailIfMoreThanMaxDigits; + } return fields->properties->formatFailIfMoreThanMaxDigits; } void DecimalFormat::setFormatFailIfMoreThanMaxDigits(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->formatFailIfMoreThanMaxDigits) { return; } fields->properties->formatFailIfMoreThanMaxDigits = value; touchNoError(); } UnicodeString& DecimalFormat::toPattern(UnicodeString& result) const { + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + result.setToBogus(); + return result; + } // Pull some properties from exportedProperties and others from properties // to keep affix patterns intact. In particular, pull rounding properties // so that CurrencyUsage is reflected properly. // TODO: Consider putting this logic in number_patternstring.cpp instead. ErrorCode localStatus; DecimalFormatProperties tprops(*fields->properties); - bool useCurrency = ((!tprops.currency.isNull()) || !tprops.currencyPluralInfo.fPtr.isNull() || - !tprops.currencyUsage.isNull() || AffixUtils::hasCurrencySymbols( - tprops.positivePrefixPattern, localStatus) || AffixUtils::hasCurrencySymbols( - tprops.positiveSuffixPattern, localStatus) || AffixUtils::hasCurrencySymbols( - tprops.negativePrefixPattern, localStatus) || AffixUtils::hasCurrencySymbols( - tprops.negativeSuffixPattern, localStatus)); + bool useCurrency = ( + !tprops.currency.isNull() || + !tprops.currencyPluralInfo.fPtr.isNull() || + !tprops.currencyUsage.isNull() || + AffixUtils::hasCurrencySymbols(tprops.positivePrefixPattern, localStatus) || + AffixUtils::hasCurrencySymbols(tprops.positiveSuffixPattern, localStatus) || + AffixUtils::hasCurrencySymbols(tprops.negativePrefixPattern, localStatus) || + AffixUtils::hasCurrencySymbols(tprops.negativeSuffixPattern, localStatus)); if (useCurrency) { tprops.minimumFractionDigits = fields->exportedProperties->minimumFractionDigits; tprops.maximumFractionDigits = fields->exportedProperties->maximumFractionDigits; @@ -949,6 +1324,11 @@ UnicodeString& DecimalFormat::toPattern(UnicodeString& result) const { } UnicodeString& DecimalFormat::toLocalizedPattern(UnicodeString& result) const { + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + result.setToBogus(); + return result; + } ErrorCode localStatus; result = toPattern(result); result = PatternStringUtils::convertLocalized(result, *fields->symbols, true, localStatus); @@ -961,6 +1341,13 @@ void DecimalFormat::applyPattern(const UnicodeString& pattern, UParseError&, UEr } void DecimalFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) { + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; + } setPropertiesFromPattern(pattern, IGNORE_ROUNDING_NEVER, status); touch(status); } @@ -972,14 +1359,20 @@ void DecimalFormat::applyLocalizedPattern(const UnicodeString& localizedPattern, } void DecimalFormat::applyLocalizedPattern(const UnicodeString& localizedPattern, UErrorCode& status) { - if (U_SUCCESS(status)) { - UnicodeString pattern = PatternStringUtils::convertLocalized( - localizedPattern, *fields->symbols, false, status); - applyPattern(pattern, status); + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; } + UnicodeString pattern = PatternStringUtils::convertLocalized( + localizedPattern, *fields->symbols, false, status); + applyPattern(pattern, status); } void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->maximumIntegerDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t min = fields->properties->minimumIntegerDigits; @@ -991,6 +1384,7 @@ void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { } void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->minimumIntegerDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t max = fields->properties->maximumIntegerDigits; @@ -1002,6 +1396,7 @@ void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { } void DecimalFormat::setMaximumFractionDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->maximumFractionDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t min = fields->properties->minimumFractionDigits; @@ -1013,6 +1408,7 @@ void DecimalFormat::setMaximumFractionDigits(int32_t newValue) { } void DecimalFormat::setMinimumFractionDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->minimumFractionDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t max = fields->properties->maximumFractionDigits; @@ -1024,14 +1420,25 @@ void DecimalFormat::setMinimumFractionDigits(int32_t newValue) { } int32_t DecimalFormat::getMinimumSignificantDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().minimumSignificantDigits; + } return fields->exportedProperties->minimumSignificantDigits; } int32_t DecimalFormat::getMaximumSignificantDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().maximumSignificantDigits; + } return fields->exportedProperties->maximumSignificantDigits; } void DecimalFormat::setMinimumSignificantDigits(int32_t value) { + if (fields == nullptr) { return; } if (value == fields->properties->minimumSignificantDigits) { return; } int32_t max = fields->properties->maximumSignificantDigits; if (max >= 0 && max < value) { @@ -1042,6 +1449,7 @@ void DecimalFormat::setMinimumSignificantDigits(int32_t value) { } void DecimalFormat::setMaximumSignificantDigits(int32_t value) { + if (fields == nullptr) { return; } if (value == fields->properties->maximumSignificantDigits) { return; } int32_t min = fields->properties->minimumSignificantDigits; if (min >= 0 && min > value) { @@ -1052,10 +1460,20 @@ void DecimalFormat::setMaximumSignificantDigits(int32_t value) { } UBool DecimalFormat::areSignificantDigitsUsed() const { - return fields->properties->minimumSignificantDigits != -1 || fields->properties->maximumSignificantDigits != -1; + const DecimalFormatProperties* dfp; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + dfp = &(DecimalFormatProperties::getDefault()); + } else { + dfp = fields->properties.getAlias(); + } + return dfp->minimumSignificantDigits != -1 || dfp->maximumSignificantDigits != -1; } void DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { + if (fields == nullptr) { return; } + // These are the default values from the old implementation. if (useSignificantDigits) { if (fields->properties->minimumSignificantDigits != -1 || @@ -1076,6 +1494,13 @@ void DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { } void DecimalFormat::setCurrency(const char16_t* theCurrency, UErrorCode& ec) { + // don't overwrite ec if it's already a failure. + if (U_FAILURE(ec)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + ec = U_MEMORY_ALLOCATION_ERROR; + return; + } CurrencyUnit currencyUnit(theCurrency, ec); if (U_FAILURE(ec)) { return; } if (!fields->properties->currency.isNull() && fields->properties->currency.getNoError() == currencyUnit) { @@ -1093,7 +1518,11 @@ void DecimalFormat::setCurrency(const char16_t* theCurrency) { } void DecimalFormat::setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec) { - if (U_FAILURE(*ec)) { + // don't overwrite ec if it's already a failure. + if (U_FAILURE(*ec)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + *ec = U_MEMORY_ALLOCATION_ERROR; return; } if (!fields->properties->currencyUsage.isNull() && newUsage == fields->properties->currencyUsage.getNoError()) { @@ -1106,7 +1535,7 @@ void DecimalFormat::setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec) { UCurrencyUsage DecimalFormat::getCurrencyUsage() const { // CurrencyUsage is not exported, so we have to get it from the input property bag. // TODO: Should we export CurrencyUsage instead? - if (fields->properties->currencyUsage.isNull()) { + if (fields == nullptr || fields->properties->currencyUsage.isNull()) { return UCURR_USAGE_STANDARD; } return fields->properties->currencyUsage.getNoError(); @@ -1114,26 +1543,58 @@ UCurrencyUsage DecimalFormat::getCurrencyUsage() const { void DecimalFormat::formatToDecimalQuantity(double number, DecimalQuantity& output, UErrorCode& status) const { + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; + } fields->formatter->formatDouble(number, status).getDecimalQuantity(output, status); } void DecimalFormat::formatToDecimalQuantity(const Formattable& number, DecimalQuantity& output, UErrorCode& status) const { + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; + } UFormattedNumberData obj; number.populateDecimalQuantity(obj.quantity, status); fields->formatter->formatImpl(&obj, status); output = std::move(obj.quantity); } +const number::LocalizedNumberFormatter* DecimalFormat::toNumberFormatter(UErrorCode& status) const { + // We sometimes need to return nullptr here (see ICU-20380) + if (U_FAILURE(status)) { return nullptr; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return &*fields->formatter; +} + const number::LocalizedNumberFormatter& DecimalFormat::toNumberFormatter() const { - return *fields->formatter; + UErrorCode localStatus = U_ZERO_ERROR; + return *toNumberFormatter(localStatus); } /** Rebuilds the formatter object from the property bag. */ void DecimalFormat::touch(UErrorCode& status) { - if (fields->exportedProperties == nullptr) { - // fields->exportedProperties is null only when the formatter is not ready yet. - // The only time when this happens is during legacy deserialization. + if (U_FAILURE(status)) { + return; + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + // For regular construction, the caller should have checked the status variable for errors. + // For copy construction, there is unfortunately nothing to report the error, so we need to guard against + // this possible bad state here and set the status to an error. + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1141,14 +1602,15 @@ void DecimalFormat::touch(UErrorCode& status) { Locale locale = fields->symbols->getLocale(); // Note: The formatter is relatively cheap to create, and we need it to populate fields->exportedProperties, - // so automatically compute it here. The parser is a bit more expensive and is not needed until the + // so automatically recompute it here. The parser is a bit more expensive and is not needed until the // parse method is called, so defer that until needed. // TODO: Only update the pieces that changed instead of re-computing the whole formatter? - fields->formatter.adoptInstead( - new LocalizedNumberFormatter( - NumberPropertyMapper::create( - *fields->properties, *fields->symbols, fields->warehouse, *fields->exportedProperties, status).locale( - locale))); + + // Since memory has already been allocated for the formatter, we can move assign a stack-allocated object + // and don't need to call new. (Which is slower and could possibly fail). + *fields->formatter = NumberPropertyMapper::create( + *fields->properties, *fields->symbols, fields->warehouse, *fields->exportedProperties, status).locale( + locale); // Do this after fields->exportedProperties are set up setupFastFormat(); @@ -1251,6 +1713,7 @@ const numparse::impl::NumberParserImpl* DecimalFormat::getCurrencyParser(UErrorC void DecimalFormat::fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition, int32_t offset, UErrorCode& status) { + if (U_FAILURE(status)) { return; } // always return first occurrence: fieldPosition.setBeginIndex(0); fieldPosition.setEndIndex(0); @@ -1264,7 +1727,7 @@ DecimalFormat::fieldPositionHelper(const number::FormattedNumber& formatted, Fie void DecimalFormat::fieldPositionIteratorHelper(const number::FormattedNumber& formatted, FieldPositionIterator* fpi, int32_t offset, UErrorCode& status) { - if (fpi != nullptr) { + if (U_SUCCESS(status) && (fpi != nullptr)) { FieldPositionIteratorHandler fpih(fpi, status); fpih.setShift(offset); formatted.getAllFieldPositionsImpl(fpih, status); diff --git a/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp b/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp index 07d0b0eb0f8717..2add399f87c91f 100644 --- a/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp +++ b/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp @@ -34,7 +34,7 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include +#include // ICU PATCH: Customize header file paths for ICU. diff --git a/deps/icu-small/source/i18n/double-conversion-bignum.cpp b/deps/icu-small/source/i18n/double-conversion-bignum.cpp index d5682af35f866d..5356923921c3c1 100644 --- a/deps/icu-small/source/i18n/double-conversion-bignum.cpp +++ b/deps/icu-small/source/i18n/double-conversion-bignum.cpp @@ -45,7 +45,7 @@ U_NAMESPACE_BEGIN namespace double_conversion { Bignum::Bignum() - : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) { + : bigits_buffer_(), bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) { for (int i = 0; i < kBigitCapacity; ++i) { bigits_[i] = 0; } @@ -459,26 +459,27 @@ void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) { mask >>= 2; uint64_t this_value = base; - bool delayed_multipliciation = false; + bool delayed_multiplication = false; const uint64_t max_32bits = 0xFFFFFFFF; while (mask != 0 && this_value <= max_32bits) { this_value = this_value * this_value; // Verify that there is enough space in this_value to perform the // multiplication. The first bit_size bits must be 0. if ((power_exponent & mask) != 0) { + ASSERT(bit_size > 0); uint64_t base_bits_mask = ~((static_cast(1) << (64 - bit_size)) - 1); bool high_bits_zero = (this_value & base_bits_mask) == 0; if (high_bits_zero) { this_value *= base; } else { - delayed_multipliciation = true; + delayed_multiplication = true; } } mask >>= 1; } AssignUInt64(this_value); - if (delayed_multipliciation) { + if (delayed_multiplication) { MultiplyByUInt32(base); } diff --git a/deps/icu-small/source/i18n/double-conversion-bignum.h b/deps/icu-small/source/i18n/double-conversion-bignum.h index d1af3bf5e77b15..d39a3dee010d8b 100644 --- a/deps/icu-small/source/i18n/double-conversion-bignum.h +++ b/deps/icu-small/source/i18n/double-conversion-bignum.h @@ -150,7 +150,7 @@ class Bignum { // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize). int exponent_; - DISALLOW_COPY_AND_ASSIGN(Bignum); + DC_DISALLOW_COPY_AND_ASSIGN(Bignum); }; } // namespace double_conversion diff --git a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp index e49700444c6b48..e1b66d2c65c82e 100644 --- a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp +++ b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp @@ -34,9 +34,9 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include -#include -#include +#include +#include +#include // ICU PATCH: Customize header file paths for ICU. diff --git a/deps/icu-small/source/i18n/double-conversion-ieee.h b/deps/icu-small/source/i18n/double-conversion-ieee.h index 952bcea27f6615..c83c8d9abbb46e 100644 --- a/deps/icu-small/source/i18n/double-conversion-ieee.h +++ b/deps/icu-small/source/i18n/double-conversion-ieee.h @@ -271,7 +271,7 @@ class Double { (biased_exponent << kPhysicalSignificandSize); } - DISALLOW_COPY_AND_ASSIGN(Double); + DC_DISALLOW_COPY_AND_ASSIGN(Double); }; class Single { @@ -408,7 +408,7 @@ class Single { const uint32_t d32_; - DISALLOW_COPY_AND_ASSIGN(Single); + DC_DISALLOW_COPY_AND_ASSIGN(Single); }; } // namespace double_conversion diff --git a/deps/icu-small/source/i18n/double-conversion-utils.h b/deps/icu-small/source/i18n/double-conversion-utils.h index 57fc49b231a3a0..1e44fcaa0e398d 100644 --- a/deps/icu-small/source/i18n/double-conversion-utils.h +++ b/deps/icu-small/source/i18n/double-conversion-utils.h @@ -37,8 +37,8 @@ #ifndef DOUBLE_CONVERSION_UTILS_H_ #define DOUBLE_CONVERSION_UTILS_H_ -#include -#include +#include +#include // ICU PATCH: Use U_ASSERT instead of #include "uassert.h" @@ -75,7 +75,22 @@ inline void abort_noreturn() { abort(); } // the output of the division with the expected result. (Inlining must be // disabled.) // On Linux,x86 89255e-22 != Div_double(89255.0/1e22) -// ICU PATCH: Enable ARM32 & ARM64 builds for Windows with 'defined(_M_ARM) || defined(_M_ARM64)'. +// +// For example: +/* +// -- in div.c +double Div_double(double x, double y) { return x / y; } + +// -- in main.c +double Div_double(double x, double y); // Forward declaration. + +int main(int argc, char** argv) { + return Div_double(89255.0, 1e22) == 89255e-22; +} +*/ +// Run as follows ./main || echo "correct" +// +// If it prints "correct" then the architecture should be here, in the "correct" section. #if defined(_M_X64) || defined(__x86_64__) || \ defined(__ARMEL__) || defined(__avr32__) || defined(_M_ARM) || defined(_M_ARM64) || \ defined(__hppa__) || defined(__ia64__) || \ @@ -85,10 +100,13 @@ inline void abort_noreturn() { abort(); } defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ defined(__SH4__) || defined(__alpha__) || \ defined(_MIPS_ARCH_MIPS32R2) || \ - defined(__AARCH64EL__) || defined(__aarch64__) || \ - defined(__riscv) + defined(__AARCH64EL__) || defined(__aarch64__) || defined(__AARCH64EB__) || \ + defined(__riscv) || \ + defined(__or1k__) || defined(__arc__) || \ + defined(__EMSCRIPTEN__) #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 -#elif defined(__mc68000__) +#elif defined(__mc68000__) || \ + defined(__pnacl__) || defined(__native_client__) #undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) #if defined(_WIN32) @@ -101,12 +119,6 @@ inline void abort_noreturn() { abort(); } #error Target architecture was not detected as supported by Double-Conversion. #endif -#if defined(__GNUC__) -#define DOUBLE_CONVERSION_UNUSED __attribute__((unused)) -#else -#define DOUBLE_CONVERSION_UNUSED -#endif - #if defined(_WIN32) && !defined(__MINGW32__) typedef signed char int8_t; @@ -145,8 +157,8 @@ typedef uint16_t uc16; // A macro to disallow the evil copy constructor and operator= functions // This should be used in the private: declarations for a class -#ifndef DISALLOW_COPY_AND_ASSIGN -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ +#ifndef DC_DISALLOW_COPY_AND_ASSIGN +#define DC_DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) #endif @@ -157,10 +169,10 @@ typedef uint16_t uc16; // This should be used in the private: declarations for a class // that wants to prevent anyone from instantiating it. This is // especially useful for classes containing only static methods. -#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ +#ifndef DC_DISALLOW_IMPLICIT_CONSTRUCTORS +#define DC_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) + DC_DISALLOW_COPY_AND_ASSIGN(TypeName) #endif // ICU PATCH: Wrap in ICU namespace @@ -305,7 +317,7 @@ class StringBuilder { bool is_finalized() const { return position_ < 0; } - DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder); + DC_DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder); }; // The type-based aliasing rule allows the compiler to assume that pointers of @@ -336,8 +348,12 @@ template inline Dest BitCast(const Source& source) { // Compile time assertion: sizeof(Dest) == sizeof(Source) // A compile error here means your Dest and Source have different sizes. - DOUBLE_CONVERSION_UNUSED - typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; +#if __cplusplus >= 201103L + static_assert(sizeof(Dest) == sizeof(Source), + "source and destination size mismatch"); +#else + typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; +#endif Dest dest; memmove(&dest, &source, sizeof(dest)); diff --git a/deps/icu-small/source/i18n/double-conversion.cpp b/deps/icu-small/source/i18n/double-conversion.cpp index 570a05bc42946c..1a60afbd64b6b7 100644 --- a/deps/icu-small/source/i18n/double-conversion.cpp +++ b/deps/icu-small/source/i18n/double-conversion.cpp @@ -34,8 +34,11 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include -#include +// ICU PATCH: Do not include std::locale. + +#include +//#include +#include // ICU PATCH: Customize header file paths for ICU. // The file fixed-dtoa.h is not needed. @@ -432,21 +435,60 @@ void DoubleToStringConverter::DoubleToAscii(double v, } +namespace { + +inline char ToLower(char ch) { +#if 0 // do not include std::locale in ICU + static const std::ctype& cType = + std::use_facet >(std::locale::classic()); + return cType.tolower(ch); +#else + (void)ch; + UNREACHABLE(); +#endif +} + +inline char Pass(char ch) { + return ch; +} + +template +static inline bool ConsumeSubStringImpl(Iterator* current, + Iterator end, + const char* substring, + Converter converter) { + ASSERT(converter(**current) == *substring); + for (substring++; *substring != '\0'; substring++) { + ++*current; + if (*current == end || converter(**current) != *substring) { + return false; + } + } + ++*current; + return true; +} + // Consumes the given substring from the iterator. // Returns false, if the substring does not match. template static bool ConsumeSubString(Iterator* current, Iterator end, - const char* substring) { - ASSERT(**current == *substring); - for (substring++; *substring != '\0'; substring++) { - ++*current; - if (*current == end || **current != *substring) return false; + const char* substring, + bool allow_case_insensibility) { + if (allow_case_insensibility) { + return ConsumeSubStringImpl(current, end, substring, ToLower); + } else { + return ConsumeSubStringImpl(current, end, substring, Pass); } - ++*current; - return true; } +// Consumes first character of the str is equal to ch +inline bool ConsumeFirstCharacter(char ch, + const char* str, + bool case_insensibility) { + return case_insensibility ? ToLower(ch) == str[0] : ch == str[0]; +} +} // namespace // Maximum number of significant digits in decimal representation. // The longest possible double in decimal representation is @@ -513,7 +555,7 @@ static double SignedZero(bool sign) { // because it constant-propagated the radix and concluded that the last // condition was always true. By moving it into a separate function the // compiler wouldn't warn anymore. -#if _MSC_VER +#ifdef _MSC_VER #pragma optimize("",off) static bool IsDecimalDigitForRadix(int c, int radix) { return '0' <= c && c <= '9' && (c - '0') < radix; @@ -521,7 +563,7 @@ static bool IsDecimalDigitForRadix(int c, int radix) { #pragma optimize("",on) #else static bool inline IsDecimalDigitForRadix(int c, int radix) { - return '0' <= c && c <= '9' && (c - '0') < radix; + return '0' <= c && c <= '9' && (c - '0') < radix; } #endif // Returns true if 'c' is a character digit that is valid for the given radix. @@ -535,17 +577,86 @@ static bool IsCharacterDigitForRadix(int c, int radix, char a_character) { return radix > 10 && c >= a_character && c < a_character + radix - 10; } +// Returns true, when the iterator is equal to end. +template +static bool Advance (Iterator* it, uc16 separator, int base, Iterator& end) { + if (separator == StringToDoubleConverter::kNoSeparator) { + ++(*it); + return *it == end; + } + if (!isDigit(**it, base)) { + ++(*it); + return *it == end; + } + ++(*it); + if (*it == end) return true; + if (*it + 1 == end) return false; + if (**it == separator && isDigit(*(*it + 1), base)) { + ++(*it); + } + return *it == end; +} + +// Checks whether the string in the range start-end is a hex-float string. +// This function assumes that the leading '0x'/'0X' is already consumed. +// +// Hex float strings are of one of the following forms: +// - hex_digits+ 'p' ('+'|'-')? exponent_digits+ +// - hex_digits* '.' hex_digits+ 'p' ('+'|'-')? exponent_digits+ +// - hex_digits+ '.' 'p' ('+'|'-')? exponent_digits+ +template +static bool IsHexFloatString(Iterator start, + Iterator end, + uc16 separator, + bool allow_trailing_junk) { + ASSERT(start != end); + + Iterator current = start; + + bool saw_digit = false; + while (isDigit(*current, 16)) { + saw_digit = true; + if (Advance(¤t, separator, 16, end)) return false; + } + if (*current == '.') { + if (Advance(¤t, separator, 16, end)) return false; + while (isDigit(*current, 16)) { + saw_digit = true; + if (Advance(¤t, separator, 16, end)) return false; + } + if (!saw_digit) return false; // Only the '.', but no digits. + } + if (*current != 'p' && *current != 'P') return false; + if (Advance(¤t, separator, 16, end)) return false; + if (*current == '+' || *current == '-') { + if (Advance(¤t, separator, 16, end)) return false; + } + if (!isDigit(*current, 10)) return false; + if (Advance(¤t, separator, 16, end)) return true; + while (isDigit(*current, 10)) { + if (Advance(¤t, separator, 16, end)) return true; + } + return allow_trailing_junk || !AdvanceToNonspace(¤t, end); +} + // Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end. +// +// If parse_as_hex_float is true, then the string must be a valid +// hex-float. template static double RadixStringToIeee(Iterator* current, Iterator end, bool sign, + uc16 separator, + bool parse_as_hex_float, bool allow_trailing_junk, double junk_string_value, bool read_as_double, bool* result_is_junk) { ASSERT(*current != end); + ASSERT(!parse_as_hex_float || + IsHexFloatString(*current, end, separator, allow_trailing_junk)); const int kDoubleSize = Double::kSignificandSize; const int kSingleSize = Single::kSignificandSize; @@ -553,27 +664,39 @@ static double RadixStringToIeee(Iterator* current, *result_is_junk = true; + int64_t number = 0; + int exponent = 0; + const int radix = (1 << radix_log_2); + // Whether we have encountered a '.' and are parsing the decimal digits. + // Only relevant if parse_as_hex_float is true. + bool post_decimal = false; + // Skip leading 0s. while (**current == '0') { - ++(*current); - if (*current == end) { + if (Advance(current, separator, radix, end)) { *result_is_junk = false; return SignedZero(sign); } } - int64_t number = 0; - int exponent = 0; - const int radix = (1 << radix_log_2); - - do { + while (true) { int digit; if (IsDecimalDigitForRadix(**current, radix)) { digit = static_cast(**current) - '0'; + if (post_decimal) exponent -= radix_log_2; } else if (IsCharacterDigitForRadix(**current, radix, 'a')) { digit = static_cast(**current) - 'a' + 10; + if (post_decimal) exponent -= radix_log_2; } else if (IsCharacterDigitForRadix(**current, radix, 'A')) { digit = static_cast(**current) - 'A' + 10; + if (post_decimal) exponent -= radix_log_2; + } else if (parse_as_hex_float && **current == '.') { + post_decimal = true; + Advance(current, separator, radix, end); + ASSERT(*current != end); + continue; + } else if (parse_as_hex_float && (**current == 'p' || **current == 'P')) { + break; } else { if (allow_trailing_junk || !AdvanceToNonspace(current, end)) { break; @@ -596,17 +719,26 @@ static double RadixStringToIeee(Iterator* current, int dropped_bits_mask = ((1 << overflow_bits_count) - 1); int dropped_bits = static_cast(number) & dropped_bits_mask; number >>= overflow_bits_count; - exponent = overflow_bits_count; + exponent += overflow_bits_count; bool zero_tail = true; for (;;) { - ++(*current); - if (*current == end || !isDigit(**current, radix)) break; + if (Advance(current, separator, radix, end)) break; + if (parse_as_hex_float && **current == '.') { + // Just run over the '.'. We are just trying to see whether there is + // a non-zero digit somewhere. + Advance(current, separator, radix, end); + ASSERT(*current != end); + post_decimal = true; + } + if (!isDigit(**current, radix)) break; zero_tail = zero_tail && **current == '0'; - exponent += radix_log_2; + if (!post_decimal) exponent += radix_log_2; } - if (!allow_trailing_junk && AdvanceToNonspace(current, end)) { + if (!parse_as_hex_float && + !allow_trailing_junk && + AdvanceToNonspace(current, end)) { return junk_string_value; } @@ -628,15 +760,37 @@ static double RadixStringToIeee(Iterator* current, } break; } - ++(*current); - } while (*current != end); + if (Advance(current, separator, radix, end)) break; + } ASSERT(number < ((int64_t)1 << kSignificandSize)); ASSERT(static_cast(static_cast(number)) == number); *result_is_junk = false; - if (exponent == 0) { + if (parse_as_hex_float) { + ASSERT(**current == 'p' || **current == 'P'); + Advance(current, separator, radix, end); + ASSERT(*current != end); + bool is_negative = false; + if (**current == '+') { + Advance(current, separator, radix, end); + ASSERT(*current != end); + } else if (**current == '-') { + is_negative = true; + Advance(current, separator, radix, end); + ASSERT(*current != end); + } + int written_exponent = 0; + while (IsDecimalDigitForRadix(**current, 10)) { + written_exponent = 10 * written_exponent + **current - '0'; + if (Advance(current, separator, radix, end)) break; + } + if (is_negative) written_exponent = -written_exponent; + exponent += written_exponent; + } + + if (exponent == 0 || number == 0) { if (sign) { if (number == 0) return -0.0; number = -number; @@ -645,7 +799,8 @@ static double RadixStringToIeee(Iterator* current, } ASSERT(number != 0); - return Double(DiyFp(number, exponent)).value(); + double result = Double(DiyFp(number, exponent)).value(); + return sign ? -result : result; } template @@ -663,6 +818,7 @@ double StringToDoubleConverter::StringToIeee( const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0; const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0; const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0; + const bool allow_case_insensibility = (flags_ & ALLOW_CASE_INSENSIBILITY) != 0; // To make sure that iterator dereferencing is valid the following // convention is used: @@ -712,8 +868,8 @@ double StringToDoubleConverter::StringToIeee( } if (infinity_symbol_ != NULL) { - if (*current == infinity_symbol_[0]) { - if (!ConsumeSubString(¤t, end, infinity_symbol_)) { + if (ConsumeFirstCharacter(*current, infinity_symbol_, allow_case_insensibility)) { + if (!ConsumeSubString(¤t, end, infinity_symbol_, allow_case_insensibility)) { return junk_string_value_; } @@ -731,8 +887,8 @@ double StringToDoubleConverter::StringToIeee( } if (nan_symbol_ != NULL) { - if (*current == nan_symbol_[0]) { - if (!ConsumeSubString(¤t, end, nan_symbol_)) { + if (ConsumeFirstCharacter(*current, nan_symbol_, allow_case_insensibility)) { + if (!ConsumeSubString(¤t, end, nan_symbol_, allow_case_insensibility)) { return junk_string_value_; } @@ -751,8 +907,7 @@ double StringToDoubleConverter::StringToIeee( bool leading_zero = false; if (*current == '0') { - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { *processed_characters_count = static_cast(current - input); return SignedZero(sign); } @@ -760,16 +915,24 @@ double StringToDoubleConverter::StringToIeee( leading_zero = true; // It could be hexadecimal value. - if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) { + if (((flags_ & ALLOW_HEX) || (flags_ & ALLOW_HEX_FLOATS)) && + (*current == 'x' || *current == 'X')) { ++current; - if (current == end || !isDigit(*current, 16)) { - return junk_string_value_; // "0x". + + bool parse_as_hex_float = (flags_ & ALLOW_HEX_FLOATS) && + IsHexFloatString(current, end, separator_, allow_trailing_junk); + + if (current == end) return junk_string_value_; // "0x" + if (!parse_as_hex_float && !isDigit(*current, 16)) { + return junk_string_value_; } bool result_is_junk; double result = RadixStringToIeee<4>(¤t, end, sign, + separator_, + parse_as_hex_float, allow_trailing_junk, junk_string_value_, read_as_double, @@ -783,8 +946,7 @@ double StringToDoubleConverter::StringToIeee( // Ignore leading zeros in the integer part. while (*current == '0') { - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { *processed_characters_count = static_cast(current - input); return SignedZero(sign); } @@ -805,8 +967,7 @@ double StringToDoubleConverter::StringToIeee( nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; } octal = octal && *current < '8'; - ++current; - if (current == end) goto parsing_done; + if (Advance(¤t, separator_, 10, end)) goto parsing_done; } if (significant_digits == 0) { @@ -817,8 +978,7 @@ double StringToDoubleConverter::StringToIeee( if (octal && !allow_trailing_junk) return junk_string_value_; if (octal) goto parsing_done; - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { if (significant_digits == 0 && !leading_zero) { return junk_string_value_; } else { @@ -831,8 +991,7 @@ double StringToDoubleConverter::StringToIeee( // Integer part consists of 0 or is absent. Significant digits start after // leading zeros (if any). while (*current == '0') { - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { *processed_characters_count = static_cast(current - input); return SignedZero(sign); } @@ -852,8 +1011,7 @@ double StringToDoubleConverter::StringToIeee( // Ignore insignificant digits in the fractional part. nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; } - ++current; - if (current == end) goto parsing_done; + if (Advance(¤t, separator_, 10, end)) goto parsing_done; } } @@ -869,9 +1027,11 @@ double StringToDoubleConverter::StringToIeee( if (*current == 'e' || *current == 'E') { if (octal && !allow_trailing_junk) return junk_string_value_; if (octal) goto parsing_done; + Iterator junk_begin = current; ++current; if (current == end) { if (allow_trailing_junk) { + current = junk_begin; goto parsing_done; } else { return junk_string_value_; @@ -883,6 +1043,7 @@ double StringToDoubleConverter::StringToIeee( ++current; if (current == end) { if (allow_trailing_junk) { + current = junk_begin; goto parsing_done; } else { return junk_string_value_; @@ -892,6 +1053,7 @@ double StringToDoubleConverter::StringToIeee( if (current == end || *current < '0' || *current > '9') { if (allow_trailing_junk) { + current = junk_begin; goto parsing_done; } else { return junk_string_value_; @@ -936,6 +1098,8 @@ double StringToDoubleConverter::StringToIeee( result = RadixStringToIeee<3>(&start, buffer + buffer_pos, sign, + separator_, + false, // Don't parse as hex_float. allow_trailing_junk, junk_string_value_, read_as_double, diff --git a/deps/icu-small/source/i18n/double-conversion.h b/deps/icu-small/source/i18n/double-conversion.h index 200537a360a7cc..377c710bf791e7 100644 --- a/deps/icu-small/source/i18n/double-conversion.h +++ b/deps/icu-small/source/i18n/double-conversion.h @@ -310,13 +310,18 @@ class DoubleToStringConverter { // should be at least kBase10MaximalLength + 1 characters long. static const int kBase10MaximalLength = 17; - // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or - // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v' - // after it has been casted to a single-precision float. That is, in this - // mode static_cast(v) must not be NaN, +Infinity or -Infinity. + // Converts the given double 'v' to digit characters. 'v' must not be NaN, + // +Infinity, or -Infinity. In SHORTEST_SINGLE-mode this restriction also + // applies to 'v' after it has been casted to a single-precision float. That + // is, in this mode static_cast(v) must not be NaN, +Infinity or + // -Infinity. // // The result should be interpreted as buffer * 10^(point-length). // + // The digits are written to the buffer in the platform's charset, which is + // often UTF-8 (with ASCII-range digits) but may be another charset, such + // as EBCDIC. + // // The output depends on the given mode: // - SHORTEST: produce the least amount of digits for which the internal // identity requirement is still satisfied. If the digits are printed @@ -393,7 +398,7 @@ class DoubleToStringConverter { const int max_trailing_padding_zeroes_in_precision_mode_; #endif // not needed for ICU - DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter); + DC_DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter); }; @@ -408,9 +413,13 @@ class StringToDoubleConverter { ALLOW_TRAILING_JUNK = 4, ALLOW_LEADING_SPACES = 8, ALLOW_TRAILING_SPACES = 16, - ALLOW_SPACES_AFTER_SIGN = 32 + ALLOW_SPACES_AFTER_SIGN = 32, + ALLOW_CASE_INSENSIBILITY = 64, + ALLOW_HEX_FLOATS = 128, }; + static const uc16 kNoSeparator = '\0'; + // Flags should be a bit-or combination of the possible Flags-enum. // - NO_FLAGS: no special flags. // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers. @@ -440,6 +449,13 @@ class StringToDoubleConverter { // - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign. // Ex: StringToDouble("- 123.2") -> -123.2. // StringToDouble("+ 123.2") -> 123.2 + // - ALLOW_CASE_INSENSIBILITY: ignore case of characters for special values: + // infinity and nan. + // - ALLOW_HEX_FLOATS: allows hexadecimal float literals. + // This *must* start with "0x" and separate the exponent with "p". + // Examples: 0x1.2p3 == 9.0 + // 0x10.1p0 == 16.0625 + // ALLOW_HEX and ALLOW_HEX_FLOATS are indendent. // // empty_string_value is returned when an empty string is given as input. // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string @@ -464,6 +480,12 @@ class StringToDoubleConverter { // - they must not have the same first character. // - they must not start with digits. // + // If the separator character is not kNoSeparator, then that specific + // character is ignored when in between two valid digits of the significant. + // It is not allowed to appear in the exponent. + // It is not allowed to lead or trail the number. + // It is not allowed to appear twice next to each other. + // // Examples: // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK, // empty_string_value = 0.0, @@ -503,16 +525,26 @@ class StringToDoubleConverter { // StringToDouble("01239E45") -> 1239e45. // StringToDouble("-infinity") -> NaN // junk_string_value. // StringToDouble("NaN") -> NaN // junk_string_value. + // + // flags = NO_FLAGS, + // separator = ' ': + // StringToDouble("1 2 3 4") -> 1234.0 + // StringToDouble("1 2") -> NaN // junk_string_value + // StringToDouble("1 000 000.0") -> 1000000.0 + // StringToDouble("1.000 000") -> 1.0 + // StringToDouble("1.0e1 000") -> NaN // junk_string_value StringToDoubleConverter(int flags, double empty_string_value, double junk_string_value, const char* infinity_symbol, - const char* nan_symbol) + const char* nan_symbol, + uc16 separator = kNoSeparator) : flags_(flags), empty_string_value_(empty_string_value), junk_string_value_(junk_string_value), infinity_symbol_(infinity_symbol), - nan_symbol_(nan_symbol) { + nan_symbol_(nan_symbol), + separator_(separator) { } // Performs the conversion. @@ -547,6 +579,7 @@ class StringToDoubleConverter { const double junk_string_value_; const char* const infinity_symbol_; const char* const nan_symbol_; + const uc16 separator_; template double StringToIeee(Iterator start_pointer, @@ -554,7 +587,7 @@ class StringToDoubleConverter { bool read_as_double, int* processed_characters_count) const; - DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter); + DC_DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter); }; } // namespace double_conversion diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index c9dfa045831d60..04aa01eb4c2459 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -21,6 +21,9 @@ * 10/12/05 emmons Added setters for eraNames, month/day by width/context ******************************************************************************* */ + +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING @@ -232,8 +235,6 @@ static const char gDayPeriodTag[]="dayPeriod"; static const char gContextTransformsTag[]="contextTransforms"; -static UMutex LOCK = U_MUTEX_INITIALIZER; - /** * Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly. * Work around this. @@ -1245,6 +1246,7 @@ const UnicodeString** DateFormatSymbols::getZoneStrings(int32_t& rowCount, int32_t& columnCount) const { const UnicodeString **result = NULL; + static UMutex LOCK = U_MUTEX_INITIALIZER; umtx_lock(&LOCK); if (fZoneStrings == NULL) { @@ -1500,7 +1502,7 @@ struct CalendarDataSink : public ResourceSink { * To avoid double deletion, 'maps' won't take ownership of the objects. Instead, * 'mapRefs' will own them and will delete them when CalendarDataSink is deleted. */ - UVector mapRefs; + MemoryPool mapRefs; // Paths and the aliases they point to UVector aliasPathPairs; @@ -1518,7 +1520,7 @@ struct CalendarDataSink : public ResourceSink { // Initializes CalendarDataSink with default values CalendarDataSink(UErrorCode& status) : arrays(FALSE, status), arraySizes(FALSE, status), maps(FALSE, status), - mapRefs(deleteHashtable, NULL, 10, status), + mapRefs(), aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status), currentCalendarType(), nextCalendarType(), resourcesToVisit(NULL), aliasRelativePath() { @@ -1663,7 +1665,7 @@ struct CalendarDataSink : public ResourceSink { // Set the resources to visit on the next calendar if (!resourcesToVisitNext.isNull()) { - resourcesToVisit.moveFrom(resourcesToVisitNext); + resourcesToVisit = std::move(resourcesToVisitNext); } } @@ -1688,14 +1690,14 @@ struct CalendarDataSink : public ResourceSink { if (value.getType() == URES_STRING) { // We are on a leaf, store the map elements into the stringMap if (i == 0) { - LocalPointer stringMapPtr(new Hashtable(FALSE, errorCode), errorCode); - stringMap = stringMapPtr.getAlias(); + // mapRefs will keep ownership of 'stringMap': + stringMap = mapRefs.create(FALSE, errorCode); + if (stringMap == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } maps.put(path, stringMap, errorCode); - // mapRefs will take ownership of 'stringMap': - mapRefs.addElement(stringMap, errorCode); if (U_FAILURE(errorCode)) { return; } - // Only release ownership after mapRefs takes it (no error happened): - stringMapPtr.orphan(); stringMap->setValueDeleter(uprv_deleteUObject); } U_ASSERT(stringMap != NULL); @@ -1839,11 +1841,6 @@ struct CalendarDataSink : public ResourceSink { static void U_CALLCONV deleteUnicodeStringArray(void *uArray) { delete[] static_cast(uArray); } - - // Deleter function to be used by 'maps' - static void U_CALLCONV deleteHashtable(void *table) { - delete static_cast(table); - } }; // Virtual destructors have to be defined out of line CalendarDataSink::~CalendarDataSink() { diff --git a/deps/icu-small/source/i18n/dtitvfmt.cpp b/deps/icu-small/source/i18n/dtitvfmt.cpp index d952cbf509dc40..0e124f5624002b 100644 --- a/deps/icu-small/source/i18n/dtitvfmt.cpp +++ b/deps/icu-small/source/i18n/dtitvfmt.cpp @@ -28,6 +28,7 @@ #include "dtitv_impl.h" #include "mutex.h" #include "uresimp.h" +#include "formattedval_impl.h" #ifdef DTITVFMT_DEBUG #include @@ -65,12 +66,26 @@ static const UChar gLaterFirstPrefix[] = {LOW_L, LOW_A, LOW_T, LOW_E, LOW_S,LOW_ static const UChar gEarlierFirstPrefix[] = {LOW_E, LOW_A, LOW_R, LOW_L, LOW_I, LOW_E, LOW_S, LOW_T, CAP_F, LOW_I, LOW_R, LOW_S, LOW_T, COLON}; +class FormattedDateIntervalData : public FormattedValueFieldPositionIteratorImpl { +public: + FormattedDateIntervalData(UErrorCode& status) : FormattedValueFieldPositionIteratorImpl(5, status) {} + virtual ~FormattedDateIntervalData(); +}; + +FormattedDateIntervalData::~FormattedDateIntervalData() = default; + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedDateInterval) + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateIntervalFormat) // Mutex, protects access to fDateFormat, fFromCalendar and fToCalendar. // Needed because these data members are modified by const methods of DateIntervalFormat. -static UMutex gFormatterMutex = U_MUTEX_INITIALIZER; +static UMutex *gFormatterMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} DateIntervalFormat* U_EXPORT2 DateIntervalFormat::createInstance(const UnicodeString& skeleton, @@ -156,7 +171,7 @@ DateIntervalFormat::operator=(const DateIntervalFormat& itvfmt) { delete fTimePattern; delete fDateTimeFormat; { - Mutex lock(&gFormatterMutex); + Mutex lock(gFormatterMutex()); if ( itvfmt.fDateFormat ) { fDateFormat = (SimpleDateFormat*)itvfmt.fDateFormat->clone(); } else { @@ -218,7 +233,7 @@ DateIntervalFormat::operator==(const Format& other) const { if ((fInfo != fmt->fInfo) && (fInfo == NULL || fmt->fInfo == NULL)) {return FALSE;} if (fInfo && fmt->fInfo && (*fInfo != *fmt->fInfo )) {return FALSE;} { - Mutex lock(&gFormatterMutex); + Mutex lock(gFormatterMutex()); if (fDateFormat != fmt->fDateFormat && (fDateFormat == NULL || fmt->fDateFormat == NULL)) {return FALSE;} if (fDateFormat && fmt->fDateFormat && (*fDateFormat != *fmt->fDateFormat)) {return FALSE;} } @@ -271,15 +286,51 @@ DateIntervalFormat::format(const DateInterval* dtInterval, if ( U_FAILURE(status) ) { return appendTo; } - if (fFromCalendar == NULL || fToCalendar == NULL || fDateFormat == NULL || fInfo == NULL) { + if (fDateFormat == NULL || fInfo == NULL) { status = U_INVALID_STATE_ERROR; return appendTo; } - Mutex lock(&gFormatterMutex); - fFromCalendar->setTime(dtInterval->getFromDate(), status); - fToCalendar->setTime(dtInterval->getToDate(), status); - return formatImpl(*fFromCalendar, *fToCalendar, appendTo,fieldPosition, status); + FieldPositionOnlyHandler handler(fieldPosition); + handler.setAcceptFirstOnly(TRUE); + int8_t ignore; + + Mutex lock(gFormatterMutex()); + return formatIntervalImpl(*dtInterval, appendTo, ignore, handler, status); +} + + +FormattedDateInterval DateIntervalFormat::formatToValue( + const DateInterval& dtInterval, + UErrorCode& status) const { + LocalPointer result(new FormattedDateIntervalData(status), status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + UnicodeString string; + int8_t firstIndex; + auto handler = result->getHandler(status); + handler.setCategory(UFIELD_CATEGORY_DATE); + { + Mutex lock(gFormatterMutex()); + formatIntervalImpl(dtInterval, string, firstIndex, handler, status); + } + handler.getError(status); + result->appendString(string, status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + + // Compute the span fields and sort them into place: + if (firstIndex != -1) { + result->addOverlapSpans(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, firstIndex, status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + result->sort(); + } + + return FormattedDateInterval(result.orphan()); } @@ -289,8 +340,63 @@ DateIntervalFormat::format(Calendar& fromCalendar, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { - Mutex lock(&gFormatterMutex); - return formatImpl(fromCalendar, toCalendar, appendTo, pos, status); + FieldPositionOnlyHandler handler(pos); + handler.setAcceptFirstOnly(TRUE); + int8_t ignore; + + Mutex lock(gFormatterMutex()); + return formatImpl(fromCalendar, toCalendar, appendTo, ignore, handler, status); +} + + +FormattedDateInterval DateIntervalFormat::formatToValue( + Calendar& fromCalendar, + Calendar& toCalendar, + UErrorCode& status) const { + LocalPointer result(new FormattedDateIntervalData(status), status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + UnicodeString string; + int8_t firstIndex; + auto handler = result->getHandler(status); + handler.setCategory(UFIELD_CATEGORY_DATE); + { + Mutex lock(gFormatterMutex()); + formatImpl(fromCalendar, toCalendar, string, firstIndex, handler, status); + } + handler.getError(status); + result->appendString(string, status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + + // Compute the span fields and sort them into place: + if (firstIndex != -1) { + result->addOverlapSpans(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, firstIndex, status); + result->sort(); + } + + return FormattedDateInterval(result.orphan()); +} + + +UnicodeString& DateIntervalFormat::formatIntervalImpl( + const DateInterval& dtInterval, + UnicodeString& appendTo, + int8_t& firstIndex, + FieldPositionHandler& fphandler, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; + } + if (fFromCalendar == nullptr || fToCalendar == nullptr) { + status = U_INVALID_STATE_ERROR; + return appendTo; + } + fFromCalendar->setTime(dtInterval.getFromDate(), status); + fToCalendar->setTime(dtInterval.getToDate(), status); + return formatImpl(*fFromCalendar, *fToCalendar, appendTo, firstIndex, fphandler, status); } @@ -298,12 +404,16 @@ UnicodeString& DateIntervalFormat::formatImpl(Calendar& fromCalendar, Calendar& toCalendar, UnicodeString& appendTo, - FieldPosition& pos, + int8_t& firstIndex, + FieldPositionHandler& fphandler, UErrorCode& status) const { if ( U_FAILURE(status) ) { return appendTo; } + // Initialize firstIndex to -1 (single date, no range) + firstIndex = -1; + // not support different calendar types and time zones //if ( fromCalendar.getType() != toCalendar.getType() ) { if ( !fromCalendar.isEquivalentTo(toCalendar) ) { @@ -346,7 +456,7 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, /* ignore the millisecond etc. small fields' difference. * use single date when all the above are the same. */ - return fDateFormat->format(fromCalendar, appendTo, pos); + return fDateFormat->_format(fromCalendar, appendTo, fphandler, status); } UBool fromToOnSameDay = (field==UCAL_AM_PM || field==UCAL_HOUR || field==UCAL_MINUTE || field==UCAL_SECOND); @@ -363,9 +473,9 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, * the smallest calendar field in pattern, * return single date format. */ - return fDateFormat->format(fromCalendar, appendTo, pos); + return fDateFormat->_format(fromCalendar, appendTo, fphandler, status); } - return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status); + return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, firstIndex, fphandler, status); } // If the first part in interval pattern is empty, // the 2nd part of it saves the full-pattern used in fall-back. @@ -375,7 +485,7 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, UnicodeString originalPattern; fDateFormat->toPattern(originalPattern); fDateFormat->applyPattern(intervalPattern.secondPart); - appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status); + appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, firstIndex, fphandler, status); fDateFormat->applyPattern(originalPattern); return appendTo; } @@ -384,24 +494,22 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, if ( intervalPattern.laterDateFirst ) { firstCal = &toCalendar; secondCal = &fromCalendar; + firstIndex = 1; } else { firstCal = &fromCalendar; secondCal = &toCalendar; + firstIndex = 0; } // break the interval pattern into 2 parts, // first part should not be empty, UnicodeString originalPattern; fDateFormat->toPattern(originalPattern); fDateFormat->applyPattern(intervalPattern.firstPart); - fDateFormat->format(*firstCal, appendTo, pos); + fDateFormat->_format(*firstCal, appendTo, fphandler, status); + if ( !intervalPattern.secondPart.isEmpty() ) { fDateFormat->applyPattern(intervalPattern.secondPart); - FieldPosition otherPos; - otherPos.setField(pos.getField()); - fDateFormat->format(*secondCal, appendTo, otherPos); - if (pos.getEndIndex() == 0 && otherPos.getEndIndex() > 0) { - pos = otherPos; - } + fDateFormat->_format(*secondCal, appendTo, fphandler, status); } fDateFormat->applyPattern(originalPattern); return appendTo; @@ -492,7 +600,7 @@ const TimeZone& DateIntervalFormat::getTimeZone() const { if (fDateFormat != NULL) { - Mutex lock(&gFormatterMutex); + Mutex lock(gFormatterMutex()); return fDateFormat->getTimeZone(); } // If fDateFormat is NULL (unexpected), create default timezone. @@ -1022,7 +1130,9 @@ DateIntervalFormat::setSeparateDateTimePtn( } setIntervalPattern(UCAL_YEAR, skeleton, bestSkeleton, differenceInfo, &extendedSkeleton, &extendedBestSkeleton); - } else { + setIntervalPattern(UCAL_ERA, skeleton, bestSkeleton, differenceInfo, + &extendedSkeleton, &extendedBestSkeleton); + } else { setIntervalPattern(UCAL_MINUTE, skeleton, bestSkeleton, differenceInfo); setIntervalPattern(UCAL_HOUR, skeleton, bestSkeleton, differenceInfo); setIntervalPattern(UCAL_AM_PM, skeleton, bestSkeleton, differenceInfo); @@ -1294,40 +1404,37 @@ DateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern) return (i - count); } -static const UChar bracketedZero[] = {0x7B,0x30,0x7D}; -static const UChar bracketedOne[] = {0x7B,0x31,0x7D}; - -void -DateIntervalFormat::adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it - UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0} - UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1} - FieldPosition& posResult) { - int32_t index0 = combiningPattern.indexOf(bracketedZero, 3, 0); - int32_t index1 = combiningPattern.indexOf(bracketedOne, 3, 0); - if (index0 < 0 || index1 < 0) { +void DateIntervalFormat::fallbackFormatRange( + Calendar& fromCalendar, + Calendar& toCalendar, + UnicodeString& appendTo, + int8_t& firstIndex, + FieldPositionHandler& fphandler, + UErrorCode& status) const { + UnicodeString fallbackPattern; + fInfo->getFallbackIntervalPattern(fallbackPattern); + SimpleFormatter sf(fallbackPattern, 2, 2, status); + if (U_FAILURE(status)) { return; } - int32_t placeholderLen = 3; // length of "{0}" or "{1}" - if (index0 < index1) { - if (pos0.getEndIndex() > 0) { - posResult.setBeginIndex(pos0.getBeginIndex() + index0); - posResult.setEndIndex(pos0.getEndIndex() + index0); - } else if (pos1.getEndIndex() > 0) { - // here index1 >= 3 - index1 += pat0.length() - placeholderLen; // adjust for pat0 replacing {0} - posResult.setBeginIndex(pos1.getBeginIndex() + index1); - posResult.setEndIndex(pos1.getEndIndex() + index1); - } + int32_t offsets[2]; + UnicodeString patternBody = sf.getTextWithNoArguments(offsets, 2); + + // TODO(ICU-20406): Use SimpleFormatter Iterator interface when available. + if (offsets[0] < offsets[1]) { + firstIndex = 0; + appendTo.append(patternBody.tempSubStringBetween(0, offsets[0])); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0], offsets[1])); + fDateFormat->_format(toCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1])); } else { - if (pos1.getEndIndex() > 0) { - posResult.setBeginIndex(pos1.getBeginIndex() + index1); - posResult.setEndIndex(pos1.getEndIndex() + index1); - } else if (pos0.getEndIndex() > 0) { - // here index0 >= 3 - index0 += pat1.length() - placeholderLen; // adjust for pat1 replacing {1} - posResult.setBeginIndex(pos0.getBeginIndex() + index0); - posResult.setEndIndex(pos0.getEndIndex() + index0); - } + firstIndex = 1; + appendTo.append(patternBody.tempSubStringBetween(0, offsets[1])); + fDateFormat->_format(toCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1], offsets[0])); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0])); } } @@ -1336,51 +1443,50 @@ DateIntervalFormat::fallbackFormat(Calendar& fromCalendar, Calendar& toCalendar, UBool fromToOnSameDay, // new UnicodeString& appendTo, - FieldPosition& pos, + int8_t& firstIndex, + FieldPositionHandler& fphandler, UErrorCode& status) const { if ( U_FAILURE(status) ) { return appendTo; } - UnicodeString fullPattern; // for saving the pattern in fDateFormat + UBool formatDatePlusTimeRange = (fromToOnSameDay && fDatePattern && fTimePattern); - // the fall back if (formatDatePlusTimeRange) { + SimpleFormatter sf(*fDateTimeFormat, 2, 2, status); + if (U_FAILURE(status)) { + return appendTo; + } + int32_t offsets[2]; + UnicodeString patternBody = sf.getTextWithNoArguments(offsets, 2); + + UnicodeString fullPattern; // for saving the pattern in fDateFormat fDateFormat->toPattern(fullPattern); // save current pattern, restore later - fDateFormat->applyPattern(*fTimePattern); - } - FieldPosition otherPos; - otherPos.setField(pos.getField()); - UnicodeString earlierDate; - fDateFormat->format(fromCalendar, earlierDate, pos); - UnicodeString laterDate; - fDateFormat->format(toCalendar, laterDate, otherPos); - UnicodeString fallbackPattern; - fInfo->getFallbackIntervalPattern(fallbackPattern); - adjustPosition(fallbackPattern, earlierDate, pos, laterDate, otherPos, pos); - UnicodeString fallbackRange; - SimpleFormatter(fallbackPattern, 2, 2, status). - format(earlierDate, laterDate, fallbackRange, status); - if ( U_SUCCESS(status) && formatDatePlusTimeRange ) { - // fallbackRange has just the time range, need to format the date part and combine that - fDateFormat->applyPattern(*fDatePattern); - UnicodeString datePortion; - otherPos.setBeginIndex(0); - otherPos.setEndIndex(0); - fDateFormat->format(fromCalendar, datePortion, otherPos); - adjustPosition(*fDateTimeFormat, fallbackRange, pos, datePortion, otherPos, pos); - const UnicodeString *values[2] = { - &fallbackRange, // {0} is time range - &datePortion, // {1} is single date portion - }; - SimpleFormatter(*fDateTimeFormat, 2, 2, status). - formatAndReplace(values, 2, fallbackRange, NULL, 0, status); - } - if ( U_SUCCESS(status) ) { - appendTo.append(fallbackRange); - } - if (formatDatePlusTimeRange) { + + // {0} is time range + // {1} is single date portion + // TODO(ICU-20406): Use SimpleFormatter Iterator interface when available. + if (offsets[0] < offsets[1]) { + appendTo.append(patternBody.tempSubStringBetween(0, offsets[0])); + fDateFormat->applyPattern(*fTimePattern); + fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0], offsets[1])); + fDateFormat->applyPattern(*fDatePattern); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1])); + } else { + appendTo.append(patternBody.tempSubStringBetween(0, offsets[1])); + fDateFormat->applyPattern(*fDatePattern); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1], offsets[0])); + fDateFormat->applyPattern(*fTimePattern); + fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0])); + } + // restore full pattern fDateFormat->applyPattern(fullPattern); + } else { + fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status); } return appendTo; } @@ -1552,6 +1658,7 @@ DateIntervalFormat::fgCalendarFieldToPatternLetter[] = }; + U_NAMESPACE_END #endif diff --git a/deps/icu-small/source/i18n/dtitvinf.cpp b/deps/icu-small/source/i18n/dtitvinf.cpp index a289fc79c8da0e..c0a6980e5567bc 100644 --- a/deps/icu-small/source/i18n/dtitvinf.cpp +++ b/deps/icu-small/source/i18n/dtitvinf.cpp @@ -326,7 +326,9 @@ struct DateIntervalInfo::DateIntervalSink : public ResourceSink { char c0; if ((c0 = patternLetter[0]) != 0 && patternLetter[1] == 0) { // Check that the pattern letter is accepted - if (c0 == 'y') { + if (c0 == 'G') { + return UCAL_ERA; + } else if (c0 == 'y') { return UCAL_YEAR; } else if (c0 == 'M') { return UCAL_MONTH; diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index b44daf37bf5802..9ca29a3cc7e608 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -471,9 +471,14 @@ enum AllowedHourFormat{ ALLOWED_HOUR_FORMAT_UNKNOWN = -1, ALLOWED_HOUR_FORMAT_h, ALLOWED_HOUR_FORMAT_H, + ALLOWED_HOUR_FORMAT_K, // Added ICU-20383, used by JP + ALLOWED_HOUR_FORMAT_k, // Added ICU-20383, not currently used ALLOWED_HOUR_FORMAT_hb, - ALLOWED_HOUR_FORMAT_Hb, ALLOWED_HOUR_FORMAT_hB, + ALLOWED_HOUR_FORMAT_Kb, // Added ICU-20383, not currently used + ALLOWED_HOUR_FORMAT_KB, // Added ICU-20383, not currently used + // ICU-20383 The following are unlikely and not currently used + ALLOWED_HOUR_FORMAT_Hb, ALLOWED_HOUR_FORMAT_HB }; @@ -511,36 +516,55 @@ struct AllowedHourFormatsSink : public ResourceSink { const char *regionOrLocale = key; ResourceTable formatList = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } + // below we construct a list[] that has an entry for the "preferred" value at [0], + // followed by 1 or more entries for the "allowed" values, terminated with an + // entry for ALLOWED_HOUR_FORMAT_UNKNOWN (not included in length below) + LocalMemory list; + int32_t length = 0; + int32_t preferredFormat = ALLOWED_HOUR_FORMAT_UNKNOWN; for (int32_t j = 0; formatList.getKeyAndValue(j, key, value); ++j) { - if (uprv_strcmp(key, "allowed") == 0) { // Ignore "preferred" list. - LocalMemory list; - int32_t length; + if (uprv_strcmp(key, "allowed") == 0) { if (value.getType() == URES_STRING) { - if (list.allocateInsteadAndReset(2) == nullptr) { + length = 2; // 1 preferred to add later, 1 allowed to add now + if (list.allocateInsteadAndReset(length + 1) == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } - list[0] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); - length = 1; + list[1] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); } else { ResourceArray allowedFormats = value.getArray(errorCode); - length = allowedFormats.getSize(); + length = allowedFormats.getSize() + 1; // 1 preferred, getSize allowed if (list.allocateInsteadAndReset(length + 1) == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } - for (int32_t k = 0; k < length; ++k) { - allowedFormats.getValue(k, value); + for (int32_t k = 1; k < length; ++k) { + allowedFormats.getValue(k-1, value); list[k] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); } } - list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN; - uhash_put(localeToAllowedHourFormatsMap, - const_cast(regionOrLocale), list.orphan(), &errorCode); - if (U_FAILURE(errorCode)) { return; } + } else if (uprv_strcmp(key, "preferred") == 0) { + preferredFormat = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); } } + if (length > 1) { + list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: list[1]; + } else { + // fallback handling for missing data + length = 2; // 1 preferred, 1 allowed + if (list.allocateInsteadAndReset(length + 1) == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: ALLOWED_HOUR_FORMAT_H; + list[1] = list[0]; + } + list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN; + // At this point list[] will have at least two non-ALLOWED_HOUR_FORMAT_UNKNOWN entries, + // followed by ALLOWED_HOUR_FORMAT_UNKNOWN. + uhash_put(localeToAllowedHourFormatsMap, const_cast(regionOrLocale), list.orphan(), &errorCode); + if (U_FAILURE(errorCode)) { return; } } } @@ -548,10 +572,14 @@ struct AllowedHourFormatsSink : public ResourceSink { if (s.length() == 1) { if (s[0] == LOW_H) { return ALLOWED_HOUR_FORMAT_h; } if (s[0] == CAP_H) { return ALLOWED_HOUR_FORMAT_H; } + if (s[0] == CAP_K) { return ALLOWED_HOUR_FORMAT_K; } + if (s[0] == LOW_K) { return ALLOWED_HOUR_FORMAT_k; } } else if (s.length() == 2) { if (s[0] == LOW_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_hb; } - if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; } if (s[0] == LOW_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_hB; } + if (s[0] == CAP_K && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Kb; } + if (s[0] == CAP_K && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_KB; } + if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; } if (s[0] == CAP_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_HB; } } @@ -587,16 +615,11 @@ U_CFUNC void U_CALLCONV DateTimePatternGenerator::loadAllowedHourFormatsData(UEr void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErrorCode &status) { if (U_FAILURE(status)) { return; } - const char *localeID = locale.getName(); - char maxLocaleID[ULOC_FULLNAME_CAPACITY]; - int32_t length = uloc_addLikelySubtags(localeID, maxLocaleID, ULOC_FULLNAME_CAPACITY, &status); + Locale maxLocale(locale); + maxLocale.addLikelySubtags(status); if (U_FAILURE(status)) { return; - } else if (length == ULOC_FULLNAME_CAPACITY) { // no room for NUL - status = U_BUFFER_OVERFLOW_ERROR; - return; } - Locale maxLocale = Locale(maxLocaleID); const char *country = maxLocale.getCountry(); if (*country == '\0') { country = "001"; } @@ -614,13 +637,23 @@ void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErro } if (allowedFormats != nullptr) { // Lookup is successful + // Here allowedFormats points to a list consisting of key for preferredFormat, + // followed by one or more keys for allowedFormats, then followed by ALLOWED_HOUR_FORMAT_UNKNOWN. + switch (allowedFormats[0]) { + case ALLOWED_HOUR_FORMAT_h: fDefaultHourFormatChar = LOW_H; break; + case ALLOWED_HOUR_FORMAT_H: fDefaultHourFormatChar = CAP_H; break; + case ALLOWED_HOUR_FORMAT_K: fDefaultHourFormatChar = CAP_K; break; + case ALLOWED_HOUR_FORMAT_k: fDefaultHourFormatChar = LOW_K; break; + default: fDefaultHourFormatChar = CAP_H; break; + } for (int32_t i = 0; i < UPRV_LENGTHOF(fAllowedHourFormats); ++i) { - fAllowedHourFormats[i] = allowedFormats[i]; - if (allowedFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) { + fAllowedHourFormats[i] = allowedFormats[i + 1]; + if (fAllowedHourFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) { break; } } } else { // Lookup failed, twice + fDefaultHourFormatChar = CAP_H; fAllowedHourFormats[0] = ALLOWED_HOUR_FORMAT_H; fAllowedHourFormats[1] = ALLOWED_HOUR_FORMAT_UNKNOWN; } @@ -750,8 +783,6 @@ DateTimePatternGenerator::hackTimes(const UnicodeString& hackPattern, UErrorCode #define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY) -static const UChar hourFormatChars[] = { CAP_H, LOW_H, CAP_K, LOW_K, 0 }; // HhKk, the hour format characters - void DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err) { destination.clear().append(DT_DateTimeGregorianTag, -1, err); // initial default @@ -791,18 +822,9 @@ void DateTimePatternGenerator::consumeShortTimePattern(const UnicodeString& shortTimePattern, UErrorCode& status) { if (U_FAILURE(status)) { return; } - // set fDefaultHourFormatChar to the hour format character from this pattern - int32_t tfIdx, tfLen = shortTimePattern.length(); - UBool ignoreChars = FALSE; - for (tfIdx = 0; tfIdx < tfLen; tfIdx++) { - UChar tfChar = shortTimePattern.charAt(tfIdx); - if ( tfChar == SINGLE_QUOTE ) { - ignoreChars = !ignoreChars; // toggle (handle quoted literals & '' for single quote) - } else if ( !ignoreChars && u_strchr(hourFormatChars, tfChar) != nullptr ) { - fDefaultHourFormatChar = tfChar; - break; - } - } + // ICU-20383 No longer set fDefaultHourFormatChar to the hour format character from + // this pattern; instead it is set from localeToAllowedHourFormatsMap which now + // includes entries for both preferred and allowed formats. // HACK for hh:ss hackTimes(shortTimePattern, status); @@ -1140,20 +1162,24 @@ DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& pattern if (patChr == LOW_J) { hourChar = fDefaultHourFormatChar; } else { - AllowedHourFormat preferred; + AllowedHourFormat bestAllowed; if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) { - preferred = (AllowedHourFormat)fAllowedHourFormats[0]; + bestAllowed = (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) { + if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) { hourChar = CAP_H; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_K || bestAllowed == ALLOWED_HOUR_FORMAT_KB || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) { + hourChar = CAP_K; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_k) { + hourChar = LOW_K; } // 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) { + if (bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_hB || bestAllowed == ALLOWED_HOUR_FORMAT_KB) { dayPeriodChar = CAP_B; - } else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) { + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_Hb || bestAllowed == ALLOWED_HOUR_FORMAT_hb || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) { dayPeriodChar = LOW_B; } } @@ -1804,7 +1830,7 @@ PatternMap::copyFrom(const PatternMap& other, UErrorCode& status) { if (prevElem != nullptr) { prevElem->next.adoptInstead(curElem); } else { - U_ASSERT(false); + UPRV_UNREACHABLE; } } prevElem = curElem; diff --git a/deps/icu-small/source/i18n/erarules.cpp b/deps/icu-small/source/i18n/erarules.cpp index 669f84423046fd..7e21a71c333f6f 100644 --- a/deps/icu-small/source/i18n/erarules.cpp +++ b/deps/icu-small/source/i18n/erarules.cpp @@ -1,6 +1,8 @@ // © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING @@ -9,6 +11,7 @@ #include "unicode/ucal.h" #include "unicode/ures.h" #include "unicode/ustring.h" +#include "unicode/timezone.h" #include "cmemory.h" #include "cstring.h" #include "erarules.h" @@ -101,7 +104,7 @@ static int32_t compareEncodedDateWithYMD(int encoded, int year, int month, int d EraRules::EraRules(LocalMemory& eraStartDates, int32_t numEras) : numEras(numEras) { - startDates.moveFrom(eraStartDates); + startDates = std::move(eraStartDates); initCurrentEra(); } @@ -288,9 +291,22 @@ int32_t EraRules::getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCo } void EraRules::initCurrentEra() { - UDate now = ucal_getNow(); + // Compute local wall time in millis using ICU's default time zone. + UErrorCode ec = U_ZERO_ERROR; + UDate localMillis = ucal_getNow(); + + int32_t rawOffset, dstOffset; + TimeZone* zone = TimeZone::createDefault(); + // If we failed to create the default time zone, we are in a bad state and don't + // really have many options. Carry on using UTC millis as a fallback. + if (zone != nullptr) { + zone->getOffset(localMillis, FALSE, rawOffset, dstOffset, ec); + delete zone; + localMillis += (rawOffset + dstOffset); + } + int year, month0, dom, dow, doy, mid; - Grego::timeToFields(now, year, month0, dom, dow, doy, mid); + Grego::timeToFields(localMillis, year, month0, dom, dow, doy, mid); int currentEncodedDate = encodeDate(year, month0 + 1 /* changes to 1-base */, dom); int eraIdx = numEras - 1; while (eraIdx > 0) { @@ -301,7 +317,8 @@ void EraRules::initCurrentEra() { } // Note: current era could be before the first era. // In this case, this implementation returns the first era index (0). - currentEra = eraIdx;} + currentEra = eraIdx; +} U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/erarules.h b/deps/icu-small/source/i18n/erarules.h index 4ed86408325ed7..74b7862da4c18c 100644 --- a/deps/icu-small/source/i18n/erarules.h +++ b/deps/icu-small/source/i18n/erarules.h @@ -18,10 +18,16 @@ U_NAMESPACE_BEGIN // When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. // See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(_MSC_VER) // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(suppress: 4661) +#pragma warning(push) +#pragma warning(disable: 4661) +#endif template class U_I18N_API LocalPointerBase; template class U_I18N_API LocalMemory; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif #endif class U_I18N_API EraRules : public UMemory { @@ -69,7 +75,8 @@ class U_I18N_API EraRules : public UMemory { /** * Gets the current era index. This is calculated only once for an instance of - * EraRules. + * EraRules. The current era calculation is based on the default time zone at + * the time of instantiation. * * @return era index of current era (or 0, when current date is before the first era) */ diff --git a/deps/icu-small/source/i18n/fmtable.cpp b/deps/icu-small/source/i18n/fmtable.cpp index cb6134cb4b2423..9baa5ff480db6a 100644 --- a/deps/icu-small/source/i18n/fmtable.cpp +++ b/deps/icu-small/source/i18n/fmtable.cpp @@ -732,9 +732,14 @@ CharString *Formattable::internalGetCharString(UErrorCode &status) { // Older ICUs called uprv_decNumberToString here, which is not exactly the same as // DecimalQuantity::toScientificString(). The biggest difference is that uprv_decNumberToString does // not print scientific notation for magnitudes greater than -5 and smaller than some amount (+5?). - if (fDecimalQuantity->isZero()) { + if (fDecimalQuantity->isInfinite()) { + fDecimalStr->append("Infinity", status); + } else if (fDecimalQuantity->isNaN()) { + fDecimalStr->append("NaN", status); + } else if (fDecimalQuantity->isZero()) { fDecimalStr->append("0", -1, status); - } else if (std::abs(fDecimalQuantity->getMagnitude()) < 5) { + } else if (fType==kLong || fType==kInt64 || // use toPlainString for integer types + (fDecimalQuantity->getMagnitude() != INT32_MIN && std::abs(fDecimalQuantity->getMagnitude()) < 5)) { fDecimalStr->appendInvariantChars(fDecimalQuantity->toPlainString(), status); } else { fDecimalStr->appendInvariantChars(fDecimalQuantity->toScientificString(), status); diff --git a/deps/icu-small/source/i18n/formattedval_impl.h b/deps/icu-small/source/i18n/formattedval_impl.h new file mode 100644 index 00000000000000..69ba0922edc81f --- /dev/null +++ b/deps/icu-small/source/i18n/formattedval_impl.h @@ -0,0 +1,259 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#ifndef __FORMVAL_IMPL_H__ +#define __FORMVAL_IMPL_H__ + +#include "unicode/utypes.h" +#if !UCONFIG_NO_FORMATTING + +// This file contains compliant implementations of FormattedValue which can be +// leveraged by ICU formatters. +// +// Each implementation is defined in its own cpp file in order to split +// dependencies more modularly. + +#include "unicode/formattedvalue.h" +#include "capi_helper.h" +#include "fphdlimp.h" +#include "util.h" +#include "uvectr32.h" +#include "number_stringbuilder.h" + + +/** + * Represents the type of constraint for ConstrainedFieldPosition. + * + * Constraints are used to control the behavior of iteration in FormattedValue. + * + * @internal + */ +typedef enum UCFPosConstraintType { + /** + * Represents the lack of a constraint. + * + * This is the value of fConstraint if no "constrain" methods were called. + * + * @internal + */ + UCFPOS_CONSTRAINT_NONE = 0, + + /** + * Represents that the field category is constrained. + * + * This is the value of fConstraint if constraintCategory was called. + * + * FormattedValue implementations should not change the field category + * while this constraint is active. + * + * @internal + */ + UCFPOS_CONSTRAINT_CATEGORY, + + /** + * Represents that the field and field category are constrained. + * + * This is the value of fConstraint if constraintField was called. + * + * FormattedValue implementations should not change the field or field category + * while this constraint is active. + * + * @internal + */ + UCFPOS_CONSTRAINT_FIELD +} UCFPosConstraintType; + + +U_NAMESPACE_BEGIN + + +/** Implementation using FieldPositionHandler to accept fields. */ +class FormattedValueFieldPositionIteratorImpl : public UMemory, public FormattedValue { +public: + + /** @param initialFieldCapacity Initially allocate space for this many fields. */ + FormattedValueFieldPositionIteratorImpl(int32_t initialFieldCapacity, UErrorCode& status); + + virtual ~FormattedValueFieldPositionIteratorImpl(); + + // Implementation of FormattedValue (const): + + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + Appendable& appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + // Additional methods used during construction phase only (non-const): + + FieldPositionIteratorHandler getHandler(UErrorCode& status); + void appendString(UnicodeString string, UErrorCode& status); + + /** + * Computes the spans for duplicated values. + * For example, if the string has fields: + * + * ...aa..[b.cc]..d.[bb.e.c]..a.. + * + * then the spans will be the bracketed regions. + * + * Assumes that the currently known fields are sorted + * and all in the same category. + */ + void addOverlapSpans(UFieldCategory spanCategory, int8_t firstIndex, UErrorCode& status); + + /** + * Sorts the fields: start index first, length second. + */ + void sort(); + +private: + UnicodeString fString; + UVector32 fFields; +}; + + +class FormattedValueNumberStringBuilderImpl : public UMemory, public FormattedValue { +public: + + FormattedValueNumberStringBuilderImpl(number::impl::Field numericField); + + virtual ~FormattedValueNumberStringBuilderImpl(); + + // Implementation of FormattedValue (const): + + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + Appendable& appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + inline number::impl::NumberStringBuilder& getStringRef() { + return fString; + } + + inline const number::impl::NumberStringBuilder& getStringRef() const { + return fString; + } + +private: + number::impl::NumberStringBuilder fString; + number::impl::Field fNumericField; +}; + + +// C API Helpers for FormattedValue +// Magic number as ASCII == "UFV" +struct UFormattedValueImpl; +typedef IcuCApiHelper UFormattedValueApiHelper; +struct UFormattedValueImpl : public UMemory, public UFormattedValueApiHelper { + // This pointer should be set by the child class. + FormattedValue* fFormattedValue = nullptr; +}; + + +/** Boilerplate to check for valid status before dereferencing the fData pointer. */ +#define UPRV_FORMATTED_VALUE_METHOD_GUARD(returnExpression) \ + if (U_FAILURE(status)) { \ + return returnExpression; \ + } \ + if (fData == nullptr) { \ + status = fErrorCode; \ + return returnExpression; \ + } \ + + +/** Implementation of the methods from U_FORMATTED_VALUE_SUBCLASS_AUTO. */ +#define UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(Name) \ + Name::Name(Name&& src) U_NOEXCEPT \ + : fData(src.fData), fErrorCode(src.fErrorCode) { \ + src.fData = nullptr; \ + src.fErrorCode = U_INVALID_STATE_ERROR; \ + } \ + Name::~Name() { \ + delete fData; \ + fData = nullptr; \ + } \ + Name& Name::operator=(Name&& src) U_NOEXCEPT { \ + delete fData; \ + fData = src.fData; \ + src.fData = nullptr; \ + fErrorCode = src.fErrorCode; \ + src.fErrorCode = U_INVALID_STATE_ERROR; \ + return *this; \ + } \ + UnicodeString Name::toString(UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) \ + return fData->toString(status); \ + } \ + UnicodeString Name::toTempString(UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) \ + return fData->toTempString(status); \ + } \ + Appendable& Name::appendTo(Appendable& appendable, UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(appendable) \ + return fData->appendTo(appendable, status); \ + } \ + UBool Name::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) \ + return fData->nextPosition(cfpos, status); \ + } + + +/** Like UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL but without impl type declarations. */ +#define UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(CType, ImplType, HelperType, Prefix) \ + U_CAPI CType* U_EXPORT2 \ + Prefix ## _openResult (UErrorCode* ec) { \ + if (U_FAILURE(*ec)) { \ + return nullptr; \ + } \ + ImplType* impl = new ImplType(); \ + if (impl == nullptr) { \ + *ec = U_MEMORY_ALLOCATION_ERROR; \ + return nullptr; \ + } \ + return static_cast(impl)->exportForC(); \ + } \ + U_DRAFT const UFormattedValue* U_EXPORT2 \ + Prefix ## _resultAsValue (const CType* uresult, UErrorCode* ec) { \ + const ImplType* result = HelperType::validate(uresult, *ec); \ + if (U_FAILURE(*ec)) { return nullptr; } \ + return static_cast(result)->exportConstForC(); \ + } \ + U_CAPI void U_EXPORT2 \ + Prefix ## _closeResult (CType* uresult) { \ + UErrorCode localStatus = U_ZERO_ERROR; \ + const ImplType* impl = HelperType::validate(uresult, localStatus); \ + delete impl; \ + } + + +/** + * Implementation of the standard methods for a UFormattedValue "subclass" C API. + * @param CPPType The public C++ type, like FormattedList + * @param CType The public C type, like UFormattedList + * @param ImplType A name to use for the implementation class + * @param HelperType A name to use for the "mixin" typedef for C API conversion + * @param Prefix The C API prefix, like ulistfmt + * @param MagicNumber A unique 32-bit number to use to identify this type + */ +#define UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(CPPType, CType, ImplType, HelperType, Prefix, MagicNumber) \ + U_NAMESPACE_BEGIN \ + class ImplType; \ + typedef IcuCApiHelper HelperType; \ + class ImplType : public UFormattedValueImpl, public HelperType { \ + public: \ + ImplType(); \ + ~ImplType(); \ + CPPType fImpl; \ + }; \ + ImplType::ImplType() { \ + fFormattedValue = &fImpl; \ + } \ + ImplType::~ImplType() {} \ + U_NAMESPACE_END \ + UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(CType, ImplType, HelperType, Prefix) + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ +#endif // __FORMVAL_IMPL_H__ diff --git a/deps/icu-small/source/i18n/formattedval_iterimpl.cpp b/deps/icu-small/source/i18n/formattedval_iterimpl.cpp new file mode 100644 index 00000000000000..75328fae883bbc --- /dev/null +++ b/deps/icu-small/source/i18n/formattedval_iterimpl.cpp @@ -0,0 +1,176 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +// This file contains one implementation of FormattedValue. +// Other independent implementations should go into their own cpp file for +// better dependency modularization. + +#include "formattedval_impl.h" +#include "putilimp.h" + +U_NAMESPACE_BEGIN + + +FormattedValueFieldPositionIteratorImpl::FormattedValueFieldPositionIteratorImpl( + int32_t initialFieldCapacity, + UErrorCode& status) + : fFields(initialFieldCapacity * 4, status) { +} + +FormattedValueFieldPositionIteratorImpl::~FormattedValueFieldPositionIteratorImpl() = default; + +UnicodeString FormattedValueFieldPositionIteratorImpl::toString( + UErrorCode&) const { + return fString; +} + +UnicodeString FormattedValueFieldPositionIteratorImpl::toTempString( + UErrorCode&) const { + // The alias must point to memory owned by this object; + // fastCopyFrom doesn't do this when using a stack buffer. + return UnicodeString(TRUE, fString.getBuffer(), fString.length()); +} + +Appendable& FormattedValueFieldPositionIteratorImpl::appendTo( + Appendable& appendable, + UErrorCode&) const { + appendable.appendString(fString.getBuffer(), fString.length()); + return appendable; +} + +UBool FormattedValueFieldPositionIteratorImpl::nextPosition( + ConstrainedFieldPosition& cfpos, + UErrorCode&) const { + U_ASSERT(fFields.size() % 4 == 0); + int32_t numFields = fFields.size() / 4; + int32_t i = static_cast(cfpos.getInt64IterationContext()); + for (; i < numFields; i++) { + UFieldCategory category = static_cast(fFields.elementAti(i * 4)); + int32_t field = fFields.elementAti(i * 4 + 1); + if (cfpos.matchesField(category, field)) { + int32_t start = fFields.elementAti(i * 4 + 2); + int32_t limit = fFields.elementAti(i * 4 + 3); + cfpos.setState(category, field, start, limit); + break; + } + } + cfpos.setInt64IterationContext(i == numFields ? i : i + 1); + return i < numFields; +} + + +FieldPositionIteratorHandler FormattedValueFieldPositionIteratorImpl::getHandler( + UErrorCode& status) { + return FieldPositionIteratorHandler(&fFields, status); +} + +void FormattedValueFieldPositionIteratorImpl::appendString( + UnicodeString string, + UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + fString.append(string); + // Make the string NUL-terminated + if (fString.getTerminatedBuffer() == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } +} + + +void FormattedValueFieldPositionIteratorImpl::addOverlapSpans( + UFieldCategory spanCategory, + int8_t firstIndex, + UErrorCode& status) { + // In order to avoid fancy data structures, this is an O(N^2) algorithm, + // which should be fine for all real-life applications of this function. + int32_t s1a = INT32_MAX; + int32_t s1b = 0; + int32_t s2a = INT32_MAX; + int32_t s2b = 0; + int32_t numFields = fFields.size() / 4; + for (int32_t i = 0; i higher rank + comparison = start2 - start1; + } else if (limit1 != limit2) { + // Higher length (end index) -> lower rank + comparison = limit1 - limit2; + } else if (categ1 != categ2) { + // Higher field category -> lower rank + comparison = categ1 - categ2; + } else if (field1 != field2) { + // Higher field -> higher rank + comparison = field2 - field1; + } + if (comparison < 0) { + // Perform a swap + isSorted = false; + fFields.setElementAt(categ2, i*4 + 0); + fFields.setElementAt(field2, i*4 + 1); + fFields.setElementAt(start2, i*4 + 2); + fFields.setElementAt(limit2, i*4 + 3); + fFields.setElementAt(categ1, i*4 + 4); + fFields.setElementAt(field1, i*4 + 5); + fFields.setElementAt(start1, i*4 + 6); + fFields.setElementAt(limit1, i*4 + 7); + } + } + if (isSorted) { + break; + } + } +} + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/formattedval_sbimpl.cpp b/deps/icu-small/source/i18n/formattedval_sbimpl.cpp new file mode 100644 index 00000000000000..1fbecf25ac6bb6 --- /dev/null +++ b/deps/icu-small/source/i18n/formattedval_sbimpl.cpp @@ -0,0 +1,46 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +// This file contains one implementation of FormattedValue. +// Other independent implementations should go into their own cpp file for +// better dependency modularization. + +#include "formattedval_impl.h" + +U_NAMESPACE_BEGIN + + +FormattedValueNumberStringBuilderImpl::FormattedValueNumberStringBuilderImpl(number::impl::Field numericField) + : fNumericField(numericField) { +} + +FormattedValueNumberStringBuilderImpl::~FormattedValueNumberStringBuilderImpl() { +} + + +UnicodeString FormattedValueNumberStringBuilderImpl::toString(UErrorCode&) const { + return fString.toUnicodeString(); +} + +UnicodeString FormattedValueNumberStringBuilderImpl::toTempString(UErrorCode&) const { + return fString.toTempUnicodeString(); +} + +Appendable& FormattedValueNumberStringBuilderImpl::appendTo(Appendable& appendable, UErrorCode&) const { + appendable.appendString(fString.chars(), fString.length()); + return appendable; +} + +UBool FormattedValueNumberStringBuilderImpl::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const { + // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool + return fString.nextPosition(cfpos, fNumericField, status) ? TRUE : FALSE; +} + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/formattedvalue.cpp b/deps/icu-small/source/i18n/formattedvalue.cpp new file mode 100644 index 00000000000000..e2c9c42fc88a36 --- /dev/null +++ b/deps/icu-small/source/i18n/formattedvalue.cpp @@ -0,0 +1,232 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/formattedvalue.h" +#include "formattedval_impl.h" +#include "capi_helper.h" + +U_NAMESPACE_BEGIN + + +ConstrainedFieldPosition::ConstrainedFieldPosition() {} + +ConstrainedFieldPosition::~ConstrainedFieldPosition() {} + +void ConstrainedFieldPosition::reset() { + fContext = 0LL; + fField = 0; + fStart = 0; + fLimit = 0; + fConstraint = UCFPOS_CONSTRAINT_NONE; + fCategory = UFIELD_CATEGORY_UNDEFINED; +} + +void ConstrainedFieldPosition::constrainCategory(int32_t category) { + fConstraint = UCFPOS_CONSTRAINT_CATEGORY; + fCategory = category; +} + +void ConstrainedFieldPosition::constrainField(int32_t category, int32_t field) { + fConstraint = UCFPOS_CONSTRAINT_FIELD; + fCategory = category; + fField = field; +} + +void ConstrainedFieldPosition::setInt64IterationContext(int64_t context) { + fContext = context; +} + +UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) const { + switch (fConstraint) { + case UCFPOS_CONSTRAINT_NONE: + return TRUE; + case UCFPOS_CONSTRAINT_CATEGORY: + return fCategory == category; + case UCFPOS_CONSTRAINT_FIELD: + return fCategory == category && fField == field; + default: + UPRV_UNREACHABLE; + } +} + +void ConstrainedFieldPosition::setState( + int32_t category, + int32_t field, + int32_t start, + int32_t limit) { + fCategory = category; + fField = field; + fStart = start; + fLimit = limit; +} + + +FormattedValue::~FormattedValue() = default; + + +/////////////////////// +/// C API FUNCTIONS /// +/////////////////////// + +struct UConstrainedFieldPositionImpl : public UMemory, + // Magic number as ASCII == "UCF" + public IcuCApiHelper { + ConstrainedFieldPosition fImpl; +}; + +U_CAPI UConstrainedFieldPosition* U_EXPORT2 +ucfpos_open(UErrorCode* ec) { + auto* impl = new UConstrainedFieldPositionImpl(); + if (impl == nullptr) { + *ec = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return impl->exportForC(); +} + +U_CAPI void U_EXPORT2 +ucfpos_reset(UConstrainedFieldPosition* ptr, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.reset(); +} + +U_CAPI void U_EXPORT2 +ucfpos_constrainCategory(UConstrainedFieldPosition* ptr, int32_t category, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.constrainCategory(category); +} + +U_CAPI void U_EXPORT2 +ucfpos_constrainField(UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.constrainField(category, field); +} + +U_CAPI int32_t U_EXPORT2 +ucfpos_getCategory(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return UFIELD_CATEGORY_UNDEFINED; + } + return impl->fImpl.getCategory(); +} + +U_CAPI int32_t U_EXPORT2 +ucfpos_getField(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.getField(); +} + +U_CAPI void U_EXPORT2 +ucfpos_getIndexes(const UConstrainedFieldPosition* ptr, int32_t* pStart, int32_t* pLimit, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + *pStart = impl->fImpl.getStart(); + *pLimit = impl->fImpl.getLimit(); +} + +U_CAPI int64_t U_EXPORT2 +ucfpos_getInt64IterationContext(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.getInt64IterationContext(); +} + +U_CAPI void U_EXPORT2 +ucfpos_setInt64IterationContext(UConstrainedFieldPosition* ptr, int64_t context, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.setInt64IterationContext(context); +} + +U_CAPI UBool U_EXPORT2 +ucfpos_matchesField(const UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.matchesField(category, field); +} + +U_CAPI void U_EXPORT2 +ucfpos_setState( + UConstrainedFieldPosition* ptr, + int32_t category, + int32_t field, + int32_t start, + int32_t limit, + UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.setState(category, field, start, limit); +} + +U_CAPI void U_EXPORT2 +ucfpos_close(UConstrainedFieldPosition* ptr) { + UErrorCode localStatus = U_ZERO_ERROR; + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, localStatus); + delete impl; +} + + +U_DRAFT const UChar* U_EXPORT2 +ufmtval_getString( + const UFormattedValue* ufmtval, + int32_t* pLength, + UErrorCode* ec) { + const auto* impl = UFormattedValueApiHelper::validate(ufmtval, *ec); + if (U_FAILURE(*ec)) { + return nullptr; + } + UnicodeString readOnlyAlias = impl->fFormattedValue->toTempString(*ec); + if (U_FAILURE(*ec)) { + return nullptr; + } + if (pLength != nullptr) { + *pLength = readOnlyAlias.length(); + } + return readOnlyAlias.getBuffer(); +} + + +U_DRAFT UBool U_EXPORT2 +ufmtval_nextPosition( + const UFormattedValue* ufmtval, + UConstrainedFieldPosition* ucfpos, + UErrorCode* ec) { + const auto* fmtval = UFormattedValueApiHelper::validate(ufmtval, *ec); + auto* cfpos = UConstrainedFieldPositionImpl::validate(ucfpos, *ec); + if (U_FAILURE(*ec)) { + return FALSE; + } + return fmtval->fFormattedValue->nextPosition(cfpos->fImpl, *ec); +} + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/fphdlimp.cpp b/deps/icu-small/source/i18n/fphdlimp.cpp index c4015fae1bbaff..f51bf4bae7889c 100644 --- a/deps/icu-small/source/i18n/fphdlimp.cpp +++ b/deps/icu-small/source/i18n/fphdlimp.cpp @@ -38,7 +38,8 @@ FieldPositionOnlyHandler::~FieldPositionOnlyHandler() { void FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { - if (pos.getField() == id) { + if (pos.getField() == id && (!acceptFirstOnly || !seenFirst)) { + seenFirst = TRUE; pos.setBeginIndex(start + fShift); pos.setEndIndex(limit + fShift); } @@ -57,17 +58,27 @@ FieldPositionOnlyHandler::isRecording(void) const { return pos.getField() != FieldPosition::DONT_CARE; } +void FieldPositionOnlyHandler::setAcceptFirstOnly(UBool acceptFirstOnly) { + this->acceptFirstOnly = acceptFirstOnly; +} + // utility subclass FieldPositionIteratorHandler FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& _status) - : iter(posIter), vec(NULL), status(_status) { + : iter(posIter), vec(NULL), status(_status), fCategory(UFIELD_CATEGORY_UNDEFINED) { if (iter && U_SUCCESS(status)) { vec = new UVector32(status); } } +FieldPositionIteratorHandler::FieldPositionIteratorHandler( + UVector32* vec, + UErrorCode& status) + : iter(nullptr), vec(vec), status(status), fCategory(UFIELD_CATEGORY_UNDEFINED) { +} + FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { // setData adopts the vec regardless of status, so it's safe to null it if (iter) { @@ -79,8 +90,9 @@ FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { void FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { - if (iter && U_SUCCESS(status) && start < limit) { + if (vec && U_SUCCESS(status) && start < limit) { int32_t size = vec->size(); + vec->addElement(fCategory, status); vec->addElement(id, status); vec->addElement(start + fShift, status); vec->addElement(limit + fShift, status); diff --git a/deps/icu-small/source/i18n/fphdlimp.h b/deps/icu-small/source/i18n/fphdlimp.h index a6827e01e98b4b..00937830fe7b80 100644 --- a/deps/icu-small/source/i18n/fphdlimp.h +++ b/deps/icu-small/source/i18n/fphdlimp.h @@ -16,6 +16,7 @@ #include "unicode/fieldpos.h" #include "unicode/fpositer.h" +#include "unicode/formattedvalue.h" U_NAMESPACE_BEGIN @@ -40,6 +41,8 @@ class U_I18N_API FieldPositionHandler: public UMemory { class FieldPositionOnlyHandler : public FieldPositionHandler { FieldPosition& pos; + UBool acceptFirstOnly = FALSE; + UBool seenFirst = FALSE; public: FieldPositionOnlyHandler(FieldPosition& pos); @@ -48,6 +51,13 @@ class FieldPositionOnlyHandler : public FieldPositionHandler { void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE; void shiftLast(int32_t delta) U_OVERRIDE; UBool isRecording(void) const U_OVERRIDE; + + /** + * Enable this option to lock in the FieldPosition value after seeing the + * first occurrence of the field. The default behavior is to take the last + * occurrence. + */ + void setAcceptFirstOnly(UBool acceptFirstOnly); }; @@ -57,21 +67,38 @@ class FieldPositionIteratorHandler : public FieldPositionHandler { FieldPositionIterator* iter; // can be NULL UVector32* vec; UErrorCode status; + UFieldCategory fCategory; // Note, we keep a reference to status, so if status is on the stack, we have // to be destroyed before status goes out of scope. Easiest thing is to // allocate us on the stack in the same (or narrower) scope as status has. // This attempts to encourage that by blocking heap allocation. - void *operator new(size_t s); - void *operator new[](size_t s); + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif public: FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& status); + /** If using this constructor, you must call getError() when done formatting! */ + FieldPositionIteratorHandler(UVector32* vec, UErrorCode& status); ~FieldPositionIteratorHandler(); void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE; void shiftLast(int32_t delta) U_OVERRIDE; UBool isRecording(void) const U_OVERRIDE; + + /** Copies a failed error code into _status. */ + inline void getError(UErrorCode& _status) { + if (U_SUCCESS(_status) && U_FAILURE(status)) { + _status = status; + } + } + + inline void setCategory(UFieldCategory category) { + fCategory = category; + } }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/fpositer.cpp b/deps/icu-small/source/i18n/fpositer.cpp index 79e2791db8d371..b6e1b58309b4e0 100644 --- a/deps/icu-small/source/i18n/fpositer.cpp +++ b/deps/icu-small/source/i18n/fpositer.cpp @@ -65,10 +65,10 @@ void FieldPositionIterator::setData(UVector32 *adopt, UErrorCode& status) { if (adopt->size() == 0) { delete adopt; adopt = NULL; - } else if ((adopt->size() % 3) != 0) { + } else if ((adopt->size() % 4) != 0) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { - for (int i = 1; i < adopt->size(); i += 3) { + for (int i = 2; i < adopt->size(); i += 4) { if (adopt->elementAti(i) >= adopt->elementAti(i+1)) { status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -95,6 +95,8 @@ UBool FieldPositionIterator::next(FieldPosition& fp) { return FALSE; } + // Ignore the first element of the tetrad: used for field category + pos++; fp.setField(data->elementAti(pos++)); fp.setBeginIndex(data->elementAti(pos++)); fp.setEndIndex(data->elementAti(pos++)); diff --git a/deps/icu-small/source/i18n/gender.cpp b/deps/icu-small/source/i18n/gender.cpp index e60bc520bcc0e8..106cf424c59d88 100644 --- a/deps/icu-small/source/i18n/gender.cpp +++ b/deps/icu-small/source/i18n/gender.cpp @@ -32,7 +32,7 @@ #include "uhash.h" static UHashtable* gGenderInfoCache = NULL; -static UMutex gGenderMetaLock = U_MUTEX_INITIALIZER; + static const char* gNeutralStr = "neutral"; static const char* gMailTaintsStr = "maleTaints"; static const char* gMixedNeutralStr = "mixedNeutral"; @@ -98,6 +98,7 @@ const GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& stat return NULL; } + static UMutex gGenderMetaLock = U_MUTEX_INITIALIZER; const GenderInfo* result = NULL; const char* key = locale.getName(); { diff --git a/deps/icu-small/source/i18n/islamcal.cpp b/deps/icu-small/source/i18n/islamcal.cpp index 11615a1e5141d3..8d6171af011e5d 100644 --- a/deps/icu-small/source/i18n/islamcal.cpp +++ b/deps/icu-small/source/i18n/islamcal.cpp @@ -54,7 +54,6 @@ static void debug_islamcal_msg(const char *pat, ...) // --- The cache -- // cache of months -static UMutex astroLock = U_MUTEX_INITIALIZER; // pod bay door lock static icu::CalendarCache *gMonthCache = NULL; static icu::CalendarAstronomer *gIslamicCalendarAstro = NULL; @@ -223,9 +222,7 @@ const char *IslamicCalendar::getType() const { sType = "islamic-umalqura"; break; default: - U_ASSERT(false); // out of range - sType = "islamic"; // "islamic" is used as the generic type - break; + UPRV_UNREACHABLE; // out of range } return sType; } @@ -473,6 +470,7 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status) { double age = 0; + static UMutex astroLock = U_MUTEX_INITIALIZER; // pod bay door lock umtx_lock(&astroLock); if(gIslamicCalendarAstro == NULL) { gIslamicCalendarAstro = new CalendarAstronomer(); @@ -675,8 +673,7 @@ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) month = m; } } else { // invalid 'civil' - U_ASSERT(false); // should not get here, out of range - year=month=0; + UPRV_UNREACHABLE; // should not get here, out of range } dayOfMonth = (days - monthStart(year, month)) + 1; diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index 056781617d6d9d..cc061fd1410d84 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -18,6 +18,16 @@ #if !UCONFIG_NO_FORMATTING #if U_PLATFORM_HAS_WINUWP_API == 0 #include // getenv() is not available in UWP env +#else +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +# define VC_EXTRALEAN +# define NOUSER +# define NOSERVICE +# define NOIME +# define NOMCX +#include #endif #include "cmemory.h" #include "erarules.h" @@ -51,8 +61,9 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar) static const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR static const char* TENTATIVE_ERA_VAR_NAME = "ICU_ENABLE_TENTATIVE_ERA"; -// Initialize global Japanese era data -static void U_CALLCONV initializeEras(UErrorCode &status) { + +// Export the following for use by test code. +UBool JapaneseCalendar::enableTentativeEra() { // Although start date of next Japanese era is planned ahead, a name of // new era might not be available. This implementation allows tester to // check a new era without era names by settings below (in priority order). @@ -77,7 +88,13 @@ static void U_CALLCONV initializeEras(UErrorCode &status) { includeTentativeEra = TRUE; } #endif - gJapaneseEraRules = EraRules::createInstance("japanese", includeTentativeEra, status); + return includeTentativeEra; +} + + +// Initialize global Japanese era data +static void U_CALLCONV initializeEras(UErrorCode &status) { + gJapaneseEraRules = EraRules::createInstance("japanese", JapaneseCalendar::enableTentativeEra(), status); if (U_FAILURE(status)) { return; } @@ -233,7 +250,7 @@ int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { return 0; } - return gCurrentEra; + return gJapaneseEraRules->getNumberOfEras() - 1; // max known era, not gCurrentEra case UCAL_YEAR: { switch (limitType) { @@ -265,7 +282,7 @@ int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode if (U_FAILURE(status)) { return 0; // error case... any value } - if (era == gCurrentEra) { + if (era == gJapaneseEraRules->getNumberOfEras() - 1) { // max known era, not gCurrentEra // TODO: Investigate what value should be used here - revisit after 4.0. return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); } else { diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index 67d2d7031526a2..a32f3db5635473 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -66,8 +66,15 @@ U_NAMESPACE_BEGIN class JapaneseCalendar : public GregorianCalendar { public: + /** + * Check environment variable. + * @internal + */ + U_I18N_API static UBool U_EXPORT2 enableTentativeEra(void); + /** * Useful constants for JapaneseCalendar. + * Exported for use by test code. * @internal */ U_I18N_API static uint32_t U_EXPORT2 getCurrentEra(void); // the current era diff --git a/deps/icu-small/source/i18n/listformatter.cpp b/deps/icu-small/source/i18n/listformatter.cpp index d9195348529c57..64d2e36ae15059 100644 --- a/deps/icu-small/source/i18n/listformatter.cpp +++ b/deps/icu-small/source/i18n/listformatter.cpp @@ -31,6 +31,7 @@ #include "ucln_in.h" #include "uresimp.h" #include "resource.h" +#include "formattedval_impl.h" U_NAMESPACE_BEGIN @@ -65,9 +66,20 @@ ListFormatInternal(const ListFormatInternal &other) : }; +#if !UCONFIG_NO_FORMATTING +class FormattedListData : public FormattedValueFieldPositionIteratorImpl { +public: + FormattedListData(UErrorCode& status) : FormattedValueFieldPositionIteratorImpl(5, status) {} + virtual ~FormattedListData(); +}; + +FormattedListData::~FormattedListData() = default; + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedList) +#endif + static Hashtable* listPatternHash = nullptr; -static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; static const char STANDARD_STYLE[] = "standard"; U_CDECL_BEGIN @@ -132,6 +144,7 @@ const ListFormatInternal* ListFormatter::getListFormatInternal( keyBuffer.append(':', errorCode).append(style, errorCode); UnicodeString key(keyBuffer.data(), -1, US_INV); ListFormatInternal* result = nullptr; + static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; { Mutex m(&listFormatterMutex); if (listPatternHash == nullptr) { @@ -377,7 +390,7 @@ UnicodeString& ListFormatter::format( int32_t offset; FieldPositionIteratorHandler handler(posIter, errorCode); return format_(items, nItems, appendTo, -1, offset, &handler, errorCode); -}; +} #endif UnicodeString& ListFormatter::format( @@ -390,6 +403,44 @@ UnicodeString& ListFormatter::format( return format_(items, nItems, appendTo, index, offset, nullptr, errorCode); } +#if !UCONFIG_NO_FORMATTING +FormattedList ListFormatter::formatStringsToValue( + const UnicodeString items[], + int32_t nItems, + UErrorCode& errorCode) const { + LocalPointer result(new FormattedListData(errorCode), errorCode); + if (U_FAILURE(errorCode)) { + return FormattedList(errorCode); + } + UnicodeString string; + int32_t offset; + auto handler = result->getHandler(errorCode); + handler.setCategory(UFIELD_CATEGORY_LIST); + format_(items, nItems, string, -1, offset, &handler, errorCode); + handler.getError(errorCode); + result->appendString(string, errorCode); + if (U_FAILURE(errorCode)) { + return FormattedList(errorCode); + } + + // Add span fields and sort + ConstrainedFieldPosition cfpos; + cfpos.constrainField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD); + int32_t i = 0; + handler.setCategory(UFIELD_CATEGORY_LIST_SPAN); + while (result->nextPosition(cfpos, errorCode)) { + handler.addAttribute(i++, cfpos.getStart(), cfpos.getLimit()); + } + handler.getError(errorCode); + if (U_FAILURE(errorCode)) { + return FormattedList(errorCode); + } + result->sort(); + + return FormattedList(result.orphan()); +} +#endif + UnicodeString& ListFormatter::format_( const UnicodeString items[], int32_t nItems, diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index 03974ff4b74048..03e4417e64da6a 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -36,6 +36,8 @@ #include "unicode/putil.h" #include "unicode/smpdtfmt.h" #include "uassert.h" +#include "unicode/numberformatter.h" +#include "number_longnames.h" #include "sharednumberformat.h" #include "sharedpluralrules.h" @@ -45,9 +47,6 @@ 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 = 142; // see assertion in MeasureFormatCacheData constructor static constexpr int32_t WIDTH_INDEX_COUNT = UMEASFMT_WIDTH_NARROW + 1; UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureFormat) @@ -91,6 +90,19 @@ static UMeasureFormatWidth getRegularWidth(UMeasureFormatWidth width) { return width; } +static UNumberUnitWidth getUnitWidth(UMeasureFormatWidth width) { + switch (width) { + case UMEASFMT_WIDTH_WIDE: + return UNUM_UNIT_WIDTH_FULL_NAME; + case UMEASFMT_WIDTH_NARROW: + case UMEASFMT_WIDTH_NUMERIC: + return UNUM_UNIT_WIDTH_NARROW; + case UMEASFMT_WIDTH_SHORT: + default: + return UNUM_UNIT_WIDTH_SHORT; + } +} + /** * Instances contain all MeasureFormat specific data for a particular locale. * This data is cached. It is never copied, but is shared via shared pointers. @@ -110,20 +122,10 @@ class MeasureFormatCacheData : public SharedObject { * - UMEASFMT_WIDTH_WIDE/SHORT/NARROW: sideways alias for missing data */ 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]; - const UChar* dnams[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT]; - SimpleFormatter perFormatters[WIDTH_INDEX_COUNT]; MeasureFormatCacheData(); virtual ~MeasureFormatCacheData(); - UBool hasPerFormatter(int32_t width) const { - // TODO: Create a more obvious way to test if the per-formatter has been set? - // Use pointers, check for NULL? Or add an isValid() method? - return perFormatters[width].getArgumentLimit() == 2; - } - void adoptCurrencyFormat(int32_t widthIndex, NumberFormat *nfToAdopt) { delete currencyFormats[widthIndex]; currencyFormats[widthIndex] = nfToAdopt; @@ -157,14 +159,9 @@ class MeasureFormatCacheData : public SharedObject { 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; } - memset(&patterns[0][0][0], 0, sizeof(patterns)); - memset(&dnams[0][0], 0, sizeof(dnams)); memset(currencyFormats, 0, sizeof(currencyFormats)); } @@ -172,13 +169,6 @@ MeasureFormatCacheData::~MeasureFormatCacheData() { for (int32_t i = 0; i < UPRV_LENGTHOF(currencyFormats); ++i) { delete currencyFormats[i]; } - for (int32_t i = 0; i < MEAS_UNIT_COUNT; ++i) { - for (int32_t j = 0; j < WIDTH_INDEX_COUNT; ++j) { - for (int32_t k = 0; k < PATTERN_COUNT; ++k) { - delete patterns[i][j][k]; - } - } - } // Note: the contents of 'dnams' are pointers into the resource bundle delete integerFormat; delete numericDateFormatters; @@ -201,250 +191,6 @@ static UBool getString( return TRUE; } -namespace { - -static const UChar g_LOCALE_units[] = { - 0x2F, 0x4C, 0x4F, 0x43, 0x41, 0x4C, 0x45, 0x2F, - 0x75, 0x6E, 0x69, 0x74, 0x73 -}; -static const UChar gShort[] = { 0x53, 0x68, 0x6F, 0x72, 0x74 }; -static const UChar gNarrow[] = { 0x4E, 0x61, 0x72, 0x72, 0x6F, 0x77 }; - -/** - * Sink for enumerating all of the measurement unit display names. - * Contains inner sink classes, each one corresponding to a type of resource table. - * The outer sink handles the top-level units, unitsNarrow, and unitsShort tables. - * - * More specific bundles (en_GB) are enumerated before their parents (en_001, en, root): - * Only store a value if it is still missing, that is, it has not been overridden. - * - * C++: Each inner sink class has a reference to the main outer sink. - * Java: Use non-static inner classes instead. - */ -struct UnitDataSink : public ResourceSink { - - // Output data. - MeasureFormatCacheData &cacheData; - - // Path to current data. - UMeasureFormatWidth width; - const char *type; - int32_t unitIndex; - - UnitDataSink(MeasureFormatCacheData &outputData) - : cacheData(outputData), - width(UMEASFMT_WIDTH_COUNT), type(NULL), unitIndex(0) {} - ~UnitDataSink(); - - 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) { - patterns[index] = new SimpleFormatter( - value.getUnicodeString(errorCode), minPlaceholders, 1, errorCode); - } - if (U_SUCCESS(errorCode) && patterns[index] == NULL) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - } - } - - 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); - } - } - - /** - * Consume a display pattern. For example, - * unitsShort/duration/hour contains other{"{0} hrs"}. - */ - void consumePattern(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - if (uprv_strcmp(key, "dnam") == 0) { - // The display name for the unit in the current width. - setDnamIfAbsent(value, errorCode); - } else if (uprv_strcmp(key, "per") == 0) { - // For example, "{0}/h". - setFormatterIfAbsent(PER_UNIT_INDEX, value, 1, errorCode); - } else { - // The key must be one of the plural form strings. For example: - // one{"{0} hr"} - // other{"{0} hrs"} - setFormatterIfAbsent(StandardPlural::indexFromString(key, errorCode), value, 0, - errorCode); - } - } - - /** - * Consume a table of per-unit tables. For example, - * unitsShort/duration contains tables for duration-unit subtypes day & hour. - */ - void consumeSubtypeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - unitIndex = MeasureUnit::internalGetIndexForTypeAndSubtype(type, key); - if (unitIndex < 0) { - // TODO: How to handle unexpected data? - // See http://bugs.icu-project.org/trac/ticket/12597 - return; - } - - // We no longer handle units like "coordinate" here (which do not have plural variants) - if (value.getType() == URES_TABLE) { - // Units that have plural variants - ResourceTable patternTableTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; patternTableTable.getKeyAndValue(i, key, value); ++i) { - consumePattern(key, value, errorCode); - } - } else { - // TODO: How to handle unexpected data? - // See http://bugs.icu-project.org/trac/ticket/12597 - return; - } - } - - /** - * Consume compound x-per-y display pattern. For example, - * unitsShort/compound/per may be "{0}/{1}". - */ - void consumeCompoundPattern(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode) && uprv_strcmp(key, "per") == 0) { - cacheData.perFormatters[width]. - applyPatternMinMaxArguments(value.getUnicodeString(errorCode), 2, 2, errorCode); - } - } - - /** - * Consume a table of unit type tables. For example, - * unitsShort contains tables for area & duration. - * It also contains a table for the compound/per pattern. - */ - void consumeUnitTypesTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - if (uprv_strcmp(key, "currency") == 0) { - // Skip. - } else if (uprv_strcmp(key, "compound") == 0) { - if (!cacheData.hasPerFormatter(width)) { - ResourceTable compoundTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; compoundTable.getKeyAndValue(i, key, value); ++i) { - consumeCompoundPattern(key, value, errorCode); - } - } - } else if (uprv_strcmp(key, "coordinate") == 0) { - // special handling but we need to determine what that is - } else { - type = key; - ResourceTable subtypeTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; subtypeTable.getKeyAndValue(i, key, value); ++i) { - consumeSubtypeTable(key, value, errorCode); - } - } - } - - void consumeAlias(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - // Handle aliases like - // units:alias{"/LOCALE/unitsShort"} - // which should only occur in the root bundle. - UMeasureFormatWidth sourceWidth = widthFromKey(key); - if (sourceWidth == UMEASFMT_WIDTH_COUNT) { - // Alias from something we don't care about. - return; - } - UMeasureFormatWidth targetWidth = widthFromAlias(value, errorCode); - if (targetWidth == UMEASFMT_WIDTH_COUNT) { - // We do not recognize what to fall back to. - errorCode = U_INVALID_FORMAT_ERROR; - return; - } - // Check that we do not fall back to another fallback. - if (cacheData.widthFallback[targetWidth] != UMEASFMT_WIDTH_COUNT) { - errorCode = U_INVALID_FORMAT_ERROR; - return; - } - cacheData.widthFallback[sourceWidth] = targetWidth; - } - - void consumeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode) && (width = widthFromKey(key)) != UMEASFMT_WIDTH_COUNT) { - ResourceTable unitTypesTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) { - consumeUnitTypesTable(key, value, errorCode); - } - } - } - - static UMeasureFormatWidth widthFromKey(const char *key) { - if (uprv_strncmp(key, "units", 5) == 0) { - key += 5; - if (*key == 0) { - return UMEASFMT_WIDTH_WIDE; - } else if (uprv_strcmp(key, "Short") == 0) { - return UMEASFMT_WIDTH_SHORT; - } else if (uprv_strcmp(key, "Narrow") == 0) { - return UMEASFMT_WIDTH_NARROW; - } - } - return UMEASFMT_WIDTH_COUNT; - } - - static UMeasureFormatWidth widthFromAlias(const ResourceValue &value, UErrorCode &errorCode) { - int32_t length; - const UChar *s = value.getAliasString(length, errorCode); - // For example: "/LOCALE/unitsShort" - if (U_SUCCESS(errorCode) && length >= 13 && u_memcmp(s, g_LOCALE_units, 13) == 0) { - s += 13; - length -= 13; - if (*s == 0) { - return UMEASFMT_WIDTH_WIDE; - } else if (u_strCompare(s, length, gShort, 5, FALSE) == 0) { - return UMEASFMT_WIDTH_SHORT; - } else if (u_strCompare(s, length, gNarrow, 6, FALSE) == 0) { - return UMEASFMT_WIDTH_NARROW; - } - } - return UMEASFMT_WIDTH_COUNT; - } - - virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, - UErrorCode &errorCode) { - // Main entry point to sink - ResourceTable widthsTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; widthsTable.getKeyAndValue(i, key, value); ++i) { - if (value.getType() == URES_ALIAS) { - consumeAlias(key, value, errorCode); - } else { - consumeTable(key, value, errorCode); - } - } - } -}; - -// Virtual destructors must be defined out of line. -UnitDataSink::~UnitDataSink() {} - -} // namespace - -static UBool loadMeasureUnitData( - const UResourceBundle *resource, - MeasureFormatCacheData &cacheData, - UErrorCode &status) { - UnitDataSink sink(cacheData); - ures_getAllItemsWithFallback(resource, "", sink, status); - return U_SUCCESS(status); -} - static UnicodeString loadNumericDateFormatterPattern( const UResourceBundle *resource, const char *pattern, @@ -507,12 +253,6 @@ const MeasureFormatCacheData *LocaleCacheKey::createObje if (U_FAILURE(status)) { return NULL; } - if (!loadMeasureUnitData( - unitsBundle.getAlias(), - *result, - status)) { - return NULL; - } result->adoptNumericDateFormatters(loadNumericDateFormatters( unitsBundle.getAlias(), status)); if (U_FAILURE(status)) { @@ -764,29 +504,21 @@ UnicodeString &MeasureFormat::formatMeasurePerUnit( if (U_FAILURE(status)) { return appendTo; } - bool isResolved = false; - MeasureUnit resolvedUnit = - MeasureUnit::resolveUnitPerUnit(measure.getUnit(), perUnit, &isResolved); - if (isResolved) { - Measure newMeasure(measure.getNumber(), new MeasureUnit(resolvedUnit), status); - return formatMeasure( - newMeasure, **numberFormat, appendTo, pos, status); - } - FieldPosition fpos(pos.getField()); - UnicodeString result; - int32_t offset = withPerUnitAndAppend( - formatMeasure( - measure, **numberFormat, result, fpos, status), - perUnit, - appendTo, - status); - if (U_FAILURE(status)) { + auto* df = dynamic_cast(&getNumberFormatInternal()); + if (df == nullptr) { + // Don't know how to handle other types of NumberFormat + status = U_UNSUPPORTED_ERROR; return appendTo; } - if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) { - pos.setBeginIndex(fpos.getBeginIndex() + offset); - pos.setEndIndex(fpos.getEndIndex() + offset); + number::FormattedNumber result; + if (auto* lnf = df->toNumberFormatter(status)) { + result = lnf->unit(measure.getUnit()) + .perUnit(perUnit) + .unitWidth(getUnitWidth(fWidth)) + .formatDouble(measure.getNumber().getDouble(status), status); } + DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status); + appendTo.append(result.toTempString(status)); return appendTo; } @@ -838,22 +570,12 @@ UnicodeString &MeasureFormat::formatMeasures( return appendTo; } -UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& /*status*/) const { - UMeasureFormatWidth width = getRegularWidth(fWidth); - const UChar* const* styleToDnam = cache->dnams[unit.getIndex()]; - const UChar* dnam = styleToDnam[width]; - if (dnam == NULL) { - int32_t fallbackWidth = cache->widthFallback[width]; - dnam = styleToDnam[fallbackWidth]; - } - - UnicodeString result; - if (dnam == NULL) { - result.setToBogus(); - } else { - result.setTo(dnam, -1); - } - return result; +UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& status) const { + return number::impl::LongNameHandler::getUnitDisplayName( + getLocale(status), + unit, + getUnitWidth(fWidth), + status); } void MeasureFormat::initMeasureFormat( @@ -882,6 +604,7 @@ void MeasureFormat::initMeasureFormat( SharedObject::copyPtr(pr, pluralRules); pr->removeRef(); if (nf.isNull()) { + // TODO: Clean this up const SharedNumberFormat *shared = NumberFormat::createSharedInstance( locale, UNUM_DECIMAL, status); if (U_FAILURE(status)) { @@ -926,10 +649,14 @@ UBool MeasureFormat::setMeasureFormatLocale(const Locale &locale, UErrorCode &st return U_SUCCESS(status); } -const NumberFormat &MeasureFormat::getNumberFormat() const { +const NumberFormat &MeasureFormat::getNumberFormatInternal() const { return **numberFormat; } +const NumberFormat &MeasureFormat::getCurrencyFormatInternal() const { + return *cache->getCurrencyFormat(UMEASFMT_WIDTH_NARROW); +} + const PluralRules &MeasureFormat::getPluralRules() const { return **pluralRules; } @@ -962,11 +689,21 @@ UnicodeString &MeasureFormat::formatMeasure( pos, status); } - UnicodeString formattedNumber; - StandardPlural::Form pluralForm = QuantityFormatter::selectPlural( - amtNumber, nf, **pluralRules, formattedNumber, pos, status); - const SimpleFormatter *formatter = getPluralFormatter(amtUnit, fWidth, pluralForm, status); - return QuantityFormatter::format(*formatter, formattedNumber, appendTo, pos, status); + auto* df = dynamic_cast(&nf); + if (df == nullptr) { + // Don't know how to handle other types of NumberFormat + status = U_UNSUPPORTED_ERROR; + return appendTo; + } + number::FormattedNumber result; + if (auto* lnf = df->toNumberFormatter(status)) { + result = lnf->unit(amtUnit) + .unitWidth(getUnitWidth(fWidth)) + .formatDouble(amtNumber.getDouble(status), status); + } + DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status); + appendTo.append(result.toTempString(status)); + return appendTo; } // Formats hours-minutes-seconds as 5:37:23 or similar. @@ -1101,108 +838,6 @@ UnicodeString &MeasureFormat::formatNumeric( return appendTo; } -const SimpleFormatter *MeasureFormat::getFormatterOrNull( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const { - width = getRegularWidth(width); - SimpleFormatter *const (*unitPatterns)[PATTERN_COUNT] = &cache->patterns[unit.getIndex()][0]; - if (unitPatterns[width][index] != NULL) { - return unitPatterns[width][index]; - } - int32_t fallbackWidth = cache->widthFallback[width]; - if (fallbackWidth != UMEASFMT_WIDTH_COUNT && unitPatterns[fallbackWidth][index] != NULL) { - return unitPatterns[fallbackWidth][index]; - } - return NULL; -} - -const SimpleFormatter *MeasureFormat::getFormatter( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index, - UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { - return NULL; - } - const SimpleFormatter *pattern = getFormatterOrNull(unit, width, index); - if (pattern == NULL) { - errorCode = U_MISSING_RESOURCE_ERROR; - } - return pattern; -} - -const SimpleFormatter *MeasureFormat::getPluralFormatter( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index, - UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { - return NULL; - } - if (index != StandardPlural::OTHER) { - const SimpleFormatter *pattern = getFormatterOrNull(unit, width, index); - if (pattern != NULL) { - return pattern; - } - } - return getFormatter(unit, width, StandardPlural::OTHER, errorCode); -} - -const SimpleFormatter *MeasureFormat::getPerFormatter( - UMeasureFormatWidth width, - UErrorCode &status) const { - if (U_FAILURE(status)) { - return NULL; - } - width = getRegularWidth(width); - const SimpleFormatter * perFormatters = cache->perFormatters; - if (perFormatters[width].getArgumentLimit() == 2) { - return &perFormatters[width]; - } - int32_t fallbackWidth = cache->widthFallback[width]; - if (fallbackWidth != UMEASFMT_WIDTH_COUNT && - perFormatters[fallbackWidth].getArgumentLimit() == 2) { - return &perFormatters[fallbackWidth]; - } - status = U_MISSING_RESOURCE_ERROR; - return NULL; -} - -int32_t MeasureFormat::withPerUnitAndAppend( - const UnicodeString &formatted, - const MeasureUnit &perUnit, - UnicodeString &appendTo, - UErrorCode &status) const { - int32_t offset = -1; - if (U_FAILURE(status)) { - return offset; - } - const SimpleFormatter *perUnitFormatter = getFormatterOrNull(perUnit, fWidth, PER_UNIT_INDEX); - if (perUnitFormatter != NULL) { - const UnicodeString *params[] = {&formatted}; - perUnitFormatter->formatAndAppend( - params, - UPRV_LENGTHOF(params), - appendTo, - &offset, - 1, - status); - return offset; - } - const SimpleFormatter *perFormatter = getPerFormatter(fWidth, status); - const SimpleFormatter *pattern = - getPluralFormatter(perUnit, fWidth, StandardPlural::ONE, status); - if (U_FAILURE(status)) { - return offset; - } - UnicodeString perUnitString = pattern->getTextWithNoArguments(); - perUnitString.trim(); - const UnicodeString *params[] = {&formatted, &perUnitString}; - perFormatter->formatAndAppend( - params, - UPRV_LENGTHOF(params), - appendTo, - &offset, - 1, - status); - return offset; -} - UnicodeString &MeasureFormat::formatMeasuresSlowTrack( const Measure *measures, int32_t measureCount, @@ -1214,7 +849,7 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack( } FieldPosition dontCare(FieldPosition::DONT_CARE); FieldPosition fpos(pos.getField()); - UnicodeString *results = new UnicodeString[measureCount]; + LocalArray results(new UnicodeString[measureCount], status); int32_t fieldPositionFoundIndex = -1; for (int32_t i = 0; i < measureCount; ++i) { const NumberFormat *nf = cache->getIntegerFormat(); @@ -1224,7 +859,6 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack( if (fieldPositionFoundIndex == -1) { formatMeasure(measures[i], *nf, results[i], fpos, status); if (U_FAILURE(status)) { - delete [] results; return appendTo; } if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) { @@ -1236,40 +870,35 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack( } int32_t offset; listFormatter->format( - results, + results.getAlias(), measureCount, appendTo, fieldPositionFoundIndex, offset, status); if (U_FAILURE(status)) { - delete [] results; return appendTo; } + // Fix up FieldPosition indexes if our field is found. if (offset != -1) { pos.setBeginIndex(fpos.getBeginIndex() + offset); pos.setEndIndex(fpos.getEndIndex() + offset); } - delete [] results; return appendTo; } MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(const Locale& locale, UErrorCode& ec) { - CurrencyFormat* fmt = NULL; - if (U_SUCCESS(ec)) { - fmt = new CurrencyFormat(locale, ec); - if (U_FAILURE(ec)) { - delete fmt; - fmt = NULL; - } + if (U_FAILURE(ec)) { + return nullptr; } - return fmt; + LocalPointer fmt(new CurrencyFormat(locale, ec), ec); + return fmt.orphan(); } MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(UErrorCode& ec) { if (U_FAILURE(ec)) { - return NULL; + return nullptr; } return MeasureFormat::createCurrencyFormat(Locale::getDefault(), ec); } diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index f6059f8c6dc808..428283e6dda8d4 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -38,48 +38,52 @@ static const int32_t gOffsets[] = { 0, 2, 7, - 16, - 22, - 26, - 325, - 336, - 347, - 351, - 357, - 361, - 381, - 382, + 17, + 25, + 29, + 328, + 339, + 354, + 358, + 366, + 368, + 372, 393, - 396, - 402, - 408, + 395, + 409, 412, - 416, - 441 + 418, + 426, + 430, + 434, + 436, + 463 }; static const int32_t gIndexes[] = { 0, 2, 7, - 16, - 22, - 26, - 26, - 37, - 48, - 52, - 58, - 62, - 82, - 83, + 17, + 25, + 29, + 29, + 40, + 55, + 59, + 67, + 69, + 73, 94, - 97, - 103, - 109, + 96, + 110, 113, - 117, - 142 + 119, + 127, + 131, + 135, + 137, + 164 }; // Must be sorted alphabetically. @@ -94,6 +98,7 @@ static const char * const gTypes[] = { "duration", "electric", "energy", + "force", "frequency", "length", "light", @@ -103,6 +108,7 @@ static const char * const gTypes[] = { "pressure", "speed", "temperature", + "torque", "volume" }; @@ -116,6 +122,7 @@ static const char * const gSubTypes[] = { "radian", "revolution", "acre", + "dunam", "hectare", "square-centimeter", "square-foot", @@ -127,9 +134,11 @@ static const char * const gSubTypes[] = { "karat", "milligram-per-deciliter", "millimole-per-liter", + "mole", "part-per-million", "percent", "permille", + "permyriad", "liter-per-100kilometers", "liter-per-kilometer", "mile-per-gallon", @@ -446,25 +455,33 @@ static const char * const gSubTypes[] = { "terabyte", "century", "day", + "day-person", "hour", "microsecond", "millisecond", "minute", "month", + "month-person", "nanosecond", "second", "week", + "week-person", "year", + "year-person", "ampere", "milliampere", "ohm", "volt", + "british-thermal-unit", "calorie", + "electronvolt", "foodcalorie", "joule", "kilocalorie", "kilojoule", "kilowatt-hour", + "newton", + "pound-force", "gigahertz", "hertz", "kilohertz", @@ -488,9 +505,13 @@ static const char * const gSubTypes[] = { "parsec", "picometer", "point", + "solar-radius", "yard", "lux", + "solar-luminosity", "carat", + "dalton", + "earth-mass", "gram", "kilogram", "metric-ton", @@ -499,6 +520,7 @@ static const char * const gSubTypes[] = { "ounce", "ounce-troy", "pound", + "solar-mass", "stone", "ton", "base", @@ -513,6 +535,8 @@ static const char * const gSubTypes[] = { "atmosphere", "hectopascal", "inch-hg", + "kilopascal", + "megapascal", "millibar", "millimeter-of-mercury", "pound-per-square-inch", @@ -524,7 +548,10 @@ static const char * const gSubTypes[] = { "fahrenheit", "generic", "kelvin", + "newton-meter", + "pound-foot", "acre-foot", + "barrel", "bushel", "centiliter", "cubic-centimeter", @@ -538,6 +565,7 @@ static const char * const gSubTypes[] = { "cup-metric", "deciliter", "fluid-ounce", + "fluid-ounce-imperial", "gallon", "gallon-imperial", "hectoliter", @@ -553,574 +581,1306 @@ static const char * const gSubTypes[] = { // Must be sorted by first value and then second value. static int32_t unitPerUnitToSingleUnit[][4] = { - {368, 338, 17, 0}, - {370, 344, 17, 2}, - {372, 338, 17, 3}, - {372, 430, 4, 2}, - {372, 431, 4, 3}, - {387, 428, 3, 1}, - {390, 11, 16, 5}, - {433, 368, 4, 1} + {379, 342, 18, 0}, + {381, 349, 18, 2}, + {383, 342, 18, 3}, + {383, 452, 4, 2}, + {383, 453, 4, 3}, + {402, 449, 3, 1}, + {405, 12, 17, 7}, + {455, 379, 4, 1} }; // Shortcuts to the base unit in order to make the default constructor fast -static const int32_t kBaseTypeIdx = 14; +static const int32_t kBaseTypeIdx = 15; static const int32_t kBaseSubTypeIdx = 0; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { return MeasureUnit::create(0, 0, status); } +MeasureUnit MeasureUnit::getGForce() { + return MeasureUnit(0, 0); +} + MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) { return MeasureUnit::create(0, 1, status); } +MeasureUnit MeasureUnit::getMeterPerSecondSquared() { + return MeasureUnit(0, 1); +} + MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) { return MeasureUnit::create(1, 0, status); } +MeasureUnit MeasureUnit::getArcMinute() { + return MeasureUnit(1, 0); +} + MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) { return MeasureUnit::create(1, 1, status); } +MeasureUnit MeasureUnit::getArcSecond() { + return MeasureUnit(1, 1); +} + MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) { return MeasureUnit::create(1, 2, status); } +MeasureUnit MeasureUnit::getDegree() { + return MeasureUnit(1, 2); +} + MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) { return MeasureUnit::create(1, 3, status); } +MeasureUnit MeasureUnit::getRadian() { + return MeasureUnit(1, 3); +} + MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) { return MeasureUnit::create(1, 4, status); } +MeasureUnit MeasureUnit::getRevolutionAngle() { + return MeasureUnit(1, 4); +} + MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) { return MeasureUnit::create(2, 0, status); } -MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) { +MeasureUnit MeasureUnit::getAcre() { + return MeasureUnit(2, 0); +} + +MeasureUnit *MeasureUnit::createDunam(UErrorCode &status) { return MeasureUnit::create(2, 1, status); } -MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) { +MeasureUnit MeasureUnit::getDunam() { + return MeasureUnit(2, 1); +} + +MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) { return MeasureUnit::create(2, 2, status); } -MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) { +MeasureUnit MeasureUnit::getHectare() { + return MeasureUnit(2, 2); +} + +MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) { return MeasureUnit::create(2, 3, status); } -MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareCentimeter() { + return MeasureUnit(2, 3); +} + +MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) { return MeasureUnit::create(2, 4, status); } -MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareFoot() { + return MeasureUnit(2, 4); +} + +MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) { return MeasureUnit::create(2, 5, status); } -MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareInch() { + return MeasureUnit(2, 5); +} + +MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) { return MeasureUnit::create(2, 6, status); } -MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareKilometer() { + return MeasureUnit(2, 6); +} + +MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) { return MeasureUnit::create(2, 7, status); } -MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareMeter() { + return MeasureUnit(2, 7); +} + +MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) { return MeasureUnit::create(2, 8, status); } +MeasureUnit MeasureUnit::getSquareMile() { + return MeasureUnit(2, 8); +} + +MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) { + return MeasureUnit::create(2, 9, status); +} + +MeasureUnit MeasureUnit::getSquareYard() { + return MeasureUnit(2, 9); +} + MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) { return MeasureUnit::create(3, 0, status); } +MeasureUnit MeasureUnit::getKarat() { + return MeasureUnit(3, 0); +} + MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) { return MeasureUnit::create(3, 1, status); } +MeasureUnit MeasureUnit::getMilligramPerDeciliter() { + return MeasureUnit(3, 1); +} + MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) { return MeasureUnit::create(3, 2, status); } -MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) { +MeasureUnit MeasureUnit::getMillimolePerLiter() { + return MeasureUnit(3, 2); +} + +MeasureUnit *MeasureUnit::createMole(UErrorCode &status) { return MeasureUnit::create(3, 3, status); } -MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) { +MeasureUnit MeasureUnit::getMole() { + return MeasureUnit(3, 3); +} + +MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) { return MeasureUnit::create(3, 4, status); } -MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) { +MeasureUnit MeasureUnit::getPartPerMillion() { + return MeasureUnit(3, 4); +} + +MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) { return MeasureUnit::create(3, 5, status); } +MeasureUnit MeasureUnit::getPercent() { + return MeasureUnit(3, 5); +} + +MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) { + return MeasureUnit::create(3, 6, status); +} + +MeasureUnit MeasureUnit::getPermille() { + return MeasureUnit(3, 6); +} + +MeasureUnit *MeasureUnit::createPermyriad(UErrorCode &status) { + return MeasureUnit::create(3, 7, status); +} + +MeasureUnit MeasureUnit::getPermyriad() { + return MeasureUnit(3, 7); +} + MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) { return MeasureUnit::create(4, 0, status); } +MeasureUnit MeasureUnit::getLiterPer100Kilometers() { + return MeasureUnit(4, 0); +} + MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) { return MeasureUnit::create(4, 1, status); } +MeasureUnit MeasureUnit::getLiterPerKilometer() { + return MeasureUnit(4, 1); +} + MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) { return MeasureUnit::create(4, 2, status); } +MeasureUnit MeasureUnit::getMilePerGallon() { + return MeasureUnit(4, 2); +} + MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) { return MeasureUnit::create(4, 3, status); } +MeasureUnit MeasureUnit::getMilePerGallonImperial() { + return MeasureUnit(4, 3); +} + MeasureUnit *MeasureUnit::createBit(UErrorCode &status) { return MeasureUnit::create(6, 0, status); } +MeasureUnit MeasureUnit::getBit() { + return MeasureUnit(6, 0); +} + MeasureUnit *MeasureUnit::createByte(UErrorCode &status) { return MeasureUnit::create(6, 1, status); } +MeasureUnit MeasureUnit::getByte() { + return MeasureUnit(6, 1); +} + MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) { return MeasureUnit::create(6, 2, status); } +MeasureUnit MeasureUnit::getGigabit() { + return MeasureUnit(6, 2); +} + MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) { return MeasureUnit::create(6, 3, status); } +MeasureUnit MeasureUnit::getGigabyte() { + return MeasureUnit(6, 3); +} + MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) { return MeasureUnit::create(6, 4, status); } +MeasureUnit MeasureUnit::getKilobit() { + return MeasureUnit(6, 4); +} + MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) { return MeasureUnit::create(6, 5, status); } +MeasureUnit MeasureUnit::getKilobyte() { + return MeasureUnit(6, 5); +} + MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) { return MeasureUnit::create(6, 6, status); } +MeasureUnit MeasureUnit::getMegabit() { + return MeasureUnit(6, 6); +} + MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) { return MeasureUnit::create(6, 7, status); } +MeasureUnit MeasureUnit::getMegabyte() { + return MeasureUnit(6, 7); +} + MeasureUnit *MeasureUnit::createPetabyte(UErrorCode &status) { return MeasureUnit::create(6, 8, status); } +MeasureUnit MeasureUnit::getPetabyte() { + return MeasureUnit(6, 8); +} + MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) { return MeasureUnit::create(6, 9, status); } +MeasureUnit MeasureUnit::getTerabit() { + return MeasureUnit(6, 9); +} + MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) { return MeasureUnit::create(6, 10, status); } +MeasureUnit MeasureUnit::getTerabyte() { + return MeasureUnit(6, 10); +} + MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) { return MeasureUnit::create(7, 0, status); } +MeasureUnit MeasureUnit::getCentury() { + return MeasureUnit(7, 0); +} + MeasureUnit *MeasureUnit::createDay(UErrorCode &status) { return MeasureUnit::create(7, 1, status); } -MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { +MeasureUnit MeasureUnit::getDay() { + return MeasureUnit(7, 1); +} + +MeasureUnit *MeasureUnit::createDayPerson(UErrorCode &status) { return MeasureUnit::create(7, 2, status); } -MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getDayPerson() { + return MeasureUnit(7, 2); +} + +MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { return MeasureUnit::create(7, 3, status); } -MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getHour() { + return MeasureUnit(7, 3); +} + +MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { return MeasureUnit::create(7, 4, status); } -MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { +MeasureUnit MeasureUnit::getMicrosecond() { + return MeasureUnit(7, 4); +} + +MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { return MeasureUnit::create(7, 5, status); } -MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { +MeasureUnit MeasureUnit::getMillisecond() { + return MeasureUnit(7, 5); +} + +MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { return MeasureUnit::create(7, 6, status); } -MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getMinute() { + return MeasureUnit(7, 6); +} + +MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { return MeasureUnit::create(7, 7, status); } -MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getMonth() { + return MeasureUnit(7, 7); +} + +MeasureUnit *MeasureUnit::createMonthPerson(UErrorCode &status) { return MeasureUnit::create(7, 8, status); } -MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { +MeasureUnit MeasureUnit::getMonthPerson() { + return MeasureUnit(7, 8); +} + +MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { return MeasureUnit::create(7, 9, status); } -MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { +MeasureUnit MeasureUnit::getNanosecond() { + return MeasureUnit(7, 9); +} + +MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { return MeasureUnit::create(7, 10, status); } +MeasureUnit MeasureUnit::getSecond() { + return MeasureUnit(7, 10); +} + +MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { + return MeasureUnit::create(7, 11, status); +} + +MeasureUnit MeasureUnit::getWeek() { + return MeasureUnit(7, 11); +} + +MeasureUnit *MeasureUnit::createWeekPerson(UErrorCode &status) { + return MeasureUnit::create(7, 12, status); +} + +MeasureUnit MeasureUnit::getWeekPerson() { + return MeasureUnit(7, 12); +} + +MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { + return MeasureUnit::create(7, 13, status); +} + +MeasureUnit MeasureUnit::getYear() { + return MeasureUnit(7, 13); +} + +MeasureUnit *MeasureUnit::createYearPerson(UErrorCode &status) { + return MeasureUnit::create(7, 14, status); +} + +MeasureUnit MeasureUnit::getYearPerson() { + return MeasureUnit(7, 14); +} + MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) { return MeasureUnit::create(8, 0, status); } +MeasureUnit MeasureUnit::getAmpere() { + return MeasureUnit(8, 0); +} + MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) { return MeasureUnit::create(8, 1, status); } +MeasureUnit MeasureUnit::getMilliampere() { + return MeasureUnit(8, 1); +} + MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) { return MeasureUnit::create(8, 2, status); } +MeasureUnit MeasureUnit::getOhm() { + return MeasureUnit(8, 2); +} + MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) { return MeasureUnit::create(8, 3, status); } -MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { +MeasureUnit MeasureUnit::getVolt() { + return MeasureUnit(8, 3); +} + +MeasureUnit *MeasureUnit::createBritishThermalUnit(UErrorCode &status) { return MeasureUnit::create(9, 0, status); } -MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { +MeasureUnit MeasureUnit::getBritishThermalUnit() { + return MeasureUnit(9, 0); +} + +MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { return MeasureUnit::create(9, 1, status); } -MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { +MeasureUnit MeasureUnit::getCalorie() { + return MeasureUnit(9, 1); +} + +MeasureUnit *MeasureUnit::createElectronvolt(UErrorCode &status) { return MeasureUnit::create(9, 2, status); } -MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { +MeasureUnit MeasureUnit::getElectronvolt() { + return MeasureUnit(9, 2); +} + +MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { return MeasureUnit::create(9, 3, status); } -MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { +MeasureUnit MeasureUnit::getFoodcalorie() { + return MeasureUnit(9, 3); +} + +MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { return MeasureUnit::create(9, 4, status); } -MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { +MeasureUnit MeasureUnit::getJoule() { + return MeasureUnit(9, 4); +} + +MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { return MeasureUnit::create(9, 5, status); } -MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { +MeasureUnit MeasureUnit::getKilocalorie() { + return MeasureUnit(9, 5); +} + +MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { + return MeasureUnit::create(9, 6, status); +} + +MeasureUnit MeasureUnit::getKilojoule() { + return MeasureUnit(9, 6); +} + +MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { + return MeasureUnit::create(9, 7, status); +} + +MeasureUnit MeasureUnit::getKilowattHour() { + return MeasureUnit(9, 7); +} + +MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) { return MeasureUnit::create(10, 0, status); } -MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) { +MeasureUnit MeasureUnit::getNewton() { + return MeasureUnit(10, 0); +} + +MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) { return MeasureUnit::create(10, 1, status); } +MeasureUnit MeasureUnit::getPoundForce() { + return MeasureUnit(10, 1); +} + +MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { + return MeasureUnit::create(11, 0, status); +} + +MeasureUnit MeasureUnit::getGigahertz() { + return MeasureUnit(11, 0); +} + +MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) { + return MeasureUnit::create(11, 1, status); +} + +MeasureUnit MeasureUnit::getHertz() { + return MeasureUnit(11, 1); +} + MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) { - return MeasureUnit::create(10, 2, status); + return MeasureUnit::create(11, 2, status); +} + +MeasureUnit MeasureUnit::getKilohertz() { + return MeasureUnit(11, 2); } MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) { - return MeasureUnit::create(10, 3, status); + return MeasureUnit::create(11, 3, status); +} + +MeasureUnit MeasureUnit::getMegahertz() { + return MeasureUnit(11, 3); } MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) { - return MeasureUnit::create(11, 0, status); + return MeasureUnit::create(12, 0, status); +} + +MeasureUnit MeasureUnit::getAstronomicalUnit() { + return MeasureUnit(12, 0); } MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) { - return MeasureUnit::create(11, 1, status); + return MeasureUnit::create(12, 1, status); +} + +MeasureUnit MeasureUnit::getCentimeter() { + return MeasureUnit(12, 1); } MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) { - return MeasureUnit::create(11, 2, status); + return MeasureUnit::create(12, 2, status); +} + +MeasureUnit MeasureUnit::getDecimeter() { + return MeasureUnit(12, 2); } MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) { - return MeasureUnit::create(11, 3, status); + return MeasureUnit::create(12, 3, status); +} + +MeasureUnit MeasureUnit::getFathom() { + return MeasureUnit(12, 3); } MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) { - return MeasureUnit::create(11, 4, status); + return MeasureUnit::create(12, 4, status); +} + +MeasureUnit MeasureUnit::getFoot() { + return MeasureUnit(12, 4); } MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) { - return MeasureUnit::create(11, 5, status); + return MeasureUnit::create(12, 5, status); +} + +MeasureUnit MeasureUnit::getFurlong() { + return MeasureUnit(12, 5); } MeasureUnit *MeasureUnit::createInch(UErrorCode &status) { - return MeasureUnit::create(11, 6, status); + return MeasureUnit::create(12, 6, status); +} + +MeasureUnit MeasureUnit::getInch() { + return MeasureUnit(12, 6); } MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) { - return MeasureUnit::create(11, 7, status); + return MeasureUnit::create(12, 7, status); +} + +MeasureUnit MeasureUnit::getKilometer() { + return MeasureUnit(12, 7); } MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) { - return MeasureUnit::create(11, 8, status); + return MeasureUnit::create(12, 8, status); +} + +MeasureUnit MeasureUnit::getLightYear() { + return MeasureUnit(12, 8); } MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) { - return MeasureUnit::create(11, 9, status); + return MeasureUnit::create(12, 9, status); +} + +MeasureUnit MeasureUnit::getMeter() { + return MeasureUnit(12, 9); } MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) { - return MeasureUnit::create(11, 10, status); + return MeasureUnit::create(12, 10, status); +} + +MeasureUnit MeasureUnit::getMicrometer() { + return MeasureUnit(12, 10); } MeasureUnit *MeasureUnit::createMile(UErrorCode &status) { - return MeasureUnit::create(11, 11, status); + return MeasureUnit::create(12, 11, status); +} + +MeasureUnit MeasureUnit::getMile() { + return MeasureUnit(12, 11); } MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) { - return MeasureUnit::create(11, 12, status); + return MeasureUnit::create(12, 12, status); +} + +MeasureUnit MeasureUnit::getMileScandinavian() { + return MeasureUnit(12, 12); } MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { - return MeasureUnit::create(11, 13, status); + return MeasureUnit::create(12, 13, status); +} + +MeasureUnit MeasureUnit::getMillimeter() { + return MeasureUnit(12, 13); } MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { - return MeasureUnit::create(11, 14, status); + return MeasureUnit::create(12, 14, status); +} + +MeasureUnit MeasureUnit::getNanometer() { + return MeasureUnit(12, 14); } MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { - return MeasureUnit::create(11, 15, status); + return MeasureUnit::create(12, 15, status); +} + +MeasureUnit MeasureUnit::getNauticalMile() { + return MeasureUnit(12, 15); } MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { - return MeasureUnit::create(11, 16, status); + return MeasureUnit::create(12, 16, status); +} + +MeasureUnit MeasureUnit::getParsec() { + return MeasureUnit(12, 16); } MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { - return MeasureUnit::create(11, 17, status); + return MeasureUnit::create(12, 17, status); +} + +MeasureUnit MeasureUnit::getPicometer() { + return MeasureUnit(12, 17); } MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) { - return MeasureUnit::create(11, 18, status); + return MeasureUnit::create(12, 18, status); +} + +MeasureUnit MeasureUnit::getPoint() { + return MeasureUnit(12, 18); +} + +MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) { + return MeasureUnit::create(12, 19, status); +} + +MeasureUnit MeasureUnit::getSolarRadius() { + return MeasureUnit(12, 19); } MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { - return MeasureUnit::create(11, 19, status); + return MeasureUnit::create(12, 20, status); +} + +MeasureUnit MeasureUnit::getYard() { + return MeasureUnit(12, 20); } MeasureUnit *MeasureUnit::createLux(UErrorCode &status) { - return MeasureUnit::create(12, 0, status); + return MeasureUnit::create(13, 0, status); +} + +MeasureUnit MeasureUnit::getLux() { + return MeasureUnit(13, 0); +} + +MeasureUnit *MeasureUnit::createSolarLuminosity(UErrorCode &status) { + return MeasureUnit::create(13, 1, status); +} + +MeasureUnit MeasureUnit::getSolarLuminosity() { + return MeasureUnit(13, 1); } MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) { - return MeasureUnit::create(13, 0, status); + return MeasureUnit::create(14, 0, status); +} + +MeasureUnit MeasureUnit::getCarat() { + return MeasureUnit(14, 0); +} + +MeasureUnit *MeasureUnit::createDalton(UErrorCode &status) { + return MeasureUnit::create(14, 1, status); +} + +MeasureUnit MeasureUnit::getDalton() { + return MeasureUnit(14, 1); +} + +MeasureUnit *MeasureUnit::createEarthMass(UErrorCode &status) { + return MeasureUnit::create(14, 2, status); +} + +MeasureUnit MeasureUnit::getEarthMass() { + return MeasureUnit(14, 2); } MeasureUnit *MeasureUnit::createGram(UErrorCode &status) { - return MeasureUnit::create(13, 1, status); + return MeasureUnit::create(14, 3, status); +} + +MeasureUnit MeasureUnit::getGram() { + return MeasureUnit(14, 3); } MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) { - return MeasureUnit::create(13, 2, status); + return MeasureUnit::create(14, 4, status); +} + +MeasureUnit MeasureUnit::getKilogram() { + return MeasureUnit(14, 4); } MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) { - return MeasureUnit::create(13, 3, status); + return MeasureUnit::create(14, 5, status); +} + +MeasureUnit MeasureUnit::getMetricTon() { + return MeasureUnit(14, 5); } MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) { - return MeasureUnit::create(13, 4, status); + return MeasureUnit::create(14, 6, status); +} + +MeasureUnit MeasureUnit::getMicrogram() { + return MeasureUnit(14, 6); } MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) { - return MeasureUnit::create(13, 5, status); + return MeasureUnit::create(14, 7, status); +} + +MeasureUnit MeasureUnit::getMilligram() { + return MeasureUnit(14, 7); } MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) { - return MeasureUnit::create(13, 6, status); + return MeasureUnit::create(14, 8, status); +} + +MeasureUnit MeasureUnit::getOunce() { + return MeasureUnit(14, 8); } MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) { - return MeasureUnit::create(13, 7, status); + return MeasureUnit::create(14, 9, status); +} + +MeasureUnit MeasureUnit::getOunceTroy() { + return MeasureUnit(14, 9); } MeasureUnit *MeasureUnit::createPound(UErrorCode &status) { - return MeasureUnit::create(13, 8, status); + return MeasureUnit::create(14, 10, status); +} + +MeasureUnit MeasureUnit::getPound() { + return MeasureUnit(14, 10); +} + +MeasureUnit *MeasureUnit::createSolarMass(UErrorCode &status) { + return MeasureUnit::create(14, 11, status); +} + +MeasureUnit MeasureUnit::getSolarMass() { + return MeasureUnit(14, 11); } MeasureUnit *MeasureUnit::createStone(UErrorCode &status) { - return MeasureUnit::create(13, 9, status); + return MeasureUnit::create(14, 12, status); +} + +MeasureUnit MeasureUnit::getStone() { + return MeasureUnit(14, 12); } MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { - return MeasureUnit::create(13, 10, status); + return MeasureUnit::create(14, 13, status); +} + +MeasureUnit MeasureUnit::getTon() { + return MeasureUnit(14, 13); } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(15, 0, status); + return MeasureUnit::create(16, 0, status); +} + +MeasureUnit MeasureUnit::getGigawatt() { + return MeasureUnit(16, 0); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(15, 1, status); + return MeasureUnit::create(16, 1, status); +} + +MeasureUnit MeasureUnit::getHorsepower() { + return MeasureUnit(16, 1); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(16, 2, status); +} + +MeasureUnit MeasureUnit::getKilowatt() { + return MeasureUnit(16, 2); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(16, 3, status); +} + +MeasureUnit MeasureUnit::getMegawatt() { + return MeasureUnit(16, 3); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(16, 4, status); +} + +MeasureUnit MeasureUnit::getMilliwatt() { + return MeasureUnit(16, 4); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(15, 5, status); + return MeasureUnit::create(16, 5, status); +} + +MeasureUnit MeasureUnit::getWatt() { + return MeasureUnit(16, 5); } MeasureUnit *MeasureUnit::createAtmosphere(UErrorCode &status) { - return MeasureUnit::create(16, 0, status); + return MeasureUnit::create(17, 0, status); +} + +MeasureUnit MeasureUnit::getAtmosphere() { + return MeasureUnit(17, 0); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(16, 1, status); + return MeasureUnit::create(17, 1, status); +} + +MeasureUnit MeasureUnit::getHectopascal() { + return MeasureUnit(17, 1); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(16, 2, status); + return MeasureUnit::create(17, 2, status); +} + +MeasureUnit MeasureUnit::getInchHg() { + return MeasureUnit(17, 2); +} + +MeasureUnit *MeasureUnit::createKilopascal(UErrorCode &status) { + return MeasureUnit::create(17, 3, status); +} + +MeasureUnit MeasureUnit::getKilopascal() { + return MeasureUnit(17, 3); +} + +MeasureUnit *MeasureUnit::createMegapascal(UErrorCode &status) { + return MeasureUnit::create(17, 4, status); +} + +MeasureUnit MeasureUnit::getMegapascal() { + return MeasureUnit(17, 4); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(16, 3, status); + return MeasureUnit::create(17, 5, status); +} + +MeasureUnit MeasureUnit::getMillibar() { + return MeasureUnit(17, 5); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(16, 4, status); + return MeasureUnit::create(17, 6, status); +} + +MeasureUnit MeasureUnit::getMillimeterOfMercury() { + return MeasureUnit(17, 6); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(16, 5, status); + return MeasureUnit::create(17, 7, status); +} + +MeasureUnit MeasureUnit::getPoundPerSquareInch() { + return MeasureUnit(17, 7); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(18, 0, status); +} + +MeasureUnit MeasureUnit::getKilometerPerHour() { + return MeasureUnit(18, 0); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(18, 1, status); +} + +MeasureUnit MeasureUnit::getKnot() { + return MeasureUnit(18, 1); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(18, 2, status); +} + +MeasureUnit MeasureUnit::getMeterPerSecond() { + return MeasureUnit(18, 2); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(18, 3, status); +} + +MeasureUnit MeasureUnit::getMilePerHour() { + return MeasureUnit(18, 3); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(19, 0, status); +} + +MeasureUnit MeasureUnit::getCelsius() { + return MeasureUnit(19, 0); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(19, 1, status); +} + +MeasureUnit MeasureUnit::getFahrenheit() { + return MeasureUnit(19, 1); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(19, 2, status); +} + +MeasureUnit MeasureUnit::getGenericTemperature() { + return MeasureUnit(19, 2); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(19, 3, status); +} + +MeasureUnit MeasureUnit::getKelvin() { + return MeasureUnit(19, 3); +} + +MeasureUnit *MeasureUnit::createNewtonMeter(UErrorCode &status) { + return MeasureUnit::create(20, 0, status); +} + +MeasureUnit MeasureUnit::getNewtonMeter() { + return MeasureUnit(20, 0); +} + +MeasureUnit *MeasureUnit::createPoundFoot(UErrorCode &status) { + return MeasureUnit::create(20, 1, status); +} + +MeasureUnit MeasureUnit::getPoundFoot() { + return MeasureUnit(20, 1); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(19, 0, status); + return MeasureUnit::create(21, 0, status); +} + +MeasureUnit MeasureUnit::getAcreFoot() { + return MeasureUnit(21, 0); +} + +MeasureUnit *MeasureUnit::createBarrel(UErrorCode &status) { + return MeasureUnit::create(21, 1, status); +} + +MeasureUnit MeasureUnit::getBarrel() { + return MeasureUnit(21, 1); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(19, 1, status); + return MeasureUnit::create(21, 2, status); +} + +MeasureUnit MeasureUnit::getBushel() { + return MeasureUnit(21, 2); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(19, 2, status); + return MeasureUnit::create(21, 3, status); +} + +MeasureUnit MeasureUnit::getCentiliter() { + return MeasureUnit(21, 3); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(19, 3, status); + return MeasureUnit::create(21, 4, status); +} + +MeasureUnit MeasureUnit::getCubicCentimeter() { + return MeasureUnit(21, 4); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(19, 4, status); + return MeasureUnit::create(21, 5, status); +} + +MeasureUnit MeasureUnit::getCubicFoot() { + return MeasureUnit(21, 5); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(19, 5, status); + return MeasureUnit::create(21, 6, status); +} + +MeasureUnit MeasureUnit::getCubicInch() { + return MeasureUnit(21, 6); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(19, 6, status); + return MeasureUnit::create(21, 7, status); +} + +MeasureUnit MeasureUnit::getCubicKilometer() { + return MeasureUnit(21, 7); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(19, 7, status); + return MeasureUnit::create(21, 8, status); +} + +MeasureUnit MeasureUnit::getCubicMeter() { + return MeasureUnit(21, 8); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(19, 8, status); + return MeasureUnit::create(21, 9, status); +} + +MeasureUnit MeasureUnit::getCubicMile() { + return MeasureUnit(21, 9); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(19, 9, status); + return MeasureUnit::create(21, 10, status); +} + +MeasureUnit MeasureUnit::getCubicYard() { + return MeasureUnit(21, 10); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(19, 10, status); + return MeasureUnit::create(21, 11, status); +} + +MeasureUnit MeasureUnit::getCup() { + return MeasureUnit(21, 11); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(19, 11, status); + return MeasureUnit::create(21, 12, status); +} + +MeasureUnit MeasureUnit::getCupMetric() { + return MeasureUnit(21, 12); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(19, 12, status); + return MeasureUnit::create(21, 13, status); +} + +MeasureUnit MeasureUnit::getDeciliter() { + return MeasureUnit(21, 13); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(19, 13, status); + return MeasureUnit::create(21, 14, status); +} + +MeasureUnit MeasureUnit::getFluidOunce() { + return MeasureUnit(21, 14); +} + +MeasureUnit *MeasureUnit::createFluidOunceImperial(UErrorCode &status) { + return MeasureUnit::create(21, 15, status); +} + +MeasureUnit MeasureUnit::getFluidOunceImperial() { + return MeasureUnit(21, 15); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(19, 14, status); + return MeasureUnit::create(21, 16, status); +} + +MeasureUnit MeasureUnit::getGallon() { + return MeasureUnit(21, 16); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(19, 15, status); + return MeasureUnit::create(21, 17, status); +} + +MeasureUnit MeasureUnit::getGallonImperial() { + return MeasureUnit(21, 17); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(19, 16, status); + return MeasureUnit::create(21, 18, status); +} + +MeasureUnit MeasureUnit::getHectoliter() { + return MeasureUnit(21, 18); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(19, 17, status); + return MeasureUnit::create(21, 19, status); +} + +MeasureUnit MeasureUnit::getLiter() { + return MeasureUnit(21, 19); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(19, 18, status); + return MeasureUnit::create(21, 20, status); +} + +MeasureUnit MeasureUnit::getMegaliter() { + return MeasureUnit(21, 20); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(19, 19, status); + return MeasureUnit::create(21, 21, status); +} + +MeasureUnit MeasureUnit::getMilliliter() { + return MeasureUnit(21, 21); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(19, 20, status); + return MeasureUnit::create(21, 22, status); +} + +MeasureUnit MeasureUnit::getPint() { + return MeasureUnit(21, 22); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(19, 21, status); + return MeasureUnit::create(21, 23, status); +} + +MeasureUnit MeasureUnit::getPintMetric() { + return MeasureUnit(21, 23); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(19, 22, status); + return MeasureUnit::create(21, 24, status); +} + +MeasureUnit MeasureUnit::getQuart() { + return MeasureUnit(21, 24); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(19, 23, status); + return MeasureUnit::create(21, 25, status); +} + +MeasureUnit MeasureUnit::getTablespoon() { + return MeasureUnit(21, 25); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(19, 24, status); + return MeasureUnit::create(21, 26, status); +} + +MeasureUnit MeasureUnit::getTeaspoon() { + return MeasureUnit(21, 26); } // End generated code diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 8ff86a2cacf018..e39b26b969889f 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -810,26 +810,31 @@ MessageFormat::getFormats(int32_t& cnt) const // method on this object. We construct and resize an array // on demand that contains aliases to the subformats[i].format // pointers. + + // Get total required capacity first (it's refreshed on each call). + int32_t totalCapacity = 0; + for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0; ++totalCapacity) {}; + MessageFormat* t = const_cast (this); cnt = 0; - if (formatAliases == NULL) { - t->formatAliasesCapacity = (argTypeCount<10) ? 10 : argTypeCount; + if (formatAliases == nullptr) { + t->formatAliasesCapacity = totalCapacity; Format** a = (Format**) uprv_malloc(sizeof(Format*) * formatAliasesCapacity); - if (a == NULL) { + if (a == nullptr) { t->formatAliasesCapacity = 0; - return NULL; + return nullptr; } t->formatAliases = a; - } else if (argTypeCount > formatAliasesCapacity) { + } else if (totalCapacity > formatAliasesCapacity) { Format** a = (Format**) - uprv_realloc(formatAliases, sizeof(Format*) * argTypeCount); - if (a == NULL) { + uprv_realloc(formatAliases, sizeof(Format*) * totalCapacity); + if (a == nullptr) { t->formatAliasesCapacity = 0; - return NULL; + return nullptr; } t->formatAliases = a; - t->formatAliasesCapacity = argTypeCount; + t->formatAliasesCapacity = totalCapacity; } for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0;) { @@ -1673,7 +1678,6 @@ void MessageFormat::cacheExplicitFormats(UErrorCode& status) { } } - Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeString& style, Formattable::Type& formattableType, UParseError& parseError, UErrorCode& ec) { @@ -1683,6 +1687,7 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin Format* fmt = NULL; int32_t typeID, styleID; DateFormat::EStyle date_style; + int32_t firstNonSpace; switch (typeID = findKeyword(type, TYPE_IDS)) { case 0: // number @@ -1702,11 +1707,10 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin fmt = createIntegerFormat(fLocale, ec); break; default: // pattern or skeleton - int32_t i = 0; - for (; PatternProps::isWhiteSpace(style.charAt(i)); i++); - if (style.compare(i, 2, u"::", 0, 2) == 0) { + firstNonSpace = PatternProps::skipWhiteSpace(style, 0); + if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) { // Skeleton - UnicodeString skeleton = style.tempSubString(i + 2); + UnicodeString skeleton = style.tempSubString(firstNonSpace + 2); fmt = number::NumberFormatter::forSkeleton(skeleton, ec).locale(fLocale).toFormat(ec); } else { // Pattern @@ -1725,19 +1729,27 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin case 1: // date case 2: // time formattableType = Formattable::kDate; - styleID = findKeyword(style, DATE_STYLE_IDS); - date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault; - - if (typeID == 1) { - fmt = DateFormat::createDateInstance(date_style, fLocale); + firstNonSpace = PatternProps::skipWhiteSpace(style, 0); + if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) { + // Skeleton + UnicodeString skeleton = style.tempSubString(firstNonSpace + 2); + fmt = DateFormat::createInstanceForSkeleton(skeleton, fLocale, ec); } else { - fmt = DateFormat::createTimeInstance(date_style, fLocale); - } + // Pattern + styleID = findKeyword(style, DATE_STYLE_IDS); + date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault; - if (styleID < 0 && fmt != NULL) { - SimpleDateFormat* sdtfmt = dynamic_cast(fmt); - if (sdtfmt != NULL) { - sdtfmt->applyPattern(style); + if (typeID == 1) { + fmt = DateFormat::createDateInstance(date_style, fLocale); + } else { + fmt = DateFormat::createTimeInstance(date_style, fLocale); + } + + if (styleID < 0 && fmt != NULL) { + SimpleDateFormat* sdtfmt = dynamic_cast(fmt); + if (sdtfmt != NULL) { + sdtfmt->applyPattern(style); + } } } break; diff --git a/deps/icu-small/source/i18n/number_affixutils.cpp b/deps/icu-small/source/i18n/number_affixutils.cpp index 8da29a03d52d56..3eb9c59bf49090 100644 --- a/deps/icu-small/source/i18n/number_affixutils.cpp +++ b/deps/icu-small/source/i18n/number_affixutils.cpp @@ -64,7 +64,7 @@ int32_t AffixUtils::estimateLength(const UnicodeString &patternString, UErrorCod } break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } offset += U16_LENGTH(cp); @@ -131,34 +131,33 @@ UnicodeString AffixUtils::escape(const UnicodeString &input) { Field AffixUtils::getFieldForType(AffixPatternType type) { switch (type) { case TYPE_MINUS_SIGN: - return Field::UNUM_SIGN_FIELD; + return UNUM_SIGN_FIELD; case TYPE_PLUS_SIGN: - return Field::UNUM_SIGN_FIELD; + return UNUM_SIGN_FIELD; case TYPE_PERCENT: - return Field::UNUM_PERCENT_FIELD; + return UNUM_PERCENT_FIELD; case TYPE_PERMILLE: - return Field::UNUM_PERMILL_FIELD; + return UNUM_PERMILL_FIELD; case TYPE_CURRENCY_SINGLE: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_DOUBLE: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_TRIPLE: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_QUAD: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_QUINT: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_OVERFLOW: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; default: - U_ASSERT(false); - return Field::UNUM_FIELD_COUNT; // suppress "control reaches end of non-void function" + UPRV_UNREACHABLE; } } int32_t AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &output, int32_t position, - const SymbolProvider &provider, UErrorCode &status) { + const SymbolProvider &provider, Field field, UErrorCode &status) { int32_t length = 0; AffixTag tag; while (hasNext(tag, affixPattern)) { @@ -171,7 +170,7 @@ AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &out 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); + length += output.insertCodePoint(position + length, tag.codePoint, field, status); } } return length; @@ -382,7 +381,7 @@ AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); } default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } // End of string @@ -411,8 +410,7 @@ AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, 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" + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/number_affixutils.h b/deps/icu-small/source/i18n/number_affixutils.h index 1d7e1a115e046a..f011a54b316166 100644 --- a/deps/icu-small/source/i18n/number_affixutils.h +++ b/deps/icu-small/source/i18n/number_affixutils.h @@ -144,7 +144,8 @@ class U_I18N_API AffixUtils { * @param provider An object to generate locale symbols. */ static int32_t unescape(const UnicodeString& affixPattern, NumberStringBuilder& output, - int32_t position, const SymbolProvider& provider, UErrorCode& status); + int32_t position, const SymbolProvider& provider, Field field, + UErrorCode& status); /** * Sames as {@link #unescape}, but only calculates the code point count. More efficient than {@link #unescape} diff --git a/deps/icu-small/source/i18n/number_asformat.cpp b/deps/icu-small/source/i18n/number_asformat.cpp index c6bb538932cec8..9d3ea69f578e1e 100644 --- a/deps/icu-small/source/i18n/number_asformat.cpp +++ b/deps/icu-small/source/i18n/number_asformat.cpp @@ -62,12 +62,12 @@ UnicodeString& LocalizedNumberFormatterAsFormat::format(const Formattable& obj, // always return first occurrence: pos.setBeginIndex(0); pos.setEndIndex(0); - bool found = data.string.nextFieldPosition(pos, status); + bool found = data.getStringRef().nextFieldPosition(pos, status); if (found && appendTo.length() != 0) { pos.setBeginIndex(pos.getBeginIndex() + appendTo.length()); pos.setEndIndex(pos.getEndIndex() + appendTo.length()); } - appendTo.append(data.string.toTempUnicodeString()); + appendTo.append(data.getStringRef().toTempUnicodeString()); return appendTo; } @@ -84,10 +84,10 @@ UnicodeString& LocalizedNumberFormatterAsFormat::format(const Formattable& obj, if (U_FAILURE(status)) { return appendTo; } - appendTo.append(data.string.toTempUnicodeString()); + appendTo.append(data.getStringRef().toTempUnicodeString()); if (posIter != nullptr) { FieldPositionIteratorHandler fpih(posIter, status); - data.string.getAllFieldPositions(fpih, status); + data.getStringRef().getAllFieldPositions(fpih, status); } return appendTo; } diff --git a/deps/icu-small/source/i18n/number_capi.cpp b/deps/icu-small/source/i18n/number_capi.cpp index 37ad8bd76fcd72..712e0a6631db56 100644 --- a/deps/icu-small/source/i18n/number_capi.cpp +++ b/deps/icu-small/source/i18n/number_capi.cpp @@ -12,6 +12,7 @@ #include "fphdlimp.h" #include "number_utypes.h" #include "numparse_types.h" +#include "formattedval_impl.h" #include "unicode/numberformatter.h" #include "unicode/unumberformatter.h" @@ -20,67 +21,63 @@ using namespace icu::number; using namespace icu::number::impl; -////////////////////////////////// -/// C API CONVERSION FUNCTIONS /// -////////////////////////////////// +U_NAMESPACE_BEGIN +namespace number { +namespace impl { -UNumberFormatterData* UNumberFormatterData::validate(UNumberFormatter* input, UErrorCode& status) { - auto* constInput = static_cast(input); - auto* validated = validate(constInput, status); - return const_cast(validated); -} +/** + * Implementation class for UNumberFormatter. Wraps a LocalizedNumberFormatter. + */ +struct UNumberFormatterData : public UMemory, + // Magic number as ASCII == "NFR" (NumberFormatteR) + public IcuCApiHelper { + LocalizedNumberFormatter fFormatter; +}; -const UNumberFormatterData* -UNumberFormatterData::validate(const UNumberFormatter* input, UErrorCode& status) { - if (U_FAILURE(status)) { - return nullptr; - } - if (input == nullptr) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return nullptr; - } - auto* impl = reinterpret_cast(input); - if (impl->fMagic != UNumberFormatterData::kMagic) { - status = U_INVALID_FORMAT_ERROR; - return nullptr; - } - return impl; +struct UFormattedNumberImpl; + +// Magic number as ASCII == "FDN" (FormatteDNumber) +typedef IcuCApiHelper UFormattedNumberApiHelper; + +struct UFormattedNumberImpl : public UFormattedValueImpl, public UFormattedNumberApiHelper { + UFormattedNumberImpl(); + ~UFormattedNumberImpl(); + + FormattedNumber fImpl; + UFormattedNumberData fData; +}; + +UFormattedNumberImpl::UFormattedNumberImpl() + : fImpl(&fData) { + fFormattedValue = &fImpl; } -UNumberFormatter* UNumberFormatterData::exportForC() { - return reinterpret_cast(this); +UFormattedNumberImpl::~UFormattedNumberImpl() { + // Disown the data from fImpl so it doesn't get deleted twice + fImpl.fData = nullptr; } -UFormattedNumberData* UFormattedNumberData::validate(UFormattedNumber* input, UErrorCode& status) { - auto* constInput = static_cast(input); - auto* validated = validate(constInput, status); - return const_cast(validated); } +} +U_NAMESPACE_END + + +UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL( + UFormattedNumber, + UFormattedNumberImpl, + UFormattedNumberApiHelper, + unumf) + -const UFormattedNumberData* -UFormattedNumberData::validate(const UFormattedNumber* input, UErrorCode& status) { +const DecimalQuantity* icu::number::impl::validateUFormattedNumberToDecimalQuantity( + const UFormattedNumber* uresult, UErrorCode& status) { + auto* result = UFormattedNumberApiHelper::validate(uresult, status); if (U_FAILURE(status)) { return nullptr; } - if (input == nullptr) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return nullptr; - } - auto* impl = reinterpret_cast(input); - if (impl->fMagic != UFormattedNumberData::kMagic) { - status = U_INVALID_FORMAT_ERROR; - return nullptr; - } - return impl; + return &result->fData.quantity; } -UFormattedNumber* UFormattedNumberData::exportForC() { - return reinterpret_cast(this); -} - -///////////////////////////////////// -/// END CAPI CONVERSION FUNCTIONS /// -///////////////////////////////////// U_CAPI UNumberFormatter* U_EXPORT2 @@ -97,13 +94,17 @@ unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const return impl->exportForC(); } -U_CAPI UFormattedNumber* U_EXPORT2 -unumf_openResult(UErrorCode* ec) { - auto* impl = new UFormattedNumberData(); +U_CAPI UNumberFormatter* U_EXPORT2 +unumf_openForSkeletonAndLocaleWithError(const UChar* skeleton, int32_t skeletonLen, const char* locale, + UParseError* perror, UErrorCode* ec) { + auto* impl = new UNumberFormatterData(); if (impl == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; return nullptr; } + // Readonly-alias constructor (first argument is whether we are NUL-terminated) + UnicodeString skeletonString(skeletonLen == -1, skeleton, skeletonLen); + impl->fFormatter = NumberFormatter::forSkeleton(skeletonString, *perror, *ec).locale(locale); return impl->exportForC(); } @@ -111,43 +112,43 @@ U_CAPI void U_EXPORT2 unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult, UErrorCode* ec) { const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec); - UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } - result->string.clear(); - result->quantity.setToLong(value); - formatter->fFormatter.formatImpl(result, *ec); + result->fData.getStringRef().clear(); + result->fData.quantity.setToLong(value); + formatter->fFormatter.formatImpl(&result->fData, *ec); } U_CAPI void U_EXPORT2 unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedNumber* uresult, UErrorCode* ec) { const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec); - UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } - result->string.clear(); - result->quantity.setToDouble(value); - formatter->fFormatter.formatImpl(result, *ec); + result->fData.getStringRef().clear(); + result->fData.quantity.setToDouble(value); + formatter->fFormatter.formatImpl(&result->fData, *ec); } U_CAPI void U_EXPORT2 unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32_t valueLen, UFormattedNumber* uresult, UErrorCode* ec) { const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec); - UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } - result->string.clear(); - result->quantity.setToDecNumber({value, valueLen}, *ec); + result->fData.getStringRef().clear(); + result->fData.quantity.setToDecNumber({value, valueLen}, *ec); if (U_FAILURE(*ec)) { return; } - formatter->fFormatter.formatImpl(result, *ec); + formatter->fFormatter.formatImpl(&result->fData, *ec); } U_CAPI int32_t U_EXPORT2 unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t bufferCapacity, UErrorCode* ec) { - const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return 0; } if (buffer == nullptr ? bufferCapacity != 0 : bufferCapacity < 0) { @@ -155,12 +156,12 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf return 0; } - return result->string.toTempUnicodeString().extract(buffer, bufferCapacity, *ec); + return result->fImpl.toTempString(*ec).extract(buffer, bufferCapacity, *ec); } U_CAPI UBool U_EXPORT2 unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* ufpos, UErrorCode* ec) { - const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return FALSE; } if (ufpos == nullptr) { @@ -172,7 +173,7 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u fp.setField(ufpos->field); fp.setBeginIndex(ufpos->beginIndex); fp.setEndIndex(ufpos->endIndex); - bool retval = result->string.nextFieldPosition(fp, *ec); + bool retval = result->fImpl.nextFieldPosition(fp, *ec); ufpos->beginIndex = fp.getBeginIndex(); ufpos->endIndex = fp.getEndIndex(); // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool @@ -182,7 +183,7 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u U_CAPI void U_EXPORT2 unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPositionIterator* ufpositer, UErrorCode* ec) { - const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } if (ufpositer == nullptr) { @@ -191,15 +192,7 @@ unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPosition } auto* fpi = reinterpret_cast(ufpositer); - FieldPositionIteratorHandler fpih(fpi, *ec); - result->string.getAllFieldPositions(fpih, *ec); -} - -U_CAPI void U_EXPORT2 -unumf_closeResult(UFormattedNumber* uresult) { - UErrorCode localStatus = U_ZERO_ERROR; - const UFormattedNumberData* impl = UFormattedNumberData::validate(uresult, localStatus); - delete impl; + result->fImpl.getAllFieldPositions(*fpi, *ec); } U_CAPI void U_EXPORT2 diff --git a/deps/icu-small/source/i18n/number_compact.cpp b/deps/icu-small/source/i18n/number_compact.cpp index 10942c35f535df..f330251be38c88 100644 --- a/deps/icu-small/source/i18n/number_compact.cpp +++ b/deps/icu-small/source/i18n/number_compact.cpp @@ -260,7 +260,7 @@ void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReferen ParsedPatternInfo patternInfo; PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); if (U_FAILURE(status)) { return; } - buildReference.setPatternInfo(&patternInfo); + buildReference.setPatternInfo(&patternInfo, UNUM_COMPACT_FIELD); info.mod = buildReference.createImmutable(status); if (U_FAILURE(status)) { return; } info.patternString = patternString; @@ -297,7 +297,7 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr for (; i < precomputedModsLength; i++) { const CompactModInfo &info = precomputedMods[i]; if (u_strcmp(patternString, info.patternString) == 0) { - info.mod->applyToMicros(micros, quantity); + info.mod->applyToMicros(micros, quantity, status); break; } } @@ -310,7 +310,7 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr ParsedPatternInfo &patternInfo = const_cast(this)->unsafePatternInfo; PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); static_cast(const_cast(micros.modMiddle)) - ->setPatternInfo(&patternInfo); + ->setPatternInfo(&patternInfo, UNUM_COMPACT_FIELD); } // We already performed rounding. Do not perform it again. diff --git a/deps/icu-small/source/i18n/number_decimalquantity.cpp b/deps/icu-small/source/i18n/number_decimalquantity.cpp index 2c4182b1c6ecda..d899c27671181e 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.cpp +++ b/deps/icu-small/source/i18n/number_decimalquantity.cpp @@ -112,10 +112,8 @@ DecimalQuantity& DecimalQuantity::operator=(DecimalQuantity&& src) U_NOEXCEPT { void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) { bogus = other.bogus; - lOptPos = other.lOptPos; lReqPos = other.lReqPos; rReqPos = other.rReqPos; - rOptPos = other.rOptPos; scale = other.scale; precision = other.precision; flags = other.flags; @@ -125,18 +123,15 @@ void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) { } 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) { +void DecimalQuantity::setMinInteger(int32_t minInt) { // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. U_ASSERT(minInt >= 0); - U_ASSERT(maxInt >= minInt); // Special behavior: do not set minInt to be less than what is already set. // This is so significant digits rounding can set the integer length. @@ -145,49 +140,68 @@ void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) { } // 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) { +void DecimalQuantity::setMinFraction(int32_t minFrac) { // Validation should happen outside of DecimalQuantity, e.g., in the Precision 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; +} + +void DecimalQuantity::applyMaxInteger(int32_t maxInt) { + // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. + U_ASSERT(maxInt >= 0); + + if (precision == 0) { + return; + } + + if (maxInt <= scale) { + setBcdToZero(); + return; + } + + int32_t magnitude = getMagnitude(); + if (maxInt <= magnitude) { + popFromLeft(magnitude - maxInt + 1); + compact(); + } } 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 maxFrac, UErrorCode& status) { - // TODO(13701): This is innefficient. Improve? - // TODO(13701): Should we convert to decNumber instead? - roundToInfinity(); - double temp = toDouble(); - temp /= roundingIncrement; - // Use another DecimalQuantity to perform the actual rounding... - DecimalQuantity dq; - dq.setToDouble(temp); - dq.roundToMagnitude(0, roundingMode, status); - temp = dq.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. - // NOTE: In Java, we have minMaxFrac, but in C++, the two are differentiated. - roundToMagnitude(-maxFrac, roundingMode, status); + UErrorCode& status) { + // Do not call this method with an increment having only a 1 or a 5 digit! + // Use a more efficient call to either roundToMagnitude() or roundToNickel(). + // Check a few popular rounding increments; a more thorough check is in Java. + U_ASSERT(roundingIncrement != 0.01); + U_ASSERT(roundingIncrement != 0.05); + U_ASSERT(roundingIncrement != 0.1); + U_ASSERT(roundingIncrement != 0.5); + U_ASSERT(roundingIncrement != 1); + U_ASSERT(roundingIncrement != 5); + + DecNum incrementDN; + incrementDN.setTo(roundingIncrement, status); + if (U_FAILURE(status)) { return; } + + // Divide this DecimalQuantity by the increment, round, then multiply back. + divideBy(incrementDN, status); + if (U_FAILURE(status)) { return; } + roundToMagnitude(0, roundingMode, status); + if (U_FAILURE(status)) { return; } + multiplyBy(incrementDN, status); + if (U_FAILURE(status)) { return; } } void DecimalQuantity::multiplyBy(const DecNum& multiplicand, UErrorCode& status) { @@ -270,7 +284,7 @@ int32_t DecimalQuantity::getUpperDisplayMagnitude() const { U_ASSERT(!isApproximate); int32_t magnitude = scale + precision; - int32_t result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude; + int32_t result = (lReqPos > magnitude) ? lReqPos : magnitude; return result - 1; } @@ -280,7 +294,7 @@ int32_t DecimalQuantity::getLowerDisplayMagnitude() const { U_ASSERT(!isApproximate); int32_t magnitude = scale; - int32_t result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude; + int32_t result = (rReqPos < magnitude) ? rReqPos : magnitude; return result; } @@ -501,7 +515,7 @@ int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const { // if (dq.fitsInLong()) { /* use dq.toLong() */ } else { /* use some fallback */ } // Fallback behavior upon truncateIfOverflow is to truncate at 17 digits. uint64_t result = 0L; - int32_t upperMagnitude = std::min(scale + precision, lOptPos) - 1; + int32_t upperMagnitude = scale + precision - 1; if (truncateIfOverflow) { upperMagnitude = std::min(upperMagnitude, 17); } @@ -517,7 +531,7 @@ int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const { uint64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const { uint64_t result = 0L; int32_t magnitude = -1; - int32_t lowerMagnitude = std::max(scale, rOptPos); + int32_t lowerMagnitude = scale; if (includeTrailingZeros) { lowerMagnitude = std::min(lowerMagnitude, rReqPos); } @@ -606,36 +620,62 @@ void DecimalQuantity::truncate() { } } +void DecimalQuantity::roundToNickel(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) { + roundToMagnitude(magnitude, roundingMode, true, status); +} + void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) { + roundToMagnitude(magnitude, roundingMode, false, status); +} + +void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, 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) { + // "trailing" = least significant digit to the left of rounding + int8_t trailingDigit = getDigitPos(position); + + if (position <= 0 && !isApproximate && (!nickel || trailingDigit == 0 || trailingDigit == 5)) { // 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; + roundingutils::Section section; if (!isApproximate) { - if (leadingDigit < 5) { + if (nickel && trailingDigit != 2 && trailingDigit != 7) { + // Nickel rounding, and not at .02x or .07x + if (trailingDigit < 2) { + // .00, .01 => down to .00 + section = roundingutils::SECTION_LOWER; + } else if (trailingDigit < 5) { + // .03, .04 => up to .05 + section = roundingutils::SECTION_UPPER; + } else if (trailingDigit < 7) { + // .05, .06 => down to .05 + section = roundingutils::SECTION_LOWER; + } else { + // .08, .09 => up to .10 + section = roundingutils::SECTION_UPPER; + } + } else if (leadingDigit < 5) { + // Includes nickel rounding .020-.024 and .070-.074 section = roundingutils::SECTION_LOWER; } else if (leadingDigit > 5) { + // Includes nickel rounding .026-.029 and .076-.079 section = roundingutils::SECTION_UPPER; } else { + // Includes nickel rounding .025 and .075 + section = roundingutils::SECTION_MIDPOINT; for (int p = safeSubtract(position, 2); p >= 0; p--) { if (getDigitPos(p) != 0) { section = roundingutils::SECTION_UPPER; @@ -646,7 +686,7 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM } else { int32_t p = safeSubtract(position, 2); int32_t minP = uprv_max(0, precision - 14); - if (leadingDigit == 0) { + if (leadingDigit == 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) { section = roundingutils::SECTION_LOWER_EDGE; for (; p >= minP; p--) { if (getDigitPos(p) != 0) { @@ -654,21 +694,23 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM break; } } - } else if (leadingDigit == 4) { + } else if (leadingDigit == 4 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) { + section = roundingutils::SECTION_MIDPOINT; for (; p >= minP; p--) { if (getDigitPos(p) != 9) { section = roundingutils::SECTION_LOWER; break; } } - } else if (leadingDigit == 5) { + } else if (leadingDigit == 5 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) { + section = roundingutils::SECTION_MIDPOINT; for (; p >= minP; p--) { if (getDigitPos(p) != 0) { section = roundingutils::SECTION_UPPER; break; } } - } else if (leadingDigit == 9) { + } else if (leadingDigit == 9 && (!nickel || trailingDigit == 4 || trailingDigit == 9)) { section = roundingutils::SECTION_UPPER_EDGE; for (; p >= minP; p--) { if (getDigitPos(p) != 9) { @@ -676,9 +718,26 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM break; } } + } else if (nickel && trailingDigit != 2 && trailingDigit != 7) { + // Nickel rounding, and not at .02x or .07x + if (trailingDigit < 2) { + // .00, .01 => down to .00 + section = roundingutils::SECTION_LOWER; + } else if (trailingDigit < 5) { + // .03, .04 => up to .05 + section = roundingutils::SECTION_UPPER; + } else if (trailingDigit < 7) { + // .05, .06 => down to .05 + section = roundingutils::SECTION_LOWER; + } else { + // .08, .09 => up to .10 + section = roundingutils::SECTION_UPPER; + } } else if (leadingDigit < 5) { + // Includes nickel rounding .020-.024 and .070-.074 section = roundingutils::SECTION_LOWER; } else { + // Includes nickel rounding .026-.029 and .076-.079 section = roundingutils::SECTION_UPPER; } @@ -686,10 +745,10 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM 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. + // 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 + roundToMagnitude(magnitude, roundingMode, nickel, status); // start over return; } @@ -698,7 +757,7 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM origDouble = 0.0; origDelta = 0; - if (position <= 0) { + if (position <= 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) { // All digits are to the left of the rounding magnitude. return; } @@ -708,7 +767,14 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM if (section == -2) { section = roundingutils::SECTION_UPPER; } } - bool roundDown = roundingutils::getRoundingDirection((trailingDigit % 2) == 0, + // Nickel rounding "half even" goes to the nearest whole (away from the 5). + bool isEven = nickel + ? (trailingDigit < 2 || trailingDigit > 7 + || (trailingDigit == 2 && section != roundingutils::SECTION_UPPER) + || (trailingDigit == 7 && section == roundingutils::SECTION_UPPER)) + : (trailingDigit % 2) == 0; + + bool roundDown = roundingutils::getRoundingDirection(isEven, isNegative(), section, roundingMode, @@ -725,12 +791,28 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM shiftRight(position); } + if (nickel) { + if (trailingDigit < 5 && roundDown) { + setDigitPos(0, 0); + compact(); + return; + } else if (trailingDigit >= 5 && !roundDown) { + setDigitPos(0, 9); + trailingDigit = 9; + // do not return: use the bubbling logic below + } else { + setDigitPos(0, 5); + // compact not necessary: digit at position 0 is nonzero + return; + } + } + // 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. + // 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 } @@ -806,10 +888,8 @@ UnicodeString DecimalQuantity::toScientificString() const { result.append(u"0E+0", -1); return result; } - // NOTE: It is not safe to add to lOptPos (aka maxInt) or subtract from - // rOptPos (aka -maxFrac) due to overflow. - int32_t upperPos = std::min(precision + scale, lOptPos) - scale - 1; - int32_t lowerPos = std::max(scale, rOptPos) - scale; + int32_t upperPos = precision - 1; + int32_t lowerPos = 0; int32_t p = upperPos; result.append(u'0' + getDigitPos(p)); if ((--p) >= lowerPos) { @@ -820,7 +900,10 @@ UnicodeString DecimalQuantity::toScientificString() const { } result.append(u'E'); int32_t _scale = upperPos + scale; - if (_scale < 0) { + if (_scale == INT32_MIN) { + result.append({u"-2147483648", -1}); + return result; + } else if (_scale < 0) { _scale *= -1; result.append(u'-'); } else { @@ -904,6 +987,19 @@ void DecimalQuantity::shiftRight(int32_t numDigits) { precision -= numDigits; } +void DecimalQuantity::popFromLeft(int32_t numDigits) { + U_ASSERT(numDigits <= precision); + if (usingBytes) { + int i = precision - 1; + for (; i >= precision - numDigits; i--) { + fBCD.bcdBytes.ptr[i] = 0; + } + } else { + fBCD.bcdLong &= (static_cast(1) << ((precision - numDigits) * 4)) - 1; + } + precision -= numDigits; +} + void DecimalQuantity::setBcdToZero() { if (usingBytes) { uprv_free(fBCD.bcdBytes.ptr); @@ -1158,10 +1254,8 @@ bool DecimalQuantity::operator==(const DecimalQuantity& other) const { scale == other.scale && precision == other.precision && flags == other.flags - && lOptPos == other.lOptPos && lReqPos == other.lReqPos && rReqPos == other.rReqPos - && rOptPos == other.rOptPos && isApproximate == other.isApproximate; if (!basicEquals) { return false; @@ -1191,11 +1285,9 @@ UnicodeString DecimalQuantity::toString() const { snprintf( buffer8, sizeof(buffer8), - "", - (lOptPos > 999 ? 999 : lOptPos), + "", lReqPos, rReqPos, - (rOptPos < -999 ? -999 : rOptPos), (usingBytes ? "bytes" : "long"), (isNegative() ? "-" : ""), (precision == 0 ? "0" : digits.getAlias()), diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h index 8e04dea7eb5c43..06cc836c7796f2 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.h +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -53,22 +53,28 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { DecimalQuantity &operator=(DecimalQuantity&& src) U_NOEXCEPT; /** - * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate. + * Sets the minimum 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); + void setMinInteger(int32_t minInt); /** - * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate. + * Sets the minimum 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); + void setMinFraction(int32_t minFrac); + + /** + * Truncates digits from the upper magnitude of the number in order to satisfy the + * specified maximum number of integer digits. + * + * @param maxInt The maximum number of integer digits. + */ + void applyMaxInteger(int32_t maxInt); /** * Rounds the number to a specified interval, such as 0.05. @@ -76,20 +82,29 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { *

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. + * @param roundingMode The {@link RoundingMode} to use if rounding is necessary. */ void roundToIncrement(double roundingIncrement, RoundingMode roundingMode, - int32_t maxFrac, UErrorCode& status); + UErrorCode& status); /** Removes all fraction digits. */ void truncate(); + /** + * Rounds the number to the nearest multiple of 5 at the specified magnitude. + * For example, when magnitude == -2, this performs rounding to the nearest 0.05. + * + * @param magnitude The magnitude at which the digit should become either 0 or 5. + * @param roundingMode Rounding strategy. + */ + void roundToNickel(int32_t magnitude, RoundingMode roundingMode, 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. + * @param roundingMode The {@link RoundingMode} to use if rounding is necessary. */ void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status); @@ -260,7 +275,7 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { inline bool isUsingBytes() { return usingBytes; } /** Visible for testing */ - inline bool isExplicitExactDouble() { return explicitExactDouble; }; + inline bool isExplicitExactDouble() { return explicitExactDouble; } bool operator==(const DecimalQuantity& other) const; @@ -327,36 +342,11 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { */ 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; + // Positions to keep track of leading and trailing zeros. + // lReqPos is the magnitude of the first required leading zero. + // rReqPos is the magnitude of the last required trailing zero. 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 @@ -382,6 +372,8 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { */ bool explicitExactDouble = false; + void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, UErrorCode& status); + /** * Returns a single digit from the BCD list. No internal state is changed by calling this method. * @@ -410,8 +402,22 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { */ void shiftLeft(int32_t numDigits); + /** + * Directly removes digits from the end of the BCD list. + * Updates the scale and precision. + * + * CAUTION: it is the caller's responsibility to call {@link #compact} after this method. + */ void shiftRight(int32_t numDigits); + /** + * Directly removes digits from the front of the BCD list. + * Updates precision. + * + * CAUTION: it is the caller's responsibility to call {@link #compact} after this method. + */ + void popFromLeft(int32_t numDigits); + /** * Sets the internal representation to zero. Clears any values stored in scale, precision, * hasDouble, origDouble, origDelta, and BCD data. diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.cpp b/deps/icu-small/source/i18n/number_decimfmtprops.cpp index 12fe7060e2d051..30481ce5bf0110 100644 --- a/deps/icu-small/source/i18n/number_decimfmtprops.cpp +++ b/deps/icu-small/source/i18n/number_decimfmtprops.cpp @@ -21,6 +21,7 @@ char kRawDefaultProperties[sizeof(DecimalFormatProperties)]; icu::UInitOnce gDefaultPropertiesInitOnce = U_INITONCE_INITIALIZER; void U_CALLCONV initDefaultProperties(UErrorCode&) { + // can't fail, uses placement new into staticly allocated space. new(kRawDefaultProperties) DecimalFormatProperties(); // set to the default instance } @@ -142,4 +143,10 @@ bool DecimalFormatProperties::equalsDefaultExceptFastFormat() const { return _equals(*reinterpret_cast(kRawDefaultProperties), true); } +const DecimalFormatProperties& DecimalFormatProperties::getDefault() { + UErrorCode localStatus = U_ZERO_ERROR; + umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus); + return *reinterpret_cast(kRawDefaultProperties); +} + #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 index f288b6e0d97f58..1ce84d9dc388d7 100644 --- a/deps/icu-small/source/i18n/number_decimfmtprops.h +++ b/deps/icu-small/source/i18n/number_decimfmtprops.h @@ -21,10 +21,16 @@ U_NAMESPACE_BEGIN // data member of CurrencyPluralInfoWrapper. // (When building DLLs for Windows this is required.) #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(_MSC_VER) // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(suppress: 4661) +#pragma warning(push) +#pragma warning(disable: 4661) +#endif template class U_I18N_API LocalPointerBase; template class U_I18N_API LocalPointer; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif #endif namespace number { @@ -149,6 +155,11 @@ struct U_I18N_API DecimalFormatProperties : public UMemory { */ bool equalsDefaultExceptFastFormat() const; + /** + * Returns the default DecimalFormatProperties instance. + */ + static const DecimalFormatProperties& getDefault(); + private: bool _equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const; }; diff --git a/deps/icu-small/source/i18n/number_fluent.cpp b/deps/icu-small/source/i18n/number_fluent.cpp index a66e3bd0f23510..09e0905609eb30 100644 --- a/deps/icu-small/source/i18n/number_fluent.cpp +++ b/deps/icu-small/source/i18n/number_fluent.cpp @@ -151,7 +151,7 @@ Derived NumberFormatterSettings::roundingMode(UNumberFormatRoundingMode } template -Derived NumberFormatterSettings::grouping(UGroupingStrategy strategy) const& { +Derived NumberFormatterSettings::grouping(UNumberGroupingStrategy strategy) const& { Derived copy(*this); // NOTE: This is slightly different than how the setting is stored in Java // because we want to put it on the stack. @@ -160,7 +160,7 @@ Derived NumberFormatterSettings::grouping(UGroupingStrategy strategy) c } template -Derived NumberFormatterSettings::grouping(UGroupingStrategy strategy)&& { +Derived NumberFormatterSettings::grouping(UNumberGroupingStrategy strategy)&& { Derived move(std::move(*this)); move.fMacros.grouper = Grouper::forStrategy(strategy); return move; @@ -322,12 +322,25 @@ Derived NumberFormatterSettings::macros(impl::MacroProps&& macros)&& { template UnicodeString NumberFormatterSettings::toSkeleton(UErrorCode& status) const { + if (U_FAILURE(status)) { + return ICU_Utility::makeBogusString(); + } if (fMacros.copyErrorTo(status)) { return ICU_Utility::makeBogusString(); } return skeleton::generate(fMacros, status); } +template +LocalPointer NumberFormatterSettings::clone() const & { + return LocalPointer(new Derived(*this)); +} + +template +LocalPointer NumberFormatterSettings::clone() && { + return LocalPointer(new Derived(std::move(*this))); +} + // Declare all classes that implement NumberFormatterSettings // See https://stackoverflow.com/a/495056/1407170 template @@ -347,7 +360,12 @@ LocalizedNumberFormatter NumberFormatter::withLocale(const Locale& locale) { UnlocalizedNumberFormatter NumberFormatter::forSkeleton(const UnicodeString& skeleton, UErrorCode& status) { - return skeleton::create(skeleton, status); + return skeleton::create(skeleton, nullptr, status); +} + +UnlocalizedNumberFormatter +NumberFormatter::forSkeleton(const UnicodeString& skeleton, UParseError& perror, UErrorCode& status) { + return skeleton::create(skeleton, &perror, status); } @@ -666,10 +684,14 @@ LocalizedNumberFormatter::formatDecimalQuantity(const DecimalQuantity& dq, UErro void LocalizedNumberFormatter::formatImpl(impl::UFormattedNumberData* results, UErrorCode& status) const { if (computeCompiled(status)) { - fCompiled->format(results->quantity, results->string, status); + fCompiled->format(results->quantity, results->getStringRef(), status); } else { - NumberFormatterImpl::formatStatic(fMacros, results->quantity, results->string, status); + NumberFormatterImpl::formatStatic(fMacros, results->quantity, results->getStringRef(), status); } + if (U_FAILURE(status)) { + return; + } + results->getStringRef().writeTerminator(status); } void LocalizedNumberFormatter::getAffixImpl(bool isPrefix, bool isNegative, UnicodeString& result, @@ -745,122 +767,13 @@ int32_t LocalizedNumberFormatter::getCallCount() const { } Format* LocalizedNumberFormatter::toFormat(UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } LocalPointer retval( new LocalizedNumberFormatterAsFormat(*this, fMacros.locale), status); return retval.orphan(); } -FormattedNumber::FormattedNumber(FormattedNumber&& src) U_NOEXCEPT - : fResults(src.fResults), fErrorCode(src.fErrorCode) { - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; -} - -FormattedNumber& FormattedNumber::operator=(FormattedNumber&& src) U_NOEXCEPT { - delete fResults; - fResults = src.fResults; - fErrorCode = src.fErrorCode; - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; - return *this; -} - -UnicodeString FormattedNumber::toString() const { - UErrorCode localStatus = U_ZERO_ERROR; - return toString(localStatus); -} - -UnicodeString FormattedNumber::toString(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->string.toUnicodeString(); -} - -Appendable& FormattedNumber::appendTo(Appendable& appendable) { - UErrorCode localStatus = U_ZERO_ERROR; - return appendTo(appendable, localStatus); -} - -Appendable& FormattedNumber::appendTo(Appendable& appendable, UErrorCode& status) const { - if (U_FAILURE(status)) { - return appendable; - } - if (fResults == nullptr) { - status = fErrorCode; - 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; - } - // in case any users were depending on the old behavior: - fieldPosition.setBeginIndex(0); - fieldPosition.setEndIndex(0); - fResults->string.nextFieldPosition(fieldPosition, status); -} - -UBool FormattedNumber::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const { - if (U_FAILURE(status)) { - return FALSE; - } - if (fResults == nullptr) { - status = fErrorCode; - return FALSE; - } - // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool - return fResults->string.nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; -} - -void FormattedNumber::populateFieldPositionIterator(FieldPositionIterator& iterator, UErrorCode& status) { - getAllFieldPositions(iterator, status); -} - -void FormattedNumber::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const { - FieldPositionIteratorHandler fpih(&iterator, status); - getAllFieldPositionsImpl(fpih, status); -} - -void FormattedNumber::getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, - UErrorCode& status) const { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - fResults->string.getAllFieldPositions(fpih, status); -} - -void FormattedNumber::getDecimalQuantity(DecimalQuantity& output, UErrorCode& status) const { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - output = fResults->quantity; -} - -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 index 60c18ee284e238..08b833beb7ad2e 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.cpp +++ b/deps/icu-small/source/i18n/number_formatimpl.cpp @@ -172,13 +172,12 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, // Pre-compute a few values for efficiency. bool isCurrency = utils::unitIsCurrency(macros.unit); bool isNoUnit = utils::unitIsNoUnit(macros.unit); - bool isPercent = isNoUnit && utils::unitIsPercent(macros.unit); - bool isPermille = isNoUnit && utils::unitIsPermille(macros.unit); - bool isCldrUnit = !isCurrency && !isNoUnit; + bool isPercent = utils::unitIsPercent(macros.unit); + bool isPermille = utils::unitIsPermille(macros.unit); bool isAccounting = macros.sign == UNUM_SIGN_ACCOUNTING || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS || macros.sign == UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO; - CurrencyUnit currency(nullptr, status); + CurrencyUnit currency(u"", status); if (isCurrency) { currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit } @@ -194,6 +193,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, if (macros.unitWidth != UNUM_UNIT_WIDTH_COUNT) { unitWidth = macros.unitWidth; } + bool isCldrUnit = !isCurrency && !isNoUnit && + (unitWidth == UNUM_UNIT_WIDTH_FULL_NAME || !(isPercent || isPermille)); // Select the numbering system. LocalPointer nsLocal; @@ -207,6 +208,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, nsLocal.adoptInstead(ns); } const char* nsName = U_SUCCESS(status) ? ns->getName() : "latn"; + uprv_strncpy(fMicros.nsName, nsName, 8); + fMicros.nsName[8] = 0; // guarantee NUL-terminated // Resolve the symbols. Do this here because currency may need to customize them. if (macros.symbols.isDecimalFormatSymbols()) { @@ -241,7 +244,9 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, } if (pattern == nullptr) { CldrPatternStyle patternStyle; - if (isPercent || isPermille) { + if (isCldrUnit) { + patternStyle = CLDR_PATTERN_STYLE_DECIMAL; + } else if (isPercent || isPermille) { patternStyle = CLDR_PATTERN_STYLE_PERCENT; } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) { patternStyle = CLDR_PATTERN_STYLE_DECIMAL; @@ -344,7 +349,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, fPatternModifier.adoptInstead(patternModifier); patternModifier->setPatternInfo( macros.affixProvider != nullptr ? macros.affixProvider - : static_cast(fPatternInfo.getAlias())); + : static_cast(fPatternInfo.getAlias()), + UNUM_FIELD_COUNT); patternModifier->setPatternAttributes(fMicros.sign, isPermille); if (patternModifier->needsPlurals()) { patternModifier->setSymbols( diff --git a/deps/icu-small/source/i18n/number_formatimpl.h b/deps/icu-small/source/i18n/number_formatimpl.h index fda38c92845f87..fd8708c532e131 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.h +++ b/deps/icu-small/source/i18n/number_formatimpl.h @@ -64,6 +64,10 @@ class NumberFormatterImpl : public UMemory { int32_t getPrefixSuffix(int8_t signum, StandardPlural::Form plural, NumberStringBuilder& outString, UErrorCode& status) const; + const MicroProps& getRawMicroProps() const { + return fMicros; + } + /** * Synthesizes the output string from a MicroProps and DecimalQuantity. * This method formats only the main number, not affixes. diff --git a/deps/icu-small/source/i18n/number_grouping.cpp b/deps/icu-small/source/i18n/number_grouping.cpp index da32cca99a38df..41f727a458f943 100644 --- a/deps/icu-small/source/i18n/number_grouping.cpp +++ b/deps/icu-small/source/i18n/number_grouping.cpp @@ -34,7 +34,7 @@ int16_t getMinGroupingForLocale(const Locale& locale) { } -Grouper Grouper::forStrategy(UGroupingStrategy grouping) { +Grouper Grouper::forStrategy(UNumberGroupingStrategy grouping) { switch (grouping) { case UNUM_GROUPING_OFF: return {-1, -1, -2, grouping}; @@ -47,8 +47,7 @@ Grouper Grouper::forStrategy(UGroupingStrategy grouping) { case UNUM_GROUPING_THOUSANDS: return {3, 3, 1, grouping}; default: - U_ASSERT(FALSE); - return {}; // return a value: silence compiler warning + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/number_integerwidth.cpp b/deps/icu-small/source/i18n/number_integerwidth.cpp index 6416b292982e56..d62aef444dca96 100644 --- a/deps/icu-small/source/i18n/number_integerwidth.cpp +++ b/deps/icu-small/source/i18n/number_integerwidth.cpp @@ -43,14 +43,15 @@ void IntegerWidth::apply(impl::DecimalQuantity& quantity, UErrorCode& status) co if (fHasError) { status = U_ILLEGAL_ARGUMENT_ERROR; } else if (fUnion.minMaxInt.fMaxInt == -1) { - quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, INT32_MAX); + quantity.setMinInteger(fUnion.minMaxInt.fMinInt); } else { // Enforce the backwards-compatibility feature "FormatFailIfMoreThanMaxDigits" if (fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits && fUnion.minMaxInt.fMaxInt < quantity.getMagnitude()) { status = U_ILLEGAL_ARGUMENT_ERROR; } - quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, fUnion.minMaxInt.fMaxInt); + quantity.setMinInteger(fUnion.minMaxInt.fMinInt); + quantity.applyMaxInteger(fUnion.minMaxInt.fMaxInt); } } diff --git a/deps/icu-small/source/i18n/number_longnames.cpp b/deps/icu-small/source/i18n/number_longnames.cpp index fd8e8d381a1d76..0cd160042a46d3 100644 --- a/deps/icu-small/source/i18n/number_longnames.cpp +++ b/deps/icu-small/source/i18n/number_longnames.cpp @@ -14,6 +14,7 @@ #include "number_microprops.h" #include #include "cstring.h" +#include "util.h" using namespace icu; using namespace icu::number; @@ -91,6 +92,17 @@ void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumber PluralTableSink sink(outArray); LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status)); if (U_FAILURE(status)) { return; } + + // Map duration-year-person, duration-week-person, etc. to duration-year, duration-week, ... + // TODO(ICU-20400): Get duration-*-person data properly with aliases. + StringPiece subtypeForResource; + int32_t subtypeLen = static_cast(uprv_strlen(unit.getSubtype())); + if (subtypeLen > 7 && uprv_strcmp(unit.getSubtype() + subtypeLen - 7, "-person") == 0) { + subtypeForResource = {unit.getSubtype(), subtypeLen - 7}; + } else { + subtypeForResource = unit.getSubtype(); + } + CharString key; key.append("units", status); if (width == UNUM_UNIT_WIDTH_NARROW) { @@ -101,7 +113,24 @@ void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumber key.append("/", status); key.append(unit.getType(), status); key.append("/", status); - key.append(unit.getSubtype(), status); + key.append(subtypeForResource, status); + + UErrorCode localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, localStatus); + if (width == UNUM_UNIT_WIDTH_SHORT) { + if (U_FAILURE(localStatus)) { + status = localStatus; + } + return; + } + + // TODO(ICU-13353): The fallback to short does not work in ICU4C. + // Manually fall back to short (this is done automatically in Java). + key.clear(); + key.append("unitsShort/", status); + key.append(unit.getType(), status); + key.append("/", status); + key.append(subtypeForResource, status); ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, status); } @@ -181,8 +210,7 @@ LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unitRef, c UnicodeString simpleFormats[ARRAY_LENGTH]; getMeasureData(loc, unit, width, simpleFormats, status); if (U_FAILURE(status)) { return result; } - // TODO: What field to use for units? - result->simpleFormatsToModifiers(simpleFormats, UNUM_FIELD_COUNT, status); + result->simpleFormatsToModifiers(simpleFormats, UNUM_MEASURE_UNIT_FIELD, status); return result; } @@ -220,11 +248,23 @@ LongNameHandler::forCompoundUnit(const Locale &loc, const MeasureUnit &unit, con compiled.format(UnicodeString(u"{0}"), secondaryString, perUnitFormat, status); if (U_FAILURE(status)) { return result; } } - // TODO: What field to use for units? - result->multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_FIELD_COUNT, status); + result->multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_MEASURE_UNIT_FIELD, status); return result; } +UnicodeString LongNameHandler::getUnitDisplayName( + const Locale& loc, + const MeasureUnit& unit, + UNumberUnitWidth width, + UErrorCode& status) { + if (U_FAILURE(status)) { + return ICU_Utility::makeBogusString(); + } + UnicodeString simpleFormats[ARRAY_LENGTH]; + getMeasureData(loc, unit, width, simpleFormats, status); + return simpleFormats[DNAM_INDEX]; +} + LongNameHandler* LongNameHandler::forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, const PluralRules *rules, const MicroPropsGenerator *parent, @@ -273,10 +313,8 @@ void LongNameHandler::multiSimpleFormatsToModifiers(const UnicodeString *leadFor void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const { parent->processQuantity(quantity, micros, status); - // TODO: Avoid the copy here? - DecimalQuantity copy(quantity); - micros.rounder.apply(copy, status); - micros.modOuter = &fModifiers[utils::getStandardPlural(rules, copy)]; + StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status); + micros.modOuter = &fModifiers[pluralForm]; } const Modifier* LongNameHandler::getModifier(int8_t /*signum*/, StandardPlural::Form plural) const { diff --git a/deps/icu-small/source/i18n/number_longnames.h b/deps/icu-small/source/i18n/number_longnames.h index a71d0caadf125c..76fb82d744b6d4 100644 --- a/deps/icu-small/source/i18n/number_longnames.h +++ b/deps/icu-small/source/i18n/number_longnames.h @@ -16,6 +16,12 @@ namespace impl { class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public UMemory { public: + static UnicodeString getUnitDisplayName( + const Locale& loc, + const MeasureUnit& unit, + UNumberUnitWidth width, + UErrorCode& status); + static LongNameHandler* forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, const PluralRules *rules, const MicroPropsGenerator *parent, UErrorCode &status); diff --git a/deps/icu-small/source/i18n/number_mapper.cpp b/deps/icu-small/source/i18n/number_mapper.cpp index 2c9a8e5178f35e..40fd5284b86649 100644 --- a/deps/icu-small/source/i18n/number_mapper.cpp +++ b/deps/icu-small/source/i18n/number_mapper.cpp @@ -80,8 +80,10 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert /////////// bool useCurrency = ( - !properties.currency.isNull() || !properties.currencyPluralInfo.fPtr.isNull() || - !properties.currencyUsage.isNull() || affixProvider->hasCurrencySign()); + !properties.currency.isNull() || + !properties.currencyPluralInfo.fPtr.isNull() || + !properties.currencyUsage.isNull() || + affixProvider->hasCurrencySign()); CurrencyUnit currency = resolveCurrency(properties, locale, status); UCurrencyUsage currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD); if (useCurrency) { @@ -141,7 +143,11 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert if (!properties.currencyUsage.isNull()) { precision = Precision::constructCurrency(currencyUsage).withCurrency(currency); } else if (roundingIncrement != 0.0) { - precision = Precision::constructIncrement(roundingIncrement, minFrac); + if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) { + precision = Precision::constructFraction(minFrac, maxFrac); + } else { + precision = Precision::constructIncrement(roundingIncrement, minFrac); + } } else if (explicitMinMaxSig) { minSig = minSig < 1 ? 1 : minSig > kMaxIntFracSig ? kMaxIntFracSig : minSig; maxSig = maxSig < 0 ? kMaxIntFracSig : maxSig < minSig ? minSig : maxSig > kMaxIntFracSig @@ -153,7 +159,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert precision = Precision::constructCurrency(currencyUsage); } if (!precision.isBogus()) { - precision = precision.withMode(roundingMode); + precision.fRoundingMode = roundingMode; macros.precision = precision; } @@ -176,7 +182,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert // PADDING // ///////////// - if (properties.formatWidth != -1) { + if (properties.formatWidth > 0) { macros.padder = Padder::forProperties(properties); } @@ -232,10 +238,10 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert int maxFrac_ = properties.maximumFractionDigits; if (minInt_ == 0 && maxFrac_ == 0) { // Patterns like "#E0" and "##E0", which mean no rounding! - macros.precision = Precision::unlimited().withMode(roundingMode); + macros.precision = Precision::unlimited(); } else if (minInt_ == 0 && minFrac_ == 0) { // Patterns like "#.##E0" (no zeros in the mantissa), which mean round to maxFrac+1 - macros.precision = Precision::constructSignificant(1, maxFrac_ + 1).withMode(roundingMode); + macros.precision = Precision::constructSignificant(1, maxFrac_ + 1); } else { int maxSig_ = minInt_ + maxFrac_; // Bug #20058: if maxInt_ > minInt_ > 1, then minInt_ should be 1. @@ -245,8 +251,9 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert int minSig_ = minInt_ + minFrac_; // To avoid regression, maxSig is not reset when minInt_ set to 1. // TODO: Reset maxSig_ = 1 + minFrac_ to follow the spec. - macros.precision = Precision::constructSignificant(minSig_, maxSig_).withMode(roundingMode); + macros.precision = Precision::constructSignificant(minSig_, maxSig_); } + macros.precision.fRoundingMode = roundingMode; } } @@ -295,7 +302,9 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert if (rounding_.fType == Precision::PrecisionType::RND_FRACTION) { minFrac_ = rounding_.fUnion.fracSig.fMinFrac; maxFrac_ = rounding_.fUnion.fracSig.fMaxFrac; - } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT) { + } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT + || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_ONE + || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_FIVE) { increment_ = rounding_.fUnion.increment.fIncrement; minFrac_ = rounding_.fUnion.increment.fMinFrac; maxFrac_ = rounding_.fUnion.increment.fMinFrac; @@ -315,7 +324,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert } -void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode&) { +void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode& status) { fBogus = false; // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the @@ -325,9 +334,7 @@ void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& proper // 2) Otherwise, follows UTS 35 rules based on the pattern string. // // Importantly, the explicit setters affect only the one field they override. If you set the positive - // prefix, that should not affect the negative prefix. Since it is impossible for the user of this class - // to know whether the origin for a string was the override or the pattern, we have to say that we always - // have a negative subpattern and perform all resolution logic here. + // prefix, that should not affect the negative prefix. // Convenience: Extract the properties into local variables. // Variables are named with three chars: [p/n][p/s][o/p] @@ -379,6 +386,14 @@ void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& proper // UTS 35: Default negative prefix is the positive prefix. negSuffix = psp.isBogus() ? u"" : psp; } + + // For declaring if this is a currency pattern, we need to look at the + // original pattern, not at any user-specified overrides. + isCurrencyPattern = ( + AffixUtils::hasCurrencySymbols(ppp, status) || + AffixUtils::hasCurrencySymbols(psp, status) || + AffixUtils::hasCurrencySymbols(npp, status) || + AffixUtils::hasCurrencySymbols(nsp, status)); } char16_t PropertiesAffixPatternProvider::charAt(int flags, int i) const { @@ -415,8 +430,11 @@ bool PropertiesAffixPatternProvider::positiveHasPlusSign() const { } bool PropertiesAffixPatternProvider::hasNegativeSubpattern() const { - // See comments in the constructor for more information on why this is always true. - return true; + return ( + (negSuffix != posSuffix) || + negPrefix.tempSubString(1) != posPrefix || + negPrefix.charAt(0) != u'-' + ); } bool PropertiesAffixPatternProvider::negativeHasMinusSign() const { @@ -426,11 +444,7 @@ bool PropertiesAffixPatternProvider::negativeHasMinusSign() const { } bool PropertiesAffixPatternProvider::hasCurrencySign() const { - ErrorCode localStatus; - return AffixUtils::hasCurrencySymbols(posPrefix, localStatus) || - AffixUtils::hasCurrencySymbols(posSuffix, localStatus) || - AffixUtils::hasCurrencySymbols(negPrefix, localStatus) || - AffixUtils::hasCurrencySymbols(negSuffix, localStatus); + return isCurrencyPattern; } bool PropertiesAffixPatternProvider::containsSymbolType(AffixPatternType type, UErrorCode& status) const { diff --git a/deps/icu-small/source/i18n/number_mapper.h b/deps/icu-small/source/i18n/number_mapper.h index 82c5711c8d0ce7..d28e9cec393a05 100644 --- a/deps/icu-small/source/i18n/number_mapper.h +++ b/deps/icu-small/source/i18n/number_mapper.h @@ -63,6 +63,7 @@ class PropertiesAffixPatternProvider : public AffixPatternProvider, public UMemo UnicodeString posSuffix; UnicodeString negPrefix; UnicodeString negSuffix; + bool isCurrencyPattern; const UnicodeString& getStringInternal(int32_t flags) const; @@ -135,7 +136,7 @@ struct DecimalFormatFields : public UMemory { * The pre-computed formatter object. Setters cause this to be re-computed atomically. The {@link * #format} method uses the formatter directly without needing to synchronize. */ - LocalPointer formatter; + LocalPointer formatter; /** The lazy-computed parser for .parse() */ std::atomic<::icu::numparse::impl::NumberParserImpl*> atomicParser = {}; diff --git a/deps/icu-small/source/i18n/number_microprops.h b/deps/icu-small/source/i18n/number_microprops.h index daa887bb0dd861..d2393aea50c098 100644 --- a/deps/icu-small/source/i18n/number_microprops.h +++ b/deps/icu-small/source/i18n/number_microprops.h @@ -32,6 +32,7 @@ struct MicroProps : public MicroPropsGenerator { UNumberSignDisplay sign; UNumberDecimalSeparatorDisplay decimal; bool useCurrency; + char nsName[9]; // Note: This struct has no direct ownership of the following pointers. const DecimalFormatSymbols* symbols; diff --git a/deps/icu-small/source/i18n/number_modifiers.cpp b/deps/icu-small/source/i18n/number_modifiers.cpp index d92ec63b08da58..1fcbe7b9b79301 100644 --- a/deps/icu-small/source/i18n/number_modifiers.cpp +++ b/deps/icu-small/source/i18n/number_modifiers.cpp @@ -92,14 +92,13 @@ bool ConstantAffixModifier::isStrong() const { bool ConstantAffixModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void ConstantAffixModifier::getParameters(Parameters& output) const { (void)output; // This method is not currently used. - U_ASSERT(false); + UPRV_UNREACHABLE; } bool ConstantAffixModifier::semanticallyEquivalent(const Modifier& other) const { @@ -157,7 +156,7 @@ SimpleModifier::SimpleModifier() int32_t SimpleModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, UErrorCode &status) const { - return formatAsPrefixSuffix(output, leftIndex, rightIndex, fField, status); + return formatAsPrefixSuffix(output, leftIndex, rightIndex, status); } int32_t SimpleModifier::getPrefixLength() const { @@ -182,8 +181,7 @@ bool SimpleModifier::isStrong() const { bool SimpleModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void SimpleModifier::getParameters(Parameters& output) const { @@ -206,13 +204,13 @@ bool SimpleModifier::semanticallyEquivalent(const Modifier& other) const { int32_t SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex, - Field field, UErrorCode &status) const { + UErrorCode &status) const { if (fSuffixOffset == -1 && fPrefixLength + fSuffixLength > 0) { // There is no argument for the inner number; overwrite the entire segment with our string. - return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status); + return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status); } else { if (fPrefixLength > 0) { - result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status); + result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status); } if (fSuffixLength > 0) { result.insert( @@ -220,7 +218,7 @@ SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startI fCompiledPattern, 1 + fSuffixOffset, 1 + fSuffixOffset + fSuffixLength, - field, + fField, status); } return fPrefixLength + fSuffixLength; diff --git a/deps/icu-small/source/i18n/number_modifiers.h b/deps/icu-small/source/i18n/number_modifiers.h index 65ada937d03345..495128bb149dcf 100644 --- a/deps/icu-small/source/i18n/number_modifiers.h +++ b/deps/icu-small/source/i18n/number_modifiers.h @@ -100,7 +100,7 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory { * @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, + formatAsPrefixSuffix(NumberStringBuilder& result, int32_t startIndex, int32_t endIndex, UErrorCode& status) const; /** diff --git a/deps/icu-small/source/i18n/number_multiplier.cpp b/deps/icu-small/source/i18n/number_multiplier.cpp index ecb50dd9b82019..8f07e548de121b 100644 --- a/deps/icu-small/source/i18n/number_multiplier.cpp +++ b/deps/icu-small/source/i18n/number_multiplier.cpp @@ -65,6 +65,9 @@ Scale::Scale(Scale&& src) U_NOEXCEPT Scale& Scale::operator=(Scale&& src) U_NOEXCEPT { fMagnitude = src.fMagnitude; + if (fArbitrary != nullptr) { + delete fArbitrary; + } fArbitrary = src.fArbitrary; fError = src.fError; // Take ownership away from src if necessary diff --git a/deps/icu-small/source/i18n/number_output.cpp b/deps/icu-small/source/i18n/number_output.cpp new file mode 100644 index 00000000000000..6f4e2482044f14 --- /dev/null +++ b/deps/icu-small/source/i18n/number_output.cpp @@ -0,0 +1,50 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/numberformatter.h" +#include "number_utypes.h" +#include "util.h" +#include "number_decimalquantity.h" + +U_NAMESPACE_BEGIN +namespace number { + + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumber) + +#define UPRV_NOARG + +UBool FormattedNumber::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const { + UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) + // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool + return fData->getStringRef().nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; +} + +void FormattedNumber::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const { + FieldPositionIteratorHandler fpih(&iterator, status); + getAllFieldPositionsImpl(fpih, status); +} + +void FormattedNumber::getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, + UErrorCode& status) const { + UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG) + fData->getStringRef().getAllFieldPositions(fpih, status); +} + +void FormattedNumber::getDecimalQuantity(impl::DecimalQuantity& output, UErrorCode& status) const { + UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG) + output = fData->quantity; +} + + +impl::UFormattedNumberData::~UFormattedNumberData() = default; + + +} // namespace number +U_NAMESPACE_END + +#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 index 4c61a0d35bca82..75de439f3ed2e1 100644 --- a/deps/icu-small/source/i18n/number_patternmodifier.cpp +++ b/deps/icu-small/source/i18n/number_patternmodifier.cpp @@ -23,13 +23,14 @@ AffixPatternProvider::~AffixPatternProvider() = default; MutablePatternModifier::MutablePatternModifier(bool isStrong) : fStrong(isStrong) {} -void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo) { +void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo, Field field) { fPatternInfo = patternInfo; + fField = field; } void MutablePatternModifier::setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille) { fSignDisplay = signDisplay; - this->perMilleReplacesPercent = perMille; + fPerMilleReplacesPercent = perMille; } void MutablePatternModifier::setSymbols(const DecimalFormatSymbols* symbols, @@ -126,18 +127,16 @@ ImmutablePatternModifier::ImmutablePatternModifier(AdoptingModifierStore* pm, co void ImmutablePatternModifier::processQuantity(DecimalQuantity& quantity, MicroProps& micros, UErrorCode& status) const { parent->processQuantity(quantity, micros, status); - applyToMicros(micros, quantity); + applyToMicros(micros, quantity, status); } -void ImmutablePatternModifier::applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const { +void ImmutablePatternModifier::applyToMicros( + MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const { if (rules == nullptr) { micros.modMiddle = pm->getModifierWithoutPlural(quantity.signum()); } else { - // TODO: Fix this. Avoid the copy. - DecimalQuantity copy(quantity); - copy.roundToInfinity(); - StandardPlural::Form plural = utils::getStandardPlural(rules, copy); - micros.modMiddle = pm->getModifier(quantity.signum(), plural); + StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status); + micros.modMiddle = pm->getModifier(quantity.signum(), pluralForm); } } @@ -163,10 +162,8 @@ void MutablePatternModifier::processQuantity(DecimalQuantity& fq, MicroProps& mi // 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.rounder.apply(copy, status); - nonConstThis->setNumberProperties(fq.signum(), utils::getStandardPlural(fRules, copy)); + StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, fRules, fq, status); + nonConstThis->setNumberProperties(fq.signum(), pluralForm); } else { nonConstThis->setNumberProperties(fq.signum(), StandardPlural::Form::COUNT); } @@ -236,39 +233,37 @@ bool MutablePatternModifier::isStrong() const { bool MutablePatternModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void MutablePatternModifier::getParameters(Parameters& output) const { (void)output; // This method is not currently used. - U_ASSERT(false); + UPRV_UNREACHABLE; } bool MutablePatternModifier::semanticallyEquivalent(const Modifier& other) const { (void)other; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } int32_t MutablePatternModifier::insertPrefix(NumberStringBuilder& sb, int position, UErrorCode& status) { prepareAffix(true); - int length = AffixUtils::unescape(currentAffix, sb, position, *this, status); + int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status); return length; } int32_t MutablePatternModifier::insertSuffix(NumberStringBuilder& sb, int position, UErrorCode& status) { prepareAffix(false); - int length = AffixUtils::unescape(currentAffix, sb, position, *this, status); + int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status); return length; } /** This method contains the heart of the logic for rendering LDML affix strings. */ void MutablePatternModifier::prepareAffix(bool isPrefix) { PatternStringUtils::patternInfoToStringBuilder( - *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, perMilleReplacesPercent, currentAffix); + *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, fPerMilleReplacesPercent, currentAffix); } UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const { @@ -307,15 +302,13 @@ UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const { case AffixPatternType::TYPE_CURRENCY_QUINT: return UnicodeString(u"\uFFFD"); default: - U_ASSERT(false); - return UnicodeString(); + UPRV_UNREACHABLE; } } UnicodeString MutablePatternModifier::toUnicodeString() const { // Never called by AffixUtils - U_ASSERT(false); - return UnicodeString(); + UPRV_UNREACHABLE; } #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 index ea80d6305e75b4..27e293b64ce50f 100644 --- a/deps/icu-small/source/i18n/number_patternmodifier.h +++ b/deps/icu-small/source/i18n/number_patternmodifier.h @@ -21,10 +21,16 @@ U_NAMESPACE_BEGIN // data member of AdoptingModifierStore. // (When building DLLs for Windows this is required.) #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(_MSC_VER) // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(suppress: 4661) +#pragma warning(push) +#pragma warning(disable : 4661) +#endif template class U_I18N_API LocalPointerBase; template class U_I18N_API LocalPointer; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif #endif namespace number { @@ -40,7 +46,7 @@ class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public U void processQuantity(DecimalQuantity&, MicroProps& micros, UErrorCode& status) const U_OVERRIDE; - void applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const; + void applyToMicros(MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const; const Modifier* getModifier(int8_t signum, StandardPlural::Form plural) const; @@ -95,8 +101,11 @@ class U_I18N_API MutablePatternModifier * Sets a reference to the parsed decimal format pattern, usually obtained from * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is * accepted. + * + * @param field + * Which field to use for literal characters in the pattern. */ - void setPatternInfo(const AffixPatternProvider *patternInfo); + void setPatternInfo(const AffixPatternProvider *patternInfo, Field field); /** * Sets attributes that imply changes to the literal interpretation of the pattern string affixes. @@ -203,8 +212,9 @@ class U_I18N_API MutablePatternModifier // Pattern details (initialized in setPatternInfo and setPatternAttributes) const AffixPatternProvider *fPatternInfo; + Field fField; UNumberSignDisplay fSignDisplay; - bool perMilleReplacesPercent; + bool fPerMilleReplacesPercent; // Symbol details (initialized in setSymbols) const DecimalFormatSymbols *fSymbols; diff --git a/deps/icu-small/source/i18n/number_patternstring.cpp b/deps/icu-small/source/i18n/number_patternstring.cpp index 63195eed989e54..90754246633064 100644 --- a/deps/icu-small/source/i18n/number_patternstring.cpp +++ b/deps/icu-small/source/i18n/number_patternstring.cpp @@ -15,6 +15,7 @@ #include "unicode/utf16.h" #include "number_utils.h" #include "number_roundingutils.h" +#include "number_mapper.h" using namespace icu; using namespace icu::number; @@ -49,7 +50,7 @@ PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFo 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); + UPRV_UNREACHABLE; } return pattern.charAt(endpoints.start + index); } @@ -643,69 +644,67 @@ PatternParser::patternInfoToProperties(DecimalFormatProperties& properties, Pars /// End PatternStringParser.java; begin PatternStringUtils.java /// /////////////////////////////////////////////////////////////////// +// Determine whether a given roundingIncrement should be ignored for formatting +// based on the current maxFrac value (maximum fraction digits). For example a +// roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac +// is 2 or more. Note that roundingIncrements are rounded in significance, so +// a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e. +// it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of +// 0.005 is treated like 0.001 for significance). This is the reason for the +// initial doubling below. +// roundIncr must be non-zero. +bool PatternStringUtils::ignoreRoundingIncrement(double roundIncr, int32_t maxFrac) { + if (maxFrac < 0) { + return false; + } + int32_t frac = 0; + roundIncr *= 2.0; + for (frac = 0; frac <= maxFrac && roundIncr <= 1.0; frac++, roundIncr *= 10.0); + return (frac > maxFrac); +} + 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); + int32_t dosMax = 100; + int32_t grouping1 = uprv_max(0, uprv_min(properties.groupingSize, dosMax)); + int32_t grouping2 = uprv_max(0, uprv_min(properties.secondaryGroupingSize, dosMax)); + bool useGrouping = properties.groupingUsed; + int32_t 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); + int32_t minInt = uprv_max(0, uprv_min(properties.minimumIntegerDigits, dosMax)); + int32_t maxInt = uprv_min(properties.maximumIntegerDigits, dosMax); + int32_t minFrac = uprv_max(0, uprv_min(properties.minimumFractionDigits, dosMax)); + int32_t maxFrac = uprv_min(properties.maximumFractionDigits, dosMax); + int32_t minSig = uprv_min(properties.minimumSignificantDigits, dosMax); + int32_t maxSig = uprv_min(properties.maximumSignificantDigits, dosMax); bool alwaysShowDecimal = properties.decimalSeparatorAlwaysShown; - int exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax); + int32_t 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; + + PropertiesAffixPatternProvider affixes(properties, status); // Prefixes - if (!ppp.isBogus()) { - sb.append(ppp); - } - sb.append(AffixUtils::escape(pp)); - int afterPrefixPos = sb.length(); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_PREFIX)); + int32_t 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; + if (!useGrouping) { grouping1 = 0; grouping2 = 0; + } else if (grouping1 == grouping2) { + grouping1 = 0; } - int groupingLength = grouping1 + grouping2 + 1; + int32_t groupingLength = grouping1 + grouping2 + 1; // Figure out the digits we need to put in the pattern. double roundingInterval = properties.roundingIncrement; UnicodeString digitsString; - int digitsStringScale = 0; + int32_t digitsStringScale = 0; if (maxSig != uprv_min(dosMax, -1)) { // Significant Digits. while (digitsString.length() < minSig) { @@ -714,9 +713,9 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP while (digitsString.length() < maxSig) { digitsString.append(u'#'); } - } else if (roundingInterval != 0.0) { + } else if (roundingInterval != 0.0 && !ignoreRoundingIncrement(roundingInterval,maxFrac)) { // Rounding Interval. - digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval); + digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval, nullptr); // TODO: Check for DoS here? DecimalQuantity incrementQuantity; incrementQuantity.setToDouble(roundingInterval); @@ -739,22 +738,30 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP } // Write the digits to the string builder - int m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale); + int32_t 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; + int32_t mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale; + for (int32_t magnitude = m0; magnitude >= mN; magnitude--) { + int32_t 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) { + // Decimal separator + if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) { + sb.append(u'.'); + } + if (!useGrouping) { + continue; + } + // Least-significant grouping separator + if (magnitude > 0 && magnitude == grouping1) { sb.append(u','); - } else if (magnitude > 0 && magnitude == grouping2) { + } + // All other grouping separators + if (magnitude > grouping1 && grouping2 > 0 && (magnitude - grouping1) % grouping2 == 0) { sb.append(u','); - } else if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) { - sb.append(u'.'); } } @@ -764,25 +771,22 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP if (exponentShowPlusSign) { sb.append(u'+'); } - for (int i = 0; i < exponentDigits; i++) { + for (int32_t i = 0; i < exponentDigits; i++) { sb.append(u'0'); } } // Suffixes - int beforeSuffixPos = sb.length(); - if (!psp.isBogus()) { - sb.append(psp); - } - sb.append(AffixUtils::escape(ps)); + int32_t beforeSuffixPos = sb.length(); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_SUFFIX)); // Resolve Padding - if (paddingWidth != -1 && !paddingLocation.isNull()) { + if (paddingWidth > 0 && !paddingLocation.isNull()) { while (paddingWidth - sb.length() > 0) { sb.insert(afterPrefixPos, u'#'); beforeSuffixPos++; } - int addedLength; + int32_t addedLength; switch (paddingLocation.get(status)) { case PadPosition::UNUM_PAD_BEFORE_PREFIX: addedLength = escapePaddingString(paddingString, sb, 0, status); @@ -810,23 +814,16 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP // 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))) { + if (affixes.hasNegativeSubpattern()) { sb.append(u';'); - if (!npp.isBogus()) { - sb.append(npp); - } - sb.append(AffixUtils::escape(np)); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_NEG_PREFIX)); // Copy the positive digit format into the negative. // This is optional; the pattern is the same as if '#' were appended here instead. // NOTE: It is not safe to append the UnicodeString to itself, so we need to copy. // See http://bugs.icu-project.org/trac/ticket/13707 UnicodeString copy(sb); sb.append(copy, afterPrefixPos, beforeSuffixPos - afterPrefixPos); - if (!nsp.isBogus()) { - sb.append(nsp); - } - sb.append(AffixUtils::escape(ns)); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_NEG_SUFFIX)); } return sb; diff --git a/deps/icu-small/source/i18n/number_patternstring.h b/deps/icu-small/source/i18n/number_patternstring.h index 91e120c16a1a84..42e7c3916133d1 100644 --- a/deps/icu-small/source/i18n/number_patternstring.h +++ b/deps/icu-small/source/i18n/number_patternstring.h @@ -98,7 +98,7 @@ struct U_I18N_API ParsedPatternInfo : public AffixPatternProvider, public UMemor int32_t offset = 0; explicit ParserState(const UnicodeString& _pattern) - : pattern(_pattern) {}; + : pattern(_pattern) {} ParserState& operator=(ParserState&& src) U_NOEXCEPT { // Leave pattern reference alone; it will continue to point to the same place in memory, @@ -222,6 +222,28 @@ class U_I18N_API PatternParser { class U_I18N_API PatternStringUtils { public: + /** + * Determine whether a given roundingIncrement should be ignored for formatting + * based on the current maxFrac value (maximum fraction digits). For example a + * roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac + * is 2 or more. Note that roundingIncrements are rounded up in significance, so + * a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e. + * it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of + * 0.005 is treated like 0.001 for significance). + * + * This test is needed for both NumberPropertyMapper::oldToNew and + * PatternStringUtils::propertiesToPatternString. In Java it cannot be + * exported by NumberPropertyMapper (package provate) so it is in + * PatternStringUtils, do the same in C. + * + * @param roundIncr + * The roundingIncrement to be checked. Must be non-zero. + * @param maxFrac + * The current maximum fraction digits value. + * @return true if roundIncr should be ignored for formatting. + */ + static bool ignoreRoundingIncrement(double roundIncr, int32_t maxFrac); + /** * Creates a pattern string from a property bag. * diff --git a/deps/icu-small/source/i18n/number_rounding.cpp b/deps/icu-small/source/i18n/number_rounding.cpp index ae4b8849fbe956..9e369f7925fe2f 100644 --- a/deps/icu-small/source/i18n/number_rounding.cpp +++ b/deps/icu-small/source/i18n/number_rounding.cpp @@ -55,7 +55,7 @@ int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) MultiplierProducer::~MultiplierProducer() = default; -digits_t roundingutils::doubleFractionLength(double input) { +digits_t roundingutils::doubleFractionLength(double input, int8_t* singleDigit) { char buffer[DoubleToStringConverter::kBase10MaximalLength + 1]; bool sign; // unused; always positive int32_t length; @@ -71,6 +71,14 @@ digits_t roundingutils::doubleFractionLength(double input) { &point ); + if (singleDigit == nullptr) { + // no-op + } else if (length == 1) { + *singleDigit = buffer[0] - '0'; + } else { + *singleDigit = -1; + } + return static_cast(length - point); } @@ -161,13 +169,6 @@ CurrencyPrecision Precision::currency(UCurrencyUsage currencyUsage) { return constructCurrency(currencyUsage); } -Precision Precision::withMode(RoundingMode roundingMode) const { - if (fType == RND_ERROR) { return *this; } // no-op in error state - Precision retval = *this; - retval.fRoundingMode = roundingMode; - return retval; -} - Precision FractionPrecision::withMinDigits(int32_t minSignificantDigits) const { if (fType == RND_ERROR) { return *this; } // no-op in error state if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) { @@ -254,14 +255,27 @@ Precision::constructFractionSignificant(const FractionPrecision &base, int32_t m IncrementPrecision Precision::constructIncrement(double increment, int32_t minFrac) { IncrementSettings settings; + // Note: For number formatting, fIncrement is used for RND_INCREMENT but not + // RND_INCREMENT_ONE or RND_INCREMENT_FIVE. However, fIncrement is used in all + // three when constructing a skeleton. settings.fIncrement = increment; settings.fMinFrac = static_cast(minFrac); // One of the few pre-computed quantities: // Note: it is possible for minFrac to be more than maxFrac... (misleading) - settings.fMaxFrac = roundingutils::doubleFractionLength(increment); + int8_t singleDigit; + settings.fMaxFrac = roundingutils::doubleFractionLength(increment, &singleDigit); PrecisionUnion union_; union_.increment = settings; - return {RND_INCREMENT, union_, kDefaultMode}; + if (singleDigit == 1) { + // NOTE: In C++, we must return the correct value type with the correct union. + // It would be invalid to return a RND_FRACTION here because the methods on the + // IncrementPrecision type assume that the union is backed by increment data. + return {RND_INCREMENT_ONE, union_, kDefaultMode}; + } else if (singleDigit == 5) { + return {RND_INCREMENT_FIVE, union_, kDefaultMode}; + } else { + return {RND_INCREMENT, union_, kDefaultMode}; + } } CurrencyPrecision Precision::constructCurrency(UCurrencyUsage usage) { @@ -348,9 +362,8 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac), fRoundingMode, status); - value.setFractionLength( - uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac)), - INT32_MAX); + value.setMinFraction( + uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac))); break; case Precision::RND_SIGNIFICANT: @@ -358,12 +371,11 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig), fRoundingMode, status); - value.setFractionLength( - uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)), - INT32_MAX); + value.setMinFraction( + uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig))); // Make sure that digits are displayed on zero. if (value.isZero() && fPrecision.fUnion.fracSig.fMinSig > 0) { - value.setIntegerLength(1, INT32_MAX); + value.setMinInteger(1); } break; @@ -384,7 +396,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const roundingMag = uprv_min(roundingMag, candidate); } value.roundToMagnitude(roundingMag, fRoundingMode, status); - value.setFractionLength(uprv_max(0, -displayMag), INT32_MAX); + value.setMinFraction(uprv_max(0, -displayMag)); break; } @@ -392,15 +404,32 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const value.roundToIncrement( fPrecision.fUnion.increment.fIncrement, fRoundingMode, - fPrecision.fUnion.increment.fMaxFrac, status); - value.setFractionLength(fPrecision.fUnion.increment.fMinFrac, INT32_MAX); + value.setMinFraction(fPrecision.fUnion.increment.fMinFrac); + break; + + case Precision::RND_INCREMENT_ONE: + value.roundToMagnitude( + -fPrecision.fUnion.increment.fMaxFrac, + fRoundingMode, + status); + value.setMinFraction(fPrecision.fUnion.increment.fMinFrac); + break; + + case Precision::RND_INCREMENT_FIVE: + value.roundToNickel( + -fPrecision.fUnion.increment.fMaxFrac, + fRoundingMode, + status); + value.setMinFraction(fPrecision.fUnion.increment.fMinFrac); break; case Precision::RND_CURRENCY: // Call .withCurrency() before .apply()! - U_ASSERT(false); - break; + UPRV_UNREACHABLE; + + default: + UPRV_UNREACHABLE; } } @@ -408,7 +437,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCod // This method is intended for the one specific purpose of helping print "00.000E0". U_ASSERT(isSignificantDigits()); U_ASSERT(value.isZero()); - value.setFractionLength(fPrecision.fUnion.fracSig.fMinSig - minInt, INT32_MAX); + value.setMinFraction(fPrecision.fUnion.fracSig.fMinSig - minInt); } #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 index 66d58bb775bbee..9c2c47b6e41b31 100644 --- a/deps/icu-small/source/i18n/number_roundingutils.h +++ b/deps/icu-small/source/i18n/number_roundingutils.h @@ -134,8 +134,11 @@ inline bool roundsAtMidpoint(int roundingMode) { /** * Computes the number of fraction digits in a double. Used for computing maxFrac for an increment. * Calls into the DoubleToStringConverter library to do so. + * + * @param singleDigit An output parameter; set to a number if that is the + * only digit in the double, or -1 if there is more than one digit. */ -digits_t doubleFractionLength(double input); +digits_t doubleFractionLength(double input, int8_t* singleDigit); } // namespace roundingutils diff --git a/deps/icu-small/source/i18n/number_scientific.cpp b/deps/icu-small/source/i18n/number_scientific.cpp index 07c1ce9dac2c89..6df07b9cc9e988 100644 --- a/deps/icu-small/source/i18n/number_scientific.cpp +++ b/deps/icu-small/source/i18n/number_scientific.cpp @@ -96,8 +96,7 @@ bool ScientificModifier::isStrong() const { bool ScientificModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not used for inner modifiers. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void ScientificModifier::getParameters(Parameters& output) const { diff --git a/deps/icu-small/source/i18n/number_skeletons.cpp b/deps/icu-small/source/i18n/number_skeletons.cpp index c7bb18b5f3d2b5..4c280ad11dd8da 100644 --- a/deps/icu-small/source/i18n/number_skeletons.cpp +++ b/deps/icu-small/source/i18n/number_skeletons.cpp @@ -159,8 +159,7 @@ Notation stem_to_object::notation(skeleton::StemEnum stem) { case STEM_NOTATION_SIMPLE: return Notation::simple(); default: - U_ASSERT(false); - return Notation::simple(); // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -176,8 +175,7 @@ MeasureUnit stem_to_object::unit(skeleton::StemEnum stem) { // Slicing is okay return NoUnit::permille(); // NOLINT default: - U_ASSERT(false); - return {}; // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -192,8 +190,7 @@ Precision stem_to_object::precision(skeleton::StemEnum stem) { case STEM_PRECISION_CURRENCY_CASH: return Precision::currency(UCURR_USAGE_CASH); default: - U_ASSERT(false); - return Precision::integer(); // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -216,12 +213,11 @@ UNumberFormatRoundingMode stem_to_object::roundingMode(skeleton::StemEnum stem) case STEM_ROUNDING_MODE_UNNECESSARY: return UNUM_ROUND_UNNECESSARY; default: - U_ASSERT(false); - return UNUM_ROUND_UNNECESSARY; + UPRV_UNREACHABLE; } } -UGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) { +UNumberGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) { switch (stem) { case STEM_GROUP_OFF: return UNUM_GROUPING_OFF; @@ -315,11 +311,11 @@ void enum_to_stem_string::roundingMode(UNumberFormatRoundingMode value, UnicodeS sb.append(u"rounding-mode-unnecessary", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } -void enum_to_stem_string::groupingStrategy(UGroupingStrategy value, UnicodeString& sb) { +void enum_to_stem_string::groupingStrategy(UNumberGroupingStrategy value, UnicodeString& sb) { switch (value) { case UNUM_GROUPING_OFF: sb.append(u"group-off", -1); @@ -337,7 +333,7 @@ void enum_to_stem_string::groupingStrategy(UGroupingStrategy value, UnicodeStrin sb.append(u"group-thousands", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } @@ -359,7 +355,7 @@ void enum_to_stem_string::unitWidth(UNumberUnitWidth value, UnicodeString& sb) { sb.append(u"unit-width-hidden", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } @@ -387,7 +383,7 @@ void enum_to_stem_string::signDisplay(UNumberSignDisplay value, UnicodeString& s sb.append(u"sign-accounting-except-zero", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } @@ -401,15 +397,46 @@ enum_to_stem_string::decimalSeparatorDisplay(UNumberDecimalSeparatorDisplay valu sb.append(u"decimal-always", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } -UnlocalizedNumberFormatter skeleton::create(const UnicodeString& skeletonString, UErrorCode& status) { +UnlocalizedNumberFormatter skeleton::create( + const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status) { + + // Initialize perror + if (perror != nullptr) { + perror->line = 0; + perror->offset = -1; + perror->preContext[0] = 0; + perror->postContext[0] = 0; + } + umtx_initOnce(gNumberSkeletonsInitOnce, &initNumberSkeletons, status); - MacroProps macros = parseSkeleton(skeletonString, status); - return NumberFormatter::with().macros(macros); + if (U_FAILURE(status)) { + return {}; + } + + int32_t errOffset; + MacroProps macros = parseSkeleton(skeletonString, errOffset, status); + if (U_SUCCESS(status)) { + return NumberFormatter::with().macros(macros); + } + + if (perror == nullptr) { + return {}; + } + + // Populate the UParseError with the error location + perror->offset = errOffset; + int32_t contextStart = uprv_max(0, errOffset - U_PARSE_CONTEXT_LEN + 1); + int32_t contextEnd = uprv_min(skeletonString.length(), errOffset + U_PARSE_CONTEXT_LEN - 1); + skeletonString.extract(contextStart, errOffset - contextStart, perror->preContext, 0); + perror->preContext[errOffset - contextStart] = 0; + skeletonString.extract(errOffset, contextEnd - errOffset, perror->postContext, 0); + perror->postContext[contextEnd - errOffset] = 0; + return {}; } UnicodeString skeleton::generate(const MacroProps& macros, UErrorCode& status) { @@ -419,8 +446,9 @@ UnicodeString skeleton::generate(const MacroProps& macros, UErrorCode& status) { return sb; } -MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCode& status) { - if (U_FAILURE(status)) { return MacroProps(); } +MacroProps skeleton::parseSkeleton( + const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status) { + U_ASSERT(U_SUCCESS(status)); // Add a trailing whitespace to the end of the skeleton string to make code cleaner. UnicodeString tempSkeletonString(skeletonString); @@ -464,7 +492,10 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo stem = parseOption(stem, segment, macros, status); } segment.resetLength(); - if (U_FAILURE(status)) { return macros; } + if (U_FAILURE(status)) { + errOffset = segment.getOffset(); + return macros; + } // Consume the segment: segment.adjustOffset(offset); @@ -475,6 +506,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo // segment.setLength(U16_LENGTH(cp)); // for error message // throw new SkeletonSyntaxException("Unexpected separator character", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; + errOffset = segment.getOffset(); return macros; } else { @@ -486,6 +518,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo // segment.setLength(U16_LENGTH(cp)); // for error message // throw new SkeletonSyntaxException("Unexpected option separator", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; + errOffset = segment.getOffset(); return macros; } @@ -502,6 +535,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo // segment.setLength(U16_LENGTH(cp)); // for error message // throw new SkeletonSyntaxException("Stem requires an option", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; + errOffset = segment.getOffset(); return macros; default: break; @@ -665,8 +699,7 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se return STATE_SCALE; default: - U_ASSERT(false); - return STATE_NULL; // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -1389,7 +1422,9 @@ bool GeneratorHelpers::precision(const MacroProps& macros, UnicodeString& sb, UE } else { blueprint_helpers::generateDigitsStem(impl.fMinSig, -1, sb, status); } - } else if (macros.precision.fType == Precision::RND_INCREMENT) { + } else if (macros.precision.fType == Precision::RND_INCREMENT + || macros.precision.fType == Precision::RND_INCREMENT_ONE + || macros.precision.fType == Precision::RND_INCREMENT_FIVE) { const Precision::IncrementSettings& impl = macros.precision.fUnion.increment; sb.append(u"precision-increment/", -1); blueprint_helpers::generateIncrementOption( diff --git a/deps/icu-small/source/i18n/number_skeletons.h b/deps/icu-small/source/i18n/number_skeletons.h index 0161f5f0ba8c1a..bc228bd0d7408e 100644 --- a/deps/icu-small/source/i18n/number_skeletons.h +++ b/deps/icu-small/source/i18n/number_skeletons.h @@ -122,7 +122,8 @@ enum StemEnum { * A number skeleton string, possibly not in its shortest form. * @return An UnlocalizedNumberFormatter with behavior defined by the given skeleton string. */ -UnlocalizedNumberFormatter create(const UnicodeString& skeletonString, UErrorCode& status); +UnlocalizedNumberFormatter create( + const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status); /** * Create a skeleton string corresponding to the given NumberFormatter. @@ -138,7 +139,7 @@ UnicodeString generate(const MacroProps& macros, UErrorCode& status); * * Internal: use the create() endpoint instead of this function. */ -MacroProps parseSkeleton(const UnicodeString& skeletonString, UErrorCode& status); +MacroProps parseSkeleton(const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status); /** * Given that the current segment represents a stem, parse it and save the result. @@ -174,7 +175,7 @@ Precision precision(skeleton::StemEnum stem); UNumberFormatRoundingMode roundingMode(skeleton::StemEnum stem); -UGroupingStrategy groupingStrategy(skeleton::StemEnum stem); +UNumberGroupingStrategy groupingStrategy(skeleton::StemEnum stem); UNumberUnitWidth unitWidth(skeleton::StemEnum stem); @@ -192,7 +193,7 @@ namespace enum_to_stem_string { void roundingMode(UNumberFormatRoundingMode value, UnicodeString& sb); -void groupingStrategy(UGroupingStrategy value, UnicodeString& sb); +void groupingStrategy(UNumberGroupingStrategy value, UnicodeString& sb); void unitWidth(UNumberUnitWidth value, UnicodeString& sb); diff --git a/deps/icu-small/source/i18n/number_stringbuilder.cpp b/deps/icu-small/source/i18n/number_stringbuilder.cpp index 74ba33fbbc159f..03300b33ac5e21 100644 --- a/deps/icu-small/source/i18n/number_stringbuilder.cpp +++ b/deps/icu-small/source/i18n/number_stringbuilder.cpp @@ -6,7 +6,9 @@ #if !UCONFIG_NO_FORMATTING #include "number_stringbuilder.h" +#include "static_unicode_sets.h" #include "unicode/utf16.h" +#include "number_utils.h" using namespace icu; using namespace icu::number; @@ -32,7 +34,15 @@ inline void uprv_memmove2(void* dest, const void* src, size_t len) { } // namespace -NumberStringBuilder::NumberStringBuilder() = default; +NumberStringBuilder::NumberStringBuilder() { +#if U_DEBUG + // Initializing the memory to non-zero helps catch some bugs that involve + // reading from an improperly terminated string. + for (int32_t i=0; i= 0); U_ASSERT(index <= fLength); @@ -427,65 +447,121 @@ bool NumberStringBuilder::nextFieldPosition(FieldPosition& fp, UErrorCode& statu return FALSE; } - auto field = static_cast(rawField); - - bool seenStart = false; - int32_t fractionStart = -1; - int32_t startIndex = fp.getEndIndex(); - for (int i = fZero + startIndex; 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; + ConstrainedFieldPosition cfpos; + cfpos.constrainField(UFIELD_CATEGORY_NUMBER, rawField); + cfpos.setState(UFIELD_CATEGORY_NUMBER, rawField, fp.getBeginIndex(), fp.getEndIndex()); + if (nextPosition(cfpos, 0, status)) { + fp.setBeginIndex(cfpos.getStart()); + fp.setEndIndex(cfpos.getLimit()); + return true; + } + + // Special case: fraction should start after integer if fraction is not present + if (rawField == UNUM_FRACTION_FIELD && fp.getEndIndex() == 0) { + bool inside = false; + int32_t i = fZero; + for (; i < fZero + fLength; i++) { + if (isIntOrGroup(getFieldPtr()[i]) || getFieldPtr()[i] == UNUM_DECIMAL_SEPARATOR_FIELD) { + inside = true; + } else if (inside) { + break; } - fp.setEndIndex(i - fZero); - break; - } else if (!seenStart && field == _field) { - fp.setBeginIndex(i - fZero); - seenStart = true; - } - if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) { - fractionStart = i - fZero + 1; } + fp.setBeginIndex(i - fZero); + fp.setEndIndex(i - fZero); } - // Backwards compatibility: FRACTION needs to start after INTEGER if empty. - // Do not return that a field was found, though, since there is not actually a fraction part. - if (field == UNUM_FRACTION_FIELD && !seenStart && fractionStart != -1) { - fp.setBeginIndex(fractionStart); - fp.setEndIndex(fractionStart); - } - - return seenStart; + return false; } void NumberStringBuilder::getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const { - 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. - fpih.addAttribute(UNUM_GROUPING_SEPARATOR_FIELD, i, i + 1); - } else if (current != field) { - if (current != UNUM_FIELD_COUNT) { - fpih.addAttribute(current, currentStart, i); + ConstrainedFieldPosition cfpos; + while (nextPosition(cfpos, 0, status)) { + fpih.addAttribute(cfpos.getField(), cfpos.getStart(), cfpos.getLimit()); + } +} + +// Signal the end of the string using a field that doesn't exist and that is +// different from UNUM_FIELD_COUNT, which is used for "null number field". +static constexpr Field kEndField = 0xff; + +bool NumberStringBuilder::nextPosition(ConstrainedFieldPosition& cfpos, Field numericField, UErrorCode& /*status*/) const { + auto numericCAF = NumFieldUtils::expand(numericField); + int32_t fieldStart = -1; + Field currField = UNUM_FIELD_COUNT; + for (int32_t i = fZero + cfpos.getLimit(); i <= fZero + fLength; i++) { + Field _field = (i < fZero + fLength) ? getFieldPtr()[i] : kEndField; + // Case 1: currently scanning a field. + if (currField != UNUM_FIELD_COUNT) { + if (currField != _field) { + int32_t end = i - fZero; + // Grouping separators can be whitespace; don't throw them out! + if (currField != UNUM_GROUPING_SEPARATOR_FIELD) { + end = trimBack(i - fZero); + } + if (end <= fieldStart) { + // Entire field position is ignorable; skip. + fieldStart = -1; + currField = UNUM_FIELD_COUNT; + i--; // look at this index again + continue; + } + int32_t start = fieldStart; + if (currField != UNUM_GROUPING_SEPARATOR_FIELD) { + start = trimFront(start); + } + auto caf = NumFieldUtils::expand(currField); + cfpos.setState(caf.category, caf.field, start, end); + return true; } - current = field; - currentStart = i; + continue; } - if (U_FAILURE(status)) { - return; + // Special case: coalesce the INTEGER if we are pointing at the end of the INTEGER. + if (cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD) + && i > fZero + // don't return the same field twice in a row: + && i - fZero > cfpos.getLimit() + && isIntOrGroup(getFieldPtr()[i - 1]) + && !isIntOrGroup(_field)) { + int j = i - 1; + for (; j >= fZero && isIntOrGroup(getFieldPtr()[j]); j--) {} + cfpos.setState(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, j - fZero + 1, i - fZero); + return true; + } + // Special case: coalesce NUMERIC if we are pointing at the end of the NUMERIC. + if (numericField != 0 + && cfpos.matchesField(numericCAF.category, numericCAF.field) + && i > fZero + // don't return the same field twice in a row: + && (i - fZero > cfpos.getLimit() + || cfpos.getCategory() != numericCAF.category + || cfpos.getField() != numericCAF.field) + && isNumericField(getFieldPtr()[i - 1]) + && !isNumericField(_field)) { + int j = i - 1; + for (; j >= fZero && isNumericField(getFieldPtr()[j]); j--) {} + cfpos.setState(numericCAF.category, numericCAF.field, j - fZero + 1, i - fZero); + return true; + } + // Special case: skip over INTEGER; will be coalesced later. + if (_field == UNUM_INTEGER_FIELD) { + _field = UNUM_FIELD_COUNT; + } + // Case 2: no field starting at this position. + if (_field == UNUM_FIELD_COUNT || _field == kEndField) { + continue; + } + // Case 3: check for field starting at this position + auto caf = NumFieldUtils::expand(_field); + if (cfpos.matchesField(caf.category, caf.field)) { + fieldStart = i - fZero; + currField = _field; } } - if (current != UNUM_FIELD_COUNT) { - fpih.addAttribute(current, currentStart, fLength); - } + + U_ASSERT(currField == UNUM_FIELD_COUNT); + return false; } bool NumberStringBuilder::containsField(Field field) const { @@ -497,4 +573,27 @@ bool NumberStringBuilder::containsField(Field field) const { return false; } +bool NumberStringBuilder::isIntOrGroup(Field field) { + return field == UNUM_INTEGER_FIELD + || field == UNUM_GROUPING_SEPARATOR_FIELD; +} + +bool NumberStringBuilder::isNumericField(Field field) { + return NumFieldUtils::isNumericField(field); +} + +int32_t NumberStringBuilder::trimBack(int32_t limit) const { + return unisets::get(unisets::DEFAULT_IGNORABLES)->spanBack( + getCharPtr() + fZero, + limit, + USET_SPAN_CONTAINED); +} + +int32_t NumberStringBuilder::trimFront(int32_t start) const { + return start + unisets::get(unisets::DEFAULT_IGNORABLES)->span( + getCharPtr() + fZero + start, + fLength - start, + USET_SPAN_CONTAINED); +} + #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 index b14ad9ede2f90f..d48f6e106cf87e 100644 --- a/deps/icu-small/source/i18n/number_stringbuilder.h +++ b/deps/icu-small/source/i18n/number_stringbuilder.h @@ -85,6 +85,8 @@ class U_I18N_API NumberStringBuilder : public UMemory { int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status); + void writeTerminator(UErrorCode& status); + /** * Gets a "safe" UnicodeString that can be used even after the NumberStringBuilder is destructed. * */ @@ -106,6 +108,8 @@ class U_I18N_API NumberStringBuilder : public UMemory { void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const; + bool nextPosition(ConstrainedFieldPosition& cfpos, Field numericField, UErrorCode& status) const; + bool containsField(Field field) const; private: @@ -140,6 +144,14 @@ class U_I18N_API NumberStringBuilder : public UMemory { int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status); int32_t remove(int32_t index, int32_t count); + + static bool isIntOrGroup(Field field); + + static bool isNumericField(Field field); + + int32_t trimBack(int32_t limit) const; + + int32_t trimFront(int32_t start) const; }; } // namespace impl diff --git a/deps/icu-small/source/i18n/number_types.h b/deps/icu-small/source/i18n/number_types.h index 00a6818869fdc2..225d1e57750490 100644 --- a/deps/icu-small/source/i18n/number_types.h +++ b/deps/icu-small/source/i18n/number_types.h @@ -23,7 +23,11 @@ namespace impl { // Typedef several enums for brevity and for easier comparison to Java. -typedef UNumberFormatFields Field; +// Convention: bottom 4 bits for field, top 4 bits for field category. +// Field category 0 implies the number category so that the number field +// literals can be directly passed as a Field type. +// See the helper functions in "NumFieldUtils" in number_utils.h +typedef uint8_t Field; typedef UNumberFormatRoundingMode RoundingMode; @@ -346,6 +350,7 @@ class U_I18N_API NullableValue { T fValue; }; + } // namespace impl } // namespace number U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_utils.cpp b/deps/icu-small/source/i18n/number_utils.cpp index c79d2de9fa3f55..0983b7b0726ec2 100644 --- a/deps/icu-small/source/i18n/number_utils.cpp +++ b/deps/icu-small/source/i18n/number_utils.cpp @@ -70,7 +70,7 @@ const char16_t* utils::getPatternForStyle(const Locale& locale, const char* nsNa break; default: patternKey = "decimalFormat"; // silence compiler error - U_ASSERT(false); + UPRV_UNREACHABLE; } LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status)); if (U_FAILURE(status)) { return u""; } @@ -237,7 +237,9 @@ void DecNum::multiplyBy(const DecNum& rhs, UErrorCode& status) { void DecNum::divideBy(const DecNum& rhs, UErrorCode& status) { uprv_decNumberDivide(fData, fData, rhs.fData, &fContext); - if (fContext.status != 0) { + if ((fContext.status & DEC_Inexact) != 0) { + // Ignore. + } else if (fContext.status != 0) { status = U_INTERNAL_PROGRAM_ERROR; } } diff --git a/deps/icu-small/source/i18n/number_utils.h b/deps/icu-small/source/i18n/number_utils.h index c367166009c0dc..203dec6d83b92b 100644 --- a/deps/icu-small/source/i18n/number_utils.h +++ b/deps/icu-small/source/i18n/number_utils.h @@ -32,6 +32,48 @@ enum CldrPatternStyle { CLDR_PATTERN_STYLE_COUNT, }; + +/** + * Helper functions for dealing with the Field typedef, which stores fields + * in a compressed format. + */ +class NumFieldUtils { +public: + struct CategoryFieldPair { + int32_t category; + int32_t field; + }; + + /** Compile-time function to construct a Field from a category and a field */ + template + static constexpr Field compress() { + static_assert(category != 0, "cannot use Undefined category in NumFieldUtils"); + static_assert(category <= 0xf, "only 4 bits for category"); + static_assert(field <= 0xf, "only 4 bits for field"); + return static_cast((category << 4) | field); + } + + /** Runtime inline function to unpack the category and field from the Field */ + static inline CategoryFieldPair expand(Field field) { + if (field == UNUM_FIELD_COUNT) { + return {UFIELD_CATEGORY_UNDEFINED, 0}; + } + CategoryFieldPair ret = { + (field >> 4), + (field & 0xf) + }; + if (ret.category == 0) { + ret.category = UFIELD_CATEGORY_NUMBER; + } + return ret; + } + + static inline bool isNumericField(Field field) { + int8_t category = field >> 4; + return category == 0 || category == UFIELD_CATEGORY_NUMBER; + } +}; + // Namespace for naked functions namespace utils { @@ -82,6 +124,23 @@ inline StandardPlural::Form getStandardPlural(const PluralRules *rules, } } +/** + * Computes the plural form after copying the number and applying rounding rules. + */ +inline StandardPlural::Form getPluralSafe( + const RoundingImpl& rounder, + const PluralRules* rules, + const DecimalQuantity& dq, + UErrorCode& status) { + // TODO(ICU-20500): Avoid the copy? + DecimalQuantity copy(dq); + rounder.apply(copy, status); + if (U_FAILURE(status)) { + return StandardPlural::Form::OTHER; + } + return getStandardPlural(rules, copy); +} + } // namespace utils } // namespace impl diff --git a/deps/icu-small/source/i18n/number_utypes.h b/deps/icu-small/source/i18n/number_utypes.h index 48bfce1969754a..88b493cbc254c9 100644 --- a/deps/icu-small/source/i18n/number_utypes.h +++ b/deps/icu-small/source/i18n/number_utypes.h @@ -11,63 +11,32 @@ #include "number_types.h" #include "number_decimalquantity.h" #include "number_stringbuilder.h" +#include "formattedval_impl.h" U_NAMESPACE_BEGIN namespace number { namespace impl { -/** - * Implementation class for UNumberFormatter with a magic number for safety. - * - * Wraps a LocalizedNumberFormatter by value. - */ -struct UNumberFormatterData : public UMemory { - // The magic number to identify incoming objects. - // Reads in ASCII as "NFR" (NumberFormatteR with room at the end) - static constexpr int32_t kMagic = 0x4E465200; - - // Data members: - int32_t fMagic = kMagic; - LocalizedNumberFormatter fFormatter; - - /** Convert from UNumberFormatter -> UNumberFormatterData. */ - static UNumberFormatterData* validate(UNumberFormatter* input, UErrorCode& status); - - /** Convert from UNumberFormatter -> UNumberFormatterData (const version). */ - static const UNumberFormatterData* validate(const UNumberFormatter* input, UErrorCode& status); - - /** Convert from UNumberFormatterData -> UNumberFormatter. */ - UNumberFormatter* exportForC(); -}; +/** Helper function used in upluralrules.cpp */ +const DecimalQuantity* validateUFormattedNumberToDecimalQuantity( + const UFormattedNumber* uresult, UErrorCode& status); /** - * Implementation class for UFormattedNumber with magic number for safety. + * Struct for data used by FormattedNumber. * - * This struct is also held internally by the C++ version FormattedNumber since the member types are not + * This struct is held internally by the C++ version FormattedNumber since the member types are not * declared in the public header file. * * 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 UFormattedNumberData : public UMemory { - // The magic number to identify incoming objects. - // Reads in ASCII as "FDN" (FormatteDNumber with room at the end) - static constexpr int32_t kMagic = 0x46444E00; +class UFormattedNumberData : public FormattedValueNumberStringBuilderImpl { +public: + UFormattedNumberData() : FormattedValueNumberStringBuilderImpl(0) {} + virtual ~UFormattedNumberData(); - // Data members: - int32_t fMagic = kMagic; DecimalQuantity quantity; - NumberStringBuilder string; - - /** Convert from UFormattedNumber -> UFormattedNumberData. */ - static UFormattedNumberData* validate(UFormattedNumber* input, UErrorCode& status); - - /** Convert from UFormattedNumber -> UFormattedNumberData (const version). */ - static const UFormattedNumberData* validate(const UFormattedNumber* input, UErrorCode& status); - - /** Convert from UFormattedNumberData -> UFormattedNumber. */ - UFormattedNumber* exportForC(); }; diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index ef47e1e01b5ee6..21efd184558778 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -156,7 +156,6 @@ static const icu::number::impl::CldrPatternStyle gFormatCldrStyles[UNUM_FORMAT_S // Static hashtable cache of NumberingSystem objects used by NumberFormat static UHashtable * NumberingSystem_cache = NULL; -static UMutex nscacheMutex = U_MUTEX_INITIALIZER; static icu::UInitOnce gNSCacheInitOnce = U_INITONCE_INITIALIZER; #if !UCONFIG_NO_SERVICE @@ -1363,6 +1362,7 @@ NumberFormat::makeInstance(const Locale& desiredLocale, // TODO: Bad hash key usage, see ticket #8504. int32_t hashKey = desiredLocale.hashCode(); + static icu::UMutex nscacheMutex = U_MUTEX_INITIALIZER; Mutex lock(&nscacheMutex); ns = (NumberingSystem *)uhash_iget(NumberingSystem_cache, hashKey); if (ns == NULL) { diff --git a/deps/icu-small/source/i18n/numparse_affixes.cpp b/deps/icu-small/source/i18n/numparse_affixes.cpp index c30d241693c8bf..12543a641b5946 100644 --- a/deps/icu-small/source/i18n/numparse_affixes.cpp +++ b/deps/icu-small/source/i18n/numparse_affixes.cpp @@ -100,7 +100,7 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, addMatcher(fWarehouse.currency(status)); break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } else if (fIgnorables != nullptr && fIgnorables->getSet()->contains(cp)) { @@ -109,7 +109,12 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, } else { // Case 3: the token is a non-ignorable literal. - addMatcher(fWarehouse.nextCodePointMatcher(cp)); + if (auto* ptr = fWarehouse.nextCodePointMatcher(cp, status)) { + addMatcher(*ptr); + } else { + // OOM; unwind the stack + return; + } } fLastTypeOrCp = type != TYPE_CODEPOINT ? type : cp; } @@ -125,51 +130,6 @@ AffixPatternMatcher AffixPatternMatcherBuilder::build() { return AffixPatternMatcher(fMatchers, fMatchersLen, fPattern); } - -CodePointMatcherWarehouse::CodePointMatcherWarehouse() - : codePointCount(0), codePointNumBatches(0) {} - -CodePointMatcherWarehouse::~CodePointMatcherWarehouse() { - // Delete the variable number of batches of code point matchers - for (int32_t i = 0; i < codePointNumBatches; i++) { - delete[] codePointsOverflow[i]; - } -} - -CodePointMatcherWarehouse::CodePointMatcherWarehouse(CodePointMatcherWarehouse&& src) U_NOEXCEPT - : codePoints(std::move(src.codePoints)), - codePointsOverflow(std::move(src.codePointsOverflow)), - codePointCount(src.codePointCount), - codePointNumBatches(src.codePointNumBatches) {} - -CodePointMatcherWarehouse& -CodePointMatcherWarehouse::operator=(CodePointMatcherWarehouse&& src) U_NOEXCEPT { - codePoints = std::move(src.codePoints); - codePointsOverflow = std::move(src.codePointsOverflow); - codePointCount = src.codePointCount; - codePointNumBatches = src.codePointNumBatches; - return *this; -} - -NumberParseMatcher& CodePointMatcherWarehouse::nextCodePointMatcher(UChar32 cp) { - if (codePointCount < CODE_POINT_STACK_CAPACITY) { - return codePoints[codePointCount++] = {cp}; - } - int32_t totalCapacity = CODE_POINT_STACK_CAPACITY + codePointNumBatches * CODE_POINT_BATCH_SIZE; - if (codePointCount >= totalCapacity) { - // Need a new batch - auto* nextBatch = new CodePointMatcher[CODE_POINT_BATCH_SIZE]; - if (codePointNumBatches >= codePointsOverflow.getCapacity()) { - // Need more room for storing pointers to batches - codePointsOverflow.resize(codePointNumBatches * 2, codePointNumBatches); - } - codePointsOverflow[codePointNumBatches++] = nextBatch; - } - return codePointsOverflow[codePointNumBatches - 1][(codePointCount++ - CODE_POINT_STACK_CAPACITY) % - CODE_POINT_BATCH_SIZE] = {cp}; -} - - AffixTokenMatcherWarehouse::AffixTokenMatcherWarehouse(const AffixTokenMatcherSetupData* setupData) : fSetupData(setupData) {} @@ -197,8 +157,15 @@ IgnorablesMatcher& AffixTokenMatcherWarehouse::ignorables() { return fSetupData->ignorables; } -NumberParseMatcher& AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp) { - return fCodePoints.nextCodePointMatcher(cp); +NumberParseMatcher* AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + auto* result = fCodePoints.create(cp); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return result; } diff --git a/deps/icu-small/source/i18n/numparse_affixes.h b/deps/icu-small/source/i18n/numparse_affixes.h index be8c4fb56473d1..e498483fbca8cf 100644 --- a/deps/icu-small/source/i18n/numparse_affixes.h +++ b/deps/icu-small/source/i18n/numparse_affixes.h @@ -7,14 +7,14 @@ #ifndef __NUMPARSE_AFFIXES_H__ #define __NUMPARSE_AFFIXES_H__ +#include "cmemory.h" + #include "numparse_types.h" #include "numparse_symbols.h" #include "numparse_currency.h" #include "number_affixutils.h" #include "number_currencysymbols.h" -#include - U_NAMESPACE_BEGIN namespace numparse { namespace impl { @@ -47,50 +47,20 @@ class CodePointMatcher : public NumberParseMatcher, public UMemory { } // namespace impl } // namespace numparse -// Export a explicit template instantiations of MaybeStackArray and CompactUnicodeString. +// Export a explicit template instantiations of MaybeStackArray, MemoryPool and CompactUnicodeString. // When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. // (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.) -// Note: These need to be outside of the impl::numparse namespace, or Clang will generate a compile error. +// Note: These need to be outside of the numparse::impl namespace, or Clang will generate a compile error. #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +template class U_I18N_API MaybeStackArray; template class U_I18N_API MaybeStackArray; -template class U_I18N_API MaybeStackArray; +template class U_I18N_API MemoryPool; template class U_I18N_API numparse::impl::CompactUnicodeString<4>; #endif namespace numparse { namespace impl { -/** - * A warehouse to retain ownership of CodePointMatchers. - */ -// Exported as U_I18N_API for tests -class U_I18N_API CodePointMatcherWarehouse : public UMemory { - private: - static constexpr int32_t CODE_POINT_STACK_CAPACITY = 5; // Number of entries directly on the stack - static constexpr int32_t CODE_POINT_BATCH_SIZE = 10; // Number of entries per heap allocation - - public: - CodePointMatcherWarehouse(); - - // A custom destructor is needed to free the memory from MaybeStackArray. - // A custom move constructor and move assignment seem to be needed because of the custom destructor. - - ~CodePointMatcherWarehouse(); - - CodePointMatcherWarehouse(CodePointMatcherWarehouse&& src) U_NOEXCEPT; - - CodePointMatcherWarehouse& operator=(CodePointMatcherWarehouse&& src) U_NOEXCEPT; - - NumberParseMatcher& nextCodePointMatcher(UChar32 cp); - - private: - std::array codePoints; // By value - MaybeStackArray codePointsOverflow; // On heap in "batches" - int32_t codePointCount; // Total for both the ones by value and on heap - int32_t codePointNumBatches; // Number of batches in codePointsOverflow -}; - - struct AffixTokenMatcherSetupData { const CurrencySymbols& currencySymbols; const DecimalFormatSymbols& dfs; @@ -129,7 +99,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory { IgnorablesMatcher& ignorables(); - NumberParseMatcher& nextCodePointMatcher(UChar32 cp); + NumberParseMatcher* nextCodePointMatcher(UChar32 cp, UErrorCode& status); private: // NOTE: The following field may be unsafe to access after construction is done! @@ -143,7 +113,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory { CombinedCurrencyMatcher fCurrency; // Use a child class for code point matchers, since it requires non-default operators. - CodePointMatcherWarehouse fCodePoints; + MemoryPool fCodePoints; friend class AffixPatternMatcherBuilder; friend class AffixPatternMatcher; diff --git a/deps/icu-small/source/i18n/numparse_impl.cpp b/deps/icu-small/source/i18n/numparse_impl.cpp index 3192a3959389a7..412ea89c86b651 100644 --- a/deps/icu-small/source/i18n/numparse_impl.cpp +++ b/deps/icu-small/source/i18n/numparse_impl.cpp @@ -72,7 +72,7 @@ NumberParserImpl::createSimpleParser(const Locale& locale, const UnicodeString& parser->addMatcher(parser->fLocalMatchers.padding = {u"@"}); parser->addMatcher(parser->fLocalMatchers.scientific = {symbols, grouper}); parser->addMatcher(parser->fLocalMatchers.currency = {currencySymbols, symbols, parseFlags, status}); -// parser.addMatcher(new RequireNumberMatcher()); + parser->addMatcher(parser->fLocalValidators.number = {}); parser->freeze(); return parser.orphan(); @@ -252,9 +252,13 @@ void NumberParserImpl::parse(const UnicodeString& input, int32_t start, bool gre StringSegment segment(input, 0 != (fParseFlags & PARSE_FLAG_IGNORE_CASE)); segment.adjustOffset(start); if (greedy) { - parseGreedyRecursive(segment, result, status); + parseGreedy(segment, result, status); + } else if (0 != (fParseFlags & PARSE_FLAG_ALLOW_INFINITE_RECURSION)) { + // Start at 1 so that recursionLevels never gets to 0 + parseLongestRecursive(segment, result, 1, status); } else { - parseLongestRecursive(segment, result, status); + // Arbitrary recursion safety limit: 100 levels. + parseLongestRecursive(segment, result, -100, status); } for (int32_t i = 0; i < fNumMatchers; i++) { fMatchers[i]->postProcess(result); @@ -262,44 +266,53 @@ void NumberParserImpl::parse(const UnicodeString& input, int32_t start, bool gre result.postProcess(); } -void NumberParserImpl::parseGreedyRecursive(StringSegment& segment, ParsedNumber& result, +void NumberParserImpl::parseGreedy(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const { - // Base Case - if (segment.length() == 0) { - return; - } - - int initialOffset = segment.getOffset(); - for (int32_t i = 0; i < fNumMatchers; i++) { + // Note: this method is not recursive in order to avoid stack overflow. + for (int i = 0; i smokeTest(segment)) { + // Matcher failed smoke test: try the next one + i++; continue; } + int32_t initialOffset = segment.getOffset(); matcher->match(segment, result, status); if (U_FAILURE(status)) { return; } if (segment.getOffset() != initialOffset) { - // In a greedy parse, recurse on only the first match. - parseGreedyRecursive(segment, result, status); - // The following line resets the offset so that the StringSegment says the same across - // the function - // call boundary. Since we recurse only once, this line is not strictly necessary. - segment.setOffset(initialOffset); - return; + // Greedy heuristic: accept the match and loop back + i = 0; + continue; + } else { + // Matcher did not match: try the next one + i++; + continue; } + UPRV_UNREACHABLE; } // NOTE: If we get here, the greedy parse completed without consuming the entire string. } void NumberParserImpl::parseLongestRecursive(StringSegment& segment, ParsedNumber& result, + int32_t recursionLevels, UErrorCode& status) const { // Base Case if (segment.length() == 0) { return; } + // Safety against stack overflow + if (recursionLevels == 0) { + return; + } + // TODO: Give a nice way for the matcher to reset the ParsedNumber? ParsedNumber initial(result); ParsedNumber candidate; @@ -326,7 +339,7 @@ void NumberParserImpl::parseLongestRecursive(StringSegment& segment, ParsedNumbe // If the entire segment was consumed, recurse. if (segment.getOffset() - initialOffset == charsToConsume) { - parseLongestRecursive(segment, candidate, status); + parseLongestRecursive(segment, candidate, recursionLevels + 1, status); if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/i18n/numparse_impl.h b/deps/icu-small/source/i18n/numparse_impl.h index 992114c7edee18..7d5f0b6f0bd07b 100644 --- a/deps/icu-small/source/i18n/numparse_impl.h +++ b/deps/icu-small/source/i18n/numparse_impl.h @@ -95,9 +95,10 @@ class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMem explicit NumberParserImpl(parse_flags_t parseFlags); - void parseGreedyRecursive(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; + void parseGreedy(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; - void parseLongestRecursive(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; + void parseLongestRecursive( + StringSegment& segment, ParsedNumber& result, int32_t recursionLevels, UErrorCode& status) const; }; diff --git a/deps/icu-small/source/i18n/numparse_parsednumber.cpp b/deps/icu-small/source/i18n/numparse_parsednumber.cpp index 98da4e8319227a..3145f718dc26b5 100644 --- a/deps/icu-small/source/i18n/numparse_parsednumber.cpp +++ b/deps/icu-small/source/i18n/numparse_parsednumber.cpp @@ -52,7 +52,7 @@ bool ParsedNumber::seenNumber() const { return !quantity.bogus || 0 != (flags & FLAG_NAN) || 0 != (flags & FLAG_INFINITY); } -double ParsedNumber::getDouble() const { +double ParsedNumber::getDouble(UErrorCode& status) const { bool sawNaN = 0 != (flags & FLAG_NAN); bool sawInfinity = 0 != (flags & FLAG_INFINITY); @@ -69,7 +69,10 @@ double ParsedNumber::getDouble() const { return INFINITY; } } - U_ASSERT(!quantity.bogus); + if (quantity.bogus) { + status = U_INVALID_STATE_ERROR; + return 0.0; + } if (quantity.isZero() && quantity.isNegative()) { return -0.0; } diff --git a/deps/icu-small/source/i18n/numparse_symbols.cpp b/deps/icu-small/source/i18n/numparse_symbols.cpp index 9ccceec8475d01..e0daab9374f8b1 100644 --- a/deps/icu-small/source/i18n/numparse_symbols.cpp +++ b/deps/icu-small/source/i18n/numparse_symbols.cpp @@ -90,7 +90,7 @@ void IgnorablesMatcher::accept(StringSegment&, ParsedNumber&) const { InfinityMatcher::InfinityMatcher(const DecimalFormatSymbols& dfs) - : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_KEY) { + : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_SIGN) { } bool InfinityMatcher::isDisabled(const ParsedNumber& result) const { diff --git a/deps/icu-small/source/i18n/numparse_types.h b/deps/icu-small/source/i18n/numparse_types.h index ab591eaba83af5..f837d8d2795a2b 100644 --- a/deps/icu-small/source/i18n/numparse_types.h +++ b/deps/icu-small/source/i18n/numparse_types.h @@ -49,6 +49,7 @@ enum ParseFlags { // PARSE_FLAG_OPTIMIZE = 0x0800, // no longer used // PARSE_FLAG_FORCE_BIG_DECIMAL = 0x1000, // not used in ICU4C PARSE_FLAG_NO_FOREIGN_CURRENCY = 0x2000, + PARSE_FLAG_ALLOW_INFINITE_RECURSION = 0x4000, }; @@ -63,7 +64,7 @@ class CompactUnicodeString { CompactUnicodeString(const UnicodeString& text) : fBuffer(text.length() + 1) { - memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(UChar) * text.length()); + uprv_memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(UChar) * text.length()); fBuffer[text.length()] = 0; } @@ -160,7 +161,7 @@ class U_I18N_API ParsedNumber { bool seenNumber() const; - double getDouble() const; + double getDouble(UErrorCode& status) const; void populateFormattable(Formattable& output, parse_flags_t parseFlags) const; @@ -266,7 +267,7 @@ class U_I18N_API StringSegment : public UMemory { bool operator==(const UnicodeString& other) const; private: - const UnicodeString fStr; + const UnicodeString& fStr; int32_t fStart; int32_t fEnd; bool fFoldCase; @@ -346,7 +347,7 @@ class U_I18N_API NumberParseMatcher { */ virtual void postProcess(ParsedNumber&) const { // Default implementation: no-op - }; + } // String for debugging virtual UnicodeString toString() const = 0; diff --git a/deps/icu-small/source/i18n/numrange_fluent.cpp b/deps/icu-small/source/i18n/numrange_fluent.cpp index 12b006c8ad5540..b284561cdc2b6f 100644 --- a/deps/icu-small/source/i18n/numrange_fluent.cpp +++ b/deps/icu-small/source/i18n/numrange_fluent.cpp @@ -162,6 +162,16 @@ Derived NumberRangeFormatterSettings::identityFallback(UNumberRangeIden return move; } +template +LocalPointer NumberRangeFormatterSettings::clone() const & { + return LocalPointer(new Derived(*this)); +} + +template +LocalPointer NumberRangeFormatterSettings::clone() && { + return LocalPointer(new Derived(std::move(*this))); +} + // Declare all classes that implement NumberRangeFormatterSettings // See https://stackoverflow.com/a/495056/1407170 template @@ -318,6 +328,10 @@ void LocalizedNumberRangeFormatter::formatImpl( return; } impl->format(results, equalBeforeRounding, status); + if (U_FAILURE(status)) { + return; + } + results.getStringRef().writeTerminator(status); } const impl::NumberRangeFormatterImpl* @@ -361,56 +375,14 @@ LocalizedNumberRangeFormatter::getFormatter(UErrorCode& status) const { } -FormattedNumberRange::FormattedNumberRange(FormattedNumberRange&& src) U_NOEXCEPT - : fResults(src.fResults), fErrorCode(src.fErrorCode) { - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; -} +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumberRange) -FormattedNumberRange& FormattedNumberRange::operator=(FormattedNumberRange&& src) U_NOEXCEPT { - delete fResults; - fResults = src.fResults; - fErrorCode = src.fErrorCode; - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; - return *this; -} - -UnicodeString FormattedNumberRange::toString(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->string.toUnicodeString(); -} - -Appendable& FormattedNumberRange::appendTo(Appendable& appendable, UErrorCode& status) const { - if (U_FAILURE(status)) { - return appendable; - } - if (fResults == nullptr) { - status = fErrorCode; - return appendable; - } - appendable.appendString(fResults->string.chars(), fResults->string.length()); - return appendable; -} +#define UPRV_NOARG UBool FormattedNumberRange::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const { - if (U_FAILURE(status)) { - return FALSE; - } - if (fResults == nullptr) { - status = fErrorCode; - return FALSE; - } + UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool - return fResults->string.nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; + return fData->getStringRef().nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; } void FormattedNumberRange::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const { @@ -420,52 +392,27 @@ void FormattedNumberRange::getAllFieldPositions(FieldPositionIterator& iterator, void FormattedNumberRange::getAllFieldPositionsImpl( FieldPositionIteratorHandler& fpih, UErrorCode& status) const { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - fResults->string.getAllFieldPositions(fpih, status); + UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG) + fData->getStringRef().getAllFieldPositions(fpih, status); } UnicodeString FormattedNumberRange::getFirstDecimal(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->quantity1.toScientificString(); + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) + return fData->quantity1.toScientificString(); } UnicodeString FormattedNumberRange::getSecondDecimal(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->quantity2.toScientificString(); + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) + return fData->quantity2.toScientificString(); } UNumberRangeIdentityResult FormattedNumberRange::getIdentityResult(UErrorCode& status) const { - if (U_FAILURE(status)) { - return UNUM_IDENTITY_RESULT_NOT_EQUAL; - } - if (fResults == nullptr) { - status = fErrorCode; - return UNUM_IDENTITY_RESULT_NOT_EQUAL; - } - return fResults->identityResult; + UPRV_FORMATTED_VALUE_METHOD_GUARD(UNUM_IDENTITY_RESULT_NOT_EQUAL) + return fData->identityResult; } -FormattedNumberRange::~FormattedNumberRange() { - delete fResults; -} + +UFormattedNumberRangeData::~UFormattedNumberRangeData() = default; diff --git a/deps/icu-small/source/i18n/numrange_impl.cpp b/deps/icu-small/source/i18n/numrange_impl.cpp index 21365bfc59bca3..05eb2b84de3d87 100644 --- a/deps/icu-small/source/i18n/numrange_impl.cpp +++ b/deps/icu-small/source/i18n/numrange_impl.cpp @@ -41,12 +41,12 @@ class NumberRangeDataSink : public ResourceSink { if (U_FAILURE(status)) { return; } for (int i = 0; miscTable.getKeyAndValue(i, key, value); i++) { if (uprv_strcmp(key, "range") == 0) { - if (fData.rangePattern.getArgumentLimit() != 0) { + if (hasRangeData()) { continue; // have already seen this pattern } fData.rangePattern = {value.getUnicodeString(status), status}; } else if (uprv_strcmp(key, "approximately") == 0) { - if (fData.approximatelyPattern.getArgumentLimit() != 0) { + if (hasApproxData()) { continue; // have already seen this pattern } fData.approximatelyPattern = {value.getUnicodeString(status), status}; @@ -54,6 +54,27 @@ class NumberRangeDataSink : public ResourceSink { } } + bool hasRangeData() { + return fData.rangePattern.getArgumentLimit() != 0; + } + + bool hasApproxData() { + return fData.approximatelyPattern.getArgumentLimit() != 0; + } + + bool isComplete() { + return hasRangeData() && hasApproxData(); + } + + void fillInDefaults(UErrorCode& status) { + if (!hasRangeData()) { + fData.rangePattern = {u"{0}–{1}", status}; + } + if (!hasApproxData()) { + fData.approximatelyPattern = {u"~{0}", status}; + } + } + private: NumberRangeData& fData; }; @@ -68,19 +89,21 @@ void getNumberRangeData(const char* localeName, const char* nsName, NumberRangeD dataPath.append("NumberElements/", -1, status); dataPath.append(nsName, -1, status); dataPath.append("/miscPatterns", -1, status); - ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, status); if (U_FAILURE(status)) { return; } - // TODO: Is it necessary to manually fall back to latn, or does the data sink take care of that? - - if (data.rangePattern.getArgumentLimit() == 0) { - // No data! - data.rangePattern = {u"{0}–{1}", status}; + UErrorCode localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, localStatus); + if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) { + status = localStatus; + return; } - if (data.approximatelyPattern.getArgumentLimit() == 0) { - // No data! - data.approximatelyPattern = {u"~{0}", status}; + + // Fall back to latn if necessary + if (!sink.isComplete()) { + ures_getAllItemsWithFallback(rb.getAlias(), "NumberElements/latn/miscPatterns", sink, status); } + + sink.fillInDefaults(status); } class PluralRangesDataSink : public ResourceSink { @@ -177,15 +200,14 @@ NumberRangeFormatterImpl::NumberRangeFormatterImpl(const RangeMacroProps& macros fCollapse(macros.collapse), fIdentityFallback(macros.identityFallback) { - // TODO: As of this writing (ICU 63), there is no locale that has different number miscPatterns - // based on numbering system. Therefore, data is loaded only from latn. If this changes, - // this part of the code should be updated to load from the local numbering system. - // The numbering system could come from the one specified in the NumberFormatter passed to - // numberFormatterBoth() or similar. - // See ICU-20144 + const char* nsName = formatterImpl1.getRawMicroProps().nsName; + if (uprv_strcmp(nsName, formatterImpl2.getRawMicroProps().nsName) != 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } NumberRangeData data; - getNumberRangeData(macros.locale.getName(), "latn", data, status); + getNumberRangeData(macros.locale.getName(), nsName, data, status); if (U_FAILURE(status)) { return; } fRangeFormatter = data.rangePattern; fApproximatelyModifier = {data.approximatelyPattern, UNUM_FIELD_COUNT, false}; @@ -269,8 +291,7 @@ void NumberRangeFormatterImpl::format(UFormattedNumberRangeData& data, bool equa break; default: - U_ASSERT(false); - break; + UPRV_UNREACHABLE; } } @@ -280,8 +301,8 @@ void NumberRangeFormatterImpl::formatSingleValue(UFormattedNumberRangeData& data UErrorCode& status) const { if (U_FAILURE(status)) { return; } if (fSameFormatters) { - int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status); - NumberFormatterImpl::writeAffixes(micros1, data.string, 0, length, status); + int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.getStringRef(), 0, status); + NumberFormatterImpl::writeAffixes(micros1, data.getStringRef(), 0, length, status); } else { formatRange(data, micros1, micros2, status); } @@ -293,12 +314,12 @@ void NumberRangeFormatterImpl::formatApproximately (UFormattedNumberRangeData& d UErrorCode& status) const { if (U_FAILURE(status)) { return; } if (fSameFormatters) { - int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status); + int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.getStringRef(), 0, status); // HEURISTIC: Desired modifier order: inner, middle, approximately, outer. - length += micros1.modInner->apply(data.string, 0, length, status); - length += micros1.modMiddle->apply(data.string, 0, length, status); - length += fApproximatelyModifier.apply(data.string, 0, length, status); - micros1.modOuter->apply(data.string, 0, length, status); + length += micros1.modInner->apply(data.getStringRef(), 0, length, status); + length += micros1.modMiddle->apply(data.getStringRef(), 0, length, status); + length += fApproximatelyModifier.apply(data.getStringRef(), 0, length, status); + micros1.modOuter->apply(data.getStringRef(), 0, length, status); } else { formatRange(data, micros1, micros2, status); } @@ -376,7 +397,7 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data, break; } - NumberStringBuilder& string = data.string; + NumberStringBuilder& string = data.getStringRef(); int32_t lengthPrefix = 0; int32_t length1 = 0; int32_t lengthInfix = 0; diff --git a/deps/icu-small/source/i18n/numrange_impl.h b/deps/icu-small/source/i18n/numrange_impl.h index 787fc656860d53..dc25dd4d67bfeb 100644 --- a/deps/icu-small/source/i18n/numrange_impl.h +++ b/deps/icu-small/source/i18n/numrange_impl.h @@ -14,6 +14,7 @@ #include "number_decimalquantity.h" #include "number_formatimpl.h" #include "number_stringbuilder.h" +#include "formattedval_impl.h" U_NAMESPACE_BEGIN namespace number { namespace impl { @@ -24,20 +25,18 @@ namespace impl { * * Has incomplete magic number logic that will need to be finished * if this is to be exposed as C API in the future. + * + * Possible magic number: 0x46445200 + * Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end) */ -struct UFormattedNumberRangeData : public UMemory { - // The magic number to identify incoming objects. - // Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end) - static constexpr int32_t kMagic = 0x46445200; +class UFormattedNumberRangeData : public FormattedValueNumberStringBuilderImpl { +public: + UFormattedNumberRangeData() : FormattedValueNumberStringBuilderImpl(0) {} + virtual ~UFormattedNumberRangeData(); - // Data members: - int32_t fMagic = kMagic; DecimalQuantity quantity1; DecimalQuantity quantity2; - NumberStringBuilder string; UNumberRangeIdentityResult identityResult = UNUM_IDENTITY_RESULT_COUNT; - - // No C conversion methods (no C API yet) }; diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index 514fe05e5ae6de..80056f925b027f 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -26,6 +26,8 @@ #include "unicode/numsys.h" #include "cstring.h" #include "uassert.h" +#include "ucln_in.h" +#include "umutex.h" #include "uresimp.h" #include "numsys_impl.h" @@ -258,83 +260,90 @@ void NumberingSystem::setName(const char *n) { if ( n == nullptr ) { name[0] = (char) 0; } else { - uprv_strncpy(name,n,NUMSYS_NAME_CAPACITY); - name[NUMSYS_NAME_CAPACITY] = '\0'; // Make sure it is null terminated. + uprv_strncpy(name,n,kInternalNumSysNameCapacity); + name[kInternalNumSysNameCapacity] = '\0'; // Make sure it is null terminated. } } UBool NumberingSystem::isAlgorithmic() const { return ( algorithmic ); } -StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { - // TODO(ticket #11908): Init-once static cache, with u_cleanup() callback. - static StringEnumeration* availableNames = nullptr; +namespace { + +UVector* gNumsysNames = nullptr; +UInitOnce gNumSysInitOnce = U_INITONCE_INITIALIZER; + +U_CFUNC UBool U_CALLCONV numSysCleanup() { + delete gNumsysNames; + gNumsysNames = nullptr; + gNumSysInitOnce.reset(); + return true; +} +U_CFUNC void initNumsysNames(UErrorCode &status) { + U_ASSERT(gNumsysNames == nullptr); + ucln_i18n_registerCleanup(UCLN_I18N_NUMSYS, numSysCleanup); + + // TODO: Simple array of UnicodeString objects, based on length of table resource? + LocalPointer numsysNames(new UVector(uprv_deleteUObject, nullptr, status), status); if (U_FAILURE(status)) { - return nullptr; + return; } - if ( availableNames == nullptr ) { - // TODO: Simple array of UnicodeString objects, based on length of table resource? - LocalPointer numsysNames(new UVector(uprv_deleteUObject, nullptr, status), status); - if (U_FAILURE(status)) { - return nullptr; + UErrorCode rbstatus = U_ZERO_ERROR; + UResourceBundle *numberingSystemsInfo = ures_openDirect(nullptr, "numberingSystems", &rbstatus); + numberingSystemsInfo = + ures_getByKey(numberingSystemsInfo, "numberingSystems", numberingSystemsInfo, &rbstatus); + if (U_FAILURE(rbstatus)) { + // Don't stomp on the catastrophic failure of OOM. + if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { + status = rbstatus; + } else { + status = U_MISSING_RESOURCE_ERROR; } + ures_close(numberingSystemsInfo); + return; + } - UErrorCode rbstatus = U_ZERO_ERROR; - UResourceBundle *numberingSystemsInfo = ures_openDirect(nullptr, "numberingSystems", &rbstatus); - numberingSystemsInfo = ures_getByKey(numberingSystemsInfo, "numberingSystems", numberingSystemsInfo, &rbstatus); - if (U_FAILURE(rbstatus)) { - // Don't stomp on the catastrophic failure of OOM. - if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { - status = rbstatus; - } else { - status = U_MISSING_RESOURCE_ERROR; - } - ures_close(numberingSystemsInfo); - return nullptr; + while ( ures_hasNext(numberingSystemsInfo) && U_SUCCESS(status) ) { + LocalUResourceBundlePointer nsCurrent(ures_getNextResource(numberingSystemsInfo, nullptr, &rbstatus)); + if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { + status = rbstatus; // we want to report OOM failure back to the caller. + break; } - - while ( ures_hasNext(numberingSystemsInfo) && U_SUCCESS(status) ) { - LocalUResourceBundlePointer nsCurrent(ures_getNextResource(numberingSystemsInfo, nullptr, &rbstatus)); - if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { - status = rbstatus; // we want to report OOM failure back to the caller. - break; - } - const char *nsName = ures_getKey(nsCurrent.getAlias()); - LocalPointer newElem(new UnicodeString(nsName, -1, US_INV), status); + const char *nsName = ures_getKey(nsCurrent.getAlias()); + LocalPointer newElem(new UnicodeString(nsName, -1, US_INV), status); + if (U_SUCCESS(status)) { + numsysNames->addElement(newElem.getAlias(), status); if (U_SUCCESS(status)) { - numsysNames->addElement(newElem.getAlias(), status); - if (U_SUCCESS(status)) { - newElem.orphan(); // on success, the numsysNames vector owns newElem. - } + newElem.orphan(); // on success, the numsysNames vector owns newElem. } } + } - ures_close(numberingSystemsInfo); - if (U_FAILURE(status)) { - return nullptr; - } - availableNames = new NumsysNameEnumeration(numsysNames.getAlias(), status); - if (availableNames == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - numsysNames.orphan(); // The names got adopted. + ures_close(numberingSystemsInfo); + if (U_SUCCESS(status)) { + gNumsysNames = numsysNames.orphan(); } + return; +} - return availableNames; +} // end anonymous namespace + +StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { + umtx_initOnce(gNumSysInitOnce, &initNumsysNames, status); + LocalPointer result(new NumsysNameEnumeration(status), status); + return result.orphan(); } -NumsysNameEnumeration::NumsysNameEnumeration(UVector *numsysNames, UErrorCode& /*status*/) { - pos=0; - fNumsysNames = numsysNames; +NumsysNameEnumeration::NumsysNameEnumeration(UErrorCode& status) : pos(0) { + (void)status; } const UnicodeString* NumsysNameEnumeration::snext(UErrorCode& status) { - if (U_SUCCESS(status) && (fNumsysNames != nullptr) && (pos < fNumsysNames->size())) { - return (const UnicodeString*)fNumsysNames->elementAt(pos++); + if (U_SUCCESS(status) && (gNumsysNames != nullptr) && (pos < gNumsysNames->size())) { + return (const UnicodeString*)gNumsysNames->elementAt(pos++); } return nullptr; } @@ -346,11 +355,10 @@ NumsysNameEnumeration::reset(UErrorCode& /*status*/) { int32_t NumsysNameEnumeration::count(UErrorCode& /*status*/) const { - return (fNumsysNames==nullptr) ? 0 : fNumsysNames->size(); + return (gNumsysNames==nullptr) ? 0 : gNumsysNames->size(); } NumsysNameEnumeration::~NumsysNameEnumeration() { - delete fNumsysNames; } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/numsys_impl.h b/deps/icu-small/source/i18n/numsys_impl.h index 733e102365369d..c0690b47d78802 100644 --- a/deps/icu-small/source/i18n/numsys_impl.h +++ b/deps/icu-small/source/i18n/numsys_impl.h @@ -26,18 +26,16 @@ U_NAMESPACE_BEGIN class NumsysNameEnumeration : public StringEnumeration { public: - // NumsysNameEnumeration instance adopts numsysNames - NumsysNameEnumeration(UVector *numsysNames, UErrorCode& status); + NumsysNameEnumeration(UErrorCode& status); virtual ~NumsysNameEnumeration(); static UClassID U_EXPORT2 getStaticClassID(void); - virtual UClassID getDynamicClassID(void) const; - virtual const UnicodeString* snext(UErrorCode& status); - virtual void reset(UErrorCode& status); - virtual int32_t count(UErrorCode& status) const; + virtual UClassID getDynamicClassID(void) const override; + virtual const UnicodeString* snext(UErrorCode& status) override; + virtual void reset(UErrorCode& status) override; + virtual int32_t count(UErrorCode& status) const override; private: int32_t pos; - UVector *fNumsysNames = nullptr; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp index c3500574662585..95fc56bcd71b54 100644 --- a/deps/icu-small/source/i18n/olsontz.cpp +++ b/deps/icu-small/source/i18n/olsontz.cpp @@ -25,7 +25,7 @@ #include "uassert.h" #include "uvector.h" #include // DBL_MAX -#include "uresimp.h" // struct UResourceBundle +#include "uresimp.h" #include "zonemeta.h" #include "umutex.h" @@ -134,12 +134,11 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // setID(ures_getKey((UResourceBundle*) res)); // cast away const int32_t len; - UResourceBundle r; - ures_initStackObject(&r); + StackUResourceBundle r; // Pre-32bit second transitions - ures_getByKey(res, kTRANSPRE32, &r, &ec); - transitionTimesPre32 = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTRANSPRE32, r.getAlias(), &ec); + transitionTimesPre32 = ures_getIntVector(r.getAlias(), &len, &ec); transitionCountPre32 = static_cast(len >> 1); if (ec == U_MISSING_RESOURCE_ERROR) { // No pre-32bit transitions @@ -151,8 +150,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, } // 32bit second transitions - ures_getByKey(res, kTRANS, &r, &ec); - transitionTimes32 = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTRANS, r.getAlias(), &ec); + transitionTimes32 = ures_getIntVector(r.getAlias(), &len, &ec); transitionCount32 = static_cast(len); if (ec == U_MISSING_RESOURCE_ERROR) { // No 32bit transitions @@ -164,8 +163,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, } // Post-32bit second transitions - ures_getByKey(res, kTRANSPOST32, &r, &ec); - transitionTimesPost32 = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTRANSPOST32, r.getAlias(), &ec); + transitionTimesPost32 = ures_getIntVector(r.getAlias(), &len, &ec); transitionCountPost32 = static_cast(len >> 1); if (ec == U_MISSING_RESOURCE_ERROR) { // No pre-32bit transitions @@ -177,8 +176,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, } // Type offsets list must be of even size, with size >= 2 - ures_getByKey(res, kTYPEOFFSETS, &r, &ec); - typeOffsets = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTYPEOFFSETS, r.getAlias(), &ec); + typeOffsets = ures_getIntVector(r.getAlias(), &len, &ec); if (U_SUCCESS(ec) && (len < 2 || len > 0x7FFE || (len & 1) != 0)) { ec = U_INVALID_FORMAT_ERROR; } @@ -187,8 +186,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // Type map data must be of the same size as the transition count typeMapData = NULL; if (transitionCount() > 0) { - ures_getByKey(res, kTYPEMAP, &r, &ec); - typeMapData = ures_getBinary(&r, &len, &ec); + ures_getByKey(res, kTYPEMAP, r.getAlias(), &ec); + typeMapData = ures_getBinary(r.getAlias(), &len, &ec); if (ec == U_MISSING_RESOURCE_ERROR) { // no type mapping data ec = U_INVALID_FORMAT_ERROR; @@ -199,10 +198,10 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // Process final rule and data, if any const UChar *ruleIdUStr = ures_getStringByKey(res, kFINALRULE, &len, &ec); - ures_getByKey(res, kFINALRAW, &r, &ec); - int32_t ruleRaw = ures_getInt(&r, &ec); - ures_getByKey(res, kFINALYEAR, &r, &ec); - int32_t ruleYear = ures_getInt(&r, &ec); + ures_getByKey(res, kFINALRAW, r.getAlias(), &ec); + int32_t ruleRaw = ures_getInt(r.getAlias(), &ec); + ures_getByKey(res, kFINALYEAR, r.getAlias(), &ec); + int32_t ruleYear = ures_getInt(r.getAlias(), &ec); if (U_SUCCESS(ec)) { UnicodeString ruleID(TRUE, ruleIdUStr, len); UResourceBundle *rule = TimeZone::loadRule(top, ruleID, NULL, ec); @@ -251,7 +250,6 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // No final zone ec = U_ZERO_ERROR; } - ures_close(&r); // initialize canonical ID canonicalID = ZoneMeta::getCanonicalCLDRID(tzid, ec); diff --git a/deps/icu-small/source/i18n/plurfmt.cpp b/deps/icu-small/source/i18n/plurfmt.cpp index 2775766d32df80..678d91b9c824bc 100644 --- a/deps/icu-small/source/i18n/plurfmt.cpp +++ b/deps/icu-small/source/i18n/plurfmt.cpp @@ -278,7 +278,7 @@ PluralFormat::format(const Formattable& numberObject, double number, auto *decFmt = dynamic_cast(numberFormat); if(decFmt != nullptr) { decFmt->toNumberFormatter().formatImpl(&data, status); // mutates &data - numberString = data.string.toUnicodeString(); + numberString = data.getStringRef().toUnicodeString(); } else { if (offset == 0) { numberFormat->format(numberObject, numberString, status); diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 3caa48a57bb700..aa950a51f0f0c6 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -35,6 +35,7 @@ #include "sharedpluralrules.h" #include "unifiedcache.h" #include "number_decimalquantity.h" +#include "util.h" #if !UCONFIG_NO_FORMATTING @@ -264,6 +265,16 @@ PluralRules::select(double number) const { return select(FixedDecimal(number)); } +UnicodeString +PluralRules::select(const number::FormattedNumber& number, UErrorCode& status) const { + DecimalQuantity dq; + number.getDecimalQuantity(dq, status); + if (U_FAILURE(status)) { + return ICU_Utility::makeBogusString(); + } + return select(dq); +} + UnicodeString PluralRules::select(const IFixedDecimal &number) const { if (mRules == nullptr) { @@ -692,14 +703,14 @@ PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorC return emptyStr; } int32_t resLen=0; - const char *curLocaleName=locale.getName(); + const char *curLocaleName=locale.getBaseName(); const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode); if (s == nullptr) { // Check parent locales. UErrorCode status = U_ZERO_ERROR; char parentLocaleName[ULOC_FULLNAME_CAPACITY]; - const char *curLocaleName2=locale.getName(); + const char *curLocaleName2=locale.getBaseName(); uprv_strcpy(parentLocaleName, curLocaleName2); while (uloc_getParent(parentLocaleName, parentLocaleName, @@ -1471,8 +1482,7 @@ PluralOperand tokenTypeToPluralOperand(tokenType tt) { case tVariableT: return PLURAL_OPERAND_T; default: - U_ASSERT(FALSE); // unexpected. - return PLURAL_OPERAND_N; + UPRV_UNREACHABLE; // unexpected. } } @@ -1684,8 +1694,7 @@ double FixedDecimal::getPluralOperand(PluralOperand operand) const { case PLURAL_OPERAND_T: return static_cast(decimalDigitsWithoutTrailingZeros); case PLURAL_OPERAND_V: return visibleDecimalDigitCount; default: - U_ASSERT(FALSE); // unexpected. - return source; + UPRV_UNREACHABLE; // unexpected. } } diff --git a/deps/icu-small/source/i18n/quantityformatter.cpp b/deps/icu-small/source/i18n/quantityformatter.cpp index ba06ba06b97013..9182f9e7d379a8 100644 --- a/deps/icu-small/source/i18n/quantityformatter.cpp +++ b/deps/icu-small/source/i18n/quantityformatter.cpp @@ -25,6 +25,8 @@ #include "standardplural.h" #include "uassert.h" #include "number_decimalquantity.h" +#include "number_utypes.h" +#include "number_stringbuilder.h" U_NAMESPACE_BEGIN @@ -174,6 +176,39 @@ StandardPlural::Form QuantityFormatter::selectPlural( return StandardPlural::orOtherFromString(pluralKeyword); } +void QuantityFormatter::formatAndSelect( + double quantity, + const NumberFormat& fmt, + const PluralRules& rules, + number::impl::NumberStringBuilder& output, + StandardPlural::Form& pluralForm, + UErrorCode& status) { + UnicodeString pluralKeyword; + const DecimalFormat* df = dynamic_cast(&fmt); + if (df != nullptr) { + number::impl::UFormattedNumberData fn; + fn.quantity.setToDouble(quantity); + df->toNumberFormatter().formatImpl(&fn, status); + if (U_FAILURE(status)) { + return; + } + output = std::move(fn.getStringRef()); + pluralKeyword = rules.select(fn.quantity); + } else { + UnicodeString result; + fmt.format(quantity, result, status); + if (U_FAILURE(status)) { + return; + } + output.append(result, UNUM_FIELD_COUNT, status); + if (U_FAILURE(status)) { + return; + } + pluralKeyword = rules.select(quantity); + } + pluralForm = StandardPlural::orOtherFromString(pluralKeyword); +} + UnicodeString &QuantityFormatter::format( const SimpleFormatter &pattern, const UnicodeString &value, diff --git a/deps/icu-small/source/i18n/quantityformatter.h b/deps/icu-small/source/i18n/quantityformatter.h index 6698b7a8a028fd..3e3f29de57323d 100644 --- a/deps/icu-small/source/i18n/quantityformatter.h +++ b/deps/icu-small/source/i18n/quantityformatter.h @@ -27,6 +27,12 @@ class NumberFormat; class Formattable; class FieldPosition; +namespace number { +namespace impl { +class NumberStringBuilder; +} +} + /** * A plural aware formatter that is good for expressing a single quantity and * a unit. @@ -111,6 +117,7 @@ class U_I18N_API QuantityFormatter : public UMemory { /** * Selects the standard plural form for the number/formatter/rules. + * TODO(13591): Remove this method. */ static StandardPlural::Form selectPlural( const Formattable &number, @@ -120,8 +127,30 @@ class U_I18N_API QuantityFormatter : public UMemory { FieldPosition &pos, UErrorCode &status); + /** + * Formats a quantity and selects its plural form. The output is appended + * to a NumberStringBuilder in order to retain field information. + * + * @param quantity The number to format. + * @param fmt The formatter to use to format the number. + * @param rules The rules to use to select the plural form of the + * formatted number. + * @param output Where to append the result of the format operation. + * @param pluralForm Output variable populated with the plural form of the + * formatted number. + * @param status Set if an error occurs. + */ + static void formatAndSelect( + double quantity, + const NumberFormat& fmt, + const PluralRules& rules, + number::impl::NumberStringBuilder& output, + StandardPlural::Form& pluralForm, + UErrorCode& status); + /** * Formats the pattern with the value and adjusts the FieldPosition. + * TODO: Remove? */ static UnicodeString &format( const SimpleFormatter &pattern, diff --git a/deps/icu-small/source/i18n/rbt.cpp b/deps/icu-small/source/i18n/rbt.cpp index 0444729b252412..8ba6a60ff42218 100644 --- a/deps/icu-small/source/i18n/rbt.cpp +++ b/deps/icu-small/source/i18n/rbt.cpp @@ -27,7 +27,6 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedTransliterator) -static UMutex transliteratorDataMutex = U_MUTEX_INITIALIZER; static Replaceable *gLockedText = NULL; void RuleBasedTransliterator::_construct(const UnicodeString& rules, @@ -253,6 +252,8 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& // Shared RBT data protected by transliteratorDataMutex. // // TODO(andy): Need a better scheme for handling this. + + static UMutex transliteratorDataMutex = U_MUTEX_INITIALIZER; UBool needToLock; { Mutex m; diff --git a/deps/icu-small/source/i18n/rbtz.cpp b/deps/icu-small/source/i18n/rbtz.cpp index 951073abc51ddf..b8dca395fc0403 100644 --- a/deps/icu-small/source/i18n/rbtz.cpp +++ b/deps/icu-small/source/i18n/rbtz.cpp @@ -146,10 +146,10 @@ RuleBasedTimeZone::addTransitionRule(TimeZoneRule* rule, UErrorCode& status) { fUpToDate = FALSE; } -static UMutex gLock = U_MUTEX_INITIALIZER; void RuleBasedTimeZone::completeConst(UErrorCode& status) const { + static UMutex gLock = U_MUTEX_INITIALIZER; if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/i18n/regexcmp.cpp b/deps/icu-small/source/i18n/regexcmp.cpp index 0c5fca6f67b3f9..8d60986fd32ca6 100644 --- a/deps/icu-small/source/i18n/regexcmp.cpp +++ b/deps/icu-small/source/i18n/regexcmp.cpp @@ -1465,7 +1465,7 @@ UBool RegexCompile::doParseActions(int32_t action) case 0x78: /* 'x' */ bit = UREGEX_COMMENTS; break; case 0x2d: /* '-' */ fSetModeFlag = FALSE; break; default: - U_ASSERT(FALSE); // Should never happen. Other chars are filtered out + UPRV_UNREACHABLE; // Should never happen. Other chars are filtered out // by the scanner. } if (fSetModeFlag) { @@ -1840,9 +1840,7 @@ UBool RegexCompile::doParseActions(int32_t action) } default: - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - break; + UPRV_UNREACHABLE; } if (U_FAILURE(*fStatus)) { @@ -1949,25 +1947,17 @@ int32_t RegexCompile::buildOp(int32_t type, int32_t val) { return 0; } if (type < 0 || type > 255) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - type = URX_RESERVED_OP; + UPRV_UNREACHABLE; } if (val > 0x00ffffff) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - val = 0; + UPRV_UNREACHABLE; } if (val < 0) { if (!(type == URX_RESERVED_OP_N || type == URX_RESERVED_OP)) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - return -1; + UPRV_UNREACHABLE; } if (URX_TYPE(val) != 0xff) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - return -1; + UPRV_UNREACHABLE; } type = URX_RESERVED_OP_N; } @@ -2295,6 +2285,13 @@ void RegexCompile::handleCloseParen() { error(U_REGEX_LOOK_BEHIND_LIMIT); break; } + if (minML == INT32_MAX && maxML == 0) { + // This condition happens when no match is possible, such as with a + // [set] expression containing no elements. + // In principle, the generated code to evaluate the expression could be deleted, + // but it's probably not worth the complication. + minML = 0; + } U_ASSERT(minML <= maxML); // Insert the min and max match len bounds into the URX_LB_CONT op that @@ -2331,6 +2328,14 @@ void RegexCompile::handleCloseParen() { error(U_REGEX_LOOK_BEHIND_LIMIT); break; } + if (minML == INT32_MAX && maxML == 0) { + // This condition happens when no match is possible, such as with a + // [set] expression containing no elements. + // In principle, the generated code to evaluate the expression could be deleted, + // but it's probably not worth the complication. + minML = 0; + } + U_ASSERT(minML <= maxML); // Insert the min and max match len bounds into the URX_LB_CONT op that @@ -2348,7 +2353,7 @@ void RegexCompile::handleCloseParen() { default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } // remember the next location in the compiled pattern. @@ -2608,8 +2613,7 @@ void RegexCompile::findCaseInsensitiveStarters(UChar32 c, UnicodeSet *starterCh if (c < UCHAR_MIN_VALUE || c > UCHAR_MAX_VALUE) { // This function should never be called with an invalid input character. - U_ASSERT(FALSE); - starterChars->clear(); + UPRV_UNREACHABLE; } else if (u_hasBinaryProperty(c, UCHAR_CASE_SENSITIVE)) { UChar32 caseFoldedC = u_foldCase(c, U_FOLD_CASE_DEFAULT); starterChars->set(caseFoldedC, caseFoldedC); @@ -3103,13 +3107,10 @@ void RegexCompile::matchStartType() { case URX_LB_END: case URX_LBN_CONT: case URX_LBN_END: - U_ASSERT(FALSE); // Shouldn't get here. These ops should be + UPRV_UNREACHABLE; // Shouldn't get here. These ops should be // consumed by the scan in URX_LA_START and LB_START - - break; - default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } @@ -3429,7 +3430,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } @@ -3673,8 +3674,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { case URX_CTR_LOOP_NG: // These opcodes will be skipped over by code for URX_CRT_INIT. // We shouldn't encounter them here. - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; case URX_LOOP_SR_I: case URX_LOOP_DOT_I: @@ -3694,8 +3694,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { // End of look-ahead ops should always be consumed by the processing at // the URX_LA_START op. - // U_ASSERT(FALSE); - // break; + // UPRV_UNREACHABLE; case URX_LB_START: { @@ -3720,7 +3719,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } @@ -3875,8 +3874,7 @@ void RegexCompile::stripNOPs() { default: // Some op is unaccounted for. - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); + UPRV_UNREACHABLE; } } @@ -4012,7 +4010,7 @@ UChar32 RegexCompile::peekCharLL() { // //------------------------------------------------------------------------------ void RegexCompile::nextChar(RegexPatternChar &c) { - + tailRecursion: fScanIndex = UTEXT_GETNATIVEINDEX(fRXPat->fPattern); c.fChar = nextCharLL(); c.fQuoted = FALSE; @@ -4023,7 +4021,9 @@ void RegexCompile::nextChar(RegexPatternChar &c) { c.fChar == (UChar32)-1) { fQuoteMode = FALSE; // Exit quote mode, nextCharLL(); // discard the E - nextChar(c); // recurse to get the real next char + // nextChar(c); // recurse to get the real next char + goto tailRecursion; // Note: fuzz testing produced testcases that + // resulted in stack overflow here. } } else if (fInBackslashQuote) { @@ -4141,8 +4141,10 @@ void RegexCompile::nextChar(RegexPatternChar &c) { else if (peekCharLL() == chQ) { // "\Q" enter quote mode, which will continue until "\E" fQuoteMode = TRUE; - nextCharLL(); // discard the 'Q'. - nextChar(c); // recurse to get the real next char. + nextCharLL(); // discard the 'Q'. + // nextChar(c); // recurse to get the real next char. + goto tailRecursion; // Note: fuzz testing produced test cases that + // resulted in stack overflow here. } else { @@ -4622,8 +4624,7 @@ void RegexCompile::setEval(int32_t nextOp) { delete rightOperand; break; default: - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } } diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index ae251ed20b46a3..cda2564b9a0539 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION #include +#include #include "unicode/dtfmtsym.h" #include "unicode/ucasemap.h" #include "unicode/ureldatefmt.h" @@ -41,11 +42,15 @@ #include "sharednumberformat.h" #include "standardplural.h" #include "unifiedcache.h" +#include "util.h" +#include "number_stringbuilder.h" +#include "number_utypes.h" +#include "number_modifiers.h" +#include "formattedval_impl.h" +#include "number_utils.h" // Copied from uscript_props.cpp -static UMutex gBrkIterMutex = U_MUTEX_INITIALIZER; - U_NAMESPACE_BEGIN // RelativeDateTimeFormatter specific data for a single locale @@ -162,13 +167,20 @@ const UnicodeString& RelativeDateTimeCacheData::getAbsoluteUnitString( URelativeDateTimeUnit unit, int32_t pastFutureIndex, int32_t pluralUnit) const { - int32_t style = fStyle; - do { - if (relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit] != nullptr) { - return relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit]; + while (true) { + int32_t style = fStyle; + do { + if (relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit] != nullptr) { + return relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit]; + } + style = fallBackCache[style]; + } while (style != -1); + + if (pluralUnit == StandardPlural::OTHER) { + break; } - style = fallBackCache[style]; - } while (style != -1); + pluralUnit = StandardPlural::OTHER; + } return nullptr; // No formatter found. } @@ -710,6 +722,26 @@ const RelativeDateTimeCacheData *LocaleCacheKey::crea return result.orphan(); } + + +static constexpr number::impl::Field kRDTNumericField + = number::impl::NumFieldUtils::compress(); + +static constexpr number::impl::Field kRDTLiteralField + = number::impl::NumFieldUtils::compress(); + +class FormattedRelativeDateTimeData : public FormattedValueNumberStringBuilderImpl { +public: + FormattedRelativeDateTimeData() : FormattedValueNumberStringBuilderImpl(kRDTNumericField) {} + virtual ~FormattedRelativeDateTimeData(); +}; + +FormattedRelativeDateTimeData::~FormattedRelativeDateTimeData() = default; + + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedRelativeDateTime) + + RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status) : fCache(nullptr), fNumberFormat(nullptr), @@ -834,43 +866,142 @@ UDateRelativeDateTimeFormatterStyle RelativeDateTimeFormatter::getFormatStyle() return fStyle; } -UnicodeString& RelativeDateTimeFormatter::format( - double quantity, UDateDirection direction, UDateRelativeUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + +// To reduce boilerplate code, we use a helper function that forwards variadic +// arguments to the formatImpl function. + +template +UnicodeString& RelativeDateTimeFormatter::doFormat( + F callback, + UnicodeString& appendTo, + UErrorCode& status, + Args... args) const { + FormattedRelativeDateTimeData output; + (this->*callback)(std::forward(args)..., output, status); if (U_FAILURE(status)) { return appendTo; } + UnicodeString result = output.getStringRef().toUnicodeString(); + return appendTo.append(adjustForContext(result)); +} + +template +FormattedRelativeDateTime RelativeDateTimeFormatter::doFormatToValue( + F callback, + UErrorCode& status, + Args... args) const { + if (!checkNoAdjustForContext(status)) { + return FormattedRelativeDateTime(status); + } + LocalPointer output( + new FormattedRelativeDateTimeData(), status); + if (U_FAILURE(status)) { + return FormattedRelativeDateTime(status); + } + (this->*callback)(std::forward(args)..., *output, status); + output->getStringRef().writeTerminator(status); + return FormattedRelativeDateTime(output.orphan()); +} + +UnicodeString& RelativeDateTimeFormatter::format( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatImpl, + appendTo, + status, + quantity, + direction, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatImpl, + status, + quantity, + direction, + unit); +} + +void RelativeDateTimeFormatter::formatImpl( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return; + } if (direction != UDAT_DIRECTION_LAST && direction != UDAT_DIRECTION_NEXT) { status = U_ILLEGAL_ARGUMENT_ERROR; - return appendTo; + return; } int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0; - FieldPosition pos(FieldPosition::DONT_CARE); - UnicodeString result; - UnicodeString formattedNumber; - - StandardPlural::Form pluralIndex = QuantityFormatter::selectPlural( - quantity, **fNumberFormat, **fPluralRules, formattedNumber, pos, + StandardPlural::Form pluralForm; + QuantityFormatter::formatAndSelect( + quantity, + **fNumberFormat, + **fPluralRules, + output.getStringRef(), + pluralForm, status); + if (U_FAILURE(status)) { + return; + } const SimpleFormatter* formatter = - fCache->getRelativeUnitFormatter(fStyle, unit, bFuture, pluralIndex); + fCache->getRelativeUnitFormatter(fStyle, unit, bFuture, pluralForm); if (formatter == nullptr) { // TODO: WARN - look at quantity formatter's action with an error. status = U_INVALID_FORMAT_ERROR; - return appendTo; + return; } - formatter->format(formattedNumber, result, status); - adjustForContext(result); - return appendTo.append(result); + + number::impl::SimpleModifier modifier(*formatter, kRDTLiteralField, false); + modifier.formatAsPrefixSuffix( + output.getStringRef(), 0, output.getStringRef().length(), status); } UnicodeString& RelativeDateTimeFormatter::formatNumeric( - double offset, URelativeDateTimeUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + double offset, + URelativeDateTimeUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatNumericImpl, + appendTo, + status, + offset, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatNumericToValue( + double offset, + URelativeDateTimeUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatNumericImpl, + status, + offset, + unit); +} + +void RelativeDateTimeFormatter::formatNumericImpl( + double offset, + URelativeDateTimeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { if (U_FAILURE(status)) { - return appendTo; + return; } UDateDirection direction = UDAT_DIRECTION_NEXT; if (std::signbit(offset)) { // needed to handle -0.0 @@ -879,55 +1010,110 @@ UnicodeString& RelativeDateTimeFormatter::formatNumeric( } if (direction != UDAT_DIRECTION_LAST && direction != UDAT_DIRECTION_NEXT) { status = U_ILLEGAL_ARGUMENT_ERROR; - return appendTo; + return; } int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0; - FieldPosition pos(FieldPosition::DONT_CARE); - - UnicodeString result; - UnicodeString formattedNumber; - StandardPlural::Form pluralIndex = QuantityFormatter::selectPlural( - offset, **fNumberFormat, **fPluralRules, formattedNumber, pos, + StandardPlural::Form pluralForm; + QuantityFormatter::formatAndSelect( + offset, + **fNumberFormat, + **fPluralRules, + output.getStringRef(), + pluralForm, status); + if (U_FAILURE(status)) { + return; + } const SimpleFormatter* formatter = - fCache->getRelativeDateTimeUnitFormatter(fStyle, unit, bFuture, pluralIndex); + fCache->getRelativeDateTimeUnitFormatter(fStyle, unit, bFuture, pluralForm); if (formatter == nullptr) { // TODO: WARN - look at quantity formatter's action with an error. status = U_INVALID_FORMAT_ERROR; - return appendTo; + return; } - formatter->format(formattedNumber, result, status); - adjustForContext(result); - return appendTo.append(result); + + number::impl::SimpleModifier modifier(*formatter, kRDTLiteralField, false); + modifier.formatAsPrefixSuffix( + output.getStringRef(), 0, output.getStringRef().length(), status); } UnicodeString& RelativeDateTimeFormatter::format( - UDateDirection direction, UDateAbsoluteUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + UDateDirection direction, + UDateAbsoluteUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatAbsoluteImpl, + appendTo, + status, + direction, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue( + UDateDirection direction, + UDateAbsoluteUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatAbsoluteImpl, + status, + direction, + unit); +} + +void RelativeDateTimeFormatter::formatAbsoluteImpl( + UDateDirection direction, + UDateAbsoluteUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { if (U_FAILURE(status)) { - return appendTo; + return; } if (unit == UDAT_ABSOLUTE_NOW && direction != UDAT_DIRECTION_PLAIN) { status = U_ILLEGAL_ARGUMENT_ERROR; - return appendTo; + return; } // Get string using fallback. - UnicodeString result; - result.fastCopyFrom(fCache->getAbsoluteUnitString(fStyle, unit, direction)); - if (fOptBreakIterator != nullptr) { - adjustForContext(result); - } - return appendTo.append(result); + output.getStringRef().append( + fCache->getAbsoluteUnitString(fStyle, unit, direction), + kRDTLiteralField, + status); } UnicodeString& RelativeDateTimeFormatter::format( - double offset, URelativeDateTimeUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + double offset, + URelativeDateTimeUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatRelativeImpl, + appendTo, + status, + offset, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue( + double offset, + URelativeDateTimeUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatRelativeImpl, + status, + offset, + unit); +} + +void RelativeDateTimeFormatter::formatRelativeImpl( + double offset, + URelativeDateTimeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { if (U_FAILURE(status)) { - return appendTo; + return; } // TODO: // The full implementation of this depends on CLDR data that is not yet available, @@ -974,20 +1160,13 @@ UnicodeString& RelativeDateTimeFormatter::format( default: break; } if (direction != UDAT_DIRECTION_COUNT && absunit != UDAT_ABSOLUTE_UNIT_COUNT) { - const UnicodeString &unitFormatString = - fCache->getAbsoluteUnitString(fStyle, absunit, direction); - if (!unitFormatString.isEmpty()) { - if (fOptBreakIterator != nullptr) { - UnicodeString result(unitFormatString); - adjustForContext(result); - return appendTo.append(result); - } else { - return appendTo.append(unitFormatString); - } + formatAbsoluteImpl(direction, absunit, output, status); + if (output.getStringRef().length() != 0) { + return; } } // otherwise fallback to formatNumeric - return formatNumeric(offset, unit, appendTo, status); + formatNumericImpl(offset, unit, output, status); } UnicodeString& RelativeDateTimeFormatter::combineDateAndTime( @@ -997,19 +1176,31 @@ UnicodeString& RelativeDateTimeFormatter::combineDateAndTime( timeString, relativeDateString, appendTo, status); } -void RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const { +UnicodeString& RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const { if (fOptBreakIterator == nullptr || str.length() == 0 || !u_islower(str.char32At(0))) { - return; + return str; } // Must guarantee that one thread at a time accesses the shared break // iterator. + static icu::UMutex gBrkIterMutex = U_MUTEX_INITIALIZER; Mutex lock(&gBrkIterMutex); str.toTitle( fOptBreakIterator->get(), fLocale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + return str; +} + +UBool RelativeDateTimeFormatter::checkNoAdjustForContext(UErrorCode& status) const { + // This is unsupported because it's hard to keep fields in sync with title + // casing. The code could be written and tested if there is demand. + if (fOptBreakIterator != nullptr) { + status = U_UNSUPPORTED_ERROR; + return FALSE; + } + return TRUE; } void RelativeDateTimeFormatter::init( @@ -1065,6 +1256,17 @@ U_NAMESPACE_END U_NAMESPACE_USE + +// Magic number: "FRDT" (FormattedRelativeDateTime) in ASCII +UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL( + FormattedRelativeDateTime, + UFormattedRelativeDateTime, + UFormattedRelativeDateTimeImpl, + UFormattedRelativeDateTimeApiHelper, + ureldatefmt, + 0x46524454) + + U_CAPI URelativeDateTimeFormatter* U_EXPORT2 ureldatefmt_open( const char* locale, UNumberFormat* nfToAdopt, @@ -1118,6 +1320,21 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt, return res.extract(result, resultCapacity, *status); } +U_STABLE void U_EXPORT2 +ureldatefmt_formatNumericToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return; + } + auto* fmt = reinterpret_cast(reldatefmt); + auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status); + resultImpl->fImpl = fmt->formatNumericToValue(offset, unit, *status); +} + U_CAPI int32_t U_EXPORT2 ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, double offset, @@ -1146,6 +1363,21 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, return res.extract(result, resultCapacity, *status); } +U_DRAFT void U_EXPORT2 +ureldatefmt_formatToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return; + } + auto* fmt = reinterpret_cast(reldatefmt); + auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status); + resultImpl->fImpl = fmt->formatToValue(offset, unit, *status); +} + U_CAPI int32_t U_EXPORT2 ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt, const UChar * relativeDateString, diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index 95fd0d2240af95..3b8d2333d82098 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -717,7 +717,7 @@ UBool RegexMatcher::find(UErrorCode &status) { if (findProgressInterrupt(startPos, status)) return FALSE; } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_START: // Matches are only possible at the start of the input string @@ -765,7 +765,7 @@ UBool RegexMatcher::find(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_STRING: case START_CHAR: @@ -797,7 +797,7 @@ UBool RegexMatcher::find(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_LINE: { @@ -877,11 +877,10 @@ UBool RegexMatcher::find(UErrorCode &status) { } default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } - U_ASSERT(FALSE); - return FALSE; + UPRV_UNREACHABLE; } @@ -992,7 +991,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { if (findProgressInterrupt(startPos, status)) return FALSE; } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_START: // Matches are only possible at the start of the input string @@ -1034,7 +1033,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_STRING: case START_CHAR: @@ -1063,7 +1062,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_LINE: { @@ -1134,11 +1133,10 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { } default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } - U_ASSERT(FALSE); - return FALSE; + UPRV_UNREACHABLE; } @@ -4278,7 +4276,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { default: // Trouble. The compiled pattern contains an entry with an // unrecognized type tag. - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } if (U_FAILURE(status)) { @@ -5778,7 +5776,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu default: // Trouble. The compiled pattern contains an entry with an // unrecognized type tag. - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } if (U_FAILURE(status)) { diff --git a/deps/icu-small/source/i18n/rulebasedcollator.cpp b/deps/icu-small/source/i18n/rulebasedcollator.cpp index b057b6bbd5a12f..92fa5385971889 100644 --- a/deps/icu-small/source/i18n/rulebasedcollator.cpp +++ b/deps/icu-small/source/i18n/rulebasedcollator.cpp @@ -1554,11 +1554,7 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale, "collation", locale, NULL, &errorCode); if(U_FAILURE(errorCode)) { return 0; } - if(length == 0) { - uprv_strcpy(resultLocale, "root"); - } else { - resultLocale[length] = 0; - } + resultLocale[length] = 0; // Append items in alphabetic order of their short definition letters. CharString result; @@ -1585,7 +1581,11 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale, length = uloc_getKeywordValue(resultLocale, "collation", subtag, UPRV_LENGTHOF(subtag), &errorCode); appendSubtag(result, 'K', subtag, length, errorCode); length = uloc_getLanguage(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode); - appendSubtag(result, 'L', subtag, length, errorCode); + if (length == 0) { + appendSubtag(result, 'L', "root", 4, errorCode); + } else { + appendSubtag(result, 'L', subtag, length, errorCode); + } if(attributeHasBeenSetExplicitly(UCOL_NORMALIZATION_MODE)) { appendAttribute(result, 'N', getAttribute(UCOL_NORMALIZATION_MODE, errorCode), errorCode); } diff --git a/deps/icu-small/source/i18n/scriptset.h b/deps/icu-small/source/i18n/scriptset.h index 385c3e3e534086..99a71ec803f36d 100644 --- a/deps/icu-small/source/i18n/scriptset.h +++ b/deps/icu-small/source/i18n/scriptset.h @@ -40,7 +40,7 @@ class U_I18N_API ScriptSet: public UMemory { ~ScriptSet(); UBool operator == (const ScriptSet &other) const; - UBool operator != (const ScriptSet &other) const {return !(*this == other);}; + UBool operator != (const ScriptSet &other) const {return !(*this == other);} ScriptSet & operator = (const ScriptSet &other); UBool test(UScriptCode script, UErrorCode &status) const; diff --git a/deps/icu-small/source/i18n/simpletz.cpp b/deps/icu-small/source/i18n/simpletz.cpp index 9bce8ed55705ee..1af5292a823324 100644 --- a/deps/icu-small/source/i18n/simpletz.cpp +++ b/deps/icu-small/source/i18n/simpletz.cpp @@ -1077,13 +1077,13 @@ SimpleTimeZone::deleteTransitionRules(void) { * allocate it in the constructors. This would be a more intrusive change, but doable * if performance turns out to be an issue. */ -static UMutex gLock = U_MUTEX_INITIALIZER; void SimpleTimeZone::checkTransitionRules(UErrorCode& status) const { if (U_FAILURE(status)) { return; } + static UMutex gLock = U_MUTEX_INITIALIZER; umtx_lock(&gLock); if (!transitionRulesInitialized) { SimpleTimeZone *ncThis = const_cast(this); diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 2bc8e49625fe29..e67c4538287b9e 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -230,7 +230,10 @@ static const int32_t gFieldRangeBias[] = { static const int32_t HEBREW_CAL_CUR_MILLENIUM_START_YEAR = 5000; static const int32_t HEBREW_CAL_CUR_MILLENIUM_END_YEAR = 6000; -static UMutex LOCK = U_MUTEX_INITIALIZER; +static UMutex *LOCK() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleDateFormat) @@ -856,6 +859,17 @@ SimpleDateFormat::initialize(const Locale& locale, { if (U_FAILURE(status)) return; + parsePattern(); // Need this before initNumberFormatters(), to set fHasHanYearChar + + // Simple-minded hack to force Gannen year numbering for ja@calendar=japanese + // if format is non-numeric (includes 年) and fDateOverride is not already specified. + // Now this does get updated if applyPattern subsequently changes the pattern type. + if (fDateOverride.isBogus() && fHasHanYearChar && + fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 && + uprv_strcmp(fLocale.getLanguage(),"ja") == 0) { + fDateOverride.setTo(u"y=jpanyear", -1); + } + // We don't need to check that the row count is >= 1, since all 2d arrays have at // least one row fNumberFormat = NumberFormat::createInstance(locale, status); @@ -872,8 +886,6 @@ SimpleDateFormat::initialize(const Locale& locale, { status = U_MISSING_RESOURCE_ERROR; } - - parsePattern(); } /* Initialize the fields we use to disambiguate ambiguous years. Separate @@ -1254,14 +1266,14 @@ SimpleDateFormat::initNumberFormatters(const Locale &locale,UErrorCode &status) if ( fDateOverride.isBogus() && fTimeOverride.isBogus() ) { return; } - umtx_lock(&LOCK); + umtx_lock(LOCK()); if (fSharedNumberFormatters == NULL) { fSharedNumberFormatters = allocSharedNumberFormatters(); if (fSharedNumberFormatters == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } } - umtx_unlock(&LOCK); + umtx_unlock(LOCK()); if (U_FAILURE(status)) { return; @@ -1778,7 +1790,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, } } else { - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } appendTo += zoneString; @@ -1950,7 +1962,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, } #if !UCONFIG_NO_BREAK_ITERATION // if first field, check to see whether we need to and are able to titlecase it - if (fieldNum == 0 && u_islower(appendTo.char32At(beginOffset)) && fCapitalizationBrkIter != NULL) { + if (fieldNum == 0 && fCapitalizationBrkIter != NULL && appendTo.length() > beginOffset && + u_islower(appendTo.char32At(beginOffset))) { UBool titlecase = FALSE; switch (capitalizationContext) { case UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE: @@ -2079,7 +2092,7 @@ SimpleDateFormat::zeroPaddingNumber( if (U_FAILURE(localStatus)) { return; } - appendTo.append(result.string.toTempUnicodeString()); + appendTo.append(result.getStringRef().toTempUnicodeString()); return; } @@ -3872,6 +3885,42 @@ SimpleDateFormat::applyPattern(const UnicodeString& pattern) { fPattern = pattern; parsePattern(); + + // Hack to update use of Gannen year numbering for ja@calendar=japanese - + // use only if format is non-numeric (includes 年) and no other fDateOverride. + if (fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 && + uprv_strcmp(fLocale.getLanguage(),"ja") == 0) { + if (fDateOverride==UnicodeString(u"y=jpanyear") && !fHasHanYearChar) { + // Gannen numbering is set but new pattern should not use it, unset; + // use procedure from adoptNumberFormat to clear overrides + if (fSharedNumberFormatters) { + freeSharedNumberFormatters(fSharedNumberFormatters); + fSharedNumberFormatters = NULL; + } + fDateOverride.setToBogus(); // record status + } else if (fDateOverride.isBogus() && fHasHanYearChar) { + // No current override (=> no Gannen numbering) but new pattern needs it; + // use procedures from initNUmberFormatters / adoptNumberFormat + umtx_lock(LOCK()); + if (fSharedNumberFormatters == NULL) { + fSharedNumberFormatters = allocSharedNumberFormatters(); + } + umtx_unlock(LOCK()); + if (fSharedNumberFormatters != NULL) { + Locale ovrLoc(fLocale.getLanguage(),fLocale.getCountry(),fLocale.getVariant(),"numbers=jpanyear"); + UErrorCode status = U_ZERO_ERROR; + const SharedNumberFormat *snf = createSharedNumberFormat(ovrLoc, status); + if (U_SUCCESS(status)) { + // Now that we have an appropriate number formatter, fill in the + // appropriate slot in the number formatters table. + UDateFormatField patternCharIndex = DateFormatSymbols::getPatternCharIndex(u'y'); + SharedObject::copyPtr(snf, fSharedNumberFormatters[patternCharIndex]); + snf->deleteIfZeroRefCount(); + fDateOverride.setTo(u"y=jpanyear", -1); // record status + } + } + } + } } //---------------------------------------------------------------------- @@ -4188,7 +4237,7 @@ SimpleDateFormat::skipUWhiteSpace(const UnicodeString& text, int32_t pos) const TimeZoneFormat * SimpleDateFormat::tzFormat(UErrorCode &status) const { if (fTimeZoneFormat == NULL) { - umtx_lock(&LOCK); + umtx_lock(LOCK()); { if (fTimeZoneFormat == NULL) { TimeZoneFormat *tzfmt = TimeZoneFormat::createInstance(fLocale, status); @@ -4199,7 +4248,7 @@ SimpleDateFormat::tzFormat(UErrorCode &status) const { const_cast(this)->fTimeZoneFormat = tzfmt; } } - umtx_unlock(&LOCK); + umtx_unlock(LOCK()); } return fTimeZoneFormat; } @@ -4207,6 +4256,7 @@ SimpleDateFormat::tzFormat(UErrorCode &status) const { void SimpleDateFormat::parsePattern() { fHasMinute = FALSE; fHasSecond = FALSE; + fHasHanYearChar = FALSE; int len = fPattern.length(); UBool inQuote = FALSE; @@ -4215,6 +4265,9 @@ void SimpleDateFormat::parsePattern() { if (ch == QUOTE) { inQuote = !inQuote; } + if (ch == 0x5E74) { // don't care whether this is inside quotes + fHasHanYearChar = TRUE; + } if (!inQuote) { if (ch == 0x6D) { // 0x6D == 'm' fHasMinute = TRUE; diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp index dbf614469e8311..70169b5c1f576d 100644 --- a/deps/icu-small/source/i18n/timezone.cpp +++ b/deps/icu-small/source/i18n/timezone.cpp @@ -115,9 +115,14 @@ static const int32_t UNKNOWN_ZONE_ID_LENGTH = 11; static icu::TimeZone* DEFAULT_ZONE = NULL; static icu::UInitOnce gDefaultZoneInitOnce = U_INITONCE_INITIALIZER; -static icu::TimeZone* _GMT = NULL; -static icu::TimeZone* _UNKNOWN_ZONE = NULL; +alignas(icu::SimpleTimeZone) +static char gRawGMT[sizeof(icu::SimpleTimeZone)]; + +alignas(icu::SimpleTimeZone) +static char gRawUNKNOWN[sizeof(icu::SimpleTimeZone)]; + static icu::UInitOnce gStaticZonesInitOnce = U_INITONCE_INITIALIZER; +static UBool gStaticZonesInitialized = FALSE; // Whether the static zones are initialized and ready to use. static char TZDATA_VERSION[16]; static icu::UInitOnce gTZDataVersionInitOnce = U_INITONCE_INITIALIZER; @@ -142,11 +147,12 @@ static UBool U_CALLCONV timeZone_cleanup(void) DEFAULT_ZONE = NULL; gDefaultZoneInitOnce.reset(); - delete _GMT; - _GMT = NULL; - delete _UNKNOWN_ZONE; - _UNKNOWN_ZONE = NULL; - gStaticZonesInitOnce.reset(); + if (gStaticZonesInitialized) { + reinterpret_cast(gRawGMT)->~SimpleTimeZone(); + reinterpret_cast(gRawUNKNOWN)->~SimpleTimeZone(); + gStaticZonesInitialized = FALSE; + gStaticZonesInitOnce.reset(); + } uprv_memset(TZDATA_VERSION, 0, sizeof(TZDATA_VERSION)); gTZDataVersionInitOnce.reset(); @@ -272,7 +278,7 @@ static UResourceBundle* openOlsonResource(const UnicodeString& id, UResourceBundle& res, UErrorCode& ec) { -#if U_DEBUG_TZ +#ifdef U_DEBUG_TZ char buf[128]; id.extract(0, sizeof(buf)-1, buf, sizeof(buf), ""); #endif @@ -304,8 +310,12 @@ void U_CALLCONV initStaticTimeZones() { // Initialize _GMT independently of other static data; it should // be valid even if we can't load the time zone UDataMemory. ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); - _UNKNOWN_ZONE = new SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH)); - _GMT = new SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH)); + + // new can't fail below, as we use placement new into staticly allocated space. + new(gRawGMT) SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH)); + new(gRawUNKNOWN) SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH)); + + gStaticZonesInitialized = TRUE; } } // anonymous namespace @@ -314,14 +324,14 @@ const TimeZone& U_EXPORT2 TimeZone::getUnknown() { umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones); - return *_UNKNOWN_ZONE; + return *reinterpret_cast(gRawUNKNOWN); } const TimeZone* U_EXPORT2 TimeZone::getGMT(void) { umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones); - return _GMT; + return reinterpret_cast(gRawGMT); } // ***************************************************************************** @@ -382,23 +392,22 @@ createSystemTimeZone(const UnicodeString& id, UErrorCode& ec) { return NULL; } TimeZone* z = 0; - UResourceBundle res; - ures_initStackObject(&res); + StackUResourceBundle res; U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec))); - UResourceBundle *top = openOlsonResource(id, res, ec); + UResourceBundle *top = openOlsonResource(id, res.ref(), ec); U_DEBUG_TZ_MSG(("post-err=%s\n", u_errorName(ec))); if (U_SUCCESS(ec)) { - z = new OlsonTimeZone(top, &res, id, ec); + z = new OlsonTimeZone(top, res.getAlias(), id, ec); if (z == NULL) { - U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec))); + ec = U_MEMORY_ALLOCATION_ERROR; + U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec))); } } - ures_close(&res); ures_close(top); if (U_FAILURE(ec)) { U_DEBUG_TZ_MSG(("cstz: failed to create, err %s\n", u_errorName(ec))); delete z; - z = 0; + z = NULL; } return z; } @@ -436,11 +445,8 @@ TimeZone::createTimeZone(const UnicodeString& ID) if (result == NULL) { U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to Etc/Unknown(GMT)")); const TimeZone& unknown = getUnknown(); - if (_UNKNOWN_ZONE == NULL) { // Cannot test (&unknown == NULL) because the - U_DEBUG_TZ_MSG(("failed to getUnknown()")); // behavior of NULL references is undefined. - } else { - result = unknown.clone(); - } + // Unknown zone uses staticly allocated memory, so creation of it can never fail due to OOM. + result = unknown.clone(); } return result; } @@ -450,10 +456,11 @@ TimeZone::createTimeZone(const UnicodeString& ID) TimeZone* U_EXPORT2 TimeZone::detectHostTimeZone() { - // We access system timezone data through TPlatformUtilities, - // including tzset(), timezone, and tzname[]. + // We access system timezone data through uprv_tzset(), uprv_tzname(), and others, + // which have platform specific implementations in putil.cpp int32_t rawOffset = 0; const char *hostID; + UBool hostDetectionSucceeded = TRUE; // First, try to create a system timezone, based // on the string ID in tzname[0]. @@ -464,8 +471,7 @@ TimeZone::detectHostTimeZone() // Get the timezone ID from the host. This function should do // any required host-specific remapping; e.g., on Windows this - // function maps the Date and Time control panel setting to an - // ICU timezone ID. + // function maps the Windows Time Zone name to an ICU timezone ID. hostID = uprv_tzname(0); // Invert sign because UNIX semantics are backwards @@ -473,10 +479,15 @@ TimeZone::detectHostTimeZone() TimeZone* hostZone = NULL; - /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */ UnicodeString hostStrID(hostID, -1, US_INV); - hostStrID.append((UChar)0); - hostStrID.truncate(hostStrID.length()-1); + + if (hostStrID.length() == 0) { + // The host time zone detection (or remapping) above has failed and + // we have no name at all. Fallback to using the Unknown zone. + hostStrID = UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH); + hostDetectionSucceeded = FALSE; + } + hostZone = createSystemTimeZone(hostStrID); #if U_PLATFORM_USES_ONLY_WIN32_API @@ -496,22 +507,19 @@ TimeZone::detectHostTimeZone() // Construct a fixed standard zone with the host's ID // and raw offset. - if (hostZone == NULL) { + if (hostZone == NULL && hostDetectionSucceeded) { hostZone = new SimpleTimeZone(rawOffset, hostStrID); } - // If we _still_ don't have a time zone, use GMT. + // If we _still_ don't have a time zone, use the Unknown zone. // // Note: This is extremely unlikely situation. If // new SimpleTimeZone(...) above fails, the following // code may also fail. if (hostZone == NULL) { - const TimeZone* temptz = TimeZone::getGMT(); - // If we can't use GMT, get out. - if (temptz == NULL) { - return NULL; - } - hostZone = temptz->clone(); + // Unknown zone uses static allocated memory, so it must always exist. + // However, clone() allocates memory and can fail. + hostZone = TimeZone::getUnknown().clone(); } return hostZone; @@ -986,18 +994,14 @@ int32_t U_EXPORT2 TimeZone::countEquivalentIDs(const UnicodeString& id) { int32_t result = 0; UErrorCode ec = U_ZERO_ERROR; - UResourceBundle res; - ures_initStackObject(&res); + StackUResourceBundle res; U_DEBUG_TZ_MSG(("countEquivalentIDs..\n")); - UResourceBundle *top = openOlsonResource(id, res, ec); + UResourceBundle *top = openOlsonResource(id, res.ref(), ec); if (U_SUCCESS(ec)) { - UResourceBundle r; - ures_initStackObject(&r); - ures_getByKey(&res, kLINKS, &r, &ec); - ures_getIntVector(&r, &result, &ec); - ures_close(&r); + StackUResourceBundle r; + ures_getByKey(res.getAlias(), kLINKS, r.getAlias(), &ec); + ures_getIntVector(r.getAlias(), &result, &ec); } - ures_close(&res); ures_close(top); return result; } @@ -1009,24 +1013,20 @@ TimeZone::getEquivalentID(const UnicodeString& id, int32_t index) { U_DEBUG_TZ_MSG(("gEI(%d)\n", index)); UnicodeString result; UErrorCode ec = U_ZERO_ERROR; - UResourceBundle res; - ures_initStackObject(&res); - UResourceBundle *top = openOlsonResource(id, res, ec); + StackUResourceBundle res; + UResourceBundle *top = openOlsonResource(id, res.ref(), ec); int32_t zone = -1; if (U_SUCCESS(ec)) { - UResourceBundle r; - ures_initStackObject(&r); + StackUResourceBundle r; int32_t size; - ures_getByKey(&res, kLINKS, &r, &ec); - const int32_t* v = ures_getIntVector(&r, &size, &ec); + ures_getByKey(res.getAlias(), kLINKS, r.getAlias(), &ec); + const int32_t *v = ures_getIntVector(r.getAlias(), &size, &ec); if (U_SUCCESS(ec)) { if (index >= 0 && index < size) { zone = v[index]; } } - ures_close(&r); } - ures_close(&res); if (zone >= 0) { UResourceBundle *ares = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Zones section if (U_SUCCESS(ec)) { @@ -1181,9 +1181,9 @@ TimeZone::getDisplayName(const Locale& locale, UnicodeString& result) const } UnicodeString& -TimeZone::getDisplayName(UBool daylight, EDisplayType style, UnicodeString& result) const +TimeZone::getDisplayName(UBool inDaylight, EDisplayType style, UnicodeString& result) const { - return getDisplayName(daylight,style, Locale::getDefault(), result); + return getDisplayName(inDaylight,style, Locale::getDefault(), result); } //-------------------------------------- int32_t @@ -1195,7 +1195,7 @@ TimeZone::getDSTSavings()const { } //--------------------------------------- UnicodeString& -TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const +TimeZone::getDisplayName(UBool inDaylight, EDisplayType style, const Locale& locale, UnicodeString& result) const { UErrorCode status = U_ZERO_ERROR; UDate date = Calendar::getNow(); @@ -1220,13 +1220,13 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local tzfmt->format(UTZFMT_STYLE_GENERIC_SHORT, *this, date, result, &timeType); break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } // Generic format many use Localized GMT as the final fallback. // When Localized GMT format is used, the result might not be // appropriate for the requested daylight value. - if ((daylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!daylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) { - offset = daylight ? getRawOffset() + getDSTSavings() : getRawOffset(); + if ((inDaylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!inDaylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) { + offset = inDaylight ? getRawOffset() + getDSTSavings() : getRawOffset(); if (style == SHORT_GENERIC) { tzfmt->formatOffsetShortLocalizedGMT(offset, result, status); } else { @@ -1239,7 +1239,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local result.remove(); return result; } - offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); + offset = inDaylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); switch (style) { case LONG_GMT: tzfmt->formatOffsetLocalizedGMT(offset, result, status); @@ -1248,7 +1248,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local tzfmt->formatOffsetISO8601Basic(offset, FALSE, FALSE, FALSE, result, status); break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } else { @@ -1256,14 +1256,14 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local UTimeZoneNameType nameType = UTZNM_UNKNOWN; switch (style) { case LONG: - nameType = daylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD; + nameType = inDaylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD; break; case SHORT: case SHORT_COMMONLY_USED: - nameType = daylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD; + nameType = inDaylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD; break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } LocalPointer tznames(TimeZoneNames::createInstance(locale, status)); if (U_FAILURE(status)) { @@ -1275,7 +1275,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local if (result.isEmpty()) { // Fallback to localized GMT LocalPointer tzfmt(TimeZoneFormat::createInstance(locale, status)); - offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); + offset = inDaylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); if (style == LONG) { tzfmt->formatOffsetLocalizedGMT(offset, result, status); } else { @@ -1496,8 +1496,9 @@ TimeZone::hasSameRules(const TimeZone& other) const static void U_CALLCONV initTZDataVersion(UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); int32_t len = 0; - UResourceBundle *bundle = ures_openDirect(NULL, kZONEINFO, &status); - const UChar *tzver = ures_getStringByKey(bundle, kTZVERSION, &len, &status); + StackUResourceBundle bundle; + ures_openDirectFillIn(bundle.getAlias(), NULL, kZONEINFO, &status); + const UChar *tzver = ures_getStringByKey(bundle.getAlias(), kTZVERSION, &len, &status); if (U_SUCCESS(status)) { if (len >= (int32_t)sizeof(TZDATA_VERSION)) { @@ -1506,8 +1507,6 @@ static void U_CALLCONV initTZDataVersion(UErrorCode &status) { } u_UCharsToChars(tzver, TZDATA_VERSION, len); } - ures_close(bundle); - } const char* diff --git a/deps/icu-small/source/i18n/tmunit.cpp b/deps/icu-small/source/i18n/tmunit.cpp index ca308cca225972..3e980105153da5 100644 --- a/deps/icu-small/source/i18n/tmunit.cpp +++ b/deps/icu-small/source/i18n/tmunit.cpp @@ -94,8 +94,7 @@ TimeUnit::TimeUnit(TimeUnit::UTimeUnitFields timeUnitField) { initTime("second"); break; default: - U_ASSERT(false); - break; + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/tmutfmt.cpp b/deps/icu-small/source/i18n/tmutfmt.cpp index 50dac8b7cef8c0..dad8825e70ff33 100644 --- a/deps/icu-small/source/i18n/tmutfmt.cpp +++ b/deps/icu-small/source/i18n/tmutfmt.cpp @@ -224,7 +224,7 @@ TimeUnitFormat::parseObject(const UnicodeString& source, if (temp.getType() == Formattable::kString) { UnicodeString tmpString; UErrorCode pStatus = U_ZERO_ERROR; - getNumberFormat().parse(temp.getString(tmpString), tmpNumber, pStatus); + getNumberFormatInternal().parse(temp.getString(tmpString), tmpNumber, pStatus); if (U_FAILURE(pStatus)) { continue; } diff --git a/deps/icu-small/source/i18n/translit.cpp b/deps/icu-small/source/i18n/translit.cpp index de54e952dcb570..9f5563b4796c19 100644 --- a/deps/icu-small/source/i18n/translit.cpp +++ b/deps/icu-small/source/i18n/translit.cpp @@ -91,7 +91,10 @@ static const char RB_RULE_BASED_IDS[] = "RuleBasedTransliteratorIDs"; /** * The mutex controlling access to registry object. */ -static UMutex registryMutex = U_MUTEX_INITIALIZER; +static icu::UMutex *registryMutex() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} /** * System transliterator registry; non-null when initialized. @@ -978,11 +981,11 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, TransliteratorAlias* alias = 0; Transliterator* t = 0; - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); if (HAVE_REGISTRY(ec)) { t = registry->get(id, alias, ec); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); if (U_FAILURE(ec)) { delete t; @@ -1010,11 +1013,11 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, alias = 0; // Step 2. reget - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); if (HAVE_REGISTRY(ec)) { t = registry->reget(id, parser, alias, ec); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); // Step 3. Loop back around! } else { @@ -1212,7 +1215,7 @@ UnicodeSet& Transliterator::getTargetSet(UnicodeSet& result) const { void U_EXPORT2 Transliterator::registerFactory(const UnicodeString& id, Transliterator::Factory factory, Transliterator::Token context) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _registerFactory(id, factory, context); @@ -1251,7 +1254,7 @@ void Transliterator::_registerSpecialInverse(const UnicodeString& target, * @see #unregister */ void U_EXPORT2 Transliterator::registerInstance(Transliterator* adoptedPrototype) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _registerInstance(adoptedPrototype); @@ -1265,7 +1268,7 @@ void Transliterator::_registerInstance(Transliterator* adoptedPrototype) { void U_EXPORT2 Transliterator::registerAlias(const UnicodeString& aliasID, const UnicodeString& realID) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _registerAlias(aliasID, realID); @@ -1287,7 +1290,7 @@ void Transliterator::_registerAlias(const UnicodeString& aliasID, */ void U_EXPORT2 Transliterator::unregister(const UnicodeString& ID) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { registry->remove(ID); @@ -1302,7 +1305,7 @@ void U_EXPORT2 Transliterator::unregister(const UnicodeString& ID) { */ int32_t U_EXPORT2 Transliterator::countAvailableIDs(void) { int32_t retVal = 0; - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { retVal = registry->countAvailableIDs(); @@ -1318,12 +1321,12 @@ int32_t U_EXPORT2 Transliterator::countAvailableIDs(void) { */ const UnicodeString& U_EXPORT2 Transliterator::getAvailableID(int32_t index) { const UnicodeString* result = NULL; - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { result = ®istry->getAvailableID(index); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); U_ASSERT(result != NULL); // fail if no registry return *result; } @@ -1331,11 +1334,11 @@ const UnicodeString& U_EXPORT2 Transliterator::getAvailableID(int32_t index) { StringEnumeration* U_EXPORT2 Transliterator::getAvailableIDs(UErrorCode& ec) { if (U_FAILURE(ec)) return NULL; StringEnumeration* result = NULL; - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); if (HAVE_REGISTRY(ec)) { result = registry->getAvailableIDs(); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); if (result == NULL) { ec = U_INTERNAL_TRANSLITERATOR_ERROR; } @@ -1343,14 +1346,14 @@ StringEnumeration* U_EXPORT2 Transliterator::getAvailableIDs(UErrorCode& ec) { } int32_t U_EXPORT2 Transliterator::countAvailableSources(void) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; return HAVE_REGISTRY(ec) ? _countAvailableSources() : 0; } UnicodeString& U_EXPORT2 Transliterator::getAvailableSource(int32_t index, UnicodeString& result) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _getAvailableSource(index, result); @@ -1359,7 +1362,7 @@ UnicodeString& U_EXPORT2 Transliterator::getAvailableSource(int32_t index, } int32_t U_EXPORT2 Transliterator::countAvailableTargets(const UnicodeString& source) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; return HAVE_REGISTRY(ec) ? _countAvailableTargets(source) : 0; } @@ -1367,7 +1370,7 @@ int32_t U_EXPORT2 Transliterator::countAvailableTargets(const UnicodeString& sou UnicodeString& U_EXPORT2 Transliterator::getAvailableTarget(int32_t index, const UnicodeString& source, UnicodeString& result) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _getAvailableTarget(index, source, result); @@ -1377,7 +1380,7 @@ UnicodeString& U_EXPORT2 Transliterator::getAvailableTarget(int32_t index, int32_t U_EXPORT2 Transliterator::countAvailableVariants(const UnicodeString& source, const UnicodeString& target) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; return HAVE_REGISTRY(ec) ? _countAvailableVariants(source, target) : 0; } @@ -1386,7 +1389,7 @@ UnicodeString& U_EXPORT2 Transliterator::getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, UnicodeString& result) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _getAvailableVariant(index, source, target, result); diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index 4884773faf5ac3..032a73fd146559 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -186,8 +186,7 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, } break; case RULES: - U_ASSERT(FALSE); // don't call create() if isRuleBased() returns TRUE! - break; + UPRV_UNREACHABLE; // don't call create() if isRuleBased() returns TRUE! } return t; } @@ -1396,8 +1395,7 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID } return 0; default: - U_ASSERT(FALSE); // can't get here - return 0; + UPRV_UNREACHABLE; // can't get here } } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/tridpars.cpp b/deps/icu-small/source/i18n/tridpars.cpp index 68bbd2d0407a7c..cbfdf03c427850 100644 --- a/deps/icu-small/source/i18n/tridpars.cpp +++ b/deps/icu-small/source/i18n/tridpars.cpp @@ -50,7 +50,10 @@ static UInitOnce gSpecialInversesInitOnce = U_INITONCE_INITIALIZER; /** * The mutex controlling access to SPECIAL_INVERSES */ -static UMutex LOCK = U_MUTEX_INITIALIZER; +static UMutex *LOCK() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} TransliteratorIDParser::Specs::Specs(const UnicodeString& s, const UnicodeString& t, const UnicodeString& v, UBool sawS, @@ -659,7 +662,7 @@ void TransliteratorIDParser::registerSpecialInverse(const UnicodeString& target, bidirectional = FALSE; } - Mutex lock(&LOCK); + Mutex lock(LOCK()); UnicodeString *tempus = new UnicodeString(inverseTarget); // Used for null pointer check before usage. if (tempus == NULL) { @@ -863,9 +866,9 @@ TransliteratorIDParser::specsToSpecialInverse(const Specs& specs, UErrorCode &st UnicodeString* inverseTarget; - umtx_lock(&LOCK); + umtx_lock(LOCK()); inverseTarget = (UnicodeString*) SPECIAL_INVERSES->get(specs.target); - umtx_unlock(&LOCK); + umtx_unlock(LOCK()); if (inverseTarget != NULL) { // If the original ID contained "Any-" then make the diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index df4dec1febf60a..c948c5f5e7b07c 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -147,7 +147,10 @@ static icu::UInitOnce gZoneIdTrieInitOnce = U_INITONCE_INITIALIZER; static TextTrieMap *gShortZoneIdTrie = NULL; static icu::UInitOnce gShortZoneIdTrieInitOnce = U_INITONCE_INITIALIZER; -static UMutex gLock = U_MUTEX_INITIALIZER; +static UMutex *gLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} U_CDECL_BEGIN /** @@ -267,7 +270,7 @@ GMTOffsetField::isValid(FieldType type, int32_t width) { case SECOND: return (width == 2); default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } return (width > 0); } @@ -589,8 +592,7 @@ TimeZoneFormat::setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, co required = FIELDS_HMS; break; default: - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } UVector* patternItems = parseOffsetPattern(pattern, required, status); @@ -1028,7 +1030,7 @@ TimeZoneFormat::parse(UTimeZoneFormatStyle style, const UnicodeString& text, Par break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } int32_t len = 0; @@ -1383,12 +1385,12 @@ TimeZoneFormat::getTimeZoneGenericNames(UErrorCode& status) const { return NULL; } - umtx_lock(&gLock); + umtx_lock(gLock()); if (fTimeZoneGenericNames == NULL) { TimeZoneFormat *nonConstThis = const_cast(this); nonConstThis->fTimeZoneGenericNames = TimeZoneGenericNames::createInstance(fLocale, status); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); return fTimeZoneGenericNames; } @@ -1399,7 +1401,7 @@ TimeZoneFormat::getTZDBTimeZoneNames(UErrorCode& status) const { return NULL; } - umtx_lock(&gLock); + umtx_lock(gLock()); if (fTZDBTimeZoneNames == NULL) { TZDBTimeZoneNames *tzdbNames = new TZDBTimeZoneNames(fLocale); if (tzdbNames == NULL) { @@ -1409,7 +1411,7 @@ TimeZoneFormat::getTZDBTimeZoneNames(UErrorCode& status) const { nonConstThis->fTZDBTimeZoneNames = tzdbNames; } } - umtx_unlock(&gLock); + umtx_unlock(gLock()); return fTZDBTimeZoneNames; } diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index 5f5b7db30227cc..4e3ecb4c6073b8 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -269,7 +269,10 @@ GNameSearchHandler::getMatches(int32_t& maxMatchLen) { return results; } -static UMutex gLock = U_MUTEX_INITIALIZER; +static UMutex *gLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} class TZGNCore : public UMemory { public: @@ -485,11 +488,11 @@ TZGNCore::getGenericLocationName(const UnicodeString& tzCanonicalID, UnicodeStri const UChar *locname = NULL; TZGNCore *nonConstThis = const_cast(this); - umtx_lock(&gLock); + umtx_lock(gLock()); { locname = nonConstThis->getGenericLocationName(tzCanonicalID); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (locname == NULL) { name.setToBogus(); @@ -740,11 +743,11 @@ TZGNCore::getPartialLocationName(const UnicodeString& tzCanonicalID, const UChar *uplname = NULL; TZGNCore *nonConstThis = const_cast(this); - umtx_lock(&gLock); + umtx_lock(gLock()); { uplname = nonConstThis->getPartialLocationName(tzCanonicalID, mzID, isLong, mzDisplayName); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (uplname == NULL) { name.setToBogus(); @@ -1007,11 +1010,11 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE TZGNCore *nonConstThis = const_cast(this); - umtx_lock(&gLock); + umtx_lock(gLock()); { fGNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (U_FAILURE(status)) { return NULL; @@ -1038,7 +1041,7 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE // All names are not yet loaded into the local trie. // Load all available names into the trie. This could be very heavy. - umtx_lock(&gLock); + umtx_lock(gLock()); { if (!fGNamesTrieFullyLoaded) { StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); @@ -1060,18 +1063,18 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE } } } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (U_FAILURE(status)) { return NULL; } - umtx_lock(&gLock); + umtx_lock(gLock()); { // now try it again fGNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); results = handler.getMatches(maxLen); if (results != NULL && maxLen > 0) { @@ -1112,7 +1115,10 @@ typedef struct TZGNCoreRef { } TZGNCoreRef; // TZGNCore object cache handling -static UMutex gTZGNLock = U_MUTEX_INITIALIZER; +static UMutex *gTZGNLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable *gTZGNCoreCache = NULL; static UBool gTZGNCoreCacheInitialized = FALSE; @@ -1178,13 +1184,13 @@ TimeZoneGenericNames::TimeZoneGenericNames() } TimeZoneGenericNames::~TimeZoneGenericNames() { - umtx_lock(&gTZGNLock); + umtx_lock(gTZGNLock()); { U_ASSERT(fRef->refCount > 0); // Just decrement the reference count fRef->refCount--; } - umtx_unlock(&gTZGNLock); + umtx_unlock(gTZGNLock()); } TimeZoneGenericNames* @@ -1200,7 +1206,7 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { TZGNCoreRef *cacheEntry = NULL; { - Mutex lock(&gTZGNLock); + Mutex lock(gTZGNLock()); if (!gTZGNCoreCacheInitialized) { // Create empty hashtable @@ -1292,13 +1298,13 @@ TimeZoneGenericNames* TimeZoneGenericNames::clone() const { TimeZoneGenericNames* other = new TimeZoneGenericNames(); if (other) { - umtx_lock(&gTZGNLock); + umtx_lock(gTZGNLock()); { // Just increments the reference count fRef->refCount++; other->fRef = fRef; } - umtx_unlock(&gTZGNLock); + umtx_unlock(gTZGNLock()); } return other; } diff --git a/deps/icu-small/source/i18n/tzgnames.h b/deps/icu-small/source/i18n/tzgnames.h index d896af8ba82f1b..bcdf0f399ba8a1 100644 --- a/deps/icu-small/source/i18n/tzgnames.h +++ b/deps/icu-small/source/i18n/tzgnames.h @@ -46,7 +46,7 @@ class U_I18N_API TimeZoneGenericNames : public UMemory { static TimeZoneGenericNames* createInstance(const Locale& locale, UErrorCode& status); virtual UBool operator==(const TimeZoneGenericNames& other) const; - virtual UBool operator!=(const TimeZoneGenericNames& other) const {return !operator==(other);}; + virtual UBool operator!=(const TimeZoneGenericNames& other) const {return !operator==(other);} virtual TimeZoneGenericNames* clone() const; UnicodeString& getDisplayName(const TimeZone& tz, UTimeZoneGenericNameType type, diff --git a/deps/icu-small/source/i18n/tznames.cpp b/deps/icu-small/source/i18n/tznames.cpp index 5a79c22aacf8f9..acd6aecdc0ce7e 100644 --- a/deps/icu-small/source/i18n/tznames.cpp +++ b/deps/icu-small/source/i18n/tznames.cpp @@ -29,7 +29,10 @@ U_NAMESPACE_BEGIN // TimeZoneNames object cache handling -static UMutex gTimeZoneNamesLock = U_MUTEX_INITIALIZER; +static UMutex *gTimeZoneNamesLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable *gTimeZoneNamesCache = NULL; static UBool gTimeZoneNamesCacheInitialized = FALSE; @@ -105,7 +108,7 @@ class TimeZoneNamesDelegate : public TimeZoneNames { virtual ~TimeZoneNamesDelegate(); virtual UBool operator==(const TimeZoneNames& other) const; - virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);}; + virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);} virtual TimeZoneNames* clone() const; StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const; @@ -132,7 +135,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate() } TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& status) { - Mutex lock(&gTimeZoneNamesLock); + Mutex lock(gTimeZoneNamesLock()); if (!gTimeZoneNamesCacheInitialized) { // Create empty hashtable if it is not already initialized. gTimeZoneNamesCache = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status); @@ -208,7 +211,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& s } TimeZoneNamesDelegate::~TimeZoneNamesDelegate() { - umtx_lock(&gTimeZoneNamesLock); + umtx_lock(gTimeZoneNamesLock()); { if (fTZnamesCacheEntry) { U_ASSERT(fTZnamesCacheEntry->refCount > 0); @@ -216,7 +219,7 @@ TimeZoneNamesDelegate::~TimeZoneNamesDelegate() { fTZnamesCacheEntry->refCount--; } } - umtx_unlock(&gTimeZoneNamesLock); + umtx_unlock(gTimeZoneNamesLock()); } UBool @@ -237,13 +240,13 @@ TimeZoneNames* TimeZoneNamesDelegate::clone() const { TimeZoneNamesDelegate* other = new TimeZoneNamesDelegate(); if (other != NULL) { - umtx_lock(&gTimeZoneNamesLock); + umtx_lock(gTimeZoneNamesLock()); { // Just increment the reference count fTZnamesCacheEntry->refCount++; other->fTZnamesCacheEntry = fTZnamesCacheEntry; } - umtx_unlock(&gTimeZoneNamesLock); + umtx_unlock(gTimeZoneNamesLock()); } return other; } diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index 6a303ea4a0110f..d6e0ee2fbb637a 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -49,8 +49,10 @@ static const UChar NO_NAME[] = { 0 }; // for empty no-fallback time static const char* TZDBNAMES_KEYS[] = {"ss", "sd"}; static const int32_t TZDBNAMES_KEYS_SIZE = UPRV_LENGTHOF(TZDBNAMES_KEYS); -static UMutex gTZDBNamesMapLock = U_MUTEX_INITIALIZER; -static UMutex gDataMutex = U_MUTEX_INITIALIZER; +static UMutex *gDataMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable* gTZDBNamesMap = NULL; static icu::UInitOnce gTZDBNamesMapInitOnce = U_INITONCE_INITIALIZER; @@ -357,8 +359,6 @@ TextTrieMap::getChildNode(CharacterNode *parent, UChar c) const { return NULL; } -// Mutex for protecting the lazy creation of the Trie node structure on the first call to search(). -static UMutex TextTrieMutex = U_MUTEX_INITIALIZER; // buildTrie() - The Trie node structure is needed. Create it from the data that was // saved at the time the ZoneStringFormatter was created. The Trie is only @@ -386,6 +386,10 @@ TextTrieMap::search(const UnicodeString &text, int32_t start, // the ICU atomic safe functions for assigning and testing. // Don't test the pointer fLazyContents. // Don't do unless it's really required. + + // Mutex for protecting the lazy creation of the Trie node structure on the first call to search(). + static UMutex TextTrieMutex = U_MUTEX_INITIALIZER; + Mutex lock(&TextTrieMutex); if (fLazyContents != NULL) { TextTrieMap *nonConstThis = const_cast(this); @@ -1210,7 +1214,7 @@ TimeZoneNamesImpl::getMetaZoneDisplayName(const UnicodeString& mzID, TimeZoneNamesImpl *nonConstThis = const_cast(this); { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); UErrorCode status = U_ZERO_ERROR; znames = nonConstThis->loadMetaZoneNames(mzID, status); if (U_FAILURE(status)) { return name; } @@ -1236,7 +1240,7 @@ TimeZoneNamesImpl::getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNa TimeZoneNamesImpl *nonConstThis = const_cast(this); { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); UErrorCode status = U_ZERO_ERROR; tznames = nonConstThis->loadTimeZoneNames(tzID, status); if (U_FAILURE(status)) { return name; } @@ -1259,7 +1263,7 @@ TimeZoneNamesImpl::getExemplarLocationName(const UnicodeString& tzID, UnicodeStr TimeZoneNamesImpl *nonConstThis = const_cast(this); { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); UErrorCode status = U_ZERO_ERROR; tznames = nonConstThis->loadTimeZoneNames(tzID, status); if (U_FAILURE(status)) { return name; } @@ -1354,7 +1358,7 @@ TimeZoneNamesImpl::find(const UnicodeString& text, int32_t start, uint32_t types // Synchronize so that data is not loaded multiple times. // TODO: Consider more fine-grained synchronization. { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); // First try of lookup. matches = doFind(handler, text, start, status); @@ -1581,7 +1585,7 @@ void TimeZoneNamesImpl::loadAllDisplayNames(UErrorCode& status) { if (U_FAILURE(status)) return; { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); internalLoadAllDisplayNames(status); } } @@ -1598,7 +1602,7 @@ void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, // Load the time zone strings { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); tznames = (void*) nonConstThis->loadTimeZoneNames(tzID, status); if (U_FAILURE(status)) { return; } } @@ -1618,7 +1622,7 @@ void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, } else { // Load the meta zone strings // Mutex is scoped to the "else" statement - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); mznames = (void*) nonConstThis->loadMetaZoneNames(mzID, status); if (U_FAILURE(status)) { return; } // Note: when the metazone doesn't exist, in Java, loadMetaZoneNames returns @@ -2243,6 +2247,7 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu U_ASSERT(status == U_ZERO_ERROR); // already checked length above mzIDKey[mzID.length()] = 0; + static UMutex gTZDBNamesMapLock = U_MUTEX_INITIALIZER; umtx_lock(&gTZDBNamesMapLock); { void *cacheVal = uhash_get(gTZDBNamesMap, mzIDKey); diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 4c13b9ffcb539a..2f70a8500e1c09 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -60,6 +60,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_CDFINFO, UCLN_I18N_REGION, UCLN_I18N_LIST_FORMATTER, + UCLN_I18N_NUMSYS, UCLN_I18N_COUNT /* This must be last */ } ECleanupI18NType; diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index 56ed5b3c19caca..aa4027eb87212b 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -348,7 +348,7 @@ CollationLoader::loadFromCollations(UErrorCode &errorCode) { const char *actualLocale = ures_getLocaleByType(data, ULOC_ACTUAL_LOCALE, &errorCode); if(U_FAILURE(errorCode)) { return NULL; } const char *vLocale = validLocale.getBaseName(); - UBool actualAndValidLocalesAreDifferent = uprv_strcmp(actualLocale, vLocale) != 0; + UBool actualAndValidLocalesAreDifferent = Locale(actualLocale) != Locale(vLocale); // Set the collation types on the informational locales, // except when they match the default types (for brevity and backwards compatibility). @@ -410,7 +410,7 @@ CollationLoader::loadFromData(UErrorCode &errorCode) { const char *actualLocale = locale.getBaseName(); // without type const char *vLocale = validLocale.getBaseName(); - UBool actualAndValidLocalesAreDifferent = uprv_strcmp(actualLocale, vLocale) != 0; + UBool actualAndValidLocalesAreDifferent = Locale(actualLocale) != Locale(vLocale); // For the actual locale, suppress the default type *according to the actual locale*. // For example, zh has default=pinyin and contains all of the Chinese tailorings. diff --git a/deps/icu-small/source/i18n/udateintervalformat.cpp b/deps/icu-small/source/i18n/udateintervalformat.cpp index 44ba6b9fb1df38..d9eaae4d3e23cf 100644 --- a/deps/icu-small/source/i18n/udateintervalformat.cpp +++ b/deps/icu-small/source/i18n/udateintervalformat.cpp @@ -18,10 +18,21 @@ #include "unicode/timezone.h" #include "unicode/locid.h" #include "unicode/unistr.h" +#include "formattedval_impl.h" U_NAMESPACE_USE +// Magic number: FDIV in ASCII +UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL( + FormattedDateInterval, + UFormattedDateInterval, + UFormattedDateIntervalImpl, + UFormattedDateIntervalApiHelper, + udtitvfmt, + 0x46444956) + + U_CAPI UDateIntervalFormat* U_EXPORT2 udtitvfmt_open(const char* locale, const UChar* skeleton, @@ -105,4 +116,21 @@ udtitvfmt_format(const UDateIntervalFormat* formatter, } +U_DRAFT void U_EXPORT2 +udtitvfmt_formatToResult( + const UDateIntervalFormat* formatter, + UFormattedDateInterval* result, + UDate fromDate, + UDate toDate, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return; + } + auto* resultImpl = UFormattedDateIntervalApiHelper::validate(result, *status); + DateInterval interval = DateInterval(fromDate,toDate); + resultImpl->fImpl = reinterpret_cast(formatter) + ->formatToValue(interval, *status); +} + + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/ulistformatter.cpp b/deps/icu-small/source/i18n/ulistformatter.cpp index c140c784b520cd..f7ad6751d338c0 100644 --- a/deps/icu-small/source/i18n/ulistformatter.cpp +++ b/deps/icu-small/source/i18n/ulistformatter.cpp @@ -15,6 +15,7 @@ #include "unicode/listformatter.h" #include "unicode/localpointer.h" #include "cmemory.h" +#include "formattedval_impl.h" U_NAMESPACE_USE @@ -40,6 +41,49 @@ ulistfmt_close(UListFormatter *listfmt) } +// Magic number: FLST in ASCII +UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL( + FormattedList, + UFormattedList, + UFormattedListImpl, + UFormattedListApiHelper, + ulistfmt, + 0x464C5354) + + +static UnicodeString* getUnicodeStrings( + const UChar* const strings[], + const int32_t* stringLengths, + int32_t stringCount, + UnicodeString* length4StackBuffer, + LocalArray& maybeOwner, + UErrorCode& status) { + U_ASSERT(U_SUCCESS(status)); + if (stringCount < 0 || (strings == NULL && stringCount > 0)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + UnicodeString* ustrings = length4StackBuffer; + if (stringCount > 4) { + maybeOwner.adoptInsteadAndCheckErrorCode(new UnicodeString[stringCount], status); + if (U_FAILURE(status)) { + return nullptr; + } + ustrings = maybeOwner.getAlias(); + } + if (stringLengths == NULL) { + for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { + ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1); + } + } else { + for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { + ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]); + } + } + return ustrings; +} + + U_CAPI int32_t U_EXPORT2 ulistfmt_format(const UListFormatter* listfmt, const UChar* const strings[], @@ -52,27 +96,16 @@ ulistfmt_format(const UListFormatter* listfmt, if (U_FAILURE(*status)) { return -1; } - if (stringCount < 0 || (strings == NULL && stringCount > 0) || ((result == NULL)? resultCapacity != 0 : resultCapacity < 0)) { + if ((result == NULL) ? resultCapacity != 0 : resultCapacity < 0) { *status = U_ILLEGAL_ARGUMENT_ERROR; return -1; } - UnicodeString ustringsStackBuf[4]; - UnicodeString* ustrings = ustringsStackBuf; - if (stringCount > UPRV_LENGTHOF(ustringsStackBuf)) { - ustrings = new UnicodeString[stringCount]; - if (ustrings == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return -1; - } - } - if (stringLengths == NULL) { - for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { - ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1); - } - } else { - for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { - ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]); - } + UnicodeString length4StackBuffer[4]; + LocalArray maybeOwner; + UnicodeString* ustrings = getUnicodeStrings( + strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status); + if (U_FAILURE(*status)) { + return -1; } UnicodeString res; if (result != NULL) { @@ -80,12 +113,33 @@ ulistfmt_format(const UListFormatter* listfmt, // otherwise, alias the destination buffer (copied from udat_format) res.setTo(result, 0, resultCapacity); } - ((const ListFormatter*)listfmt)->format( ustrings, stringCount, res, *status ); - if (ustrings != ustringsStackBuf) { - delete[] ustrings; - } + reinterpret_cast(listfmt)->format( ustrings, stringCount, res, *status ); return res.extract(result, resultCapacity, *status); } +U_CAPI void U_EXPORT2 +ulistfmt_formatStringsToResult( + const UListFormatter* listfmt, + const UChar* const strings[], + const int32_t * stringLengths, + int32_t stringCount, + UFormattedList* uresult, + UErrorCode* status) { + auto* result = UFormattedListApiHelper::validate(uresult, *status); + if (U_FAILURE(*status)) { + return; + } + UnicodeString length4StackBuffer[4]; + LocalArray maybeOwner; + UnicodeString* ustrings = getUnicodeStrings( + strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status); + if (U_FAILURE(*status)) { + return; + } + result->fImpl = reinterpret_cast(listfmt) + ->formatStringsToValue(ustrings, stringCount, *status); +} + + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index 7f6ba9532feebe..2aae3a4d4393e3 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -463,9 +463,7 @@ umsg_vformat( const UMessageFormat *fmt, default: // Unknown/unsupported argument type. - U_ASSERT(FALSE); - *status=U_ILLEGAL_ARGUMENT_ERROR; - break; + UPRV_UNREACHABLE; } } UnicodeString resultStr; @@ -592,13 +590,11 @@ umsg_vparse(const UMessageFormat *fmt, // support kObject. When MessageFormat is changed to // understand MeasureFormats, modify this code to do the // right thing. [alan] - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; // better not happen! case Formattable::kArray: - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/unicode/alphaindex.h b/deps/icu-small/source/i18n/unicode/alphaindex.h index 4ebdf1cc56a1a8..dfb6110a36cf11 100644 --- a/deps/icu-small/source/i18n/unicode/alphaindex.h +++ b/deps/icu-small/source/i18n/unicode/alphaindex.h @@ -651,7 +651,7 @@ class U_I18N_API AlphabeticIndex: public UObject { /** * No assignment. */ - AlphabeticIndex &operator =(const AlphabeticIndex & /*other*/) { return *this;}; + AlphabeticIndex &operator =(const AlphabeticIndex & /*other*/) { return *this;} /** * No Equality operators. diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index 48cadc10b704af..63739c37fd569b 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -44,6 +44,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { /** * Construct an object with the given ISO currency code. + * * @param isoCode the 3-letter ISO 4217 currency code; must have * length 3 and need not be NUL-terminated. If NULL, the currency * is initialized to the unknown currency XXX. @@ -53,6 +54,19 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { */ CurrencyUnit(ConstChar16Ptr isoCode, UErrorCode &ec); +#ifndef U_HIDE_DRAFT_API + /** + * Construct an object with the given ISO currency code. + * + * @param isoCode the 3-letter ISO 4217 currency code; must have + * length 3. If invalid, the currency is initialized to XXX. + * @param ec input-output error code. If the isoCode is invalid, + * then this will be set to a failing value. + * @draft ICU 64 + */ + CurrencyUnit(StringPiece isoCode, UErrorCode &ec); +#endif /* U_HIDE_DRAFT_API */ + /** * Copy constructor * @stable ICU 3.0 diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index b3a5cc0495f144..097a38fb88f6b2 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -63,18 +63,6 @@ class NumberParserImpl; } } -/** - * \cond - * explicit template instantiation. see digitlst.h - * (When building DLLs for Windows this is required.) - */ -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) -template class U_I18N_API EnumSet; -#endif -/** \endcond */ - /** * **IMPORTANT:** New users are strongly encouraged to see if * numberformatter.h fits their use case. Although not deprecated, this header @@ -288,7 +276,7 @@ template class U_I18N_API EnumSetPad escape, precedes pad character * * - *

A DecimalFormat pattern contains a postive and negative + *

A DecimalFormat pattern contains a positive and negative * subpattern, for example, "#,##0.00;(#,##0.00)". Each subpattern has a * prefix, a numeric part, and a suffix. If there is no explicit negative * subpattern, the negative subpattern is the localized minus sign prefixed to the @@ -423,7 +411,7 @@ template class U_I18N_API EnumSetIf the number of actual fraction digits is less than the * minimum fraction digits, then trailing zeros are added. - * For example, 0.125 is formatted as "0.1250" if the mimimum fraction + * For example, 0.125 is formatted as "0.1250" if the minimum fraction * digits is set to 4. * *

  • Trailing fractional zeros are not displayed if they occur @@ -588,9 +576,9 @@ template class U_I18N_API EnumSetgetMaximumSignificantDigits() - 1. For example, the * pattern "@@###E0" is equivalent to "0.0###E0". * - *
  • If signficant digits are in use, then the integer and fraction + *
  • If significant digits are in use, then the integer and fraction * digit counts, as set via the API, are ignored. If significant - * digits are not in use, then the signficant digit counts, as set via + * digits are not in use, then the significant digit counts, as set via * the API, are ignored. * * @@ -644,7 +632,7 @@ template class U_I18N_API EnumSetIn the absense of an explicit rounding increment numbers are + *

    In the absence of an explicit rounding increment numbers are * rounded to their formatted width. * *

    + * + * @draft ICU 60 */ typedef enum UNumberDecimalSeparatorDisplay { /** @@ -408,15 +405,13 @@ typedef enum UNumberDecimalSeparatorDisplay { } UNumberDecimalSeparatorDisplay; #endif /* U_HIDE_DRAFT_API */ -#ifndef U_HIDE_DRAFT_API - struct UNumberFormatter; /** * C-compatible version of icu::number::LocalizedNumberFormatter. * * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. * - * @draft ICU 62 + * @stable ICU 62 */ typedef struct UNumberFormatter UNumberFormatter; @@ -426,7 +421,7 @@ struct UFormattedNumber; * * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. * - * @draft ICU 62 + * @stable ICU 62 */ typedef struct UFormattedNumber UFormattedNumber; @@ -446,24 +441,41 @@ typedef struct UFormattedNumber UFormattedNumber; * @param skeletonLen The number of UChars in the skeleton string, or -1 it it is NUL-terminated. * @param locale The NUL-terminated locale ID. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT UNumberFormatter* U_EXPORT2 +U_STABLE UNumberFormatter* U_EXPORT2 unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const char* locale, UErrorCode* ec); +#ifndef U_HIDE_DRAFT_API /** - * Creates a new UFormattedNumber for holding the result of a number formatting operation. + * Like unumf_openForSkeletonAndLocale, but accepts a UParseError, which will be populated with the + * location of a skeleton syntax error if such a syntax error exists. * - * Objects of type UFormattedNumber are not guaranteed to be threadsafe. - * - * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. + * @param skeleton The skeleton string, like u"percent precision-integer" + * @param skeletonLen The number of UChars in the skeleton string, or -1 it it is NUL-terminated. + * @param locale The NUL-terminated locale ID. + * @param perror A parse error struct populated if an error occurs when parsing. Can be NULL. + * If no error occurs, perror->offset will be set to -1. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT UNumberFormatter* U_EXPORT2 +unumf_openForSkeletonAndLocaleWithError( + const UChar* skeleton, int32_t skeletonLen, const char* locale, UParseError* perror, UErrorCode* ec); +#endif // U_HIDE_DRAFT_API + + +/** + * Creates an object to hold the result of a UNumberFormatter + * operation. The object can be used repeatedly; it is cleared whenever + * passed to a format function. * * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT UFormattedNumber* U_EXPORT2 +U_STABLE UFormattedNumber* U_EXPORT2 unumf_openResult(UErrorCode* ec); @@ -480,9 +492,9 @@ unumf_openResult(UErrorCode* ec); * @param value The number to be formatted. * @param uresult The object that will be mutated to store the result; see unumf_openResult. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult, UErrorCode* ec); @@ -500,9 +512,9 @@ unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNum * @param value The number to be formatted. * @param uresult The object that will be mutated to store the result; see unumf_openResult. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedNumber* uresult, UErrorCode* ec); @@ -524,18 +536,42 @@ unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedN * @param valueLen The length of the numeric string, or -1 if it is NUL-terminated. * @param uresult The object that will be mutated to store the result; see unumf_openResult. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32_t valueLen, UFormattedNumber* uresult, UErrorCode* ec); +#ifndef U_HIDE_DRAFT_API +/** + * Returns a representation of a UFormattedNumber as a UFormattedValue, + * which can be subsequently passed to any API requiring that type. + * + * The returned object is owned by the UFormattedNumber and is valid + * only as long as the UFormattedNumber is present and unchanged in memory. + * + * You can think of this method as a cast between types. + * + * @param uresult The object containing the formatted string. + * @param ec Set if an error occurs. + * @return A UFormattedValue owned by the input object. + * @draft ICU 64 + */ +U_DRAFT const UFormattedValue* U_EXPORT2 +unumf_resultAsValue(const UFormattedNumber* uresult, UErrorCode* ec); +#endif /* U_HIDE_DRAFT_API */ + /** * Extracts the result number string out of a UFormattedNumber to a UChar buffer if possible. * If bufferCapacity is greater than the required length, a terminating NUL is written. * If bufferCapacity is less than the required length, an error code is set. * + * Also see ufmtval_getString, which returns a NUL-terminated string: + * + * int32_t len; + * const UChar* str = ufmtval_getString(unumf_resultAsValue(uresult, &ec), &len, &ec); + * * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. * * @param uresult The object containing the formatted number. @@ -543,9 +579,9 @@ unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32 * @param bufferCapacity The number of UChars available in the buffer. * @param ec Set if an error occurs. * @return The required length. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t bufferCapacity, UErrorCode* ec); @@ -555,6 +591,8 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf * output string. This allows you to determine the locations of, for example, the integer part, * fraction part, or symbols. * + * This is a simpler but less powerful alternative to {@link ufmtval_nextPosition}. + * * If a field occurs just once, calling this method will find that occurrence and return it. If a * field occurs multiple times, this method may be called repeatedly with the following pattern: * @@ -579,9 +617,9 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf * (exclusive index). If a field position is not found, the FieldPosition is not changed and * the method returns FALSE. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* ufpos, UErrorCode* ec); @@ -589,7 +627,10 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u * Populates the given iterator with all fields in the formatted output string. This allows you to * determine the locations of the integer part, fraction part, and sign. * - * If you need information on only one field, use unumf_resultNextFieldPosition(). + * This is an alternative to the more powerful {@link ufmtval_nextPosition} API. + * + * If you need information on only one field, use {@link ufmtval_nextPosition} or + * {@link unumf_resultNextFieldPosition}. * * @param uresult The object containing the formatted number. * @param ufpositer @@ -601,9 +642,9 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u * overlap, but they may nest. For example, 1234 could format as "1,234" which might consist of a * grouping separator field for ',' and an integer field encompassing the entire string. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPositionIterator* ufpositer, UErrorCode* ec); @@ -611,24 +652,20 @@ unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPosition /** * Releases the UNumberFormatter created by unumf_openForSkeletonAndLocale(). * - * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. - * * @param uformatter An object created by unumf_openForSkeletonAndLocale(). - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_close(UNumberFormatter* uformatter); /** * Releases the UFormattedNumber created by unumf_openResult(). * - * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. - * * @param uresult An object created by unumf_openResult(). - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_closeResult(UFormattedNumber* uresult); @@ -648,12 +685,12 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 62 + * @stable ICU 62 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unumf_close); /** - * \class LocalUNumberFormatterPointer + * \class LocalUFormattedNumberPointer * "Smart pointer" class; closes a UFormattedNumber via unumf_closeResult(). * For most methods see the LocalPointerBase base class. * @@ -665,14 +702,12 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unum * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 62 + * @stable ICU 62 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberPointer, UFormattedNumber, unumf_closeResult); U_NAMESPACE_END #endif // U_SHOW_CPLUSPLUS_API -#endif /* U_HIDE_DRAFT_API */ - #endif //__UNUMBERFORMATTER_H__ #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/unicode/unumsys.h b/deps/icu-small/source/i18n/unicode/unumsys.h index 2c794c23d3c8a7..84ceddf84f73f9 100644 --- a/deps/icu-small/source/i18n/unicode/unumsys.h +++ b/deps/icu-small/source/i18n/unicode/unumsys.h @@ -105,6 +105,7 @@ U_NAMESPACE_END /** * Returns an enumeration over the names of all of the predefined numbering systems known * to ICU. + * The numbering system names will be in alphabetical (invariant) order. * @param status A pointer to a UErrorCode to receive any errors. * @return A pointer to a UEnumeration that must be closed with uenum_close(), * or NULL if an error occurred. diff --git a/deps/icu-small/source/i18n/unicode/upluralrules.h b/deps/icu-small/source/i18n/unicode/upluralrules.h index 690846bc89cd01..fc1b2fb57173b8 100644 --- a/deps/icu-small/source/i18n/unicode/upluralrules.h +++ b/deps/icu-small/source/i18n/unicode/upluralrules.h @@ -20,6 +20,9 @@ #include "unicode/unum.h" #endif /* U_HIDE_INTERNAL_API */ +// Forward-declaration +struct UFormattedNumber; + /** * \file * \brief C API: Plural rules, select plural keywords for numeric values. @@ -132,14 +135,15 @@ U_NAMESPACE_END /** - * Given a number, returns the keyword of the first rule that + * Given a floating-point number, returns the keyword of the first rule that * applies to the number, according to the supplied UPluralRules object. * @param uplrules The UPluralRules object specifying the rules. * @param number The number for which the rule has to be determined. - * @param keyword The keyword of the rule that applies to number. - * @param capacity The capacity of keyword. + * @param keyword An output buffer to write the keyword of the rule that + * applies to number. + * @param capacity The capacity of the keyword buffer. * @param status A pointer to a UErrorCode to receive any errors. - * @return The length of keyword. + * @return The length of the keyword. * @stable ICU 4.8 */ U_CAPI int32_t U_EXPORT2 @@ -148,6 +152,31 @@ uplrules_select(const UPluralRules *uplrules, UChar *keyword, int32_t capacity, UErrorCode *status); +#ifndef U_HIDE_DRAFT_API +/** + * Given a formatted number, returns the keyword of the first rule + * that applies to the number, according to the supplied UPluralRules object. + * + * A UFormattedNumber allows you to specify an exponent or trailing zeros, + * which can affect the plural category. To get a UFormattedNumber, see + * {@link UNumberFormatter}. + * + * @param uplrules The UPluralRules object specifying the rules. + * @param number The formatted number for which the rule has to be determined. + * @param keyword The destination buffer for the keyword of the rule that + * applies to number. + * @param capacity The capacity of the keyword buffer. + * @param status A pointer to a UErrorCode to receive any errors. + * @return The length of the keyword. + * @draft ICU 64 + */ +U_CAPI int32_t U_EXPORT2 +uplrules_selectFormatted(const UPluralRules *uplrules, + const struct UFormattedNumber* number, + UChar *keyword, int32_t capacity, + UErrorCode *status); +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_INTERNAL_API /** * Given a number, returns the keyword of the first rule that applies to the @@ -160,7 +189,8 @@ uplrules_select(const UPluralRules *uplrules, * @param fmt The UNumberFormat specifying how the number will be formatted * (this can affect the plural form, e.g. "1 dollar" vs "1.0 dollars"). * If this is NULL, the function behaves like uplrules_select. - * @param keyword The keyword of the rule that applies to number. + * @param keyword An output buffer to write the keyword of the rule that + * applies to number. * @param capacity The capacity of the keyword buffer. * @param status A pointer to a UErrorCode to receive any errors. * @return The length of keyword. diff --git a/deps/icu-small/source/i18n/unicode/uregex.h b/deps/icu-small/source/i18n/unicode/uregex.h index 69c0eead956fc9..cb5e51ef01e856 100644 --- a/deps/icu-small/source/i18n/unicode/uregex.h +++ b/deps/icu-small/source/i18n/unicode/uregex.h @@ -167,6 +167,7 @@ uregex_openUText(UText *pattern, UParseError *pe, UErrorCode *status); +#if !UCONFIG_NO_CONVERSION /** * Open (compile) an ICU regular expression. The resulting regular expression * handle can then be used to perform various matching operations. @@ -190,7 +191,6 @@ uregex_openUText(UText *pattern, * * @stable ICU 3.0 */ -#if !UCONFIG_NO_CONVERSION U_STABLE URegularExpression * U_EXPORT2 uregex_openC( const char *pattern, uint32_t flags, diff --git a/deps/icu-small/source/i18n/unicode/ureldatefmt.h b/deps/icu-small/source/i18n/unicode/ureldatefmt.h index 0eff80a16b2086..1aa554dc7c0d7a 100644 --- a/deps/icu-small/source/i18n/unicode/ureldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/ureldatefmt.h @@ -17,6 +17,7 @@ #include "unicode/unum.h" #include "unicode/udisplaycontext.h" #include "unicode/localpointer.h" +#include "unicode/uformattedvalue.h" /** * \file @@ -174,6 +175,27 @@ typedef enum URelativeDateTimeUnit { #endif /* U_HIDE_DEPRECATED_API */ } URelativeDateTimeUnit; +#ifndef U_HIDE_DRAFT_API +/** + * FieldPosition and UFieldPosition selectors for format fields + * defined by RelativeDateTimeFormatter. + * @draft ICU 64 + */ +typedef enum URelativeDateTimeFormatterField { + /** + * Represents a literal text string, like "tomorrow" or "days ago". + * @draft ICU 64 + */ + UDAT_REL_LITERAL_FIELD, + /** + * Represents a number quantity, like "3" in "3 days ago". + * @draft ICU 64 + */ + UDAT_REL_NUMERIC_FIELD, +} URelativeDateTimeFormatterField; +#endif // U_HIDE_DRAFT_API + + /** * Opaque URelativeDateTimeFormatter object for use in C programs. * @stable ICU 57 @@ -230,6 +252,54 @@ ureldatefmt_open( const char* locale, U_STABLE void U_EXPORT2 ureldatefmt_close(URelativeDateTimeFormatter *reldatefmt); +#ifndef U_HIDE_DRAFT_API +struct UFormattedRelativeDateTime; +/** + * Opaque struct to contain the results of a URelativeDateTimeFormatter operation. + * @draft ICU 64 + */ +typedef struct UFormattedRelativeDateTime UFormattedRelativeDateTime; + +/** + * Creates an object to hold the result of a URelativeDateTimeFormatter + * operation. The object can be used repeatedly; it is cleared whenever + * passed to a format function. + * + * @param ec Set if an error occurs. + * @return A pointer needing ownership. + * @draft ICU 64 + */ +U_DRAFT UFormattedRelativeDateTime* U_EXPORT2 +ureldatefmt_openResult(UErrorCode* ec); + +/** + * Returns a representation of a UFormattedRelativeDateTime as a UFormattedValue, + * which can be subsequently passed to any API requiring that type. + * + * The returned object is owned by the UFormattedRelativeDateTime and is valid + * only as long as the UFormattedRelativeDateTime is present and unchanged in memory. + * + * You can think of this method as a cast between types. + * + * @param ufrdt The object containing the formatted string. + * @param ec Set if an error occurs. + * @return A UFormattedValue owned by the input object. + * @draft ICU 64 + */ +U_DRAFT const UFormattedValue* U_EXPORT2 +ureldatefmt_resultAsValue(const UFormattedRelativeDateTime* ufrdt, UErrorCode* ec); + +/** + * Releases the UFormattedRelativeDateTime created by ureldatefmt_openResult. + * + * @param ufrdt The object to release. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ureldatefmt_closeResult(UFormattedRelativeDateTime* ufrdt); +#endif /* U_HIDE_DRAFT_API */ + + #if U_SHOW_CPLUSPLUS_API U_NAMESPACE_BEGIN @@ -245,6 +315,19 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalURelativeDateTimeFormatterPointer, URelativeDateTimeFormatter, ureldatefmt_close); +#ifndef U_HIDE_DRAFT_API +/** + * \class LocalUFormattedRelativeDateTimePointer + * "Smart pointer" class, closes a UFormattedRelativeDateTime via ureldatefmt_closeResult(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @draft ICU 64 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedRelativeDateTimePointer, UFormattedRelativeDateTime, ureldatefmt_closeResult); +#endif /* U_HIDE_DRAFT_API */ + U_NAMESPACE_END #endif @@ -285,6 +368,39 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt, int32_t resultCapacity, UErrorCode* status); +#ifndef U_HIDE_DRAFT_API +/** + * Format a combination of URelativeDateTimeUnit and numeric + * offset using a numeric style, e.g. "1 week ago", "in 1 week", + * "5 weeks ago", "in 5 weeks". + * + * @param reldatefmt + * The URelativeDateTimeFormatter object specifying the + * format conventions. + * @param offset + * The signed offset for the specified unit. This will + * be formatted according to this object's UNumberFormat + * object. + * @param unit + * The unit to use when formatting the relative + * date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY. + * @param result + * A pointer to a UFormattedRelativeDateTime to populate. + * @param status + * A pointer to a UErrorCode to receive any errors. In + * case of error status, the contents of result are + * undefined. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ureldatefmt_formatNumericToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status); +#endif /* U_HIDE_DRAFT_API */ + /** * Format a combination of URelativeDateTimeUnit and numeric offset * using a text style if possible, e.g. "last week", "this week", @@ -321,6 +437,42 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, int32_t resultCapacity, UErrorCode* status); +#ifndef U_HIDE_DRAFT_API +/** + * Format a combination of URelativeDateTimeUnit and numeric offset + * using a text style if possible, e.g. "last week", "this week", + * "next week", "yesterday", "tomorrow". Falls back to numeric + * style if no appropriate text term is available for the specified + * offset in the object's locale. + * + * This method populates a UFormattedRelativeDateTime, which exposes more + * information than the string populated by format(). + * + * @param reldatefmt + * The URelativeDateTimeFormatter object specifying the + * format conventions. + * @param offset + * The signed offset for the specified unit. + * @param unit + * The unit to use when formatting the relative + * date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY. + * @param result + * A pointer to a UFormattedRelativeDateTime to populate. + * @param status + * A pointer to a UErrorCode to receive any errors. In + * case of error status, the contents of result are + * undefined. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ureldatefmt_formatToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status); +#endif /* U_HIDE_DRAFT_API */ + /** * Combines a relative date string and a time string in this object's * locale. This is done with the same date-time separator used for the diff --git a/deps/icu-small/source/i18n/upluralrules.cpp b/deps/icu-small/source/i18n/upluralrules.cpp index bba6dfe3101ec3..5119257fd804f7 100644 --- a/deps/icu-small/source/i18n/upluralrules.cpp +++ b/deps/icu-small/source/i18n/upluralrules.cpp @@ -17,7 +17,9 @@ #include "unicode/unistr.h" #include "unicode/unum.h" #include "unicode/numfmt.h" +#include "unicode/unumberformatter.h" #include "number_decimalquantity.h" +#include "number_utypes.h" U_NAMESPACE_USE @@ -91,6 +93,28 @@ uplrules_select(const UPluralRules *uplrules, return result.extract(keyword, capacity, *status); } +U_CAPI int32_t U_EXPORT2 +uplrules_selectFormatted(const UPluralRules *uplrules, + const UFormattedNumber* number, + UChar *keyword, int32_t capacity, + UErrorCode *status) +{ + if (U_FAILURE(*status)) { + return 0; + } + if (keyword == NULL ? capacity != 0 : capacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + const number::impl::DecimalQuantity* dq = + number::impl::validateUFormattedNumberToDecimalQuantity(number, *status); + if (U_FAILURE(*status)) { + return 0; + } + UnicodeString result = ((PluralRules*)uplrules)->select(*dq); + return result.extract(keyword, capacity, *status); +} + U_CAPI int32_t U_EXPORT2 uplrules_selectWithFormat(const UPluralRules *uplrules, double number, diff --git a/deps/icu-small/source/i18n/uregex.cpp b/deps/icu-small/source/i18n/uregex.cpp index f504aec91bd7c3..ff6e65b38e2d60 100644 --- a/deps/icu-small/source/i18n/uregex.cpp +++ b/deps/icu-small/source/i18n/uregex.cpp @@ -767,7 +767,7 @@ uregex_start64(URegularExpression *regexp2, if (validateRE(regexp, TRUE, status) == FALSE) { return 0; } - int32_t result = regexp->fMatcher->start(groupNum, *status); + int64_t result = regexp->fMatcher->start64(groupNum, *status); return result; } @@ -791,7 +791,7 @@ uregex_end64(URegularExpression *regexp2, if (validateRE(regexp, TRUE, status) == FALSE) { return 0; } - int32_t result = regexp->fMatcher->end(groupNum, *status); + int64_t result = regexp->fMatcher->end64(groupNum, *status); return result; } diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp index 0e4cca77a13ae0..0e9b876d2babb7 100644 --- a/deps/icu-small/source/i18n/usearch.cpp +++ b/deps/icu-small/source/i18n/usearch.cpp @@ -3544,9 +3544,7 @@ const CEI *CEIBuffer::get(int32_t index) { // Verify that it is the next one in sequence, which is all // that is allowed. if (index != limitIx) { - U_ASSERT(FALSE); - - return NULL; + UPRV_UNREACHABLE; } // Manage the circular CE buffer indexing @@ -3583,9 +3581,7 @@ const CEI *CEIBuffer::getPrevious(int32_t index) { // Verify that it is the next one in sequence, which is all // that is allowed. if (index != limitIx) { - U_ASSERT(FALSE); - - return NULL; + UPRV_UNREACHABLE; } // Manage the circular CE buffer indexing diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 710adcd08daeaf..c8fbec27bb9b6f 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -43,7 +43,9 @@ static UnicodeSet *gRecommendedSet = NULL; static const Normalizer2 *gNfdNormalizer = NULL; static UInitOnce gSpoofInitStaticsOnce = U_INITONCE_INITIALIZER; -static UBool U_CALLCONV +namespace { + +UBool U_CALLCONV uspoof_cleanup(void) { delete gInclusionSet; gInclusionSet = NULL; @@ -54,7 +56,7 @@ uspoof_cleanup(void) { return TRUE; } -static void U_CALLCONV initializeStatics(UErrorCode &status) { +void U_CALLCONV initializeStatics(UErrorCode &status) { static const char16_t *inclusionPat = u"['\\-.\\:\\u00B7\\u0375\\u058A\\u05F3\\u05F4\\u06FD\\u06FE\\u0F0B\\u200C" u"\\u200D\\u2010\\u2019\\u2027\\u30A0\\u30FB]"; @@ -69,7 +71,6 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { // There is tooling to generate this constant in the unicodetools project: // org.unicode.text.tools.RecommendedSetGenerator // It will print the Java and C++ code to the console for easy copy-paste into this file. - // Note: concatenated string constants do not work with UNICODE_STRING_SIMPLE on all platforms. static const char16_t *recommendedPat = u"[0-9A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u0131\\u0134-\\u013E" u"\\u0141-\\u0148\\u014A-\\u017E\\u018F\\u01A0\\u01A1\\u01AF\\u01B0\\u01CD-" @@ -107,37 +108,36 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { u"\\u0D8E\\u0D91-\\u0D96\\u0D9A-\\u0DA5\\u0DA7-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD" u"\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDE\\u0DF2\\u0E01-" u"\\u0E32\\u0E34-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84" - u"\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3" - u"\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB2\\u0EB4-\\u0EB9\\u0EBB-\\u0EBD" - u"\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00" - u"\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C" - u"\\u0F4E-\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C" - u"\\u0F71\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-" - u"\\u0F97\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-" - u"\\u0FB8\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD" - u"\\u10D0-\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D" - u"\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-" - u"\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6" - u"\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F" - u"\\u1780-\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7" - u"\\u17DC\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-" - u"\\u1E99\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45" - u"\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72" - u"\\u1F74\\u1F76\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC" - u"\\u1FC2-\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA" - u"\\u1FE0-\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA" - u"\\u1FFC\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-" - u"\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-" - u"\\u2DDE\\u3005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-" - u"\\u30FA\\u30FC-\\u30FE\\u3105-\\u312F\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-" - u"\\u9FEF\\uA660\\uA661\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788" - u"\\uA78D\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE\\uA7AF\\uA7B8\\uA7B9" - u"\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06\\uAB09-" - u"\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAC00-\\uD7A3\\uFA0E" - u"\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29" - u"\\U0001133B\\U0001B002-\\U0001B11E\\U00020000-\\U0002A6D6\\U0002A700-" - u"\\U0002B734\\U0002B740-\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-" - u"\\U0002EBE0]"; + u"\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB2\\u0EB4-\\u0EBD\\u0EC0-" + u"\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00\\u0F20-" + u"\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C\\u0F4E-" + u"\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C\\u0F71" + u"\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-\\u0F97" + u"\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-\\u0FB8" + u"\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD\\u10D0-" + u"\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D\\u1250-" + u"\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0" + u"\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-" + u"\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u1780-" + u"\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7\\u17DC" + u"\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-\\u1E99" + u"\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-" + u"\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72\\u1F74" + u"\\u1F76\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC\\u1FC2-" + u"\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA\\u1FE0-" + u"\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA\\u1FFC" + u"\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6" + u"\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE" + u"\\u3005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-\\u30FA" + u"\\u30FC-\\u30FE\\u3105-\\u312F\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-\\u9FEF" + u"\\uA660\\uA661\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788\\uA78D" + u"\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE\\uA7AF\\uA7B8-\\uA7BF\\uA7C2-" + u"\\uA7C6\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06" + u"\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB66\\uAB67" + u"\\uAC00-\\uD7A3\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23" + u"\\uFA24\\uFA27-\\uFA29\\U0001133B\\U0001B150-\\U0001B152\\U0001B164-" + u"\\U0001B167\\U00020000-\\U0002A6D6\\U0002A700-\\U0002B734\\U0002B740-" + u"\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-\\U0002EBE0]"; gRecommendedSet = new UnicodeSet(UnicodeString(recommendedPat), status); if (gRecommendedSet == NULL) { @@ -150,6 +150,8 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup); } +} // namespace + U_CFUNC void uspoof_internalInitStatics(UErrorCode *status) { umtx_initOnce(gSpoofInitStaticsOnce, &initializeStatics, *status); } @@ -547,6 +549,8 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, return uspoof_check2UnicodeString(sc, id, NULL, status); } +namespace { + int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* checkResult, UErrorCode* status) { U_ASSERT(This != NULL); U_ASSERT(checkResult != NULL); @@ -639,6 +643,8 @@ int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* c return checkResult->toCombinedBitmask(This->fChecks); } +} // namespace + U_CAPI int32_t U_EXPORT2 uspoof_check2UnicodeString(const USpoofChecker *sc, const icu::UnicodeString &id, diff --git a/deps/icu-small/source/i18n/uspoof_impl.cpp b/deps/icu-small/source/i18n/uspoof_impl.cpp index c1034c2e53f6e9..85a028bdfa02f2 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.cpp +++ b/deps/icu-small/source/i18n/uspoof_impl.cpp @@ -52,7 +52,6 @@ SpoofImpl::SpoofImpl() { } void SpoofImpl::construct(UErrorCode& status) { - fMagic = USPOOF_MAGIC; fChecks = USPOOF_ALL_CHECKS; fSpoofData = NULL; fAllowedCharsSet = NULL; @@ -74,12 +73,11 @@ void SpoofImpl::construct(UErrorCode& status) { // Copy Constructor, used by the user level clone() function. SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : - fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , + fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , fAllowedLocales(NULL) { if (U_FAILURE(status)) { return; } - fMagic = src.fMagic; fChecks = src.fChecks; if (src.fSpoofData != NULL) { fSpoofData = src.fSpoofData->addReference(); @@ -93,8 +91,6 @@ SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : } SpoofImpl::~SpoofImpl() { - fMagic = 0; // head off application errors by preventing use of - // of deleted objects. if (fSpoofData != NULL) { fSpoofData->removeReference(); // Will delete if refCount goes to zero. } @@ -104,7 +100,7 @@ SpoofImpl::~SpoofImpl() { // Cast this instance as a USpoofChecker for the C API. USpoofChecker *SpoofImpl::asUSpoofChecker() { - return reinterpret_cast(this); + return exportForC(); } // @@ -112,18 +108,10 @@ USpoofChecker *SpoofImpl::asUSpoofChecker() { // received from the C API. // const SpoofImpl *SpoofImpl::validateThis(const USpoofChecker *sc, UErrorCode &status) { + auto* This = validate(sc, status); if (U_FAILURE(status)) { return NULL; } - if (sc == NULL) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - SpoofImpl *This = (SpoofImpl *)sc; - if (This->fMagic != USPOOF_MAGIC) { - status = U_INVALID_FORMAT_ERROR; - return NULL; - } if (This->fSpoofData != NULL && !This->fSpoofData->validateDataVersion(status)) { return NULL; } @@ -454,12 +442,12 @@ UChar32 SpoofImpl::ScanHex(const UChar *s, int32_t start, int32_t limit, UErrorC // //----------------------------------------- -CheckResult::CheckResult() : fMagic(USPOOF_CHECK_MAGIC) { +CheckResult::CheckResult() { clear(); } USpoofCheckResult* CheckResult::asUSpoofCheckResult() { - return reinterpret_cast(this); + return exportForC(); } // @@ -467,22 +455,11 @@ USpoofCheckResult* CheckResult::asUSpoofCheckResult() { // received from the C API. // const CheckResult* CheckResult::validateThis(const USpoofCheckResult *ptr, UErrorCode &status) { - if (U_FAILURE(status)) { return NULL; } - if (ptr == NULL) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - CheckResult *This = (CheckResult*) ptr; - if (This->fMagic != USPOOF_CHECK_MAGIC) { - status = U_INVALID_FORMAT_ERROR; - return NULL; - } - return This; + return validate(ptr, status); } CheckResult* CheckResult::validateThis(USpoofCheckResult *ptr, UErrorCode &status) { - return const_cast - (CheckResult::validateThis(const_cast(ptr), status)); + return validate(ptr, status); } void CheckResult::clear() { @@ -752,9 +729,7 @@ void *SpoofData::reserveSpace(int32_t numBytes, UErrorCode &status) { return NULL; } if (!fDataOwned) { - U_ASSERT(FALSE); - status = U_INTERNAL_PROGRAM_ERROR; - return NULL; + UPRV_UNREACHABLE; } numBytes = (numBytes + 15) & ~15; // Round up to a multiple of 16 diff --git a/deps/icu-small/source/i18n/uspoof_impl.h b/deps/icu-small/source/i18n/uspoof_impl.h index 7d6d0f76e34275..8844a96446e2b5 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.h +++ b/deps/icu-small/source/i18n/uspoof_impl.h @@ -27,6 +27,8 @@ #ifdef __cplusplus +#include "capi_helper.h" + U_NAMESPACE_BEGIN // The maximium length (in UTF-16 UChars) of the skeleton replacement string resulting from @@ -52,7 +54,8 @@ class ConfusableDataUtils; * Class SpoofImpl corresponds directly to the plain C API opaque type * USpoofChecker. One can be cast to the other. */ -class SpoofImpl : public UObject { +class SpoofImpl : public UObject, + public IcuCApiHelper { public: SpoofImpl(SpoofData *data, UErrorCode& status); SpoofImpl(UErrorCode& status); @@ -96,7 +99,6 @@ class SpoofImpl : public UObject { // Data Members // - int32_t fMagic; // Internal sanity check. int32_t fChecks; // Bit vector of checks to perform. SpoofData *fSpoofData; @@ -112,7 +114,8 @@ class SpoofImpl : public UObject { * Class CheckResult corresponds directly to the plain C API opaque type * USpoofCheckResult. One can be cast to the other. */ -class CheckResult : public UObject { +class CheckResult : public UObject, + public IcuCApiHelper { public: CheckResult(); virtual ~CheckResult(); @@ -127,7 +130,6 @@ class CheckResult : public UObject { int32_t toCombinedBitmask(int32_t expectedChecks); // Data Members - int32_t fMagic; // Internal sanity check. int32_t fChecks; // Bit vector of checks that were failed. UnicodeSet fNumerics; // Set of numerics found in the string. URestrictionLevel fRestrictionLevel; // The restriction level of the string. diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index b7139a807b3fb7..0e3ee893161122 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -30,7 +30,10 @@ #include "olsontz.h" #include "uinvchar.h" -static UMutex gZoneMetaLock = U_MUTEX_INITIALIZER; +static icu::UMutex *gZoneMetaLock() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} // CLDR Canonical ID mapping table static UHashtable *gCanonicalIDCache = NULL; @@ -263,11 +266,11 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { } // Check if it was already cached - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { canonicalID = (const UChar *)uhash_get(gCanonicalIDCache, utzid); } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); if (canonicalID != NULL) { return canonicalID; @@ -348,7 +351,7 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { U_ASSERT(canonicalID != NULL); // canocanilD must be non-NULL here // Put the resolved canonical ID to the cache - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { const UChar* idInCache = (const UChar *)uhash_get(gCanonicalIDCache, utzid); if (idInCache == NULL) { @@ -368,7 +371,7 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { } } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); } return canonicalID; @@ -446,14 +449,14 @@ ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &country, // Check if it was already cached UBool cached = FALSE; UBool singleZone = FALSE; - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { singleZone = cached = gSingleZoneCountries->contains((void*)region); if (!cached) { cached = gMultiZonesCountries->contains((void*)region); } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); if (!cached) { // We need to go through all zones associated with the region. @@ -472,7 +475,7 @@ ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &country, delete ids; // Cache the result - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { UErrorCode ec = U_ZERO_ERROR; if (singleZone) { @@ -485,7 +488,7 @@ ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &country, } } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); } if (singleZone) { @@ -572,11 +575,11 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { // get the mapping from cache const UVector *result = NULL; - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { result = (UVector*) uhash_get(gOlsonToMeta, tzidUChars); } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); if (result != NULL) { return result; @@ -590,7 +593,7 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { } // put the new one into the cache - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { // make sure it's already created result = (UVector*) uhash_get(gOlsonToMeta, tzidUChars); @@ -618,7 +621,7 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { delete tmpResult; } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); return result; } @@ -784,14 +787,13 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { UResourceBundle *rb = ures_openDirect(NULL, gMetaZones, &status); UResourceBundle *bundle = ures_getByKey(rb, gMapTimezonesTag, NULL, &status); - UResourceBundle res; - ures_initStackObject(&res); + StackUResourceBundle res; while (U_SUCCESS(status) && ures_hasNext(bundle)) { - ures_getNextResource(bundle, &res, &status); + ures_getNextResource(bundle, res.getAlias(), &status); if (U_FAILURE(status)) { break; } - const char *mzID = ures_getKey(&res); + const char *mzID = ures_getKey(res.getAlias()); int32_t len = static_cast(uprv_strlen(mzID)); UChar *uMzID = (UChar*)uprv_malloc(sizeof(UChar) * (len + 1)); if (uMzID == NULL) { @@ -809,7 +811,6 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { delete usMzID; } } - ures_close(&res); ures_close(bundle); ures_close(rb); diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp index f51a86ea96fc1b..a056098ecebca6 100644 --- a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -327,6 +327,9 @@ bool fixLine(int /*no*/, std::string &linestr) { // start from the end and find all u" cases size_t pos = len = linestr.size(); + if(len>INT32_MAX/2) { + return true; + } while((pos>0) && (pos = linestr.rfind("u\"", pos)) != std::string::npos) { //printf("found doublequote at %d\n", pos); if(fixAt(linestr, pos)) return true; @@ -391,15 +394,19 @@ int convert(const std::string &infile, const std::string &outfile) { while( getline( inf, linestr)) { no++; if(fixLine(no, linestr)) { - outf.close(); - fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str()); - cleanup(outfile); - return 1; + goto fail; } outf << linestr << '\n'; } - return 0; + if(inf.eof()) { + return 0; + } +fail: + outf.close(); + fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str()); + cleanup(outfile); + return 1; } /** diff --git a/deps/icu-small/source/tools/genrb/filterrb.cpp b/deps/icu-small/source/tools/genrb/filterrb.cpp new file mode 100644 index 00000000000000..d62d185d773224 --- /dev/null +++ b/deps/icu-small/source/tools/genrb/filterrb.cpp @@ -0,0 +1,236 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include +#include + +#include "filterrb.h" +#include "errmsg.h" + + +const char* PathFilter::kEInclusionNames[] = { + "INCLUDE", + "PARTIAL", + "EXCLUDE" +}; + + +ResKeyPath::ResKeyPath() {} + +ResKeyPath::ResKeyPath(const std::string& path, UErrorCode& status) { + if (path.empty() || path[0] != '/') { + std::cerr << "genrb error: path must start with /: " << path << std::endl; + status = U_PARSE_ERROR; + return; + } + size_t i; + size_t j = 0; + while (true) { + i = j + 1; + j = path.find('/', i); + std::string key = path.substr(i, j - i); + if (key.empty()) { + std::cerr << "genrb error: empty subpaths and trailing slashes are not allowed: " << path << std::endl; + status = U_PARSE_ERROR; + return; + } + push(key); + if (j == std::string::npos) { + break; + } + } +} + +void ResKeyPath::push(const std::string& key) { + fPath.push_back(key); +} + +void ResKeyPath::pop() { + fPath.pop_back(); +} + +const std::list& ResKeyPath::pieces() const { + return fPath; +} + +std::ostream& operator<<(std::ostream& out, const ResKeyPath& value) { + if (value.pieces().empty()) { + out << "/"; + } else for (auto& key : value.pieces()) { + out << "/" << key; + } + return out; +} + + +PathFilter::~PathFilter() = default; + + +void SimpleRuleBasedPathFilter::addRule(const std::string& ruleLine, UErrorCode& status) { + if (ruleLine.empty()) { + std::cerr << "genrb error: empty filter rules are not allowed" << std::endl; + status = U_PARSE_ERROR; + return; + } + bool inclusionRule = false; + if (ruleLine[0] == '+') { + inclusionRule = true; + } else if (ruleLine[0] != '-') { + std::cerr << "genrb error: rules must start with + or -: " << ruleLine << std::endl; + status = U_PARSE_ERROR; + return; + } + ResKeyPath path(ruleLine.substr(1), status); + addRule(path, inclusionRule, status); +} + +void SimpleRuleBasedPathFilter::addRule(const ResKeyPath& path, bool inclusionRule, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + fRoot.applyRule(path, path.pieces().begin(), inclusionRule, status); +} + +PathFilter::EInclusion SimpleRuleBasedPathFilter::match(const ResKeyPath& path) const { + const Tree* node = &fRoot; + + // defaultResult "bubbles up" the nearest "definite" inclusion/exclusion rule + EInclusion defaultResult = INCLUDE; + if (node->fIncluded != PARTIAL) { + // rules handled here: "+/" and "-/" + defaultResult = node->fIncluded; + } + + // isLeaf is whether the filter tree can provide no additional information + // even if additional subpaths are added to the given key + bool isLeaf = false; + + for (auto& key : path.pieces()) { + auto child = node->fChildren.find(key); + // Leaf case 1: input path descends outside the filter tree + if (child == node->fChildren.end()) { + if (node->fWildcard) { + // A wildcard pattern is present; continue checking + node = node->fWildcard.get(); + } else { + isLeaf = true; + break; + } + } else { + node = &child->second; + } + if (node->fIncluded != PARTIAL) { + defaultResult = node->fIncluded; + } + } + + // Leaf case 2: input path exactly matches a filter leaf + if (node->isLeaf()) { + isLeaf = true; + } + + // Always return PARTIAL if we are not at a leaf + if (!isLeaf) { + return PARTIAL; + } + + // If leaf node is PARTIAL, return the default + if (node->fIncluded == PARTIAL) { + return defaultResult; + } + + return node->fIncluded; +} + + +SimpleRuleBasedPathFilter::Tree::Tree(const Tree& other) + : fIncluded(other.fIncluded), fChildren(other.fChildren) { + // Note: can't use the default copy assignment because of the std::unique_ptr + if (other.fWildcard) { + fWildcard.reset(new Tree(*other.fWildcard)); + } +} + +bool SimpleRuleBasedPathFilter::Tree::isLeaf() const { + return fChildren.empty() && !fWildcard; +} + +void SimpleRuleBasedPathFilter::Tree::applyRule( + const ResKeyPath& path, + std::list::const_iterator it, + bool inclusionRule, + UErrorCode& status) { + + // Base Case + if (it == path.pieces().end()) { + if (isVerbose() && (fIncluded != PARTIAL || !isLeaf())) { + std::cout << "genrb info: rule on path " << path + << " overrides previous rules" << std::endl; + } + fIncluded = inclusionRule ? INCLUDE : EXCLUDE; + fChildren.clear(); + fWildcard.reset(); + return; + } + + // Recursive Step + auto& key = *it; + if (key == "*") { + // Case 1: Wildcard + if (!fWildcard) { + fWildcard.reset(new Tree()); + } + // Apply the rule to fWildcard and also to all existing children. + it++; + fWildcard->applyRule(path, it, inclusionRule, status); + for (auto& child : fChildren) { + child.second.applyRule(path, it, inclusionRule, status); + } + it--; + + } else { + // Case 2: Normal Key + auto search = fChildren.find(key); + if (search == fChildren.end()) { + if (fWildcard) { + // Deep-copy the existing wildcard tree into the new key + search = fChildren.emplace(key, Tree(*fWildcard)).first; + } else { + search = fChildren.emplace(key, Tree()).first; + } + } + it++; + search->second.applyRule(path, it, inclusionRule, status); + it--; + } +} + +void SimpleRuleBasedPathFilter::Tree::print(std::ostream& out, int32_t indent) const { + for (int32_t i=0; iprint(out, indent + 1); + for (int32_t i=0; i +#include +#include +#include +#include + +#include "unicode/utypes.h" + + +/** + * Represents an absolute path into a resource bundle. + * For example: "/units/length/meter" + */ +class ResKeyPath { +public: + /** Constructs an empty path (top of tree) */ + ResKeyPath(); + + /** Constructs from a string path */ + ResKeyPath(const std::string& path, UErrorCode& status); + + void push(const std::string& key); + void pop(); + + const std::list& pieces() const; + + private: + std::list fPath; +}; + +std::ostream& operator<<(std::ostream& out, const ResKeyPath& value); + + +/** + * Interface used to determine whether to include or reject pieces of a + * resource bundle based on their absolute path. + */ +class PathFilter { +public: + enum EInclusion { + INCLUDE, + PARTIAL, + EXCLUDE + }; + + static const char* kEInclusionNames[]; + + virtual ~PathFilter(); + + /** + * Returns an EInclusion on whether or not the given path should be included. + * + * INCLUDE = include the whole subtree + * PARTIAL = recurse into the subtree + * EXCLUDE = reject the whole subtree + */ + virtual EInclusion match(const ResKeyPath& path) const = 0; +}; + + +/** + * Implementation of PathFilter for a list of inclusion/exclusion rules. + * + * The wildcard pattern "*" means that the subsequent filters are applied to + * every other tree sharing the same parent. + * + * For example, given this list of filter rules: + */ +// -/alabama +// +/alabama/alaska/arizona +// -/fornia/hawaii +// -/mississippi +// +/mississippi/michigan +// +/mississippi/*/maine +// -/mississippi/*/iowa +// +/mississippi/louisiana/iowa +/* + * You get the following structure: + * + * SimpleRuleBasedPathFilter { + * included: PARTIAL + * alabama: { + * included: EXCLUDE + * alaska: { + * included: PARTIAL + * arizona: { + * included: INCLUDE + * } + * } + * } + * fornia: { + * included: PARTIAL + * hawaii: { + * included: EXCLUDE + * } + * } + * mississippi: { + * included: EXCLUDE + * louisiana: { + * included: PARTIAL + * iowa: { + * included: INCLUDE + * } + * maine: { + * included: INCLUDE + * } + * } + * michigan: { + * included: INCLUDE + * iowa: { + * included: EXCLUDE + * } + * maine: { + * included: INCLUDE + * } + * } + * * { + * included: PARTIAL + * iowa: { + * included: EXCLUDE + * } + * maine: { + * included: INCLUDE + * } + * } + * } + * } + */ +class SimpleRuleBasedPathFilter : public PathFilter { +public: + void addRule(const std::string& ruleLine, UErrorCode& status); + void addRule(const ResKeyPath& path, bool inclusionRule, UErrorCode& status); + + EInclusion match(const ResKeyPath& path) const override; + + void print(std::ostream& out) const; + +private: + struct Tree { + + Tree() = default; + + /** Copy constructor */ + Tree(const Tree& other); + + /** + * Information on the USER-SPECIFIED inclusion/exclusion. + * + * INCLUDE = this path exactly matches a "+" rule + * PARTIAL = this path does not match any rule, but subpaths exist + * EXCLUDE = this path exactly matches a "-" rule + */ + EInclusion fIncluded = PARTIAL; + std::map fChildren; + std::unique_ptr fWildcard; + + void applyRule( + const ResKeyPath& path, + std::list::const_iterator it, + bool inclusionRule, + UErrorCode& status); + + bool isLeaf() const; + + void print(std::ostream& out, int32_t indent) const; + }; + + Tree fRoot; +}; + +std::ostream& operator<<(std::ostream& out, const SimpleRuleBasedPathFilter& value); + + +#endif //__FILTERRB_H__ diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index c4fc462066a099..885f3039bf6d7b 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -18,6 +18,11 @@ ******************************************************************************* */ +#include +#include +#include +#include + #include #include "genrb.h" #include "unicode/localpointer.h" @@ -25,13 +30,15 @@ #include "unicode/utf16.h" #include "charstr.h" #include "cmemory.h" +#include "filterrb.h" #include "reslist.h" #include "ucmndata.h" /* TODO: for reading the pool bundle */ U_NAMESPACE_USE /* Protos */ -void processFile(const char *filename, const char* cp, const char *inputDir, const char *outputDir, +void processFile(const char *filename, const char* cp, + const char *inputDir, const char *outputDir, const char *filterDir, const char *packageName, SRBRoot *newPoolBundle, UBool omitBinaryCollation, UErrorCode &status); static char *make_res_filename(const char *filename, const char *outputDir, @@ -76,7 +83,8 @@ enum FORMAT_VERSION, WRITE_POOL_BUNDLE, USE_POOL_BUNDLE, - INCLUDE_UNIHAN_COLL + INCLUDE_UNIHAN_COLL, + FILTERDIR }; UOption options[]={ @@ -99,9 +107,10 @@ UOption options[]={ UOPTION_DEF("language", 'l', UOPT_REQUIRES_ARG), /* 16 */ UOPTION_DEF("omitCollationRules", 'R', UOPT_NO_ARG),/* 17 */ UOPTION_DEF("formatVersion", '\x01', UOPT_REQUIRES_ARG),/* 18 */ - UOPTION_DEF("writePoolBundle", '\x01', UOPT_NO_ARG),/* 19 */ + UOPTION_DEF("writePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 19 */ UOPTION_DEF("usePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 20 */ UOPTION_DEF("includeUnihanColl", '\x01', UOPT_NO_ARG),/* 21 */ /* temporary, don't display in usage info */ + UOPTION_DEF("filterDir", '\x01', UOPT_OPTIONAL_ARG), /* 22 */ }; static UBool write_java = FALSE; @@ -121,6 +130,7 @@ main(int argc, const char *arg = NULL; const char *outputDir = NULL; /* NULL = no output directory, use current */ const char *inputDir = NULL; + const char *filterDir = NULL; const char *encoding = ""; int i; UBool illegalArg = FALSE; @@ -224,10 +234,13 @@ main(int argc, "\t --formatVersion write a .res file compatible with the requested formatVersion (single digit);\n" "\t for example, --formatVersion 1\n"); fprintf(stderr, - "\t --writePoolBundle write a pool.res file with all of the keys of all input bundles\n" - "\t --usePoolBundle [path-to-pool.res] point to keys from the pool.res keys pool bundle if they are available there;\n" + "\t --writePoolBundle [directory] write a pool.res file with all of the keys of all input bundles\n" + "\t --usePoolBundle [directory] point to keys from the pool.res keys pool bundle if they are available there;\n" "\t makes .res files smaller but dependent on the pool bundle\n" "\t (--writePoolBundle and --usePoolBundle cannot be combined)\n"); + fprintf(stderr, + "\t --filterDir Input directory where filter files are available.\n" + "\t For more on filter files, see Python buildtool.\n"); return illegalArg ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } @@ -254,6 +267,10 @@ main(int argc, outputDir = options[DESTDIR].value; } + if (options[FILTERDIR].doesOccur) { + filterDir = options[FILTERDIR].value; + } + if(options[ENCODING].doesOccur) { encoding = options[ENCODING].value; } @@ -524,7 +541,7 @@ main(int argc, if (isVerbose()) { printf("Processing file \"%s\"\n", theCurrentFileName.data()); } - processFile(arg, encoding, inputDir, outputDir, NULL, + processFile(arg, encoding, inputDir, outputDir, filterDir, NULL, newPoolBundle.getAlias(), options[NO_BINARY_COLLATION].doesOccur, status); } @@ -532,8 +549,14 @@ main(int argc, poolBundle.close(); if(U_SUCCESS(status) && options[WRITE_POOL_BUNDLE].doesOccur) { + const char* writePoolDir; + if (options[WRITE_POOL_BUNDLE].value!=NULL) { + writePoolDir = options[WRITE_POOL_BUNDLE].value; + } else { + writePoolDir = outputDir; + } char outputFileName[256]; - newPoolBundle->write(outputDir, NULL, outputFileName, sizeof(outputFileName), status); + newPoolBundle->write(writePoolDir, NULL, outputFileName, sizeof(outputFileName), status); if(U_FAILURE(status)) { fprintf(stderr, "unable to write the pool bundle: %s\n", u_errorName(status)); } @@ -552,19 +575,17 @@ main(int argc, /* Process a file */ void processFile(const char *filename, const char *cp, - const char *inputDir, const char *outputDir, const char *packageName, + const char *inputDir, const char *outputDir, const char *filterDir, + const char *packageName, SRBRoot *newPoolBundle, UBool omitBinaryCollation, UErrorCode &status) { LocalPointer data; - UCHARBUF *ucbuf = NULL; - char *rbname = NULL; - char *openFileName = NULL; - char *inputDirBuf = NULL; - - char outputFileName[256]; + LocalUCHARBUFPointer ucbuf; + CharString openFileName; + CharString inputDirBuf; + char outputFileName[256]; int32_t dirlen = 0; - int32_t filelen = 0; if (U_FAILURE(status)) { return; @@ -572,14 +593,10 @@ processFile(const char *filename, const char *cp, if(filename==NULL){ status=U_ILLEGAL_ARGUMENT_ERROR; return; - }else{ - filelen = (int32_t)uprv_strlen(filename); } if(inputDir == NULL) { const char *filenameBegin = uprv_strrchr(filename, U_FILE_SEP_CHAR); - openFileName = (char *) uprv_malloc(dirlen + filelen + 2); - openFileName[0] = '\0'; if (filenameBegin != NULL) { /* * When a filename ../../../data/root.txt is specified, @@ -588,31 +605,15 @@ processFile(const char *filename, const char *cp, * another file, like UCARules.txt or thaidict.brk. */ int32_t filenameSize = (int32_t)(filenameBegin - filename + 1); - inputDirBuf = uprv_strncpy((char *)uprv_malloc(filenameSize), filename, filenameSize); - - /* test for NULL */ - if(inputDirBuf == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto finish; - } + inputDirBuf.append(filename, filenameSize, status); - inputDirBuf[filenameSize - 1] = 0; - inputDir = inputDirBuf; - dirlen = (int32_t)uprv_strlen(inputDir); + inputDir = inputDirBuf.data(); + dirlen = inputDirBuf.length(); } }else{ dirlen = (int32_t)uprv_strlen(inputDir); if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) { - openFileName = (char *) uprv_malloc(dirlen + filelen + 2); - - /* test for NULL */ - if(openFileName == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto finish; - } - - openFileName[0] = '\0'; /* * append the input dir to openFileName if the first char in * filename is not file seperation char and the last char input directory is not '.'. @@ -625,49 +626,80 @@ processFile(const char *filename, const char *cp, * genrb -s. icu/data --- start from CWD and look in icu/data dir */ if( (filename[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')){ - uprv_strcpy(openFileName, inputDir); - openFileName[dirlen] = U_FILE_SEP_CHAR; + openFileName.append(inputDir, status); } - openFileName[dirlen + 1] = '\0'; } else { - openFileName = (char *) uprv_malloc(dirlen + filelen + 1); - - /* test for NULL */ - if(openFileName == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto finish; - } - - uprv_strcpy(openFileName, inputDir); - + openFileName.append(inputDir, status); } } + openFileName.appendPathPart(filename, status); - uprv_strcat(openFileName, filename); + // Test for CharString failure + if (U_FAILURE(status)) { + return; + } - ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, &status); + ucbuf.adoptInstead(ucbuf_open(openFileName.data(), &cp,getShowWarning(),TRUE, &status)); if(status == U_FILE_ACCESS_ERROR) { - fprintf(stderr, "couldn't open file %s\n", openFileName == NULL ? filename : openFileName); - goto finish; + fprintf(stderr, "couldn't open file %s\n", openFileName.data()); + return; } - if (ucbuf == NULL || U_FAILURE(status)) { + if (ucbuf.isNull() || U_FAILURE(status)) { fprintf(stderr, "An error occurred processing file %s. Error: %s\n", - openFileName == NULL ? filename : openFileName, u_errorName(status)); - goto finish; + openFileName.data(), u_errorName(status)); + return; } /* auto detected popular encodings? */ if (cp!=NULL && isVerbose()) { printf("autodetected encoding %s\n", cp); } /* Parse the data into an SRBRoot */ - data.adoptInstead(parse(ucbuf, inputDir, outputDir, filename, + data.adoptInstead(parse(ucbuf.getAlias(), inputDir, outputDir, filename, !omitBinaryCollation, options[NO_COLLATION_RULES].doesOccur, &status)); if (data.isNull() || U_FAILURE(status)) { fprintf(stderr, "couldn't parse the file %s. Error:%s\n", filename, u_errorName(status)); - goto finish; + return; } + + // Run filtering before writing pool bundle + if (filterDir != nullptr) { + CharString filterFileName(filterDir, status); + filterFileName.appendPathPart(filename, status); + if (U_FAILURE(status)) { + return; + } + + // Open the file and read it into filter + SimpleRuleBasedPathFilter filter; + std::ifstream f(filterFileName.data()); + if (f.fail()) { + std::cerr << "genrb error: unable to open " << filterFileName.data() << std::endl; + status = U_FILE_ACCESS_ERROR; + return; + } + std::string currentLine; + while (std::getline(f, currentLine)) { + // Ignore # comments and empty lines + if (currentLine.empty() || currentLine[0] == '#') { + continue; + } + filter.addRule(currentLine, status); + if (U_FAILURE(status)) { + return; + } + } + + if (isVerbose()) { + filter.print(std::cout); + } + + // Apply the filter to the data + ResKeyPath path; + data->fRoot->applyFilter(filter, path, data.getAlias()); + } + if(options[WRITE_POOL_BUNDLE].doesOccur) { data->fWritePoolBundle = newPoolBundle; data->compactKeys(status); @@ -677,7 +709,7 @@ processFile(const char *filename, const char *cp, if(U_FAILURE(status)) { fprintf(stderr, "bundle_compactKeys(%s) or bundle_getKeyBytes() failed: %s\n", filename, u_errorName(status)); - goto finish; + return; } /* count the number of just-added key strings */ for(const char *newKeysLimit = newKeys + newKeysLength; newKeys < newKeysLimit; ++newKeys) { @@ -692,11 +724,11 @@ processFile(const char *filename, const char *cp, } /* Determine the target rb filename */ - rbname = make_res_filename(filename, outputDir, packageName, status); + uprv_free(make_res_filename(filename, outputDir, packageName, status)); if(U_FAILURE(status)) { fprintf(stderr, "couldn't make the res fileName for bundle %s. Error:%s\n", filename, u_errorName(status)); - goto finish; + return; } if(write_java== TRUE){ bundle_write_java(data.getAlias(), outputDir, outputEnc, @@ -713,24 +745,6 @@ processFile(const char *filename, const char *cp, if (U_FAILURE(status)) { fprintf(stderr, "couldn't write bundle %s. Error:%s\n", outputFileName, u_errorName(status)); } - -finish: - - if (inputDirBuf != NULL) { - uprv_free(inputDirBuf); - } - - if (openFileName != NULL) { - uprv_free(openFileName); - } - - if(ucbuf) { - ucbuf_close(ucbuf); - } - - if (rbname) { - uprv_free(rbname); - } } /* Generate the target .res file name from the input file name */ diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 1f6246d3cfbf46..884d5d5666081a 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -2000,6 +2000,8 @@ parse(UCHARBUF *buf, const char *inputDir, const char *outputDir, const char *fi if (state.bundle == NULL || U_FAILURE(*status)) { + delete state.bundle; + return NULL; } diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp index 0493347ebe5194..bf57516047e901 100644 --- a/deps/icu-small/source/tools/genrb/reslist.cpp +++ b/deps/icu-small/source/tools/genrb/reslist.cpp @@ -28,13 +28,17 @@ #endif #include +#include +#include #include + #include "unicode/localpointer.h" #include "reslist.h" #include "unewdata.h" #include "unicode/ures.h" #include "unicode/putil.h" #include "errmsg.h" +#include "filterrb.h" #include "uarrsort.h" #include "uelement.h" @@ -42,6 +46,8 @@ #include "uinvchar.h" #include "ustr_imp.h" #include "unicode/utf16.h" +#include "uassert.h" + /* * Align binary data at a 16-byte offset from the start of the resource bundle, * to be safe for any data type it may contain. @@ -921,9 +927,6 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, if (f16BitUnits.length() & 1) { f16BitUnits.append((UChar)0xaaaa); /* pad to multiple of 4 bytes */ } - /* all keys have been mapped */ - uprv_free(fKeyMap); - fKeyMap = NULL; byteOffset = fKeysTop + f16BitUnits.length() * 2; fRoot->preWrite(&byteOffset); @@ -1037,14 +1040,15 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, // Swap to big-endian so we get the same checksum on all platforms // (except for charset family, due to the key strings). UnicodeString s(f16BitUnits); - s.append((UChar)1); // Ensure that we own this buffer. assert(!s.isBogus()); - uint16_t *p = const_cast(reinterpret_cast(s.getBuffer())); + // .getBuffer(capacity) returns a mutable buffer + char16_t* p = s.getBuffer(f16BitUnits.length()); for (int32_t count = f16BitUnits.length(); count > 0; --count) { uint16_t x = *p; *p++ = (uint16_t)((x << 8) | (x >> 8)); } - checksum = computeCRC((const char *)p, + s.releaseBuffer(f16BitUnits.length()); + checksum = computeCRC((const char *)s.getBuffer(), (uint32_t)f16BitUnits.length() * 2, checksum); } indexes[URES_INDEX_POOL_CHECKSUM] = (int32_t)checksum; @@ -1127,7 +1131,8 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo : fRoot(NULL), fLocale(NULL), fIndexLength(0), fMaxTableLength(0), fNoFallback(FALSE), fStringsForm(STRINGS_UTF16_V1), fIsPoolBundle(isPoolBundle), fKeys(NULL), fKeyMap(NULL), - fKeysBottom(0), fKeysTop(0), fKeysCapacity(0), fKeysCount(0), fLocalKeyLimit(0), + fKeysBottom(0), fKeysTop(0), fKeysCapacity(0), + fKeysCount(0), fLocalKeyLimit(0), f16BitUnits(), f16BitStringsLength(0), fUsePoolBundle(&kNoPoolBundle), fPoolStringIndexLimit(0), fPoolStringIndex16Limit(0), fLocalStringIndexLimit(0), @@ -1232,6 +1237,9 @@ int32_t SRBRoot::addKeyBytes(const char *keyBytes, int32_t length, UErrorCode &errorCode) { int32_t keypos; + // It is not legal to add new key bytes after compactKeys is run! + U_ASSERT(fKeyMap == nullptr); + if (U_FAILURE(errorCode)) { return -1; } @@ -1333,11 +1341,35 @@ compareKeyOldpos(const void * /*context*/, const void *l, const void *r) { return compareInt32(((const KeyMapEntry *)l)->oldpos, ((const KeyMapEntry *)r)->oldpos); } +void SResource::collectKeys(std::function collector) const { + collector(fKey); +} + +void ContainerResource::collectKeys(std::function collector) const { + collector(fKey); + for (SResource* curr = fFirst; curr != NULL; curr = curr->fNext) { + curr->collectKeys(collector); + } +} + void SRBRoot::compactKeys(UErrorCode &errorCode) { KeyMapEntry *map; char *keys; int32_t i; + + // Except for pool bundles, keys might not be used. + // Do not add unused keys to the final bundle. + std::set keysInUse; + if (!fIsPoolBundle) { + fRoot->collectKeys([&keysInUse](int32_t key) { + if (key >= 0) { + keysInUse.insert(key); + } + }); + fKeysCount = static_cast(keysInUse.size()); + } + int32_t keysCount = fUsePoolBundle->fKeysCount + fKeysCount; if (U_FAILURE(errorCode) || fKeysCount == 0 || fKeyMap != NULL) { return; @@ -1356,11 +1388,23 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { ++keys; /* skip the NUL */ } keys = fKeys + fKeysBottom; - for (; i < keysCount; ++i) { - map[i].oldpos = (int32_t)(keys - fKeys); - map[i].newpos = 0; - while (*keys != 0) { ++keys; } /* skip the key */ - ++keys; /* skip the NUL */ + while (i < keysCount) { + int32_t keyOffset = static_cast(keys - fKeys); + if (!fIsPoolBundle && keysInUse.count(keyOffset) == 0) { + // Mark the unused key as deleted + while (*keys != 0) { *keys++ = 1; } + *keys++ = 1; + } else { + map[i].oldpos = keyOffset; + map[i].newpos = 0; + while (*keys != 0) { ++keys; } /* skip the key */ + ++keys; /* skip the NUL */ + i++; + } + } + if (keys != fKeys + fKeysTop) { + // Throw away any unused keys from the end + fKeysTop = static_cast(keys - fKeys); } /* Sort the keys so that each one is immediately followed by all of its suffixes. */ uprv_sortArray(map, keysCount, (int32_t)sizeof(KeyMapEntry), @@ -1403,7 +1447,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { for (k = keyLimit; suffix < suffixLimit && *--k == *--suffixLimit;) {} if (suffix == suffixLimit && *k == *suffixLimit) { map[j].newpos = map[i].oldpos + offset; /* yes, point to the earlier key */ - /* mark the suffix as deleted */ + // Mark the suffix as deleted while (*suffix != 0) { *suffix++ = 1; } *suffix = 1; } else { @@ -1437,7 +1481,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { keys[newpos++] = keys[oldpos++]; } } - assert(i == keysCount); + U_ASSERT(i == keysCount); } fKeysTop = newpos; /* Re-sort once more, by old offsets for binary searching. */ @@ -1691,3 +1735,55 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { // +1 to account for the initial zero in f16BitUnits assert(f16BitUnits.length() <= (f16BitStringsLength + 1)); } + +void SResource::applyFilter( + const PathFilter& /*filter*/, + ResKeyPath& /*path*/, + const SRBRoot* /*bundle*/) { + // Only a few resource types (tables) are capable of being filtered. +} + +void TableResource::applyFilter( + const PathFilter& filter, + ResKeyPath& path, + const SRBRoot* bundle) { + SResource* prev = nullptr; + SResource* curr = fFirst; + for (; curr != nullptr;) { + path.push(curr->getKeyString(bundle)); + auto inclusion = filter.match(path); + if (inclusion == PathFilter::EInclusion::INCLUDE) { + // Include whole subtree + // no-op + if (isVerbose()) { + std::cout << "genrb subtree: " << bundle->fLocale << ": INCLUDE: " << path << std::endl; + } + } else if (inclusion == PathFilter::EInclusion::EXCLUDE) { + // Reject the whole subtree + // Remove it from the linked list + if (isVerbose()) { + std::cout << "genrb subtree: " << bundle->fLocale << ": DELETE: " << path << std::endl; + } + if (prev == nullptr) { + fFirst = curr->fNext; + } else { + prev->fNext = curr->fNext; + } + fCount--; + delete curr; + curr = prev; + } else { + U_ASSERT(inclusion == PathFilter::EInclusion::PARTIAL); + // Recurse into the child + curr->applyFilter(filter, path, bundle); + } + path.pop(); + + prev = curr; + if (curr == nullptr) { + curr = fFirst; + } else { + curr = curr->fNext; + } + } +} diff --git a/deps/icu-small/source/tools/genrb/reslist.h b/deps/icu-small/source/tools/genrb/reslist.h index 53ade5b82c07e8..34b710c4232670 100644 --- a/deps/icu-small/source/tools/genrb/reslist.h +++ b/deps/icu-small/source/tools/genrb/reslist.h @@ -23,6 +23,8 @@ #define KEY_SPACE_SIZE 65536 #define RESLIST_MAX_INT_VECTOR 2048 +#include + #include "unicode/utypes.h" #include "unicode/unistr.h" #include "unicode/ures.h" @@ -36,7 +38,9 @@ U_CDECL_BEGIN +class PathFilter; class PseudoListResource; +class ResKeyPath; struct ResFile { ResFile() @@ -212,6 +216,19 @@ struct SResource { void write(UNewDataMemory *mem, uint32_t *byteOffset); virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); + /** + * Applies the given filter with the given base path to this resource. + * Removes child resources rejected by the filter recursively. + * + * @param bundle Needed in order to access the key for this and child resources. + */ + virtual void applyFilter(const PathFilter& filter, ResKeyPath& path, const SRBRoot* bundle); + + /** + * Calls the given function for every key ID present in this tree. + */ + virtual void collectKeys(std::function collector) const; + int8_t fType; /* nominal type: fRes (when != 0xffffffff) may use subtype */ UBool fWritten; /* res_write() can exit early */ uint32_t fRes; /* resource item word; RES_BOGUS=0xffffffff if not known yet */ @@ -231,7 +248,10 @@ class ContainerResource : public SResource { fCount(0), fFirst(NULL) {} virtual ~ContainerResource(); - virtual void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode); + void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode) override; + + void collectKeys(std::function collector) const override; + protected: void writeAllRes16(SRBRoot *bundle); void preWriteAllRes(uint32_t *byteOffset); @@ -254,9 +274,11 @@ class TableResource : public ContainerResource { void add(SResource *res, int linenumber, UErrorCode &errorCode); - virtual void handleWrite16(SRBRoot *bundle); - virtual void handlePreWrite(uint32_t *byteOffset); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); + void handleWrite16(SRBRoot *bundle) override; + void handlePreWrite(uint32_t *byteOffset) override; + void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) override; + + void applyFilter(const PathFilter& filter, ResKeyPath& path, const SRBRoot* bundle) override; int8_t fTableType; // determined by table_write16() for table_preWrite() & table_write() SRBRoot *fRoot; diff --git a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp index d7e5721c2d0fab..9d512a3ae5b628 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp +++ b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp @@ -504,7 +504,6 @@ main(int argc, char* argv[]) { if (o.files != NULL) { pkg_deleteList(o.files); } - return result; } @@ -544,6 +543,7 @@ static int runCommand(const char* command, UBool specialHandling) { int result = system(cmd); if (result != 0) { fprintf(stderr, "-- return status = %d\n", result); + result = 1; // system() result code is platform specific. } if (cmd != cmdBuffer && cmd != command) { @@ -1350,8 +1350,8 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c if (IN_STATIC_MODE(mode)) { if (cmd == NULL) { - length = uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + - uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE; + length = static_cast(uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + + uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE); if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { fprintf(stderr, "Unable to allocate memory for command.\n"); return -1; @@ -1376,15 +1376,15 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c } } else /* if (IN_DLL_MODE(mode)) */ { if (cmd == NULL) { - length = uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + + length = static_cast(uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) + uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) + - uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE; + uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE); #if U_PLATFORM == U_PF_CYGWIN - length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]); + length += static_cast(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION])); #elif U_PLATFORM == U_PF_MINGW - length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]); + length += static_cast(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW])); #endif if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { fprintf(stderr, "Unable to allocate memory for command.\n"); @@ -1516,8 +1516,8 @@ static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode uprv_strcpy(tempObjectFile, gencFilePath); tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o'; - length = uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) - + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE; + length = static_cast(uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) + + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE); cmd = (char *)uprv_malloc(sizeof(char) * length); if (cmd == NULL) { @@ -1905,7 +1905,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { char *tmpGenlibFlagBuffer = NULL; int32_t i, offset; - length = uprv_strlen(flag) + 1; + length = static_cast(uprv_strlen(flag) + 1); tmpGenlibFlagBuffer = (char *)uprv_malloc(length); if (tmpGenlibFlagBuffer == NULL) { /* Memory allocation error */ @@ -1915,7 +1915,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { uprv_strcpy(tmpGenlibFlagBuffer, flag); - offset = uprv_strlen(rm_cmd); + offset = static_cast(uprv_strlen(rm_cmd)); for (i = 0; i < (length - offset); i++) { flag[i] = tmpGenlibFlagBuffer[offset + i]; @@ -1928,7 +1928,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { } flag = pkgDataFlags[BIR_FLAGS]; - length = uprv_strlen(pkgDataFlags[BIR_FLAGS]); + length = static_cast(uprv_strlen(pkgDataFlags[BIR_FLAGS])); for (int32_t i = 0; i < length; i++) { if (flag[i] == MAP_FILE_EXT[count]) { @@ -1988,7 +1988,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { int32_t length = 0; flag = pkgDataFlags[GENLIB]; - length = uprv_strlen(pkgDataFlags[GENLIB]); + length = static_cast(uprv_strlen(pkgDataFlags[GENLIB])); int32_t position = length - 1; @@ -2006,7 +2006,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { int32_t length = 0; flag = pkgDataFlags[GENLIB]; - length = uprv_strlen(pkgDataFlags[GENLIB]); + length = static_cast(uprv_strlen(pkgDataFlags[GENLIB])); int32_t position = length - 1; @@ -2117,8 +2117,8 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) fprintf(stderr, "pkgdata: Error: absolute path encountered. Old style paths are not supported. Use relative paths such as 'fur.res' or 'translit%cfur.res'.\n\tBad path: '%s'\n", U_FILE_SEP_CHAR, s); exit(U_ILLEGAL_ARGUMENT_ERROR); } - tmpLength = uprv_strlen(o->srcDir) + - uprv_strlen(s) + 5; /* 5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ + /* The +5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ + tmpLength = static_cast(uprv_strlen(o->srcDir) + uprv_strlen(s) + 5); if((tmp = (char *)uprv_malloc(tmpLength)) == NULL) { fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); exit(U_MEMORY_ALLOCATION_ERROR); diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp index 5ab0d846302179..2a8425e334119e 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp @@ -309,16 +309,11 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr T_FileStream_writeLine(out, assemblyHeader[assemblyHeaderIndex].beginLine); for(;;) { + memset(buffer, 0, sizeof(buffer)); length=T_FileStream_read(in, buffer, sizeof(buffer)); if(length==0) { break; } - if (length != sizeof(buffer)) { - /* pad with extra 0's when at the end of the file */ - for(i=0; i < (length % sizeof(uint32_t)); ++i) { - buffer[length+i] = 0; - } - } for(i=0; i<(length/sizeof(buffer[0])); i++) { column = write32(out, buffer[i], column); } @@ -685,23 +680,30 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char *pBits=32; *pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB); #elif U_PLATFORM_HAS_WIN32_API -/* _M_IA64 should be defined in windows.h */ -# if defined(_M_IA64) - *pCPU=IMAGE_FILE_MACHINE_IA64; - *pBits = 64; -# elif defined(_M_AMD64) -// link.exe does not really care about the .obj machine type and this will -// allow us to build a dll for both ARM & x64 with an amd64 built tool -// ARM is same as x64 except for first 2 bytes of object file - *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; - // *pCPU = IMAGE_FILE_MACHINE_ARMNT; // If we wanted to be explicit - // *pCPU = IMAGE_FILE_MACHINE_AMD64; // We would use one of these names - *pBits = 64; // Doesn't seem to be used for anything interesting? + // Windows always runs in little-endian mode. + *pIsBigEndian = FALSE; + + // Note: The various _M_ macros are predefined by the MSVC compiler based + // on the target compilation architecture. + // https://docs.microsoft.com/cpp/preprocessor/predefined-macros + + // link.exe will link an IMAGE_FILE_MACHINE_UNKNOWN data-only .obj file + // no matter what architecture it is targeting (though other values are + // required to match). Unfortunately, the variable name decoration/mangling + // is slightly different on x86, which means we can't use the UNKNOWN type + // for all architectures though. +# if defined(_M_IX86) + *pCPU = IMAGE_FILE_MACHINE_I386; # else - *pCPU=IMAGE_FILE_MACHINE_I386; // We would use one of these names + *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; +# endif +# if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64) + *pBits = 64; // Doesn't seem to be used for anything interesting though? +# elif defined(_M_IX86) || defined(_M_ARM) *pBits = 32; +# else +# error "Unknown platform for CAN_GENERATE_OBJECTS." # endif - *pIsBigEndian=FALSE; #else # error "Unknown platform for CAN_GENERATE_OBJECTS." #endif diff --git a/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp b/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp index 423e4b7363c790..29a1f7bc1809d3 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp @@ -379,14 +379,14 @@ createCommonDataFile(const char *destDir, const char *name, const char *entrypoi " {0, 0, 0, 0}\n" " },\n" " \"\", %lu, 0, {\n", - (unsigned long)32-4-sizeof(UDataInfo), - (unsigned long)fileCount, + static_cast(32-4-sizeof(UDataInfo)), + static_cast(fileCount), entrypointName, - (unsigned long)sizeof(UDataInfo), + static_cast(sizeof(UDataInfo)), U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, U_SIZEOF_UCHAR, - (unsigned long)fileCount + static_cast(fileCount) ); T_FileStream_writeLine(out, buffer); diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.cpp b/deps/icu-small/source/tools/toolutil/swapimpl.cpp index e8850cb9864168..926755a2aa8c36 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.cpp +++ b/deps/icu-small/source/tools/toolutil/swapimpl.cpp @@ -41,6 +41,7 @@ #include "uarrsort.h" #include "ucmndata.h" #include "udataswp.h" +#include "ulayout_props.h" /* swapping implementations in common */ @@ -640,6 +641,106 @@ unorm_swap(const UDataSwapper *ds, #endif +// Unicode text layout properties data swapping -------------------------------- + +static int32_t U_CALLCONV +ulayout_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + // udata_swapDataHeader checks the arguments. + int32_t headerSize = udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if (pErrorCode == nullptr || U_FAILURE(*pErrorCode)) { + return 0; + } + + // Check data format and format version. + const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4); + if (!( + pInfo->dataFormat[0] == ULAYOUT_FMT_0 && // dataFormat="Layo" + pInfo->dataFormat[1] == ULAYOUT_FMT_1 && + pInfo->dataFormat[2] == ULAYOUT_FMT_2 && + pInfo->dataFormat[3] == ULAYOUT_FMT_3 && + pInfo->formatVersion[0] == 1)) { + udata_printError(ds, + "ulayout_swap(): data format %02x.%02x.%02x.%02x (format version %02x) " + "is not recognized as text layout properties data\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode = U_UNSUPPORTED_ERROR; + return 0; + } + + const uint8_t *inBytes = (const uint8_t *)inData + headerSize; + uint8_t *outBytes = (uint8_t *)outData + headerSize; + + const int32_t *inIndexes = (const int32_t *)inBytes; + + if (length >= 0) { + length -= headerSize; + if (length < 12 * 4) { + udata_printError(ds, + "ulayout_swap(): too few bytes (%d after header) for text layout properties data\n", + length); + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + int32_t indexesLength = udata_readInt32(ds, inIndexes[ULAYOUT_IX_INDEXES_LENGTH]); + if (indexesLength < 12) { + udata_printError(ds, + "ulayout_swap(): too few indexes (%d) for text layout properties data\n", + indexesLength); + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + // Read the data offsets before swapping anything. + int32_t indexes[ULAYOUT_IX_TRIES_TOP + 1]; + for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) { + indexes[i] = udata_readInt32(ds, inIndexes[i]); + } + int32_t size = indexes[ULAYOUT_IX_TRIES_TOP]; + + if (length >= 0) { + if (length < size) { + udata_printError(ds, + "ulayout_swap(): too few bytes (%d after header) " + "for all of text layout properties data\n", + length); + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + // Copy the data for inaccessible bytes. + if (inBytes != outBytes) { + uprv_memcpy(outBytes, inBytes, size); + } + + // Swap the int32_t indexes[]. + int32_t offset = 0; + int32_t count = indexesLength * 4; + ds->swapArray32(ds, inBytes, count, outBytes, pErrorCode); + offset += count; + + // Swap each trie. + for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) { + int32_t top = indexes[i]; + count = top - offset; + U_ASSERT(count >= 0); + if (count >= 16) { + utrie_swapAnyVersion(ds, inBytes + offset, count, outBytes + offset, pErrorCode); + } + offset = top; + } + + U_ASSERT(offset == size); + } + + return headerSize + size; +} + /* Swap 'Test' data from gentest */ static int32_t U_CALLCONV test_swap(const UDataSwapper *ds, @@ -731,6 +832,10 @@ static const struct { { { 0x4e, 0x6f, 0x72, 0x6d }, unorm_swap }, /* dataFormat="Norm" */ { { 0x4e, 0x72, 0x6d, 0x32 }, unorm2_swap }, /* dataFormat="Nrm2" */ #endif + + { { ULAYOUT_FMT_0, ULAYOUT_FMT_1, ULAYOUT_FMT_2, ULAYOUT_FMT_3 }, + ulayout_swap }, // dataFormat="Layo" + #if !UCONFIG_NO_COLLATION { { 0x55, 0x43, 0x6f, 0x6c }, ucol_swap }, /* dataFormat="UCol" */ { { 0x49, 0x6e, 0x76, 0x43 }, ucol_swapInverseUCA },/* dataFormat="InvC" */ diff --git a/deps/icu-small/source/tools/toolutil/toolutil.cpp b/deps/icu-small/source/tools/toolutil/toolutil.cpp index 0f7d0984a8b232..21dca7fe5d6a82 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.cpp +++ b/deps/icu-small/source/tools/toolutil/toolutil.cpp @@ -143,7 +143,7 @@ findDirname(const char *path, char *buffer, int32_t bufLen, UErrorCode* status) resultLen = 0; } else { resultPtr = path; - resultLen = basename - path; + resultLen = static_cast(basename - path); if(resultLen<1) { resultLen = 1; /* '/' or '/a' -> '/' */ } diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.cpp b/deps/icu-small/source/tools/toolutil/ucbuf.cpp index 5269c8177cab7f..9b5e615d258c92 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.cpp +++ b/deps/icu-small/source/tools/toolutil/ucbuf.cpp @@ -178,7 +178,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ memmove(buf->buffer,buf->currentPos,offset* sizeof(UChar)); } -#if UCBUF_DEBUG +#ifdef UCBUF_DEBUG memset(pTarget+offset,0xff,sizeof(UChar)*(MAX_IN_BUF-offset)); #endif if(buf->isBuffered){ @@ -295,7 +295,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ } outputWritten = (int32_t)(target - pTarget); -#if UCBUF_DEBUG +#ifdef UCBUF_DEBUG { int i; target = pTarget; diff --git a/deps/icu-small/source/tools/toolutil/ucmstate.cpp b/deps/icu-small/source/tools/toolutil/ucmstate.cpp index 277657522963fa..206c2f172eb1c5 100644 --- a/deps/icu-small/source/tools/toolutil/ucmstate.cpp +++ b/deps/icu-small/source/tools/toolutil/ucmstate.cpp @@ -653,7 +653,8 @@ compactToUnicode2(UCMStates *states, /* for each lead byte */ for(i=0; i<256; ++i) { entry=states->stateTable[leadState][i]; - if(MBCS_ENTRY_IS_TRANSITION(entry) && (MBCS_ENTRY_TRANSITION_STATE(entry))==trailState) { + if(MBCS_ENTRY_IS_TRANSITION(entry) && + (MBCS_ENTRY_TRANSITION_STATE(entry))==static_cast(trailState)) { /* the offset is different for each lead byte */ offset=MBCS_ENTRY_TRANSITION_OFFSET(entry); /* for each trail byte for this lead byte */ From e5bd72640dca075921180d092e67998adaf6668f Mon Sep 17 00:00:00 2001 From: Ujjwal Sharma Date: Tue, 23 Apr 2019 18:21:33 +0530 Subject: [PATCH 2/2] deps: update LICENSE and tools/icu/current_ver.dep Update the LICENSE file and tools/icu/current_ver.dep file in order to finalize the upgrade to ICU 64.2 --- LICENSE | 10 +++++----- tools/icu/current_ver.dep | 12 ++---------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/LICENSE b/LICENSE index 59f5c0e6ecd462..6125b8268a41ca 100644 --- a/LICENSE +++ b/LICENSE @@ -118,8 +118,8 @@ The externally maintained libraries used by Node.js are: """ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) - Copyright © 1991-2018 Unicode, Inc. All rights reserved. - Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + Copyright © 1991-2019 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in https://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation @@ -1103,7 +1103,7 @@ The externally maintained libraries used by Node.js are: // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -- jinja2, located at tools/jinja2, is licensed as follows: +- jinja2, located at tools/inspector_protocol/jinja2, is licensed as follows: """ Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. @@ -1138,7 +1138,7 @@ The externally maintained libraries used by Node.js are: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -- markupsafe, located at tools/markupsafe, is licensed as follows: +- markupsafe, located at tools/inspector_protocol/markupsafe, is licensed as follows: """ Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS for more details. @@ -1255,7 +1255,7 @@ The externally maintained libraries used by Node.js are: WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -- gtest, located at deps/gtest, is licensed as follows: +- gtest, located at test/cctest/gtest, is licensed as follows: """ Copyright 2008, Google Inc. All rights reserved. diff --git a/tools/icu/current_ver.dep b/tools/icu/current_ver.dep index ce0d89485ab312..2d467a6fd01e75 100644 --- a/tools/icu/current_ver.dep +++ b/tools/icu/current_ver.dep @@ -1,14 +1,6 @@ [ { - "url": "https://github.com/unicode-org/icu/releases/download/release-63-1/icu4c-63_1-src.zip", - "md5": "d25bc38089db64668fd86f34b4aa9b93" - }, - { - "url": "https://sourceforge.net/projects/icu/files/ICU4C/63.1/icu4c-63_1-src.zip", - "md5": "d25bc38089db64668fd86f34b4aa9b93" - }, - { - "url": "https://download.icu-project.org/files/icu4c/63.1/icu4c-63_1-src.zip", - "md5": "d25bc38089db64668fd86f34b4aa9b93" + "url": "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-src.tgz", + "md5": "a3d18213beec454e3cdec9a3116d6b05" } ]
  • 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 z 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